From 86e3c2232ff6abdab8f2b361fdb44cba0f779e5b Mon Sep 17 00:00:00 2001 From: Jean Pierre Cimalando Date: Thu, 2 Apr 2020 09:15:54 +0200 Subject: [PATCH] Add the benchmark for string resonator --- benchmarks/BM_stringResonator.cpp | 103 ++++++++++++++++++++++++++++++ benchmarks/CMakeLists.txt | 10 +++ 2 files changed, 113 insertions(+) create mode 100644 benchmarks/BM_stringResonator.cpp diff --git a/benchmarks/BM_stringResonator.cpp b/benchmarks/BM_stringResonator.cpp new file mode 100644 index 00000000..2ddbaa6b --- /dev/null +++ b/benchmarks/BM_stringResonator.cpp @@ -0,0 +1,103 @@ +// SPDX-License-Identifier: BSD-2-Clause + +// This code is part of the sfizz library and is licensed under a BSD 2-clause +// license. You should have receive a LICENSE.md file along with the code. +// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz + +#include "Macros.h" +#include "ScopedFTZ.h" +#include "MathHelpers.h" +#include "SIMDConfig.h" +#include "effects/impl/ResonantArray.h" +#include "effects/impl/ResonantArraySSE.h" +#include "effects/impl/ResonantArrayAVX.h" +#include +#include +#include + +class AddArray : public benchmark::Fixture { +public: + void SetUp(const ::benchmark::State& state) { + std::random_device rd { }; + std::mt19937 gen { rd() }; + + numStrings = state.range(0); + pitches.resize(numStrings); + bandwidths.resize(numStrings); + feedbacks.resize(numStrings); + gains.resize(numStrings); + + std::generate(pitches.begin(), pitches.end(), [&]() { + std::uniform_int_distribution<> dist {0, 127}; + return midiNoteFrequency(dist(gen)); + }); + + std::fill(bandwidths.begin(), bandwidths.end(), 1.0f); + std::fill(feedbacks.begin(), feedbacks.end(), std::exp(-6.91 / (50e-3 * sampleRate))); + std::fill(gains.begin(), gains.end(), 1e-3f); + + input.resize(numFrames); + output.resize(numFrames); + + std::generate(input.begin(), input.end(), [&]() { + std::uniform_real_distribution<> dist {-1, 1}; + return dist(gen); + }); + } + + void TearDown(const ::benchmark::State& state) { + UNUSED(state); + } + + static constexpr float sampleRate = 44100; + static constexpr unsigned numFrames = sampleRate * 5.0; + std::vector input; + std::vector output; + unsigned numStrings = 0; + std::vector pitches; + std::vector bandwidths; + std::vector feedbacks; + std::vector gains; +}; + +BENCHMARK_DEFINE_F(AddArray, StringResonator_Scalar)(benchmark::State& state) { + ScopedFTZ ftz; + sfz::fx::ResonantArrayScalar resonator; + resonator.setup(sampleRate, numStrings, pitches.data(), bandwidths.data(), feedbacks.data(), gains.data()); + resonator.setSamplesPerBlock(numFrames); + for (auto _ : state) + { + resonator.process(input.data(), output.data(), numFrames); + } +} + +#if SFIZZ_CPU_FAMILY_X86_64 || SFIZZ_CPU_FAMILY_I386 +BENCHMARK_DEFINE_F(AddArray, StringResonator_SSE)(benchmark::State& state) { + ScopedFTZ ftz; + sfz::fx::ResonantArraySSE resonator; + resonator.setup(sampleRate, numStrings, pitches.data(), bandwidths.data(), feedbacks.data(), gains.data()); + resonator.setSamplesPerBlock(numFrames); + for (auto _ : state) + { + resonator.process(input.data(), output.data(), numFrames); + } +} + +BENCHMARK_DEFINE_F(AddArray, StringResonator_AVX)(benchmark::State& state) { + ScopedFTZ ftz; + sfz::fx::ResonantArrayAVX resonator; + resonator.setup(sampleRate, numStrings, pitches.data(), bandwidths.data(), feedbacks.data(), gains.data()); + resonator.setSamplesPerBlock(numFrames); + for (auto _ : state) + { + resonator.process(input.data(), output.data(), numFrames); + } +} +#endif + +BENCHMARK_REGISTER_F(AddArray, StringResonator_Scalar)->RangeMultiplier(4)->Range(1, 128); +#if SFIZZ_CPU_FAMILY_X86_64 || SFIZZ_CPU_FAMILY_I386 +BENCHMARK_REGISTER_F(AddArray, StringResonator_SSE)->RangeMultiplier(4)->Range(1, 128); +BENCHMARK_REGISTER_F(AddArray, StringResonator_AVX)->RangeMultiplier(4)->Range(1, 128); +#endif +BENCHMARK_MAIN(); diff --git a/benchmarks/CMakeLists.txt b/benchmarks/CMakeLists.txt index 3da1d309..493f450e 100644 --- a/benchmarks/CMakeLists.txt +++ b/benchmarks/CMakeLists.txt @@ -93,6 +93,15 @@ target_link_libraries(bm_filterModulation PRIVATE sfizz-sndfile) sfizz_add_benchmark(bm_filterStereoMono BM_filterStereoMono.cpp ../src/sfizz/SfzFilter.cpp) target_link_libraries(bm_filterStereoMono PRIVATE sfizz-sndfile) +sfizz_add_benchmark(bm_stringResonator BM_stringResonator.cpp + ../src/sfizz/effects/impl/ResonantArray.cpp + ../src/sfizz/effects/impl/ResonantArraySSE.cpp + ../src/sfizz/effects/impl/ResonantArrayAVX.cpp + ../src/sfizz/effects/impl/ResonantString.cpp + ../src/sfizz/effects/impl/ResonantStringSSE.cpp + ../src/sfizz/effects/impl/ResonantStringAVX.cpp) +target_link_libraries(bm_stringResonator PRIVATE sfizz-sndfile) + add_custom_target(sfizz_benchmarks) add_dependencies(sfizz_benchmarks bm_opf_high_vs_low @@ -126,6 +135,7 @@ add_dependencies(sfizz_benchmarks bm_flacfile bm_filterModulation bm_filterStereoMono + bm_stringResonator ) if (TARGET bm_resample)