11 #ifndef INCLUDED_BENCHMARK_COMMON
12 #define INCLUDED_BENCHMARK_COMMON
15 #include <spdlog/tweakme.h>
18 #include <spdlog/fmt/fmt.h>
19 #include <string_view>
27 template <
typename functor>
28 [[nodiscard]]
auto benchmark(functor test,
size_t block_size)
30 std::vector<float> outp(2 * block_size);
31 float* output = outp.data();
32 float *x = &output[0], *y = &output[block_size];
36 for (
auto& value : outp) {
37 value = rng() /
static_cast<double>(1ULL << 32) - (1ULL << 32);
40 auto before = std::chrono::high_resolution_clock::now();
45 auto after = std::chrono::high_resolution_clock::now();
48 std::chrono::duration_cast<std::chrono::duration<double, std::ratio<1, 1>>>(
52 volatile auto sum = std::accumulate(outp.cbegin(), outp.cend(), 0.0f);
53 if (sum == std::numeric_limits<decltype(sum)>::
min()) {
55 return decltype(dur){};
60 template <
typename dur_t>
66 auto dur_s = std::chrono::duration_cast<std::chrono::duration<double>>(dur);
67 return fmt::format(FMT_STRING(
"{:<18} time: {:<8.4e} s throughput: {:>6.3e} it/s"),
70 static_cast<double>(iterations) / dur_s.count());