Skip to content

Commit 4fadabe

Browse files
author
Guillaume Lessard
committed
docs: sync artifact counts to 187/93 and retract the sccache claim
README table rebuilt from the current artifact; all 49 cited rows machine-checked against the CSV (throughput, LER, both Wilson bounds) - no discrepancies. Counts corrected from the previous run's 185/95 and a stale 63. CHANGELOG: the aarch64 entry blamed sccache. That was my first hypothesis and it was wrong - the failure reproduced with the compiler invoked directly. The cause is ring's asm_base.h needing __ARM_ARCH predefined, and fixing that exposed a real portability bug underneath (c_char is unsigned on aarch64). Records both, plus the two blockers found since: the publish job being eligible on a publish=false dispatch, and cargo deny never having run at all.
1 parent 36eea16 commit 4fadabe

2 files changed

Lines changed: 80 additions & 60 deletions

File tree

CHANGELOG.md

Lines changed: 28 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ has been published. `src/*.rs` is `.gitignore`d, so `git log v0.6.9..HEAD` shows
1212
none of the Rust work recorded here — it is verified by `cargo test` and by
1313
reading the tree.
1414

15-
### Release pipeline — four blockers, found by running it instead of trusting it
15+
### Release pipeline — six blockers, found by running it instead of trusting it
1616
`release-build.yml` had never executed. A `workflow_dispatch` dry run with
1717
`publish: false` builds every wheel and runs the strict dependency gate without
1818
uploading anything; doing that surfaced four faults, each of which would have
@@ -33,12 +33,32 @@ fired on the first `v0.7.0` tag.
3333
wheel that compiles but decodes wrongly cannot reach PyPI.
3434
- **RUSTSEC-2026-0204** (`crossbeam-epoch` 0.9.18, invalid pointer dereference)
3535
hard-blocks publish under the release gate's `strict: true`. Updated to 0.9.20.
36-
- **aarch64 Linux never built, and musllinux never smoke-tested.** sccache
37-
wrapping the cross-assembler breaks `ring`'s `.S` files (`#error "ARM
38-
assembler must define __ARM_ARCH"`), so sccache is disabled for that one job.
39-
Separately, musllinux built correctly and then failed trying to `pip install`
40-
a musl wheel on a glibc runner; the smoke-test guard excluded aarch64 but not
41-
musllinux. Both are now excluded from smoke-testing, still built and uploaded.
36+
- **aarch64 Linux never built, and musllinux never smoke-tested.** `ring`'s
37+
`asm_base.h` hard-errors with `#error "ARM assembler must define __ARM_ARCH"`
38+
because the manylinux cross-gcc does not predefine it; `__ARM_ARCH=8` is now
39+
set for that target. (sccache was suspected first and ruled out — the failure
40+
reproduced with the compiler invoked directly.) Fixing it exposed a second,
41+
genuine portability bug underneath: `cuda_batch.rs` declared the
42+
cuDeviceGetName buffer as `[0i8; 256]`, but `c_char` is signed on x86_64 and
43+
**unsigned** on aarch64, so the build failed with two E0308s. Now uses
44+
`std::os::raw::c_char`. Separately, musllinux built correctly and then failed
45+
trying to `pip install` a musl wheel on a glibc runner; the smoke-test guard
46+
excluded aarch64 but not musllinux. Both are now excluded from smoke-testing,
47+
still built and uploaded.
48+
- **The publish job was eligible on a `publish=false` dispatch.** The gate read
49+
`|| inputs.publish`; a workflow_dispatch input arrives as a string and every
50+
non-empty string is truthy, so `publish=false` evaluated **true**. Only the
51+
wheel builds failing kept 0.7.0 off PyPI — the dry runs were not dry. It
52+
showed as `cancelled` rather than `skipped`, which is the tell. Now compares
53+
against the literal `'true'`.
54+
- **`cargo deny` never ran.** In 0.18 `--config` belongs to the `check`
55+
subcommand, so the invocation died at argument parsing with exit 2. Because
56+
the step runs under `set +e` and only enforces when strict, non-strict runs
57+
downgraded that to a warning and reported success — the licence/bans/sources
58+
gate executed nothing for as long as it has existed. Fixed, and an exit > 1
59+
(tool failed to run) is now a hard failure in every mode, since a gate that
60+
cannot run must never look like a gate that passed. First green run reports
61+
`bans ok, licenses ok, sources ok`.
4262

4363
`tests.yml` also gained a concurrency group. Without one, every push spawned a
4464
fresh five-version matrix and superseded runs kept running, so several pushes in
@@ -94,7 +114,7 @@ paying for it to finish.
94114
`ler.estimate_ler_circuit_level` — one circuit, one decomposed DEM, one
95115
detector/observable sample set per cell, one `decode_batch` resolver for
96116
QECTOR, PyMatching and ldpc alike — and `ler.assert_comparable` gates the rows
97-
before writing. Nothing is extrapolated: 63 cells that exceeded the per-cell
117+
before writing. Nothing is extrapolated: 93 cells that exceeded the per-cell
98118
decode budget are recorded as *not measured*, with their probe rate and
99119
projected cost.
100120
- **The numbers, per-cell and not generalised.** `qector_blossom` and PyMatching

README.md

Lines changed: 52 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ python scripts/run_custom_comparison_benchmark.py \
423423
run at `p = 0.005`, `seed = 1`, `d ∈ {3..15}`, shots up to 100,000. Read it as
424424
indicative only: it was taken on a **developer workstation that was not
425425
quiesced**, and its provenance block records `git_tree_dirty: true`. A further
426-
63 cells exceeded the per-cell decode budget and are listed as *not measured*,
426+
93 cells exceeded the per-cell decode budget and are listed as *not measured*,
427427
carrying their measured probe rate and projected cost — no cell is extrapolated.
428428

429429
Largest shot count measured per cell. Throughput is decode time only; LER is
@@ -432,57 +432,57 @@ per shot with a 95% Wilson interval. Every row is one
432432

433433
| d | Decoder | Shots | Throughput (dec/s) | LER | 95% CI |
434434
| ---: | --- | ---: | ---: | ---: | --- |
435-
| 3 | PyMatching 2 | 100,000 | 2,488,546 | 0.01891 | [0.01808, 0.01977] |
436-
| 3 | `qector_blossom` | 100,000 | 2,259,953 | 0.01891 | [0.01808, 0.01977] |
437-
| 3 | `qector_unionfind` | 100,000 | 4,816,445 | 0.02210 | [0.02121, 0.02303] |
438-
| 3 | `qector_cuda` (GPU, unweighted) | 100,000 | 1,391,074 | 0.02215 | [0.02126, 0.02308] |
439-
| 3 | `qector_cuda` (GPU, weighted) | 100,000 | 1,252,127 | 0.02201 | [0.02112, 0.02294] |
440-
| 3 | `qector_opencl` (GPU, unweighted) | 100,000 | 1,186,666 | 0.02215 | [0.02126, 0.02308] |
441-
| 3 | `qector_opencl` (GPU, weighted) | 100,000 | 1,494,096 | 0.02201 | [0.02112, 0.02294] |
442-
| 3 | ldpc BP-OSD | 50,000 | 2,356 | 0.01938 | [0.01821, 0.02063] |
443-
| 5 | PyMatching 2 | 100,000 | 276,643 | 0.01596 | [0.01520, 0.01676] |
444-
| 5 | `qector_blossom` | 100,000 | 102,728 | 0.01596 | [0.01520, 0.01676] |
445-
| 5 | `qector_unionfind` | 100,000 | 630,493 | 0.02645 | [0.02547, 0.02746] |
446-
| 5 | `qector_cuda` (GPU, unweighted) | 100,000 | 157,099 | 0.06094 | [0.05947, 0.06244] |
447-
| 5 | `qector_cuda` (GPU, weighted) | 100,000 | 70,473 | 0.03182 | [0.03075, 0.03293] |
448-
| 5 | `qector_opencl` (GPU, unweighted) | 100,000 | 138,965 | 0.06094 | [0.05947, 0.06244] |
449-
| 5 | `qector_opencl` (GPU, weighted) | 100,000 | 51,241 | 0.03182 | [0.03075, 0.03293] |
450-
| 5 | ldpc BP-OSD | 1,000 | 103 | 0.02100 | [0.01378, 0.03189] |
451-
| 7 | PyMatching 2 | 100,000 | 101,498 | 0.01220 | [0.01154, 0.01290] |
452-
| 7 | `qector_blossom` | 100,000 | 17,018 | 0.01233 | [0.01166, 0.01303] |
453-
| 7 | `qector_unionfind` | 100,000 | 152,985 | 0.02042 | [0.01956, 0.02132] |
454-
| 7 | `qector_cuda` (GPU, unweighted) | 100,000 | 42,492 | 0.04274 | [0.04150, 0.04401] |
455-
| 7 | `qector_cuda` (GPU, weighted) | 10,000 | 12,680 | 0.01800 | [0.01557, 0.02080] |
456-
| 7 | `qector_opencl` (GPU, unweighted) | 100,000 | 237,312 | 0.04274 | [0.04150, 0.04401] |
457-
| 7 | `qector_opencl` (GPU, weighted) | 10,000 | 8,063 | 0.01800 | [0.01557, 0.02080] |
458-
| 9 | PyMatching 2 | 100,000 | 40,581 | 0.00878 | [0.00822, 0.00938] |
459-
| 9 | `qector_blossom` | 50,000 | 2,343 | 0.00906 | [0.00827, 0.00993] |
460-
| 9 | `qector_unionfind` | 100,000 | 42,073 | 0.01732 | [0.01653, 0.01815] |
461-
| 9 | `qector_cuda` (GPU, unweighted) | 50,000 | 15,442 | 0.04648 | [0.04467, 0.04836] |
462-
| 9 | `qector_cuda` (GPU, weighted) | 5,000 | 3,765 | 0.01140 | [0.00881, 0.01474] |
463-
| 9 | `qector_opencl` (GPU, unweighted) | 100,000 | 101,976 | 0.04663 | [0.04534, 0.04795] |
464-
| 9 | `qector_opencl` (GPU, weighted) | 5,000 | 1,984 | 0.01140 | [0.00881, 0.01474] |
465-
| 11 | PyMatching 2 | 100,000 | 19,880 | 0.00647 | [0.00599, 0.00699] |
466-
| 11 | `qector_blossom` | 10,000 | 757 | 0.00780 | [0.00625, 0.00972] |
467-
| 11 | `qector_unionfind` | 50,000 | 8,681 | 0.01678 | [0.01569, 0.01794] |
468-
| 11 | `qector_cuda` (GPU, unweighted) | 10,000 | 11,862 | 0.04400 | [0.04015, 0.04820] |
469-
| 11 | `qector_cuda` (GPU, weighted) | 1,000 | 277 | 0.01000 | [0.00544, 0.01831] |
470-
| 11 | `qector_opencl` (GPU, unweighted) | 50,000 | 50,184 | 0.04222 | [0.04049, 0.04402] |
471-
| 11 | `qector_opencl` (GPU, weighted) | 1,000 | 286 | 0.01000 | [0.00544, 0.01831] |
472-
| 13 | PyMatching 2 | 100,000 | 10,008 | 0.00445 | [0.00406, 0.00488] |
473-
| 13 | `qector_blossom` | 5,000 | 227 | 0.00380 | [0.00243, 0.00593] |
474-
| 13 | `qector_unionfind` | 10,000 | 2,379 | 0.01400 | [0.01188, 0.01650] |
475-
| 13 | `qector_cuda` (GPU, unweighted) | 10,000 | 6,600 | 0.04100 | [0.03729, 0.04507] |
476-
| 13 | `qector_cuda` (GPU, weighted) | 1,000 | 123 | 0.00800 | [0.00406, 0.01571] |
477-
| 13 | `qector_opencl` (GPU, unweighted) | 10,000 | 24,690 | 0.04100 | [0.03729, 0.04507] |
478-
| 13 | `qector_opencl` (GPU, weighted) | 1,000 | 137 | 0.00800 | [0.00406, 0.01571] |
479-
| 15 | PyMatching 2 | 100,000 | 6,721 | 0.00314 | [0.00281, 0.00351] |
480-
| 15 | `qector_blossom` | 1,000 | 59 | 0.00200 | [0.00055, 0.00726] |
481-
| 15 | `qector_unionfind` | 1,000 | 317 | 0.01200 | [0.00688, 0.02086] |
482-
| 15 | `qector_cuda` (GPU, unweighted) | 10,000 | 3,971 | 0.03760 | [0.03405, 0.04151] |
483-
| 15 | `qector_opencl` (GPU, unweighted) | 10,000 | 11,531 | 0.03760 | [0.03405, 0.04151] |
484-
485-
The complete 185-row table — every shot count, together with the 95 cells that
435+
| 3 | PyMatching 2 | 100,000 | 2,478,782 | 0.01891 | [0.01808, 0.01977] |
436+
| 3 | `qector_blossom` | 100,000 | 2,337,448 | 0.01891 | [0.01808, 0.01977] |
437+
| 3 | `qector_unionfind` | 100,000 | 4,953,928 | 0.02210 | [0.02121, 0.02303] |
438+
| 3 | `qector_cuda` (GPU, unweighted) | 100,000 | 1,446,123 | 0.02215 | [0.02126, 0.02308] |
439+
| 3 | `qector_cuda` (GPU, weighted) | 100,000 | 1,201,288 | 0.02201 | [0.02112, 0.02294] |
440+
| 3 | `qector_opencl` (GPU, unweighted) | 100,000 | 1,286,159 | 0.02215 | [0.02126, 0.02308] |
441+
| 3 | `qector_opencl` (GPU, weighted) | 100,000 | 1,554,014 | 0.02201 | [0.02112, 0.02294] |
442+
| 3 | ldpc BP-OSD | 50,000 | 2,399 | 0.01938 | [0.01821, 0.02063] |
443+
| 5 | PyMatching 2 | 100,000 | 340,202 | 0.01596 | [0.01520, 0.01676] |
444+
| 5 | `qector_blossom` | 100,000 | 111,843 | 0.01596 | [0.01520, 0.01676] |
445+
| 5 | `qector_unionfind` | 100,000 | 694,192 | 0.02645 | [0.02547, 0.02746] |
446+
| 5 | `qector_cuda` (GPU, unweighted) | 100,000 | 150,505 | 0.06094 | [0.05947, 0.06244] |
447+
| 5 | `qector_cuda` (GPU, weighted) | 100,000 | 69,156 | 0.03182 | [0.03075, 0.03293] |
448+
| 5 | `qector_opencl` (GPU, unweighted) | 100,000 | 144,886 | 0.06094 | [0.05947, 0.06244] |
449+
| 5 | `qector_opencl` (GPU, weighted) | 100,000 | 61,421 | 0.03182 | [0.03075, 0.03293] |
450+
| 5 | ldpc BP-OSD | 1,000 | 113 | 0.02100 | [0.01378, 0.03189] |
451+
| 7 | PyMatching 2 | 100,000 | 97,941 | 0.01220 | [0.01154, 0.01290] |
452+
| 7 | `qector_blossom` | 100,000 | 20,975 | 0.01233 | [0.01166, 0.01303] |
453+
| 7 | `qector_unionfind` | 100,000 | 173,669 | 0.02042 | [0.01956, 0.02132] |
454+
| 7 | `qector_cuda` (GPU, unweighted) | 100,000 | 45,353 | 0.04274 | [0.04150, 0.04401] |
455+
| 7 | `qector_cuda` (GPU, weighted) | 10,000 | 13,552 | 0.01800 | [0.01557, 0.02080] |
456+
| 7 | `qector_opencl` (GPU, unweighted) | 100,000 | 244,318 | 0.04274 | [0.04150, 0.04401] |
457+
| 7 | `qector_opencl` (GPU, weighted) | 10,000 | 8,693 | 0.01800 | [0.01557, 0.02080] |
458+
| 9 | PyMatching 2 | 100,000 | 42,295 | 0.00878 | [0.00822, 0.00938] |
459+
| 9 | `qector_blossom` | 50,000 | 2,649 | 0.00906 | [0.00827, 0.00993] |
460+
| 9 | `qector_unionfind` | 100,000 | 44,420 | 0.01732 | [0.01653, 0.01815] |
461+
| 9 | `qector_cuda` (GPU, unweighted) | 50,000 | 18,273 | 0.04648 | [0.04467, 0.04836] |
462+
| 9 | `qector_cuda` (GPU, weighted) | 10,000 | 3,382 | 0.01400 | [0.01188, 0.01650] |
463+
| 9 | `qector_opencl` (GPU, unweighted) | 100,000 | 107,529 | 0.04663 | [0.04534, 0.04795] |
464+
| 9 | `qector_opencl` (GPU, weighted) | 10,000 | 2,043 | 0.01400 | [0.01188, 0.01650] |
465+
| 11 | PyMatching 2 | 100,000 | 21,511 | 0.00647 | [0.00599, 0.00699] |
466+
| 11 | `qector_blossom` | 10,000 | 890 | 0.00780 | [0.00625, 0.00972] |
467+
| 11 | `qector_unionfind` | 50,000 | 9,722 | 0.01678 | [0.01569, 0.01794] |
468+
| 11 | `qector_cuda` (GPU, unweighted) | 10,000 | 13,621 | 0.04400 | [0.04015, 0.04820] |
469+
| 11 | `qector_cuda` (GPU, weighted) | 1,000 | 330 | 0.01000 | [0.00544, 0.01831] |
470+
| 11 | `qector_opencl` (GPU, unweighted) | 50,000 | 53,218 | 0.04222 | [0.04049, 0.04402] |
471+
| 11 | `qector_opencl` (GPU, weighted) | 1,000 | 338 | 0.01000 | [0.00544, 0.01831] |
472+
| 13 | PyMatching 2 | 100,000 | 12,096 | 0.00445 | [0.00406, 0.00488] |
473+
| 13 | `qector_blossom` | 5,000 | 293 | 0.00380 | [0.00243, 0.00593] |
474+
| 13 | `qector_unionfind` | 10,000 | 2,571 | 0.01400 | [0.01188, 0.01650] |
475+
| 13 | `qector_cuda` (GPU, unweighted) | 10,000 | 7,634 | 0.04100 | [0.03729, 0.04507] |
476+
| 13 | `qector_cuda` (GPU, weighted) | 1,000 | 151 | 0.00800 | [0.00406, 0.01571] |
477+
| 13 | `qector_opencl` (GPU, unweighted) | 10,000 | 25,937 | 0.04100 | [0.03729, 0.04507] |
478+
| 13 | `qector_opencl` (GPU, weighted) | 1,000 | 166 | 0.00800 | [0.00406, 0.01571] |
479+
| 15 | PyMatching 2 | 50,000 | 4,847 | 0.00342 | [0.00295, 0.00397] |
480+
| 15 | `qector_blossom` | 1,000 | 73 | 0.00200 | [0.00055, 0.00726] |
481+
| 15 | `qector_unionfind` | 5,000 | 511 | 0.01440 | [0.01145, 0.01809] |
482+
| 15 | `qector_cuda` (GPU, unweighted) | 10,000 | 4,398 | 0.03760 | [0.03405, 0.04151] |
483+
| 15 | `qector_opencl` (GPU, unweighted) | 10,000 | 14,809 | 0.03760 | [0.03405, 0.04151] |
484+
485+
The complete 187-row table — every shot count, together with the 93 cells that
486486
exceeded the per-cell decode budget and are therefore recorded as *not measured*
487487
rather than estimated — is in `official_benchmark_results.md`.
488488

0 commit comments

Comments
 (0)