1
2#ifndef EIGEN_BENCH_BASICBENCH_H
3#define EIGEN_BENCH_BASICBENCH_H
4
5enum {LazyEval, EarlyEval, OmpEval};
6
7template<int Mode, typename MatrixType>
8void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline));
9
10template<int Mode, typename MatrixType>
11void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations)
12{
13  for(int a = 0; a < iterations; a++)
14  {
15    if (Mode==LazyEval)
16    {
17      asm("#begin_bench_loop LazyEval");
18      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
19      m = (I + 0.00005 * (m + m.lazy() * m)).eval();
20    }
21    else if (Mode==OmpEval)
22    {
23      asm("#begin_bench_loop OmpEval");
24      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
25      m = (I + 0.00005 * (m + m.lazy() * m)).evalOMP();
26    }
27    else
28    {
29      asm("#begin_bench_loop EarlyEval");
30      if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize");
31      m = I + 0.00005 * (m + m * m);
32    }
33    asm("#end_bench_loop");
34  }
35}
36
37template<int Mode, typename MatrixType>
38double benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline));
39
40template<int Mode, typename MatrixType>
41double benchBasic(const MatrixType& mat, int iterations, int tries)
42{
43  const int rows = mat.rows();
44  const int cols = mat.cols();
45
46  MatrixType I(rows,cols);
47  MatrixType m(rows,cols);
48
49  initMatrix_identity(I);
50
51  Eigen::BenchTimer timer;
52  for(uint t=0; t<tries; ++t)
53  {
54    initMatrix_random(m);
55    timer.start();
56    benchBasic_loop<Mode>(I, m, iterations);
57    timer.stop();
58    cerr << m;
59  }
60  return timer.value();
61};
62
63#endif // EIGEN_BENCH_BASICBENCH_H
64