From 32870f29bff4c46260607a17442894abe27ed88d Mon Sep 17 00:00:00 2001 From: pleroy Date: Wed, 17 Apr 2024 19:36:30 +0200 Subject: [PATCH 1/4] A benchmark for the trigonometric functions. --- benchmarks/benchmarks.vcxproj | 1 + benchmarks/benchmarks.vcxproj.filters | 3 ++ benchmarks/trigonometry_benchmark.cpp | 55 +++++++++++++++++++++++++++ 3 files changed, 59 insertions(+) create mode 100644 benchmarks/trigonometry_benchmark.cpp diff --git a/benchmarks/benchmarks.vcxproj b/benchmarks/benchmarks.vcxproj index 5906f20a3d..450a8d8398 100644 --- a/benchmarks/benchmarks.vcxproj +++ b/benchmarks/benchmarks.vcxproj @@ -38,6 +38,7 @@ + diff --git a/benchmarks/benchmarks.vcxproj.filters b/benchmarks/benchmarks.vcxproj.filters index 8241497894..e46445ea61 100644 --- a/benchmarks/benchmarks.vcxproj.filters +++ b/benchmarks/benchmarks.vcxproj.filters @@ -86,6 +86,9 @@ Source Files + + Source Files + diff --git a/benchmarks/trigonometry_benchmark.cpp b/benchmarks/trigonometry_benchmark.cpp new file mode 100644 index 0000000000..10d839c58c --- /dev/null +++ b/benchmarks/trigonometry_benchmark.cpp @@ -0,0 +1,55 @@ +// .\Release\x64\benchmarks.exe --benchmark_repetitions=3 --benchmark_filter=BM_EvaluateElementaryFunction // NOLINT(whitespace/line_length) + +#include +#include + +#include "benchmark/benchmark.h" + +namespace principia { +namespace functions { + +static constexpr std::int64_t number_of_iterations = 1000; + +enum class Metric { Latency, Throughput }; + +template +void BM_EvaluateElementaryFunction(benchmark::State& state) { + using Value = double; + using Argument = double; + + std::mt19937_64 random(42); + std::uniform_real_distribution<> uniformly_at(-1.0, 1.0); + Argument argument = uniformly_at(random); + + if constexpr (metric == Metric::Throughput) { + Value v[number_of_iterations]; + while (state.KeepRunningBatch(number_of_iterations)) { + for (std::int64_t i = 0; i < number_of_iterations; ++i) { + v[i] = fn(argument); + } + benchmark::DoNotOptimize(v); + } + } else { + static_assert(metric == Metric::Latency); + Value v; + while (state.KeepRunningBatch(number_of_iterations)) { + for (std::int64_t i = 0; i < number_of_iterations; ++i) { + v = fn(argument); + argument = v; + } + } + } +} + +BENCHMARK_TEMPLATE(BM_EvaluateElementaryFunction, Metric::Latency, std::sin) + ->Unit(benchmark::kNanosecond); +BENCHMARK_TEMPLATE(BM_EvaluateElementaryFunction, Metric::Throughput, std::sin) + ->Unit(benchmark::kNanosecond); + +BENCHMARK_TEMPLATE(BM_EvaluateElementaryFunction, Metric::Latency, std::cos) + ->Unit(benchmark::kNanosecond); +BENCHMARK_TEMPLATE(BM_EvaluateElementaryFunction, Metric::Throughput, std::cos) + ->Unit(benchmark::kNanosecond); + +} // namespace functions +} // namespace principia From 24178f92e59b486e9aac8fa5d32b2e4916859255 Mon Sep 17 00:00:00 2001 From: pleroy Date: Wed, 17 Apr 2024 19:42:09 +0200 Subject: [PATCH 2/4] Rename and a bigger range. --- benchmarks/benchmarks.vcxproj | 2 +- ...nometry_benchmark.cpp => elementary_functions_benchmark.cpp} | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename benchmarks/{trigonometry_benchmark.cpp => elementary_functions_benchmark.cpp} (96%) diff --git a/benchmarks/benchmarks.vcxproj b/benchmarks/benchmarks.vcxproj index 450a8d8398..f3b065bf92 100644 --- a/benchmarks/benchmarks.vcxproj +++ b/benchmarks/benchmarks.vcxproj @@ -18,6 +18,7 @@ + @@ -38,7 +39,6 @@ - diff --git a/benchmarks/trigonometry_benchmark.cpp b/benchmarks/elementary_functions_benchmark.cpp similarity index 96% rename from benchmarks/trigonometry_benchmark.cpp rename to benchmarks/elementary_functions_benchmark.cpp index 10d839c58c..3ecab2506e 100644 --- a/benchmarks/trigonometry_benchmark.cpp +++ b/benchmarks/elementary_functions_benchmark.cpp @@ -18,7 +18,7 @@ void BM_EvaluateElementaryFunction(benchmark::State& state) { using Argument = double; std::mt19937_64 random(42); - std::uniform_real_distribution<> uniformly_at(-1.0, 1.0); + std::uniform_real_distribution<> uniformly_at(-10.0, 10.0); Argument argument = uniformly_at(random); if constexpr (metric == Metric::Throughput) { From 6fe311a8ffedb1f8f389358a61f52322f8966344 Mon Sep 17 00:00:00 2001 From: pleroy Date: Wed, 17 Apr 2024 19:44:41 +0200 Subject: [PATCH 3/4] Missing file. --- benchmarks/benchmarks.vcxproj.filters | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/benchmarks.vcxproj.filters b/benchmarks/benchmarks.vcxproj.filters index e46445ea61..1b2d5219a1 100644 --- a/benchmarks/benchmarks.vcxproj.filters +++ b/benchmarks/benchmarks.vcxproj.filters @@ -86,7 +86,7 @@ Source Files - + Source Files From 04570ffe6bec277244194eb7285cd8e432bdb41e Mon Sep 17 00:00:00 2001 From: pleroy Date: Wed, 17 Apr 2024 21:44:48 +0200 Subject: [PATCH 4/4] After egg's review. --- benchmarks/elementary_functions_benchmark.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/benchmarks/elementary_functions_benchmark.cpp b/benchmarks/elementary_functions_benchmark.cpp index 3ecab2506e..10d839c58c 100644 --- a/benchmarks/elementary_functions_benchmark.cpp +++ b/benchmarks/elementary_functions_benchmark.cpp @@ -18,7 +18,7 @@ void BM_EvaluateElementaryFunction(benchmark::State& state) { using Argument = double; std::mt19937_64 random(42); - std::uniform_real_distribution<> uniformly_at(-10.0, 10.0); + std::uniform_real_distribution<> uniformly_at(-1.0, 1.0); Argument argument = uniformly_at(random); if constexpr (metric == Metric::Throughput) {