diff --git a/benchmarks/BM_cumsum.cpp b/benchmarks/BM_cumsum.cpp index 08a49859..b91afe0e 100644 --- a/benchmarks/BM_cumsum.cpp +++ b/benchmarks/BM_cumsum.cpp @@ -29,12 +29,12 @@ #include #include "../sfizz/SIMDHelpers.h" -class CumsumArray : public benchmark::Fixture { +class CumArray : public benchmark::Fixture { public: void SetUp(const ::benchmark::State& state) { std::random_device rd { }; std::mt19937 gen { rd() }; - std::uniform_real_distribution dist { 0, 1 }; + std::uniform_real_distribution dist { 0.1, 1 }; input = std::vector(state.range(0)); output = std::vector(state.range(0)); std::generate(input.begin(), input.end(), [&]() { return dist(gen); }); @@ -49,36 +49,37 @@ public: }; -BENCHMARK_DEFINE_F(CumsumArray, Scalar)(benchmark::State& state) { +BENCHMARK_DEFINE_F(CumArray, Sum_Scalar)(benchmark::State& state) { for (auto _ : state) { cumsum(input, absl::MakeSpan(output)); } } -BENCHMARK_DEFINE_F(CumsumArray, SIMD)(benchmark::State& state) { +BENCHMARK_DEFINE_F(CumArray, Sum_SIMD)(benchmark::State& state) { for (auto _ : state) { cumsum(input, absl::MakeSpan(output)); } } -BENCHMARK_DEFINE_F(CumsumArray, Scalar_Unaligned)(benchmark::State& state) { +BENCHMARK_DEFINE_F(CumArray, Sum_Scalar_Unaligned)(benchmark::State& state) { for (auto _ : state) { cumsum(absl::MakeSpan(input).subspan(1), absl::MakeSpan(output).subspan(1)); } } -BENCHMARK_DEFINE_F(CumsumArray, SIMD_Unaligned)(benchmark::State& state) { +BENCHMARK_DEFINE_F(CumArray, Sum_SIMD_Unaligned)(benchmark::State& state) { for (auto _ : state) { cumsum(absl::MakeSpan(input).subspan(1), absl::MakeSpan(output).subspan(1)); } } -BENCHMARK_REGISTER_F(CumsumArray, Scalar)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); -BENCHMARK_REGISTER_F(CumsumArray, SIMD)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); -BENCHMARK_REGISTER_F(CumsumArray, Scalar_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); -BENCHMARK_REGISTER_F(CumsumArray, SIMD_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); + +BENCHMARK_REGISTER_F(CumArray, Sum_Scalar)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(CumArray, Sum_SIMD)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(CumArray, Sum_Scalar_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); +BENCHMARK_REGISTER_F(CumArray, Sum_SIMD_Unaligned)->RangeMultiplier(4)->Range(1 << 2, 1 << 12); BENCHMARK_MAIN(); \ No newline at end of file diff --git a/sfizz/SIMDDummy.cpp b/sfizz/SIMDDummy.cpp index f91549de..cbb98be6 100644 --- a/sfizz/SIMDDummy.cpp +++ b/sfizz/SIMDDummy.cpp @@ -148,4 +148,4 @@ template <> void cumsum(absl::Span input, absl::Span output) noexcept { cumsum(input, output); -} \ No newline at end of file +} diff --git a/sfizz/SIMDHelpers.h b/sfizz/SIMDHelpers.h index c06ca20b..2647e709 100644 --- a/sfizz/SIMDHelpers.h +++ b/sfizz/SIMDHelpers.h @@ -474,4 +474,4 @@ void cumsum(absl::Span input, absl::Span output) noexcept } template <> -void cumsum(absl::Span input, absl::Span output) noexcept; \ No newline at end of file +void cumsum(absl::Span input, absl::Span output) noexcept; diff --git a/sfizz/SIMDSSE.cpp b/sfizz/SIMDSSE.cpp index f7900a81..8f702f3c 100644 --- a/sfizz/SIMDSSE.cpp +++ b/sfizz/SIMDSSE.cpp @@ -691,7 +691,7 @@ void cumsum(absl::Span input, absl::Span output while (in < lastAligned) { auto mmOffset = _mm_load_ps(in); mmOffset = _mm_add_ps(mmOffset, _mm_castsi128_ps(_mm_slli_si128(_mm_castps_si128(mmOffset), 4))); - mmOffset = _mm_add_ps(mmOffset, _mm_shuffle_ps(_mm_setzero_ps(), mmOffset, 0x40)); + mmOffset = _mm_add_ps(mmOffset, _mm_shuffle_ps(_mm_setzero_ps(), mmOffset, _MM_SHUFFLE(1, 0, 0, 0))); mmOutput = _mm_add_ps(mmOutput, mmOffset); _mm_store_ps(out, mmOutput); mmOutput = _mm_shuffle_ps(mmOutput, mmOutput, _MM_SHUFFLE(3, 3, 3, 3)); @@ -701,4 +701,4 @@ void cumsum(absl::Span input, absl::Span output while (in < sentinel) snippetCumsum(in, out); -} \ No newline at end of file +}