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> 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> 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