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