Add sinf/cosf/sincosf benchmark
Similar to expf/exp2f, this patch add two benchmarks for sinf, cosf, and
sincosf: one which measures thoughput as default and one which measures
latency.
The input in 512 random value divided in 8 ranges:
1. 0.0 <= x < 0.1
2. 0.1 <= x < 0.7
3. 0.7 <= x < 3.1
4. -3.1 <= x < 3.1
5. 3.3 <= x < 33.3
6. 100.0 <= x < 1000.0
7. 1e6 <= x < 1e32
8. 1e32 < x < FLT_MAX
Test: ran 32-bit and 64-bit x86 tests on host
Change-Id: I92bc2f1fac911c573c5122911d08ca590311578a
diff --git a/benchmarks/math_benchmark.cpp b/benchmarks/math_benchmark.cpp
index 3e5f81e..d64830a 100644
--- a/benchmarks/math_benchmark.cpp
+++ b/benchmarks/math_benchmark.cpp
@@ -348,3 +348,97 @@
}
}
BIONIC_BENCHMARK(BM_math_log2f_speccpu2017_latency);
+
+// Four ranges of values are checked:
+// * 0.0 <= x < 0.1
+// * 0.1 <= x < 0.7
+// * 0.7 <= x < 3.1
+// * -3.1 <= x < 3.1
+// * 3.3 <= x < 33.3
+// * 100.0 <= x < 1000.0
+// * 1e6 <= x < 1e32
+// * 1e32 < x < FLT_MAX
+
+#include "sincosf_input.cpp"
+
+static void BM_math_sinf(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ f = sinf(*cin);
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_sinf, "MATH_SINCOS_COMMON");
+
+static void BM_math_sinf_latency(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ f = sinf(f * zero + *cin);
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_sinf_latency, "MATH_SINCOS_COMMON");
+
+static void BM_math_cosf(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ f = cosf(*cin);
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_cosf, "MATH_SINCOS_COMMON");
+
+static void BM_math_cosf_latency(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ f = cosf(f * zero + *cin);
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_cosf_latency, "MATH_SINCOS_COMMON");
+
+static void BM_math_sincosf(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ float s, c;
+ sincosf(*cin, &s, &c);
+ f += s;
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_sincosf, "MATH_SINCOS_COMMON");
+
+static void BM_math_sincosf_latency(benchmark::State& state) {
+ auto range = sincosf_input[state.range(0)];
+ auto cin = range.values.cbegin();
+ f = 0.0;
+ for (auto _ : state) {
+ float s, c;
+ sincosf(f * zero + *cin, &s, &c);
+ f += s;
+ if (++cin == range.values.cend())
+ cin = range.values.cbegin();
+ }
+ state.SetLabel(range.label);
+}
+BIONIC_BENCHMARK_WITH_ARG(BM_math_sincosf_latency, "MATH_SINCOS_COMMON");