bench_reverse.cpp revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
1
2#include <iostream>
3#include <Eigen/Core>
4#include <bench/BenchUtil.h>
5using namespace Eigen;
6
7#ifndef REPEAT
8#define REPEAT 100000
9#endif
10
11#ifndef TRIES
12#define TRIES 20
13#endif
14
15typedef double Scalar;
16
17template <typename MatrixType>
18__attribute__ ((noinline)) void bench_reverse(const MatrixType& m)
19{
20  int rows = m.rows();
21  int cols = m.cols();
22  int size = m.size();
23
24  int repeats = (REPEAT*1000)/size;
25  MatrixType a = MatrixType::Random(rows,cols);
26  MatrixType b = MatrixType::Random(rows,cols);
27
28  BenchTimer timerB, timerH, timerV;
29
30  Scalar acc = 0;
31  int r = internal::random<int>(0,rows-1);
32  int c = internal::random<int>(0,cols-1);
33  for (int t=0; t<TRIES; ++t)
34  {
35    timerB.start();
36    for (int k=0; k<repeats; ++k)
37    {
38      asm("#begin foo");
39      b = a.reverse();
40      asm("#end foo");
41      acc += b.coeff(r,c);
42    }
43    timerB.stop();
44  }
45
46  if (MatrixType::RowsAtCompileTime==Dynamic)
47    std::cout << "dyn   ";
48  else
49    std::cout << "fixed ";
50  std::cout << rows << " x " << cols << " \t"
51            << (timerB.value() * REPEAT) / repeats << "s "
52            << "(" << 1e-6 * size*repeats/timerB.value() << " MFLOPS)\t";
53
54  std::cout << "\n";
55  // make sure the compiler does not optimize too much
56  if (acc==123)
57    std::cout << acc;
58}
59
60int main(int argc, char* argv[])
61{
62  const int dynsizes[] = {4,6,8,16,24,32,49,64,128,256,512,900,0};
63  std::cout << "size            no sqrt                           standard";
64//   #ifdef BENCH_GSL
65//   std::cout << "       GSL (standard + double + ATLAS)  ";
66//   #endif
67  std::cout << "\n";
68  for (uint i=0; dynsizes[i]>0; ++i)
69  {
70    bench_reverse(Matrix<Scalar,Dynamic,Dynamic>(dynsizes[i],dynsizes[i]));
71    bench_reverse(Matrix<Scalar,Dynamic,1>(dynsizes[i]*dynsizes[i]));
72  }
73//   bench_reverse(Matrix<Scalar,2,2>());
74//   bench_reverse(Matrix<Scalar,3,3>());
75//   bench_reverse(Matrix<Scalar,4,4>());
76//   bench_reverse(Matrix<Scalar,5,5>());
77//   bench_reverse(Matrix<Scalar,6,6>());
78//   bench_reverse(Matrix<Scalar,7,7>());
79//   bench_reverse(Matrix<Scalar,8,8>());
80//   bench_reverse(Matrix<Scalar,12,12>());
81//   bench_reverse(Matrix<Scalar,16,16>());
82  return 0;
83}
84
85