benchmark_t Struct Reference

Public Member Functions

 benchmark_t ()
 
 benchmark_t (size_t pk, size_t pm, size_t pn, size_t bk, size_t bm, size_t bn)
 
 benchmark_t (size_t pk, size_t pm, size_t pn)
 
void run ()
 

Public Attributes

uint16_t compact_product_size
 
uint16_t compact_block_size
 
bool use_default_block_size
 
float gflops
 

Constructor & Destructor Documentation

◆ benchmark_t() [1/3]

benchmark_t::benchmark_t ( )
inline
bool use_default_block_size
Definition: benchmark-blocking-sizes.cpp:94
float gflops
Definition: benchmark-blocking-sizes.cpp:95
uint16_t compact_block_size
Definition: benchmark-blocking-sizes.cpp:93
uint16_t compact_product_size
Definition: benchmark-blocking-sizes.cpp:92

◆ benchmark_t() [2/3]

benchmark_t::benchmark_t ( size_t  pk,
size_t  pm,
size_t  pn,
size_t  bk,
size_t  bm,
size_t  bn 
)
inline
100  use_default_block_size(false),
101  gflops(0) {}
Matrix4d pm
Definition: HessenbergDecomposition_packedMatrix.cpp:4
uint16_t compact_size_triple(size_t k, size_t m, size_t n)
Definition: benchmark-blocking-sizes.cpp:83

◆ benchmark_t() [3/3]

benchmark_t::benchmark_t ( size_t  pk,
size_t  pm,
size_t  pn 
)
inline
106  gflops(0) {}

Member Function Documentation

◆ run()

void benchmark_t::run ( )
134  {
135  size_triple_t productsizes(compact_product_size);
136 
139  } else {
140  // feed eigen with our custom blocking params
142  size_triple_t blocksizes(compact_block_size);
143  eigen_block_size_k = blocksizes.k;
144  eigen_block_size_m = blocksizes.m;
145  eigen_block_size_n = blocksizes.n;
146  }
147 
148  // set up the matrix pool
149 
150  const size_t combined_three_matrices_sizes =
151  sizeof(Scalar) *
152  (productsizes.k * productsizes.m + productsizes.k * productsizes.n + productsizes.m * productsizes.n);
153 
154  // 64 M is large enough that nobody has a cache bigger than that,
155  // while still being small enough that everybody has this much RAM,
156  // so conveniently we don't need to special-case platforms here.
157  const size_t unlikely_large_cache_size = 64 << 20;
158 
159  const size_t working_set_size = min_working_set_size ? min_working_set_size : unlikely_large_cache_size;
160 
161  const size_t matrix_pool_size = 1 + working_set_size / combined_three_matrices_sizes;
162 
163  MatrixType* lhs = new MatrixType[matrix_pool_size];
164  MatrixType* rhs = new MatrixType[matrix_pool_size];
165  MatrixType* dst = new MatrixType[matrix_pool_size];
166 
167  for (size_t i = 0; i < matrix_pool_size; i++) {
168  lhs[i] = MatrixType::Zero(productsizes.m, productsizes.k);
169  rhs[i] = MatrixType::Zero(productsizes.k, productsizes.n);
170  dst[i] = MatrixType::Zero(productsizes.m, productsizes.n);
171  }
172 
173  // main benchmark loop
174 
175  int iters_at_a_time = 1;
176  float time_per_iter = 0.0f;
177  size_t matrix_index = 0;
178  while (true) {
179  double starttime = timer.getCpuTime();
180  for (int i = 0; i < iters_at_a_time; i++) {
181  dst[matrix_index].noalias() = lhs[matrix_index] * rhs[matrix_index];
182  matrix_index++;
183  if (matrix_index == matrix_pool_size) {
184  matrix_index = 0;
185  }
186  }
187  double endtime = timer.getCpuTime();
188 
189  const float timing = float(endtime - starttime);
190 
191  if (timing >= min_accurate_time) {
192  time_per_iter = timing / iters_at_a_time;
193  break;
194  }
195 
196  iters_at_a_time *= 2;
197  }
198 
199  delete[] lhs;
200  delete[] rhs;
201  delete[] dst;
202 
203  gflops = 2e-9 * productsizes.k * productsizes.m * productsizes.n / time_per_iter;
204 }
int i
Definition: BiCGSTAB_step_by_step.cpp:9
Array< double, 1, 3 > e(1./3., 0.5, 2.)
size_t min_working_set_size
Definition: benchmark-blocking-sizes.cpp:44
MatrixType::Scalar Scalar
Definition: benchmark-blocking-sizes.cpp:53
bool eigen_use_specific_block_size
Definition: benchmark-blocking-sizes.cpp:18
int eigen_block_size_n
Definition: benchmark-blocking-sizes.cpp:19
int eigen_block_size_k
Definition: benchmark-blocking-sizes.cpp:19
const float min_accurate_time
Definition: benchmark-blocking-sizes.cpp:41
int eigen_block_size_m
Definition: benchmark-blocking-sizes.cpp:19
MatrixXf MatrixType
Definition: benchmark-blocking-sizes.cpp:52
double Zero
Definition: pseudosolid_node_update_elements.cc:35
Definition: analyze-blocking-sizes.cpp:45

References e(), eigen_block_size_k, eigen_block_size_m, eigen_block_size_n, eigen_use_specific_block_size, i, size_triple_t::k, size_triple_t::m, min_accurate_time, min_working_set_size, size_triple_t::n, and oomph::PseudoSolidHelper::Zero.

Member Data Documentation

◆ compact_block_size

uint16_t benchmark_t::compact_block_size

Referenced by operator<().

◆ compact_product_size

uint16_t benchmark_t::compact_product_size

Referenced by operator<().

◆ gflops

float benchmark_t::gflops

Referenced by operator<().

◆ use_default_block_size

bool benchmark_t::use_default_block_size

The documentation for this struct was generated from the following file: