From 9324d137bcb28a03905ba44b54ae7febebaf7e7a Mon Sep 17 00:00:00 2001 From: paulfd Date: Sun, 15 Sep 2019 20:16:42 +0200 Subject: [PATCH] Added a "scalar add" SIMD helper --- benchmarks/BM_add.cpp | 31 +++++++++++++++++++++++++++++++ sfizz/SIMDDummy.cpp | 6 ++++++ sfizz/SIMDHelpers.h | 19 +++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/benchmarks/BM_add.cpp b/benchmarks/BM_add.cpp index 20ab8386..8221e997 100644 --- a/benchmarks/BM_add.cpp +++ b/benchmarks/BM_add.cpp @@ -49,6 +49,33 @@ public: std::vector output; }; +BENCHMARK_DEFINE_F(AddArray, Value_Scalar)(benchmark::State& state) { + for (auto _ : state) + { + add(1.1f, absl::MakeSpan(output)); + } +} + +BENCHMARK_DEFINE_F(AddArray, Value_SIMD)(benchmark::State& state) { + for (auto _ : state) + { + add(1.1f, absl::MakeSpan(output)); + } +} + +BENCHMARK_DEFINE_F(AddArray, Value_Scalar_Unaligned)(benchmark::State& state) { + for (auto _ : state) + { + add(1.1f, absl::MakeSpan(output).subspan(1)); + } +} + +BENCHMARK_DEFINE_F(AddArray, Value_SIMD_Unaligned)(benchmark::State& state) { + for (auto _ : state) + { + add(1.1f, absl::MakeSpan(output).subspan(1)); + } +} BENCHMARK_DEFINE_F(AddArray, Scalar)(benchmark::State& state) { for (auto _ : state) @@ -78,6 +105,10 @@ BENCHMARK_DEFINE_F(AddArray, SIMD_Unaligned)(benchmark::State& state) { } } +BENCHMARK_REGISTER_F(AddArray, Value_Scalar)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(AddArray, Value_SIMD)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(AddArray, Value_Scalar_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(AddArray, Value_SIMD_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); BENCHMARK_REGISTER_F(AddArray, Scalar)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); BENCHMARK_REGISTER_F(AddArray, SIMD)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); BENCHMARK_REGISTER_F(AddArray, Scalar_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); diff --git a/sfizz/SIMDDummy.cpp b/sfizz/SIMDDummy.cpp index cbb98be6..d57ead41 100644 --- a/sfizz/SIMDDummy.cpp +++ b/sfizz/SIMDDummy.cpp @@ -114,6 +114,12 @@ void add(absl::Span input, absl::Span output) n add(input, output); } +template <> +void add(float value, absl::Span output) noexcept +{ + add(value, output); +} + template <> void subtract(absl::Span input, absl::Span output) noexcept { diff --git a/sfizz/SIMDHelpers.h b/sfizz/SIMDHelpers.h index 2647e709..064999e4 100644 --- a/sfizz/SIMDHelpers.h +++ b/sfizz/SIMDHelpers.h @@ -349,6 +349,25 @@ void add(absl::Span input, absl::Span output) noexcept template <> void add(absl::Span input, absl::Span output) noexcept; +template +inline void snippetAdd(const T value, T*& output) +{ + *output++ += value; +} + +template +void add(T value, absl::Span output) noexcept +{ + auto* out = output.begin(); + auto* sentinel = output.end(); + while (out < sentinel) + snippetAdd(value, out); +} + +template <> +void add(float value, absl::Span output) noexcept; + + template inline void snippetSubtract(const T*& input, T*& output) {