2026-02-17 20:51:36 -08:00
|
|
|
#include <benchmark/benchmark.h>
|
|
|
|
|
#include <Eigen/Core>
|
|
|
|
|
#include <unsupported/Eigen/FFT>
|
|
|
|
|
#include <complex>
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
|
|
|
|
using namespace Eigen;
|
|
|
|
|
|
|
|
|
|
template <typename T, bool Forward, bool Unscaled = false, bool HalfSpec = false>
|
|
|
|
|
static void BM_FFT(benchmark::State& state) {
|
|
|
|
|
typedef typename NumTraits<T>::Real ScalarType;
|
|
|
|
|
typedef std::complex<ScalarType> Complex;
|
|
|
|
|
int nfft = state.range(0);
|
|
|
|
|
std::vector<T> inbuf(nfft);
|
|
|
|
|
std::vector<Complex> outbuf(nfft);
|
|
|
|
|
FFT<ScalarType> fft;
|
|
|
|
|
if (Unscaled) fft.SetFlag(fft.Unscaled);
|
|
|
|
|
if (HalfSpec) fft.SetFlag(fft.HalfSpectrum);
|
|
|
|
|
std::fill(inbuf.begin(), inbuf.end(), T(0));
|
|
|
|
|
fft.fwd(outbuf, inbuf);
|
|
|
|
|
|
|
|
|
|
for (auto _ : state) {
|
|
|
|
|
if (Forward)
|
|
|
|
|
fft.fwd(outbuf, inbuf);
|
|
|
|
|
else
|
|
|
|
|
fft.inv(inbuf, outbuf);
|
|
|
|
|
benchmark::DoNotOptimize(outbuf.data());
|
|
|
|
|
benchmark::DoNotOptimize(inbuf.data());
|
|
|
|
|
}
|
|
|
|
|
double mflops_per_iter = 5.0 * nfft * std::log2(static_cast<double>(nfft));
|
|
|
|
|
if (!NumTraits<T>::IsComplex) mflops_per_iter /= 2;
|
|
|
|
|
state.counters["MFLOPS"] =
|
|
|
|
|
benchmark::Counter(mflops_per_iter, benchmark::Counter::kIsIterationInvariantRate, benchmark::Counter::kIs1000);
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-20 17:42:07 -07:00
|
|
|
// clang-format off
|
|
|
|
|
#define FFT_SIZES \
|
|
|
|
|
->Arg(64)->Arg(128)->Arg(256)->Arg(512)->Arg(1024)->Arg(2048) \
|
|
|
|
|
->Arg(4096)->Arg(8192)->Arg(16384)->Arg(65536) \
|
|
|
|
|
->Arg(1000)->Arg(5000)
|
|
|
|
|
BENCHMARK(BM_FFT<std::complex<float>, true>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<std::complex<float>, false>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<float, true>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<float, false>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<std::complex<double>, true>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<std::complex<double>, false>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<double, true>) FFT_SIZES;
|
|
|
|
|
BENCHMARK(BM_FFT<double, false>) FFT_SIZES;
|
|
|
|
|
#undef FFT_SIZES
|
|
|
|
|
// clang-format on
|