From 9f67dcb79c2a428bbe21d8c2be784f7208a9f3cd Mon Sep 17 00:00:00 2001 From: Aaron Miller Date: Tue, 1 Sep 2026 17:57:50 +0100 Subject: [PATCH 1/5] =?UTF-8?q?chore(ci):=20=F0=9F=91=B7=20declare=20each?= =?UTF-8?q?=20Bencher=20rung's=20problem,=20shape=20and=20rounds?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `monoprop_PARTITIONS` was unset everywhere in CI, so `resolve_partition_count_`'s `ranks == 1 ? cores : 1` decided the shape: every point in the `ubuntu-26.04` and `aws-c7i-4xlarge` series was one partition per core of whatever runner it landed on, unrecorded, and a runner resize would have moved every series without moving a testbed name. Nothing declared a problem either -- the lanes ran the suite's dataclass defaults. A rung line now carries both: ` | `. L1 is benches/LADDER.md's own L1 rows; L2a and L2b share one problem sized to this instance rather than to the 128-core node the ladder tables were measured on, and differ only in shape. Measured on an 8-core mask of a Deucalion x86 node: L1 1x1 9.95M / 10.07M / 19.90M terms 2.60 GiB 3:53 at 3 rounds L2a 1x8 167,515,463 terms 19.11 GiB 135 s at 1 round L2b 4x2 167,515,463 terms 23.71 GiB/node 90 s at 1 round `--obs-terms=2500000` is the largest measured point that fits: 3500000 reaches 35.49 GiB/node against the instance's 32 GiB, and a fit over 1.5M and 2.5M under-called it by 3.9 GiB, so the axis is read off measured points rather than interpolated. The term count is identical at both shapes, which is the geometry-independence check. Rounds is per rung because `pedantic` builds round k+1's propagator before releasing round k's -- at these sizes that is a memory setting, not a statistics setting. Placement is asserted rather than printed. `check_shape.py` fails a rung whose recorded shape differs from the one asked for, or whose `single_cpu_threads_min` is zero while threads were counted; an all-zero summary means /proc was unreadable, not that nothing was pinned, so it does not fire there. Both L2 rungs sit exactly on the `partitions > visible cores` boundary, where the only warning goes to C++ stderr and pytest's capture eats it. `--map-by slot:PE=$monoprop_PARTITIONS --bind-to core` moves into `bench-ci-mpi`, which can no longer run unpinned and refuses without `monoprop_PARTITIONS`; `*ARGS` is freed for the pytest args the rungs need. The testbed's CPU is slugified from the cpuinfo block pytest-benchmark already writes into `time-