|
| 1 | +// Copyright Naoki Shibata and contributors 2024. |
| 2 | +// Distributed under the Boost Software License, Version 1.0. |
| 3 | +// (See accompanying file LICENSE.txt or copy at |
| 4 | +// http://www.boost.org/LICENSE_1_0.txt) |
| 5 | + |
| 6 | +#pragma once |
| 7 | +#include "benchmark_templates.hpp" |
| 8 | + |
| 9 | +// Define macros that can be used to generate benchmark calls (defined in |
| 10 | +// benchmark_templates.hpp). |
| 11 | +// Example to generate benchmarks for 1ULP sin(x) for x between 0 and 6.28: |
| 12 | +// BENCH(Sleef_sin_u10, double, 0, 6.28); |
| 13 | +// BENCHMARK_CAPTURE is a symbol from the google bench framework |
| 14 | +// Note: type is only passed for name filtering reasons |
| 15 | +#define BENCH(funname, typefilter, min, max) \ |
| 16 | + BENCHMARK_CAPTURE(BM_Sleef_templated_function, #funname, funname, min, max) \ |
| 17 | + ->Name("MB_" #funname "_" #typefilter "_" #min "_" #max); |
| 18 | + |
| 19 | +#define BENCH_SINGLE_SCALAR(fun, ulp, min, max) \ |
| 20 | + BENCH(Sleef_##fun##f_##ulp, scalarf, min, max); |
| 21 | +#define BENCH_DOUBLE_SCALAR(fun, ulp, min, max) \ |
| 22 | + BENCH(Sleef_##fun##_##ulp, scalard, min, max); |
| 23 | +// Generate benchmarks for scalar function implementations |
| 24 | +#define BENCH_SCALAR(fun, ulp, min, max) \ |
| 25 | + BENCH_SINGLE_SCALAR(fun, ulp, min, max); \ |
| 26 | + BENCH_DOUBLE_SCALAR(fun, ulp, min, max); |
| 27 | + |
| 28 | +// Generate benchmarks for vector function implementations |
| 29 | +#ifdef ENABLE_VECTOR_BENCHMARKS |
| 30 | +#if !defined(ARCH_VECT_LEN) || ARCH_VECT_LEN == 128 |
| 31 | +#define BENCH_SINGLE_VECTOR(fun, ulp, min, max) \ |
| 32 | + BENCH(Sleef_##fun##f4_##ulp, vectorf128, min, max); |
| 33 | +#define BENCH_DOUBLE_VECTOR(fun, ulp, min, max) \ |
| 34 | + BENCH(Sleef_##fun##d2_##ulp, vectord128, min, max); |
| 35 | +#elif ARCH_VECT_LEN == 256 |
| 36 | +#define BENCH_SINGLE_VECTOR(fun, ulp, min, max) \ |
| 37 | + BENCH(Sleef_##fun##f8_##ulp, vectorf256, min, max); |
| 38 | +#define BENCH_DOUBLE_VECTOR(fun, ulp, min, max) \ |
| 39 | + BENCH(Sleef_##fun##d4_##ulp, vectord256, min, max); |
| 40 | +#elif ARCH_VECT_LEN == 512 |
| 41 | +#define BENCH_SINGLE_VECTOR(fun, ulp, min, max) \ |
| 42 | + BENCH(Sleef_##fun##f16_##ulp, vectorf512, min, max); |
| 43 | +#define BENCH_DOUBLE_VECTOR(fun, ulp, min, max) \ |
| 44 | + BENCH(Sleef_##fun##d8_##ulp, vectord512, min, max); |
| 45 | +#endif |
| 46 | +#define BENCH_VECTOR(fun, ulp, min, max) \ |
| 47 | + BENCH_SINGLE_VECTOR(fun, ulp, min, max); \ |
| 48 | + BENCH_DOUBLE_VECTOR(fun, ulp, min, max); |
| 49 | +#else |
| 50 | +#define BENCH_SINGLE_VECTOR(fun, ulp, min, max) |
| 51 | +#define BENCH_DOUBLE_VECTOR(fun, ulp, min, max) |
| 52 | +#define BENCH_VECTOR(fun, ulp, min, max) |
| 53 | +#endif |
| 54 | + |
| 55 | +// Generate benchmarks for SVE function implementations |
| 56 | +#ifdef ENABLE_SVECTOR_BENCHMARKS |
| 57 | +#define BENCH_SINGLE_SVE(fun, ulp, min, max) \ |
| 58 | + BENCH(Sleef_##fun##fx_##ulp##sve, scalarf, min, max); |
| 59 | +#define BENCH_DOUBLE_SVE(fun, ulp, min, max) \ |
| 60 | + BENCH(Sleef_##fun##dx_##ulp##sve, scalard, min, max); |
| 61 | +#define BENCH_SVE(fun, ulp, min, max) \ |
| 62 | + BENCH_SINGLE_SVE(fun, ulp, min, max); \ |
| 63 | + BENCH_DOUBLE_SVE(fun, ulp, min, max); |
| 64 | +#else |
| 65 | +#define BENCH_SINGLE_SVE(fun, ulp, min, max) |
| 66 | +#define BENCH_DOUBLE_SVE(fun, ulp, min, max) |
| 67 | +#define BENCH_SVE(fun, ulp, min, max) |
| 68 | +#endif |
| 69 | + |
| 70 | +// Given a function implemented meeting a specific ulp |
| 71 | +// error (present in the name of the function), |
| 72 | +// BENCH_ALL_W_FIX_ULP macro will |
| 73 | +// generate benchmarks for |
| 74 | +// * all vector extensions supported |
| 75 | +// * all precisions |
| 76 | +// * all vector lengths |
| 77 | +#define BENCH_ALL_W_FIX_ULP(fun, ulp, min, max) \ |
| 78 | + BENCH_SCALAR(fun, ulp, min, max); \ |
| 79 | + BENCH_VECTOR(fun, ulp, min, max); \ |
| 80 | + BENCH_SVE(fun, ulp, min, max); |
| 81 | +#define BENCH_SINGLEP_W_FIX_ULP(fun, ulp, min, max) \ |
| 82 | + BENCH_SINGLE_SCALAR(fun, ulp, min, max); \ |
| 83 | + BENCH_SINGLE_VECTOR(fun, ulp, min, max); \ |
| 84 | + BENCH_SINGLE_SVE(fun, ulp, min, max); |
| 85 | +#define BENCH_DOUBLEP_W_FIX_ULP(fun, ulp, min, max) \ |
| 86 | + BENCH_DOUBLE_SCALAR(fun, ulp, min, max); \ |
| 87 | + BENCH_DOUBLE_VECTOR(fun, ulp, min, max); \ |
| 88 | + BENCH_DOUBLE_SVE(fun, ulp, min, max); |
| 89 | + |
| 90 | +#define BENCH_ALL_SINGLEP(fun, min, max) \ |
| 91 | + BENCH_SINGLEP_W_FIX_ULP(fun, u10, min, max); \ |
| 92 | + BENCH_SINGLEP_W_FIX_ULP(fun, u35, min, max); |
| 93 | +#define BENCH_ALL_DOUBLEP(fun, min, max) \ |
| 94 | + BENCH_DOUBLEP_W_FIX_ULP(fun, u10, min, max); \ |
| 95 | + BENCH_DOUBLEP_W_FIX_ULP(fun, u35, min, max); |
| 96 | + |
| 97 | +// Given a function, BENCH_ALL macro will |
| 98 | +// generate benchmarks for |
| 99 | +// * all ulp implementations available (u10 and u35) |
| 100 | +// * all vector extensions supported |
| 101 | +// * all precisions |
| 102 | +// * all vector lengths |
| 103 | +#define BENCH_ALL(fun, min, max) \ |
| 104 | + BENCH_ALL_W_FIX_ULP(fun, u10, min, max); \ |
| 105 | + BENCH_ALL_W_FIX_ULP(fun, u35, min, max); |
0 commit comments