Skip to content

Benchmarks ​

Interim numbers

The figures and numbers on this page are the development state: one round per case, measured on the machines listed at the bottom under their normal load, at the commits given below. The measurement campaign on quiet machines will replace them; the protocol below is already the one the campaign follows.

The numbers in the text are read from the summaries that the figure scripts write (bench/fig_speedup.jl, bench/fig_standing.jl), so text and figures come from the same data.

Which library to depend on ​

This figure asks the question a package author faces: which single library to depend on. Per case, the fold change is the time of the fastest other library divided by this library's time; right of the parity line is a win, left of it a loss, and wins are not clipped at 1. The box is the quartile rectangle with the median line and Tukey whiskers, the points are the raw cases. Colour marks the library. The label under each column carries the fold factor (the geometric mean of the fold changes over the cases the library itself computes), the win rate, and the coverage: libraries that lack transform kinds (ducc0 without DCT/DST, vDSP with c2c and DCT-II only, MPSGraph and cuFFT without real-to-real at all) compute their factor over a smaller subset, so the coverage is part of the label.

FFTL is the only library that runs in all six panels and computes every kind. Its fold factor ranges from 0.88× to 1.44× over the panels. It is below 1 on the NVIDIA A6000 (0.88×), where VkFFT has the highest factor (1.03×); see Platforms and limits.

How FFTL compares ​

The speed-up is the time of the fastest other library for that case divided by FFTL's time; above 1 (shaded), FFTL is faster. One marker per transform; colour is the precision, shape the kind; open triangles at the panel edge mark values beyond the axis. In the two multi-thread panels every library is timed at its better setting per case, the minimum over one and all threads, so FFTW is not charged for spreading tiny transforms over many threads. Transforms that no competitor computes (DCT and DST in cuFFT and MPSGraph, most real-to-real kinds) are not plotted. The table gives the share of cases in which FFTL is faster than the fastest other library, and the median speed-up; on the A6000, small transforms are bound by kernel launches.

platformcompetitorsFFTL faster inmedian speed-upcases
Apple M1 Max, 1 threadFFTW, ducc0, vDSP90 %1.34×386
AMD EPYC 7702, 1 threadFFTW, ducc079 %1.27×386
Apple M1 Max, 8 threadsFFTW, ducc092 %1.39×386
AMD EPYC 7702, 16 threadsFFTW, ducc075 %1.26×386
Apple M1 Max GPUMPSGraph, VkFFT73 %1.24×119
NVIDIA RTX A6000cuFFT, VkFFT22 %0.88×119

The data is the overview set in bench/results. Each data file has a .meta file with its provenance; the table lists the FFTL commit and the start of each run.

dataFFTL commitmeasured
overview-a6000-gpu-kinds.csv49648b32026-11-03
overview-m1-gpu-kinds-0ab2ed0.csvfec5b702026-11-06
overview-m1-t1-kinds-0ab2ed0.csv9e9bcc22026-11-06
overview-m1-t1-kinds-8e31d3a.csv8e31d3a2026-11-07
overview-m1-t8-kinds-0ab2ed0.csvfec5b702026-11-06
overview-m1-t8-kinds-8e31d3a.csv8e31d3a2026-11-07
overview-reco2-t1-kinds-8e31d3a.csv8e31d3a2026-11-07
overview-reco2-t1-kinds-f825bee.csvf825bee2026-11-06
overview-reco2-t16-kinds-8e31d3a.csv8e31d3a2026-11-07
overview-reco2-t16-kinds-f825bee.csvf825bee2026-11-06

What the campaign covers ​

  • Complex, real and real-to-real transforms on the CPU, 1D to 3D, Float32 and Float64, against the competitors that support the same kind. Each kind has its own column; kinds without a competitor are shown separately.

  • Threads. The same sizes with one thread and with the number of threads of the machine, with the noise band of each machine.

  • GPU. Complex, real and real-to-real transforms against the vendor library (cuFFT on CUDA, MPSGraph and Metal.jl's FFT on Metal) and against VkFFT.

  • libfftl. The C library against the Julia package.

  • Planning. The cost of the first plan in a fresh process, separate from the execution time.

  • Accuracy. Error against a high-precision reference over the same sizes.

How it is measured ​

The protocol is described on the Performance page: A/B runs on the same machine, medians of interleaved runs, A/A runs for the noise band, and sizes reported separately from the sizes used for tuning.

Machines ​

machinerole
Apple M1 Maxdevelopment machine, CPU and Metal GPU
AMD EPYC 7702 (Zen 2, 2 sockets, AVX2)x86-64 CPU of the figures above
AMD EPYC 7763 (Zen 3, 2 sockets, AVX2)x86-64 development machine; hosts the A6000
NVIDIA RTX A6000CUDA GPU

Each result names the library, its version, the build flags and the thread count. Competitors are built from their current releases with native CPU flags; FFTW is planned with MEASURE.

Status ​

partstatus
harness, protocol and figuresprepared
campaign (quiet machines, several rounds, held-out sizes)planned