aboutsummaryrefslogtreecommitdiffhomepage
path: root/bench/bench_reverse.cpp
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2009-02-06 13:28:55 +0000
committerGravatar Gael Guennebaud <g.gael@free.fr>2009-02-06 13:28:55 +0000
commitcc90495e3091ef68927c8d3f1999fc618aec0c77 (patch)
tree5df305a746d056bbe8b830d33e205f08429c0dbb /bench/bench_reverse.cpp
parentf5d96df80075667b2e09d9df8bbf1640c97e51d3 (diff)
add bench_reverse, draft of a reverse vectorization for AltiVec, make
global Scaling function static
Diffstat (limited to 'bench/bench_reverse.cpp')
-rw-r--r--bench/bench_reverse.cpp83
1 files changed, 83 insertions, 0 deletions
diff --git a/bench/bench_reverse.cpp b/bench/bench_reverse.cpp
new file mode 100644
index 000000000..2cedc0d3d
--- /dev/null
+++ b/bench/bench_reverse.cpp
@@ -0,0 +1,83 @@
+
+#include <Eigen/Array>
+#include <bench/BenchUtil.h>
+using namespace Eigen;
+
+#ifndef REPEAT
+#define REPEAT 100000
+#endif
+
+#ifndef TRIES
+#define TRIES 20
+#endif
+
+typedef double Scalar;
+
+template <typename MatrixType>
+__attribute__ ((noinline)) void bench_reverse(const MatrixType& m)
+{
+ int rows = m.rows();
+ int cols = m.cols();
+ int size = m.size();
+
+ int repeats = (REPEAT*1000)/size;
+ MatrixType a = MatrixType::Random(rows,cols);
+ MatrixType b = MatrixType::Random(rows,cols);
+
+ BenchTimer timerB, timerH, timerV;
+
+ Scalar acc = 0;
+ int r = ei_random<int>(0,rows-1);
+ int c = ei_random<int>(0,cols-1);
+ for (int t=0; t<TRIES; ++t)
+ {
+ timerB.start();
+ for (int k=0; k<repeats; ++k)
+ {
+ asm("#begin foo");
+ b = a.reverse();
+ asm("#end foo");
+ acc += b.coeff(r,c);
+ }
+ timerB.stop();
+ }
+
+ if (MatrixType::RowsAtCompileTime==Dynamic)
+ std::cout << "dyn ";
+ else
+ std::cout << "fixed ";
+ std::cout << rows << " x " << cols << " \t"
+ << (timerB.value() * REPEAT) / repeats << "s "
+ << "(" << 1e-6 * size*repeats/timerB.value() << " MFLOPS)\t";
+
+ std::cout << "\n";
+ // make sure the compiler does not optimize too much
+ if (acc==123)
+ std::cout << acc;
+}
+
+int main(int argc, char* argv[])
+{
+ const int dynsizes[] = {4,6,8,16,24,32,49,64,128,256,512,900,0};
+ std::cout << "size no sqrt standard";
+// #ifdef BENCH_GSL
+// std::cout << " GSL (standard + double + ATLAS) ";
+// #endif
+ std::cout << "\n";
+ for (uint i=0; dynsizes[i]>0; ++i)
+ {
+ bench_reverse(Matrix<Scalar,Dynamic,Dynamic>(dynsizes[i],dynsizes[i]));
+ bench_reverse(Matrix<Scalar,Dynamic,1>(dynsizes[i]*dynsizes[i]));
+ }
+// bench_reverse(Matrix<Scalar,2,2>());
+// bench_reverse(Matrix<Scalar,3,3>());
+// bench_reverse(Matrix<Scalar,4,4>());
+// bench_reverse(Matrix<Scalar,5,5>());
+// bench_reverse(Matrix<Scalar,6,6>());
+// bench_reverse(Matrix<Scalar,7,7>());
+// bench_reverse(Matrix<Scalar,8,8>());
+// bench_reverse(Matrix<Scalar,12,12>());
+// bench_reverse(Matrix<Scalar,16,16>());
+ return 0;
+}
+