Skip to content

v0.6.0 — Pi 5 (Cortex-A76 / V3D) optimization pass

Latest

Choose a tag to compare

@n4hy n4hy released this 10 Jul 18:06
4458859

Raspberry Pi 5 (Cortex-A76 / VideoCore VII "V3D") optimization pass. 17/17 test suites pass; all newly-threaded kernels are ThreadSanitizer-clean.

Highlights (measured on a Pi 5)

  • Multi-core threading (OpenMP) across GEMM, 2D convolution, CAF, CFAR, MTI, and Doppler FFT (~2–2.5×; LPDDR4X-bandwidth-bound).
  • Int8 SDOT GEMM (neon_gemm_s8s8s32): cache-blocked vdotq_s32 matmul — ~90–109 GOP/s, ≈13× the fp32 GEMM — plus an int8 conv2d.
  • Radix-2 FFT Doppler: replaces the O(N²) per-element DFT — ~290× faster, matches the DFT to 1e-7.
  • fp32 GEMM: public neon_gemm routes to the blocked 8×8 path; L2-aware cache blocking; fixed B-packing.
  • Lane-batched 4-channel biquad (neon_biquad_x4_f32, ~2×); NEON atan2 complex phase; SIMD CFAR reference-window sum.
  • Vulkan: CPU/GPU offload thresholds (small/memory-bound work stays on the faster CPU), cached descriptor pool / command buffer / VkFence (per-dispatch overhead 4.76 → 2.89 ms), and crash-guards on every GPU wrapper.
  • Build: -fno-math-errno / -fno-semantic-interposition (IEEE-preserving); runtime has_dotprod/has_fp16 detection; ENABLE_CUDA defaults off on ARM.

Honest negative result

  • fp16 GEMM/GEMV removed — the Cortex-A76 lacks FEAT_FHM, so fp16-with-fp32-accumulation is ~3.3× slower than the fp32 FMA path. Only the genuinely-2× fp16 elementwise ops are kept.

Merged via #4 (kernels), #5 (docs + benchmarks), #6 (polish), #7 (version bump).