11#ifndef INCLUDED_BENCHMARK_COMMON
12#define INCLUDED_BENCHMARK_COMMON
15#include <spdlog/tweakme.h>
18#include <spdlog/fmt/fmt.h>
27template <
typename functor>
28[[nodiscard]]
auto benchmark(functor test,
size_t block_size)
30 using namespace std::chrono;
31 std::vector<float> outp(2 * block_size);
32 float* output = outp.data();
33 float *x = &output[0], *y = &output[block_size];
37 for (
auto& value : outp) {
38 value = rng() /
static_cast<double>(1ULL << 32) - (1ULL << 32);
41 auto before = high_resolution_clock::now();
46 auto after = high_resolution_clock::now();
48 auto dur = duration_cast<duration<double, std::ratio<1, 1>>>(after - before);
51 volatile auto sum = std::accumulate(outp.cbegin(), outp.cend(), 0.0f);
52 if (sum == std::numeric_limits<
decltype(sum)>::min()) {
54 return decltype(dur){};
59template <
typename dur_t>
65 auto dur_s = std::chrono::duration_cast<std::chrono::duration<double>>(dur);
66 return fmt::format(FMT_STRING(
"{:<18} time: {:<8.4e} s throughput: {:>6.3e} it/s"),
69 static_cast<double>(iterations) / dur_s.count());
auto format_duration(std::string_view name, dur_t dur, size_t iterations, size_t block_size)
Definition: benchmark_common.h:60
auto benchmark(functor test, size_t block_size)
Definition: benchmark_common.h:28
wrapper for XOROSHIRO128+ PRNG for use in std::distributions Fulfills C++ named requirements for Unif...
Definition: random.h:29
fmt::format_context::iterator format(const gr::io_signature &iosig, format_context &ctx) const