mirror of
https://github.com/bdbrown4/peltier.io.git
synced 2026-11-07 19:08:27 +00:00
Commit the spec and scaffold the system it describes:
- SPEC.md: the full v0.1 engineering spec
- crates/: trust-layer Rust workspace, unit-tested
- bench-runner: interleaved ABAB scheduling with discarded warm-ups,
deterministic bootstrap CIs over the ratio of medians,
CI-lower-bound accept rule, env fingerprinting, and a CLI with
compare + A/A self-test modes (A/A verified passing end-to-end)
- diff-test: gate outcome model, sha256 corpus pin verifier that
refuses on mismatch, per-target equivalence policy parser
(byte-identical default, explicit fp-tolerance opt-in)
- ledger: append-only SQLite attempt schema with UPDATE/DELETE
refused by triggers, anti-double-attempt query
- report: cores-saved and dollars/yr ROI math over speedup CIs,
pricing.toml inputs
- playbook/: classes 1-7 with preconditions, procedure, verification
notes, and known failure modes per class
- agent/: Python package skeleton — six-tool contract and prompting
spine, harness IPC deferred to Phase 1
- config/: accept.toml (2% threshold, 30 runs/side), pricing.toml
- targets/, corpora/, results/calibration/: layout and policy docs
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EcKPWQ3MQD4NdEHwar96u2
2.0 KiB
2.0 KiB
Class 6 — SIMD
Autovectorization enablement first, intrinsics last (SPEC §4).
Preconditions
- Profile signature: hot, trip-count-heavy inner loops over contiguous numeric/byte data; scalar math or byte-wise processing in the top frames; disassembly of the hot loop shows scalar ops where vector ops are plausible.
Procedure (cheapest first)
- Read the optimizer's mind: check the hot loop's assembly (or
-Cremark/-Rpass=loop-vectorize) for why vectorization failed. - Remove the blocker, in order of cheapness:
- Bounds checks: restructure with slices/iterators or hoist a single
length check (
&x[..n]pattern) — notunsafeindexing. - Aliasing: split borrows,
split_at_mut, pass slices instead of overlapping raw pointers. - Loop-carried dependencies: reassociate integer reductions, unroll accumulators.
- Bounds checks: restructure with slices/iterators or hoist a single
length check (
- Widen the ISA baseline if class 1 hasn't already (
target-cpu), since SSE2-only baselines strangle the vectorizer. std::simd/ portable-SIMD explicit vectorization.- Raw intrinsics only when all of the above fail and the win is large; isolate behind a scalar-fallback path selected at runtime.
Verification notes
- FP flags are a hard line: any
-ffast-math-class flag, FP reassociation, or FMA-contraction change routes toneeds-human-review— no exceptions, even for a 2x win (SPEC §8). Integer/byte SIMD has no such taint and can auto-accept. - Intrinsics imply
unsafe→ automaticneeds-human-review+ MIRI where feasible + differential fuzz against the scalar path with adversarial lengths (0, 1, lane-1, lane, lane+1, unaligned offsets).
Known failure modes
- Tail handling: the classic SIMD bug class. Fuzz lengths around lane boundaries explicitly.
- Alignment assumptions that hold on the bench box and fault (or crawl) elsewhere.
- Runtime feature detection done per-call in the hot loop, eating the win; hoist detection to init.
- Integer reduction reassociation is safe; float reduction reassociation changes results — do not confuse the two.