1 #include <iostream>
2 #include <fstream>
3 #include <vector>
4 #include <Eigen/Core>
5 #include "../../BenchTimer.h"
6 using namespace Eigen;
7
8 #ifndef SCALAR
9 #error SCALAR must be defined
10 #endif
11
12 typedef SCALAR Scalar;
13
14 typedef Matrix<Scalar,Dynamic,Dynamic> Mat;
15
16 EIGEN_DONT_INLINE
gemm(const Mat & A,const Mat & B,Mat & C)17 void gemm(const Mat &A, const Mat &B, Mat &C)
18 {
19 C.noalias() += A * B;
20 }
21
22 EIGEN_DONT_INLINE
bench(long m,long n,long k)23 double bench(long m, long n, long k)
24 {
25 Mat A(m,k);
26 Mat B(k,n);
27 Mat C(m,n);
28 A.setRandom();
29 B.setRandom();
30 C.setZero();
31
32 BenchTimer t;
33
34 double up = 1e8*4/sizeof(Scalar);
35 double tm0 = 4, tm1 = 10;
36 if(NumTraits<Scalar>::IsComplex)
37 {
38 up /= 4;
39 tm0 = 2;
40 tm1 = 4;
41 }
42
43 double flops = 2. * m * n * k;
44 long rep = std::max(1., std::min(100., up/flops) );
45 long tries = std::max(tm0, std::min(tm1, up/flops) );
46
47 BENCH(t, tries, rep, gemm(A,B,C));
48
49 return 1e-9 * rep * flops / t.best();
50 }
51
main(int argc,char ** argv)52 int main(int argc, char **argv)
53 {
54 std::vector<double> results;
55
56 std::ifstream settings("gemm_settings.txt");
57 long m, n, k;
58 while(settings >> m >> n >> k)
59 {
60 //std::cerr << " Testing " << m << " " << n << " " << k << std::endl;
61 results.push_back( bench(m, n, k) );
62 }
63
64 std::cout << RowVectorXd::Map(results.data(), results.size());
65
66 return 0;
67 }
68