 9d9d81ad71
			
		
	
	
		9d9d81ad71
		
	
	
	
	
		
			
			internaly uses OpenMP if enabled at compile time. * added a bench/ folder with a couple benchmarks and benchmark tools.
		
			
				
	
	
		
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			82 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // g++ -O3 -DNDEBUG -I.. -fopenmp benchOpenMP.cpp -o benchOpenMP && ./benchOpenMP 2> /dev/null
 | |
| // icpc -fast -fno-exceptions -DNDEBUG -I.. -openmp  benchOpenMP.cpp -o benchOpenMP && ./benchOpenMP 2> /dev/null
 | |
| 
 | |
| #include <omp.h>
 | |
| #include "BenchUtil.h"
 | |
| #include "basicbenchmark.h"
 | |
| 
 | |
| // #include <Eigen/Core>
 | |
| // #include "BenchTimer.h"
 | |
| //
 | |
| // using namespace std;
 | |
| // USING_PART_OF_NAMESPACE_EIGEN
 | |
| //
 | |
| // enum {LazyEval, EarlyEval, OmpEval};
 | |
| //
 | |
| // template<int Mode, typename MatrixType>
 | |
| // double benchSingleProc(const MatrixType& mat, int iterations, 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();
 | |
| //
 | |
| //   Eigen::BenchTimer timer;
 | |
| //   for(uint t=0; t<tries; ++t)
 | |
| //   {
 | |
| //     MatrixType I = MatrixType::identity(rows, cols);
 | |
| //     MatrixType m = MatrixType::random(rows, cols);
 | |
| //
 | |
| //     timer.start();
 | |
| //     for(int a = 0; a < iterations; a++)
 | |
| //     {
 | |
| //       if(Mode==LazyEval)
 | |
| //         m = (I + 0.00005 * (m + m.lazyProduct(m))).eval();
 | |
| //       else if(Mode==OmpEval)
 | |
| //         m = (I + 0.00005 * (m + m.lazyProduct(m))).evalOMP();
 | |
| //       else
 | |
| //         m = I + 0.00005 * (m + m * m);
 | |
| //     }
 | |
| //     timer.stop();
 | |
| //     cerr << m;
 | |
| //   }
 | |
| //   return timer.value();
 | |
| // };
 | |
| 
 | |
| int main(int argc, char *argv[])
 | |
| {
 | |
|   // disbale floating point exceptions
 | |
|   // this leads to more stable bench results
 | |
|   {
 | |
|     int aux;
 | |
|     asm(
 | |
|     "stmxcsr   %[aux]           \n\t"
 | |
|     "orl       $32832, %[aux]   \n\t"
 | |
|     "ldmxcsr   %[aux]           \n\t"
 | |
|     : : [aux] "m" (aux));
 | |
|   }
 | |
| 
 | |
|   // commented since the default setting is use as many threads as processors
 | |
|   //omp_set_num_threads(omp_get_num_procs());
 | |
| 
 | |
|   std::cout << "double, fixed-size 4x4: "
 | |
|     << benchBasic<LazyEval>(Matrix4d(), 10000, 10) << "s  "
 | |
|     << benchBasic<OmpEval>(Matrix4d(), 10000, 10) << "s  \n";
 | |
| 
 | |
|   #define BENCH_MATRIX(TYPE, SIZE, ITERATIONS, TRIES) {\
 | |
|       double single = benchBasic<LazyEval>(Matrix<TYPE,Eigen::Dynamic,Eigen::Dynamic>(SIZE,SIZE), ITERATIONS, TRIES); \
 | |
|       double omp    = benchBasic<OmpEval> (Matrix<TYPE,Eigen::Dynamic,Eigen::Dynamic>(SIZE,SIZE), ITERATIONS, TRIES); \
 | |
|       std::cout << #TYPE << ", " << #SIZE << "x" << #SIZE << ": " << single << "s " << omp << "s " \
 | |
|         << " => x" << single/omp << " (" << omp_get_num_procs() << ")" << std::endl; \
 | |
|     }
 | |
| 
 | |
|   BENCH_MATRIX(double,   32, 1000, 10);
 | |
|   BENCH_MATRIX(double,  128,   10, 10);
 | |
|   BENCH_MATRIX(double,  512,    1,  6);
 | |
|   BENCH_MATRIX(double, 1024,    1,  4);
 | |
| 
 | |
|   return 0;
 | |
| }
 | |
| 
 |