• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 
2 #ifndef EIGEN_BENCH_BASICBENCH_H
3 #define EIGEN_BENCH_BASICBENCH_H
4 
5 enum {LazyEval, EarlyEval, OmpEval};
6 
7 template<int Mode, typename MatrixType>
8 void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline));
9 
10 template<int Mode, typename MatrixType>
benchBasic_loop(const MatrixType & I,MatrixType & m,int iterations)11 void 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 
37 template<int Mode, typename MatrixType>
38 double benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline));
39 
40 template<int Mode, typename MatrixType>
benchBasic(const MatrixType & mat,int iterations,int tries)41 double 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