From 95b3b1af21311528df35eb6a22f93282b6417d71 Mon Sep 17 00:00:00 2001 From: "russell@unturf.com" Date: Fri, 5 Jun 2026 14:16:20 -0400 Subject: [PATCH] catalog: Form D opt 3 landed; both pivots converge on compute-saturation MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Form D Option 3 (QECCOPS2 packed op format) shipped at foxhop commit 90484ca. Numbers: n_batches unpacked packed speedup 16 5842 ms 5428 1.076x 64 6226 ms 5830 1.068x 128 6604 ms 6201 1.065x On-disk shrink: 716 MB → 307 MB (2.33x). Storage win, not compute win. Critical diagnostic correction from the opt 3 agent: the 3.5x bandwidth projection was WRONG because ops_loader.c already narrowed u64 → u32 on load, so in-VRAM Op was already 28 B, not 56 B. Max realistic VRAM-reduction was 28 → 24 B = 1.17x best case. The measured 1.07x matches: per-shot state traffic (qubits + bits per thread) is ~85x larger than the op stream, which warp-broadcasts through L1/L2. Op-stream bandwidth was not the bottleneck. Both Form D pivots (opt 1 axis-flip, opt 3 packing) converged on the same finding: the 3090 is compute-saturated at ~250 Mops/s on the kickmix circuit, not bandwidth-saturated. Algorithm + layout tweaks already extracted; the real next macro-lever is multi-GPU fan-out across the fleet (3090-ai + ai.foxhop.net 4090 + future nodes, each saturating its own ceiling in parallel). cuda-sim-axis-flip remains LIVE as a tool with specific use: many-candidates × few-shots search-loop early-screen. ops.bin packing remains useful for fleet rsync (3.5x smaller payloads across the LAN matters when shipping candidate variants). --- examples/cuda-fanout/CATALOG.md | 29 +++++++++++++++++++++-------- www/bend.html | 7 ++++--- 2 files changed, 25 insertions(+), 11 deletions(-) diff --git a/examples/cuda-fanout/CATALOG.md b/examples/cuda-fanout/CATALOG.md index ab47b24..ab48b87 100644 --- a/examples/cuda-fanout/CATALOG.md +++ b/examples/cuda-fanout/CATALOG.md @@ -188,19 +188,32 @@ when there's no superposition; AG reduces to exactly what sim_gpu.cu already does, at one bit per qubit per shot. The 1.07x cuda-sim-ops-bin ceiling traces to memory-bandwidth on -per-shot striped state, not algorithm. Two pivots queued; opt 1 landed 2026-06-05 with a key correction: +per-shot striped state, not algorithm. Both pivots landed 2026-06-05; bandwidth-bound diagnosis confirmed FALSE +on the kickmix circuit. Empirical results below; see RESULTS docs for +detail. - **axis-flip refactor of sim_gpu.cu** — DONE (Form D option 1, commit foxhop 1f7ac9d). 217 Mops/s @ K=32 M=4; 23.7x over - per-shot N=4 at same M. CORRECTION: bandwidth-bound diagnosis - was WRONG — both kernels saturate at ~220-250 Mops/s. Axis - flip's win is **occupancy-amortization** at small M, not + per-shot N=4 at same M. Both kernels saturate at ~220-250 Mops/s. + Axis flip's win is **occupancy-amortization** at small M, not bandwidth redistribution. Right tool for many-candidates × few-shots search-loop early-screen pattern. - - **ops.bin packing** — 56 -> 16 bytes per op halves global-memory - traffic (Form D option 3). Still in flight. Given the bandwidth - diagnosis flipped, may not deliver expected gain — letting - the agent report empirical numbers. + + - **ops.bin packing (QECCOPS2)** — DONE (Form D option 3, commit + foxhop 90484ca). 1.07x kernel speedup, 2.33x on-disk shrink + (716 MB → 307 MB). The 3.5x projection was WRONG because + ops_loader.c already narrowed u64 → u32 on load, so in-VRAM Op + was already 28 B not 56 B; max realistic VRAM reduction 28→24 B + = 1.17x best case. Per-shot state traffic (qubits + bits per + thread) is ~85x larger than the op stream and dominates kernel + bandwidth. Storage win still useful for fleet rsync; compute + win small. + + Both pivots converged on the same diagnosis: **the 3090 is + compute-saturated at ~250 Mops/s on the kickmix circuit, not + bandwidth-saturated.** Real next macro-lever: multi-GPU fan-out + (3090-ai + ai.foxhop.net 4090, each hitting its own ceiling in + parallel — see task #30). Form D as originally scoped (AG tableau for our circuit) is **parked**. STABSim-class wins remain valid for QEC / surface-code diff --git a/www/bend.html b/www/bend.html index 0397c0a..4ddeb5a 100644 --- a/www/bend.html +++ b/www/bend.html @@ -99,11 +99,12 @@ make gpu-worker LUMBDA=asm # smallest footprint

Form D structural finding — 2026-06-05

cuda-clifford-stabilizer as originally scoped does not apply to our point-add circuit. Build agent measured Toffoli fraction 13.87% (well under the 40% threshold), then noticed the circuit contains no Hadamard or S gates — only X / CX / CCX / CZ / CCZ / SWAP / R / HMR / Z / NEG. State never leaves the computational basis. Aaronson-Gottesman tableau compression buys nothing when superposition does not exist; it reduces to exactly what sim_gpu.cu already does, at one bit per qubit per shot.

The cuda-sim-ops-bin 1.07× ceiling traces to memory-bandwidth on per-shot striped state, not algorithm choice. STABSim-class wins remain valid for QEC / surface-code workloads where H + S exist; that's a future workload, not point-add today.

-

Two replacement directions in flight:

+

Both replacement directions landed 2026-06-05; the bandwidth-bound diagnosis they were chasing turned out FALSE for our circuit.

+

Both pivots converged on the same diagnosis: the 3090 is compute-saturated at ~250 Mops/s on the kickmix circuit, not bandwidth-saturated. Real next macro-lever: multi-GPU fan-out across our fleet.

Status legend