mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-20 08:39:37 +08:00
55 lines
1.6 KiB
C++
55 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
|