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-blockedvdotq_s32matmul — ~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_gemmroutes to the blocked 8×8 path; L2-aware cache blocking; fixed B-packing. - Lane-batched 4-channel biquad (
neon_biquad_x4_f32, ~2×); NEONatan2complex 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); runtimehas_dotprod/has_fp16detection;ENABLE_CUDAdefaults 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).