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