Skip to content

v0.17.0

Choose a tag to compare

@tannevaled tannevaled released this 18 Oct 13:51
· 13 commits to main since this release
8b51948

FFT kernel builders (#28)

go-fft's SIMD kernel generators now live here, one package per architecture:

  • fft/amd64:

    • Stockham passes of radix 2, 3, 4, 5, 8, 9, 10, 12, 15, 16 and 20 (AVX2), and radix 2, 4 and 8 at 512 bits;
    • final, batched, strided and run-writing passes;
    • the split layouts at 256 and 512 bits;
    • float32 passes;
    • the real-FFT untangle and retangle;
    • SSE2 and AVX2 complex products;
    • the two- and three-pass stack-frame trampolines and their address table.

    Kernels.FMA builds the fused twins: the twiddle product, radix 8's √2/2, and the radix-9 and -16 internal twiddles.

  • fft/arm64:

    • NEON passes of radix 2, 3, 4, 5 and 8 in float64 and float32: pass, final pass, batched pass, block-split layout;
    • the untangle and retangle;
    • the complex product.
  • fft/riscv64 and fft/s390x: the RVV and vector-facility complex products.

Each builder appends one TEXT block to an emit.File. The caller supplies:

  • the symbol;
  • the constants-table offsets (Consts, SplitConsts);
  • on amd64, FMA.

The arguments, registers and frame are the kernel's own, and are documented on each builder.

Verification:

  • Every file go-fft generates is pinned, by SHA-256, to the bytes go-fft commits. That covers go-fft main's 21 .s files and the 3 FMA files of its Round 41 branch.
  • Golden files pin one or two kernels of every builder.
  • Every kernel goes through the Go assembler.
  • examples/fft/<arch> runs the complex products and a 16-point FFT on each architecture.
  • The library gate covers ./fft/... at 100%.

No change to the existing packages.