diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-10-07 16:06:48 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-10-07 16:06:48 +0200 |
commit | 13294b5152578bf9eb2bfe67f20b8f14f9e755b4 (patch) | |
tree | cba9deb22753ec80b3a525393aac2dcd91b556c9 /bench/perf_monitoring/gemm/lazy_gemm.cpp | |
parent | 247259f805f914f4c0f9cae44771f68da2b4eb40 (diff) |
Unify gemm and lazy_gemm benchmarks
Diffstat (limited to 'bench/perf_monitoring/gemm/lazy_gemm.cpp')
-rw-r--r-- | bench/perf_monitoring/gemm/lazy_gemm.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/bench/perf_monitoring/gemm/lazy_gemm.cpp b/bench/perf_monitoring/gemm/lazy_gemm.cpp new file mode 100644 index 000000000..b443218d7 --- /dev/null +++ b/bench/perf_monitoring/gemm/lazy_gemm.cpp @@ -0,0 +1,97 @@ +#include <iostream> +#include <fstream> +#include <vector> +#include <Eigen/Core> +#include "../../BenchTimer.h" +using namespace Eigen; + +#ifndef SCALAR +#error SCALAR must be defined +#endif + +typedef SCALAR Scalar; + +template<typename MatA, typename MatB, typename MatC> +inline void lazy_gemm(const MatA &A, const MatB &B, MatC &C) +{ + escape((void*)A.data()); + escape((void*)B.data()); + C.noalias() += A.lazyProduct(B); + escape((void*)C.data()); +} + +template<int m, int n, int k, int TA> +EIGEN_DONT_INLINE +double bench() +{ + typedef Matrix<Scalar,m,k,TA> MatA; + typedef Matrix<Scalar,k,n> MatB; + typedef Matrix<Scalar,m,n> MatC; + + MatA A(m,k); + MatB B(k,n); + MatC C(m,n); + A.setRandom(); + B.setRandom(); + C.setZero(); + + BenchTimer t; + + double up = 1e7*4/sizeof(Scalar); + double tm0 = 10, tm1 = 20; + + double flops = 2. * m * n * k; + long rep = std::max(10., std::min(10000., up/flops) ); + long tries = std::max(tm0, std::min(tm1, up/flops) ); + + BENCH(t, tries, rep, lazy_gemm(A,B,C)); + + return 1e-9 * rep * flops / t.best(); +} + +template<int m, int n, int k> +double bench_t(int t) +{ + if(t) + return bench<m,n,k,RowMajor>(); + else + return bench<m,n,k,0>(); +} + +EIGEN_DONT_INLINE +double bench_mnk(int m, int n, int k, int t) +{ + int id = m*10000 + n*100 + k; + switch(id) { + case 10101 : return bench_t< 1, 1, 1>(t); break; + case 20202 : return bench_t< 2, 2, 2>(t); break; + case 30303 : return bench_t< 3, 3, 3>(t); break; + case 40404 : return bench_t< 4, 4, 4>(t); break; + case 50505 : return bench_t< 5, 5, 5>(t); break; + case 60606 : return bench_t< 6, 6, 6>(t); break; + case 70707 : return bench_t< 7, 7, 7>(t); break; + case 80808 : return bench_t< 8, 8, 8>(t); break; + case 90909 : return bench_t< 9, 9, 9>(t); break; + case 101010 : return bench_t<10,10,10>(t); break; + case 111111 : return bench_t<11,11,11>(t); break; + case 121212 : return bench_t<12,12,12>(t); break; + } + return 0; +} + +int main(int argc, char **argv) +{ + std::vector<double> results; + + std::ifstream settings("lazy_gemm_settings.txt"); + long m, n, k, t; + while(settings >> m >> n >> k >> t) + { + //std::cerr << " Testing " << m << " " << n << " " << k << std::endl; + results.push_back( bench_mnk(m, n, k, t) ); + } + + std::cout << RowVectorXd::Map(results.data(), results.size()); + + return 0; +} |