lazy_gemm.cpp File Reference
#include <iostream>
#include <fstream>
#include <vector>
#include <Eigen/Core>
#include "../../BenchTimer.h"

Typedefs

typedef SCALAR Scalar
 

Functions

template<typename MatA , typename MatB , typename MatC >
EIGEN_DONT_INLINE void lazy_gemm (const MatA &A, const MatB &B, MatC &C)
 
template<int m, int n, int k, int TA>
EIGEN_DONT_INLINE double bench ()
 
template<int m, int n, int k>
double bench_t (int t)
 
EIGEN_DONT_INLINE double bench_mnk (int m, int n, int k, int t)
 
int main (int argc, char **argv)
 

Typedef Documentation

◆ Scalar

typedef SCALAR Scalar

Function Documentation

◆ bench()

template<int m, int n, int k, int TA>
EIGEN_DONT_INLINE double bench ( )
23  {
24  typedef Matrix<Scalar, m, k, TA> MatA;
25  typedef Matrix<Scalar, k, n> MatB;
26  typedef Matrix<Scalar, m, n> MatC;
27 
28  MatA A(m, k);
29  MatB B(k, n);
30  MatC C(m, n);
31  A.setRandom();
32  B.setRandom();
33  C.setZero();
34 
35  BenchTimer t;
36 
37  double up = 1e7 * 4 / sizeof(Scalar);
38  double tm0 = 10, tm1 = 20;
39 
40  double flops = 2. * m * n * k;
41  long rep = std::max(10., std::min(10000., up / flops));
42  long tries = std::max(tm0, std::min(tm1, up / flops));
43 
44  BENCH(t, tries, rep, lazy_gemm(A, B, C));
45 
46  return 1e-9 * rep * flops / t.best();
47 }
#define BENCH(TIMER, TRIES, REP, CODE)
Definition: BenchTimer.h:150
const unsigned n
Definition: CG3DPackingUnitTest.cpp:11
Array< double, 1, 3 > e(1./3., 0.5, 2.)
Matrix< SCALARA, Dynamic, Dynamic, opt_A > A
Definition: bench_gemm.cpp:47
Matrix< Scalar, Dynamic, Dynamic > C
Definition: bench_gemm.cpp:49
Matrix< SCALARB, Dynamic, Dynamic, opt_B > B
Definition: bench_gemm.cpp:48
Definition: BenchTimer.h:55
The matrix class, also used for vectors and row-vectors.
Definition: Eigen/Eigen/src/Core/Matrix.h:186
Derived & setRandom(Index size)
Definition: Random.h:147
Definition: matrices.h:74
#define min(a, b)
Definition: datatypes.h:22
#define max(a, b)
Definition: datatypes.h:23
SCALAR Scalar
Definition: lazy_gemm.cpp:12
EIGEN_DONT_INLINE void lazy_gemm(const MatA &A, const MatB &B, MatC &C)
Definition: lazy_gemm.cpp:15
int * m
Definition: level2_cplx_impl.h:294
char char char int int * k
Definition: level2_impl.h:374
t
Definition: plotPSD.py:36

References BENCH, e(), k, lazy_gemm(), m, max, min, n, Eigen::PlainObjectBase< Derived >::setRandom(), and plotPSD::t.

◆ bench_mnk()

EIGEN_DONT_INLINE double bench_mnk ( int  m,
int  n,
int  k,
int  t 
)
57  {
58  int id = m * 10000 + n * 100 + k;
59  switch (id) {
60  case 10101:
61  return bench_t<1, 1, 1>(t);
62  break;
63  case 20202:
64  return bench_t<2, 2, 2>(t);
65  break;
66  case 30303:
67  return bench_t<3, 3, 3>(t);
68  break;
69  case 40404:
70  return bench_t<4, 4, 4>(t);
71  break;
72  case 50505:
73  return bench_t<5, 5, 5>(t);
74  break;
75  case 60606:
76  return bench_t<6, 6, 6>(t);
77  break;
78  case 70707:
79  return bench_t<7, 7, 7>(t);
80  break;
81  case 80808:
82  return bench_t<8, 8, 8>(t);
83  break;
84  case 90909:
85  return bench_t<9, 9, 9>(t);
86  break;
87  case 101010:
88  return bench_t<10, 10, 10>(t);
89  break;
90  case 111111:
91  return bench_t<11, 11, 11>(t);
92  break;
93  case 121212:
94  return bench_t<12, 12, 12>(t);
95  break;
96  }
97  return 0;
98 }

References k, m, n, and plotPSD::t.

Referenced by main().

◆ bench_t()

template<int m, int n, int k>
double bench_t ( int  t)
50  {
51  if (t)
52  return bench<m, n, k, RowMajor>();
53  else
54  return bench<m, n, k, 0>();
55 }

References plotPSD::t.

◆ lazy_gemm()

template<typename MatA , typename MatB , typename MatC >
EIGEN_DONT_INLINE void lazy_gemm ( const MatA &  A,
const MatB &  B,
MatC &  C 
)
15  {
16  // escape((void*)A.data());
17  // escape((void*)B.data());
18  C.noalias() += A.lazyProduct(B);
19  // escape((void*)C.data());
20 }

Referenced by bench().

◆ main()

int main ( int argc  ,
char **  argv 
)
100  {
101  std::vector<double> results;
102 
103  std::string filename = std::string("lazy_gemm_settings.txt");
104  if (argc > 1) filename = std::string(argv[1]);
105  std::ifstream settings(filename);
106  long m, n, k, t;
107  while (settings >> m >> n >> k >> t) {
108  // std::cerr << " Testing " << m << " " << n << " " << k << std::endl;
109  results.push_back(bench_mnk(m, n, k, t));
110  }
111 
112  std::cout << RowVectorXd::Map(results.data(), results.size());
113 
114  return 0;
115 }
std::map< std::string, Array< float, 1, 8, DontAlign|RowMajor > > results
Definition: dense_solvers.cpp:10
EIGEN_DONT_INLINE double bench_mnk(int m, int n, int k, int t)
Definition: lazy_gemm.cpp:57
string filename
Definition: MergeRestartFiles.py:39
std::string string(const unsigned &i)
Definition: oomph_definitions.cc:286

References bench_mnk(), MergeRestartFiles::filename, k, m, n, results, oomph::Global_string_for_annotation::string(), and plotPSD::t.