64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
 | 
						|
#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
 |