|  |  | 
|  | #ifndef EIGEN_BENCH_BASICBENCH_H | 
|  | #define EIGEN_BENCH_BASICBENCH_H | 
|  |  | 
|  | enum {LazyEval, EarlyEval, OmpEval}; | 
|  |  | 
|  | template<int Mode, typename MatrixType> | 
|  | void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) __attribute__((noinline)); | 
|  |  | 
|  | template<int Mode, typename MatrixType> | 
|  | void benchBasic_loop(const MatrixType& I, MatrixType& m, int iterations) | 
|  | { | 
|  | for(int a = 0; a < iterations; a++) | 
|  | { | 
|  | if (Mode==LazyEval) | 
|  | { | 
|  | asm("#begin_bench_loop LazyEval"); | 
|  | if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); | 
|  | m = (I + 0.00005 * (m + m.lazyProduct(m))).eval(); | 
|  | } | 
|  | else if (Mode==OmpEval) | 
|  | { | 
|  | asm("#begin_bench_loop OmpEval"); | 
|  | if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); | 
|  | m = (I + 0.00005 * (m + m.lazyProduct(m))).eval(); | 
|  | } | 
|  | else | 
|  | { | 
|  | asm("#begin_bench_loop EarlyEval"); | 
|  | if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); | 
|  | m = I + 0.00005 * (m + m * m); | 
|  | } | 
|  | asm("#end_bench_loop"); | 
|  | } | 
|  | } | 
|  |  | 
|  | template<int Mode, typename MatrixType> | 
|  | double benchBasic(const MatrixType& mat, int size, int tries) __attribute__((noinline)); | 
|  |  | 
|  | template<int Mode, typename MatrixType> | 
|  | double benchBasic(const MatrixType& mat, int iterations, int tries) | 
|  | { | 
|  | const int rows = mat.rows(); | 
|  | const int cols = mat.cols(); | 
|  |  | 
|  | MatrixType I(rows,cols); | 
|  | MatrixType m(rows,cols); | 
|  |  | 
|  | initMatrix_identity(I); | 
|  |  | 
|  | Eigen::BenchTimer timer; | 
|  | for(uint t=0; t<tries; ++t) | 
|  | { | 
|  | initMatrix_random(m); | 
|  | timer.start(); | 
|  | benchBasic_loop<Mode>(I, m, iterations); | 
|  | timer.stop(); | 
|  | cerr << m; | 
|  | } | 
|  | return timer.value(); | 
|  | }; | 
|  |  | 
|  | #endif // EIGEN_BENCH_BASICBENCH_H |