From 4c8fea75938d0d48631cef5b695d870ad280c1ac Mon Sep 17 00:00:00 2001 From: Steven Atkinson Date: Sun, 8 Sep 2024 15:16:54 -0700 Subject: [PATCH] More efficient pre-warming using multiple-sample buffers --- NAM/dsp.cpp | 20 ++++++++++++++------ tools/benchmodel.cpp | 8 ++++---- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/NAM/dsp.cpp b/NAM/dsp.cpp index b945789..b15fc62 100644 --- a/NAM/dsp.cpp +++ b/NAM/dsp.cpp @@ -25,14 +25,22 @@ void nam::DSP::prewarm() if (prewarmSamples == 0) return; - NAM_SAMPLE sample = 0; - NAM_SAMPLE* sample_ptr = &sample; + const size_t bufferSize = std::max(mMaxBufferSize, 1); + std::vector inputBuffer, outputBuffer; + inputBuffer.resize(bufferSize); + outputBuffer.resize(bufferSize); + for (auto it = inputBuffer.begin(); it != inputBuffer.end(); ++it) + { + (*it) = (NAM_SAMPLE)0.0; + } - // pre-warm the model for a model-specific number of samples - for (long i = 0; i < prewarmSamples; i++) + NAM_SAMPLE* inputPtr = inputBuffer.data(); + NAM_SAMPLE* outputPtr = outputBuffer.data(); + int samplesProcessed = 0; + while (samplesProcessed < prewarmSamples) { - this->process(sample_ptr, sample_ptr, 1); - sample = 0; + this->process(inputPtr, outputPtr, bufferSize); + samplesProcessed += bufferSize; } } diff --git a/tools/benchmodel.cpp b/tools/benchmodel.cpp index 99f3923..3f175d0 100644 --- a/tools/benchmodel.cpp +++ b/tools/benchmodel.cpp @@ -37,7 +37,6 @@ int main(int argc, char* argv[]) exit(1); } - auto t1 = high_resolution_clock::now(); size_t bufferSize = AUDIO_BUFFER_SIZE; model->Reset(model->GetExpectedSampleRate(), bufferSize); @@ -49,17 +48,18 @@ int main(int argc, char* argv[]) { inputBuffer[i] = 0.0; } + // Run once outside to trigger any pre-allocation + model->process(inputBuffer, outputBuffer, AUDIO_BUFFER_SIZE); std::cout << "Running benchmark\n"; - + auto t1 = high_resolution_clock::now(); for (size_t i = 0; i < numBuffers; i++) { model->process(inputBuffer, outputBuffer, AUDIO_BUFFER_SIZE); } - + auto t2 = high_resolution_clock::now(); std::cout << "Finished\n"; - auto t2 = high_resolution_clock::now(); /* Getting number of milliseconds as an integer. */ auto ms_int = duration_cast(t2 - t1);