sz::splitand the other 13 range helpers took the haystack by value —sz::split(view, "-")never compiled, and an owning lvalue was deep-copied so every returned offset pointed into a private copy and was meaningless against your own iterators. Under SSO the offsets came back small and plausible rather than obviously wrong.- Rolling fingerprints published uninitialized counts. A chunk shorter than the window completes no hash and never overwrote the min-count accumulators, so results were stack garbage — a 3-byte text reported 1,006,634,040 against 0 from the per-text path — and reused scratch folded one text's counts into the next.
- CUDA contexts are now bound per device and per thread. A current context is per-thread state the driver never creates implicitly, so a scope scheduled on one thread left every other thread with none; kernel tables and timers are keyed by device now.
- CPU capabilities were discarded when no GPU was present. Any driver error other than "no device" returned
sz_caps_none_k, so driver-less machines and containers reported no backends at all and silently lost every SIMD tier. - Similarity scoring fixed on degenerate and wide-cell shapes across every backend, along with gap-track seeding at the boundary and per-pair DP cell sizing.
- Cross-product similarity now batches cells into lockstep launches. Every engine dispatched one cell per scheduler prong while the kernels underneath score 2-64, so a prong filled one lane, idled the rest, and paid the full vector cost — the batched kernels never engaged under the parallel executor. Fixed across serial, NEON, Haswell, Ice Lake and RVV.
sz_isasciihelper is retired in favour of an ISA-specific byteset scan. The old SWAR loop could never reach the SIMD kernels; callers now name the backend explicitly and one that names none fails to compile instead of silently settling for the serial tier. 4.9 ns on NEON vs 7.0 ns for the retired SWAR over 100-byte inputs.- Packaging: free-threaded Python 3.14 (
cp314t) wheels, CUDA-on-Arm wheels building under Clang as host compiler, and the Swift package building on Windows.
Patch
- Docs: Refresh the v5 performance table (065c3c1)
- Fix: Build CUDA-on-Arm wheels with Clang as the host compiler (8ef6be4)
- Docs: Mention preliminary Java & C# support (4eccd43)
- Make: Decompose CMake helpers and unify capability naming (9da22cf)
- Fix: Honor tier overrides, multi-config builds, and stale probe caches (f3378b2)
- Make: Regroup StringZillas sources by capability tier (a4185d3)
- Fix: Make StringZillas capability narrowing reversible (9337409)
- Fix: Keep CPU capabilities when no GPU is present (169ac9a)
- Fix: Mark cross-product test constants maybe-unused (122cd1e)
- Fix: Cover degenerate and wide-cell similarity shapes on every backend (7478e42)
- Fix: Guard degenerate cells and match warp kernels to cell width (fa3a4db)
- Fix: Align UTF-8 break page LUTs to 64 bytes (d4122ab)
- Fix: Clear rolling counts before each fingerprint chunk (ff741d4)
- Fix: Detect host-accessible allocators without concepts (48785e9)
- Fix: Resolve the GPU scope through one binder (fe72a2a)
- Fix: Bind a CUDA context per device, per thread (29db56e)
- Fix: Local min/max operators for block reductions (f4ffe61)
- Fix: Size per-pair DP cells from the materialized reach (9e10818)
- Improve: One reach derivation for the candidate-lane tiers (aae7865)
- Fix: Seed discarded gap tracks one step above the boundary (96152db)
- Improve: Draw fuzzy corpora one UTF-8 character at a time (82d480e)
- Improve: Skip the rune and affine planes when inputs allow (d0bd183)
- Improve: Retire
sz_isasciifor a byteset scan (050d5f6) - Fix: Inline linkage on
sz_rfind_byte_serial(0e21398) - Make: Build free-threaded
cp314twheels (3f430ac) - Improve: Serialize StringZillas engines per object (70eee2e)
- Improve: Batch cross-product cells into lockstep launches (87294b5)
- Fix: Borrow range haystacks instead of copying them (be0a712)
- Fix: Materialize concatenation expressions from views and literals (9dc777a)
- Fix: Build the Swift package on Windows under clang (cfc5c80)