Verkar som FFT inte skalar med kärnor, även med 100 000 samples används bara en kärna både på Ubuntu 22.04 och MacOS (det är då testat mer 3 olika ramverk, FFTW, Arm ComputeLibrary samt Apple Accelerate).
För långa fft-längder skalar det rätt bra, men man måste aktivt be om multitrådning och säga hur många trådar man vill använda.
Åtta kärnor:
#include <fftw3.h>
#include <chrono>
#include <iostream>
const int fftSize = 1024*100;
fftwf_complex* fftInput;
fftwf_complex* fftOutput;
fftwf_plan fftPlan;
int main(int argc, char *argv[])
{
fftwf_init_threads();
fftwf_plan_with_nthreads(8);
fftwf_import_wisdom_from_filename("wisdom.dat");
fftInput = fftwf_alloc_complex(fftSize);
fftOutput = fftwf_alloc_complex(fftSize);
fftPlan = fftwf_plan_dft_1d(fftSize, fftInput, fftOutput, FFTW_FORWARD, FFTW_MEASURE | FFTW_PRESERVE_INPUT);
fftwf_export_wisdom_to_filename("wisdom.dat");
for(int i = 0; i < fftSize; ++i)
{
fftInput[i][0] = rand()%1000000;
fftInput[i][1] = rand()%1000000;
}
std::chrono::high_resolution_clock::time_point t1 = std::chrono::high_resolution_clock::now();
const int N = 1000;
for(int q = 0; q < N; ++q)
fftwf_execute(fftPlan);
std::chrono::high_resolution_clock::time_point t2 = std::chrono::high_resolution_clock::now();
std::cout << "Time: " << std::chrono::duration_cast<std::chrono::duration<double>>(t2 - t1).count()/N*1000 << " ms" << std::endl;
fftwf_destroy_plan(fftPlan);
fftwf_free(fftInput);
fftwf_free(fftOutput);
fftwf_cleanup_threads();
}
0,09 ms (i7 8700k).