#include #include #include #include #include using namespace Eigen; template static void BM_FFT(benchmark::State& state) { typedef typename NumTraits::Real ScalarType; typedef std::complex Complex; int nfft = state.range(0); std::vector inbuf(nfft); std::vector outbuf(nfft); FFT 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(nfft)); if (!NumTraits::IsComplex) mflops_per_iter /= 2; state.counters["MFLOPS"] = benchmark::Counter(mflops_per_iter, benchmark::Counter::kIsIterationInvariantRate, benchmark::Counter::kIs1000); } BENCHMARK(BM_FFT, true>)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT, false>)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT, true>)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT, false>)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT)->Arg(1024)->Arg(4096); BENCHMARK(BM_FFT)->Arg(1024)->Arg(4096);