mirror of
https://github.com/bdbrown4/peltier.io.git
synced 2026-11-07 10:58:28 +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
45 lines
2.0 KiB
Markdown
45 lines
2.0 KiB
Markdown
# 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)
|
|
1. Read the optimizer's mind: check the hot loop's assembly (or
|
|
`-Cremark`/`-Rpass=loop-vectorize`) for *why* vectorization failed.
|
|
2. Remove the blocker, in order of cheapness:
|
|
- Bounds checks: restructure with slices/iterators or hoist a single
|
|
length check (`&x[..n]` pattern) — not `unsafe` indexing.
|
|
- Aliasing: split borrows, `split_at_mut`, pass slices instead of
|
|
overlapping raw pointers.
|
|
- Loop-carried dependencies: reassociate integer reductions, unroll
|
|
accumulators.
|
|
3. Widen the ISA baseline if class 1 hasn't already (`target-cpu`), since
|
|
SSE2-only baselines strangle the vectorizer.
|
|
4. `std::simd` / portable-SIMD explicit vectorization.
|
|
5. 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 to
|
|
`needs-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` → automatic `needs-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.
|