|
|
|
|
|
#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.lazy() * m)).eval(); |
|
|
} |
|
|
else if (Mode==OmpEval) |
|
|
{ |
|
|
asm("#begin_bench_loop OmpEval"); |
|
|
if (MatrixType::SizeAtCompileTime!=Eigen::Dynamic) asm("#fixedsize"); |
|
|
m = (I + 0.00005 * (m + m.lazy() * m)).evalOMP(); |
|
|
} |
|
|
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 |
|
|
|