docs: measured ARM numbers, and a correction
On a Raspberry Pi 5 at N = 100 000 and equal recall (0.9940 vs 0.9945), medians of three runs: f32 33 413 ms build 6 164 QPS int8 scalar 18 950 ms ~6 190 QPS (what v2.7.0 shipped) int8 NEON ~17 000 ms 6 640 QPS int8 SDOT 14 464 ms 7 267 QPS 1.18x f32, 2.3x build The docs said quantised search stayed off by default because aarch64 "falls back to the scalar loop, where the original trade still applies" — that it was ~13% slower than f32 there, as on x86. That was extrapolated rather than measured, and it was wrong: x86's portable baseline is SSE2 against hand-written AVX2 f32 kernels, but on aarch64 NEON is the baseline and the scalar loop vectorises well, so it already matched f32. Corrected in BENCHMARKS.md, README.md and CLAUDE.md; the released v2.7.0 changelog entry is left as it was and the correction is recorded in a new one. Labelled as Pi 5 figures throughout — a Pi's memory bandwidth and cache are far below an M-series or flagship phone, so the ratios will move. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
This commit is contained in:
@@ -1,5 +1,30 @@
|
||||
# Changelog
|
||||
|
||||
## Unreleased
|
||||
|
||||
### Performance
|
||||
- `clawhdf5-accel`: **`dot_i8` has aarch64 kernels** — `SDOT` for CPUs with
|
||||
the ARMv8.2 dot-product extension (Cortex-A76 and later, Neoverse-N1, every
|
||||
Apple Silicon generation) and plain NEON (`vmull_s8` + `vpadalq_s16`) for
|
||||
the rest, selected at runtime. `SDOT` is issued through inline assembly,
|
||||
because the `vdotq_s32` intrinsic is still behind the unstable
|
||||
`stdarch_neon_dotprod` feature. On a Raspberry Pi 5 at N = 100 000 and
|
||||
equal recall, the quantised index answers **1.18x the queries per second**
|
||||
of f32 (7 267 vs 6 164) and builds **2.3x faster** (14 464 vs 33 413 ms).
|
||||
Both kernels are tested bit-for-bit against scalar on real hardware, each
|
||||
explicitly — dispatch only ever takes one path on a given CPU, so testing
|
||||
through it alone would have left the plain-NEON fallback unexercised on any
|
||||
machine with `SDOT`.
|
||||
|
||||
### Corrections
|
||||
- The v2.7.0 entry for `dot_i8` said `quantized_index` stayed off by default
|
||||
because "aarch64 falls back to the scalar loop", implying the ~13% search
|
||||
penalty measured on x86 applied on ARM too. It did not. That figure came
|
||||
from scalar int8 against hand-written AVX2 f32 kernels on x86, whose
|
||||
portable baseline is SSE2; on aarch64 NEON is the baseline, and measured on
|
||||
a Pi 5 the scalar int8 loop already matched f32 for search while building
|
||||
1.76x faster. The claim was extrapolated rather than measured.
|
||||
|
||||
## v2.7.0 (2026-09-20)
|
||||
|
||||
### Upgrade Notes
|
||||
|
||||
Reference in New Issue
Block a user