Squashed 'third_party/eigen/' content from commit 61d72f6

Change-Id: Iccc90fa0b55ab44037f018046d2fcffd90d9d025
git-subtree-dir: third_party/eigen
git-subtree-split: 61d72f6383cfa842868c53e30e087b0258177257
diff --git a/bench/basicbenchmark.h b/bench/basicbenchmark.h
new file mode 100644
index 0000000..3fdc357
--- /dev/null
+++ b/bench/basicbenchmark.h
@@ -0,0 +1,63 @@
+
+#ifndef EIGEN_BENCH_BASICBENCH_H
+#define EIGEN_BENCH_BASICBENCH_H
+
+enum {LazyEval, EarlyEval, OmpEval};
+
+template<int Mode, typename MatrixType>
+void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline));
+
+template<int Mode, typename MatrixType>
+void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations)
+{
+  for(int a = 0; a < iterations; a++)
+  {
+    if (Mode==LazyEval)
+    {
+      asm("#begin_bench_loop LazyEval");
+      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
+      m = (I + 0.00005 * (m + m.lazy() * m)).eval();
+    }
+    else if (Mode==OmpEval)
+    {
+      asm("#begin_bench_loop OmpEval");
+      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
+      m = (I + 0.00005 * (m + m.lazy() * m)).evalOMP();
+    }
+    else
+    {
+      asm("#begin_bench_loop EarlyEval");
+      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
+      m = I + 0.00005 * (m + m * m);
+    }
+    asm("#end_bench_loop");
+  }
+}
+
+template<int Mode, typename MatrixType>
+double benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline));
+
+template<int Mode, typename MatrixType>
+double benchBasic(const MatrixType& mat, int iterations, int tries)
+{
+  const int rows = mat.rows();
+  const int cols = mat.cols();
+
+  MatrixType I(rows,cols);
+  MatrixType m(rows,cols);
+
+  initMatrix_identity(I);
+
+  Eigen::BenchTimer timer;
+  for(uint t=0; t<tries; ++t)
+  {
+    initMatrix_random(m);
+    timer.start();
+    benchBasic_loop<Mode>(I, m, iterations);
+    timer.stop();
+    cerr << m;
+  }
+  return timer.value();
+};
+
+#endif // EIGEN_BENCH_BASICBENCH_H