Running the benchmark suite#
Run the four-case core suite with uv run poe bench. It measures bounded windows
of full-resolution problems and prints warm time, startup time, peak memory and
check status. Numerical reference preparation is optional for exploratory timing.
The runner is specified by
SEP 30. The rules it applies,
the measurement windows and what a performance claim reports are in
Benchmarks; this page is the runner’s manual.
uv run poe bench --dry-run
uv run poe bench --out .benchmarks/suite/runs/first-look
uv run poe bench --case rdw --threads 1
The default uses the native CPU backend and requires it to be installed in the
environment. For a small first check without the native backend, use
uv run poe bench --case rdw --backend numpy_ref --threads 1.
The 384-square Kerr case is a substantial memory workload: its conservative
admission budget is about 36 GiB. The controller records a refusal if available
memory is insufficient; select individual cases on smaller machines.
poe bench accepts the same arguments as python -m benchmarks.
Omitting a subcommand means run. No profile, baseline environment or reference
preparation is required for a quick run. Missing references are labelled
not-qualified and do not prevent timing.
Select a measurement#
Planning imports metadata only; it does not import NumPy, initialise a backend, translate a simulation or prepare references:
uv run python -m benchmarks list
uv run python -m benchmarks run --dry-run --set core
uv run python -m benchmarks list --all
The table includes conservative memory budgets and reference receipt status. Planning checks reference metadata compatibility only; the worker verifies array hashes and numerical results. Missing cost measurements are shown as unknown.
The default selection is core, quick, native, at the available production
width. Declare a machine profile before a standard comparison. The alias must be
suitable for a public report; the width must fit the current allocation:
uv run python -m benchmarks profile .benchmarks/suite/profiles/workstation.json \
--alias workstation --production 8
uv run python -m benchmarks run --set core \
--machine-profile .benchmarks/suite/profiles/workstation.json
Use --case or --set repeatedly to select a deduplicated union. --all selects
all sets, including visible pending definitions. A pending definition produces an
explicit exclusion; it never becomes a successful measurement. --threads accepts
positive integers and production, for example 1,production. Quick mode defaults
to production; standard mode defaults to both widths. Unsupported tracks and widths
are reported explicitly.
Core case |
Headline measurement |
Fixed diagnostic |
|---|---|---|
Four-mode RDW |
0.02–0.04 m, following a 0–0.02 m lead-in |
Ten 2 mm entrance steps |
Six-mode CtC |
0.00017–0.00034 m, following its lead-in |
Ten 17 micrometre entrance steps |
384-square Kerr beam |
Fixed RK4IP only, one lead-in step and ten 0.5 micrometre steps |
The same row |
256-node radial filament |
0–0.03 m, four observation planes |
Ten frozen RK pilot steps, ending at 0.274524 mm |
RDW, CtC and radial headline rows each use default Multistep() and RungeKutta().
The original guides, gas-flow profiles and grids remain intact. The measurement
window does not redefine a pressure-gradient guide’s endpoint.
The radial diagnostic uses the first ten accepted steps of the NumPy default-RK
pilot at rtol=1e-6; its edges are stored with the registry and included in the
measurement identity. It does not run a pilot during ordinary collection.
The modal-capillary and mode-averaged sets add nine bounded cases. Both
adaptive methods and a ten-step fixed RK diagnostic are available on NumPy,
Numba and native CPU. Select Numba with --backend numba_cpu; its first window
includes JIT compilation or cache loading in startup, before warm timing.
The existing on-disk Numba cache is recorded as uncontrolled, so startup should
not be presented as a reproducible cold compilation measurement.
uv run poe bench run --set mode-averaged --backend numba_cpu
uv run poe bench run --case argon_blueshift --track fixed-rk --threads 1
Additional case |
Adaptive entrance interval |
Fixed diagnostic |
|---|---|---|
One resolved mode RDW |
0–39.1377 mm |
Ten frozen pilot steps |
Reduced two-mode CtC |
0–1.31141 mm |
Ten 120 micrometre steps |
Resolved argon blueshift |
0–2.42717 mm |
Ten frozen pilot steps |
Resolved hydrogen Raman, 6 ps |
0–13.2409 mm |
Ten frozen pilot steps |
Averaged helium RDW |
0–39.3310 mm |
Ten frozen pilot steps |
Averaged argon blueshift |
0–2.43336 mm |
Ten frozen pilot steps |
Averaged hydrogen Raman, 6 ps |
0–13.2409 mm |
Ten frozen pilot steps |
Ideal N=3 GNLSE soliton |
0–90.0316 mm |
Ten frozen pilot steps |
Raman/shock GNLSE |
0–0.945275 mm |
Ten frozen pilot steps |
These windows end at the tenth accepted step of independent NumPy RK pilots at
rtol=1e-6, atol=1e-10. The registry retains the full precision of every edge.
Each adaptive window saves its endpoint with ordinary statistics. The full guides,
including the helium pressure profile over 1.5 m, are preserved. The averaged
cases use the effective-area route; the resolved cases keep transverse quadrature
even with one mode. The two hydrogen cases retain the explicitly named 6 ps grids.
The ideal soliton retains the lesson’s full-period guide but propagates only the
short entrance interval. These nine adaptive cases have a reviewed relative field
ceiling of 1e-4, independent of the solver tolerance. Preparing or selecting
reference receipts remains separate from ordinary timing.
The free-space set also adds these windows. The six adaptive additions use
the same ten-step NumPy pilot protocol, with atol=0; both default methods and
the frozen fixed-RK diagnostic are available. Kerr remains fixed-RK4IP only.
Additional case |
Measured interval |
Fixed diagnostic |
|---|---|---|
Radial filament, 512 nodes |
0–274.524 micrometres |
Ten frozen pilot steps |
Cartesian filament, 128-square |
0–225.110 micrometres |
Ten frozen pilot steps |
Cartesian filament, 256-square |
0–225.111 micrometres |
Ten frozen pilot steps |
Line, 128 points |
0–10.8716 mm |
Ten frozen pilot steps |
Planar, two modes by 32 points |
0–6.79474 mm |
Ten frozen pilot steps |
Radial absorber, 64 nodes |
0–10.8716 mm |
Ten frozen pilot steps |
Kerr beam, 192-square |
0.5–5.5 micrometres |
Ten 0.5 micrometre steps |
Kerr beam, 768-square |
0.5–3 micrometres |
Five 0.5 micrometre steps |
Kerr windows follow one lead-in step. The 768-square case excludes one-thread
selection unless --diagnostic is explicit. Memory admission still applies:
large Cartesian cases can be refused before construction on a smaller machine.
Line, planar and radial-absorber cases have reviewed 1e-4 relative field
ceilings. The larger filament additions remain unqualified for accuracy.
The advanced set preserves the source guides, coherent wall models and taper
corners. Each case supports both adaptive methods and a fixed RK diagnostic:
Additional case |
Adaptive entrance endpoint |
Fixed diagnostic |
|---|---|---|
Scalar coherent wall |
200 micrometres |
Ten 20 micrometre steps |
Vector TE/TM coherent wall |
200 micrometres |
Ten 20 micrometre steps |
Taper without wall |
137.401 micrometres |
Ten 20 micrometre steps |
Taper with scalar wall |
137.889 micrometres |
Ten 20 micrometre steps |
General step-index HE11 pair |
135.895 micrometres |
Ten frozen pilot steps |
Linear two-channel GRIN |
19.2601 micrometres |
Ten frozen pilot steps |
Nonlinear four-channel GRIN |
620.057 micrometres |
Ten frozen pilot steps |
Moving solid guide |
21.8692 micrometres |
Ten frozen pilot steps |
The linear GRIN case keeps the continuous-wave two-channel launch and its
0.784680 mm self-imaging guide; its temporal grid retains the source’s 1 mm
length. Its ten accepted pilot steps include three rejected trials. Nonlinear
GRIN retains input-noise seed 41. The moving guide retains its 5 mm taper corner
in the unexecuted schedule tail. Weak-absorber and grazing-incidence warnings
from the wall tutorials are declared by category and message. General-guide
construction can dominate startup, independently of the short measured interval.
All eight advanced cases have reviewed 1e-4 relative field ceilings, with
reference and policy revisions independent of the workload.
The backend-exercise set covers particular execution paths on small problems:
Exercise |
Measured entrance endpoint |
Tracks and observations |
|---|---|---|
Vector rotational Raman |
0.291590 micrometres |
Both adaptive methods; ten fixed pilot steps |
Envelope plasma |
8 micrometres |
Both adaptive methods; four original 2 micrometre fixed steps |
Helium/argon pressure gradient |
21.8703 mm |
Both adaptive methods; ten fixed pilot steps |
Dispersive Kerr |
15.2189 mm |
Both adaptive methods; ten fixed pilot steps |
Band/trapezoid plasma integration |
135.895 micrometres |
Two cases, both adaptive methods; ten fixed pilot steps |
Batch |
1 mm |
Two distinct GNLSE members, ten fixed RK steps |
Physical noise |
135.895 micrometres |
Both adaptive methods; ten fixed pilot steps; seed 13 |
Dense output |
1.45795 mm |
Both adaptive methods; eight interpolated observations |
Split-step absorber |
135.895 micrometres |
Both adaptive methods; ten fixed pilot steps |
Ordinary statistics |
135.895 micrometres |
Both adaptive methods; ten fixed pilot steps |
Far-field statistics |
863.801 micrometres |
Both adaptive methods; eight observations with only the exit field retained; ten fixed pilot steps |
Vector Raman uses the current optmat rotational hydrogen response with vibration disabled, retaining the circular pump and delayed oblique probe launch. Its low-density linewidth warning is recorded. The envelope-plasma guide ends after four source steps, so that shorter interval is retained. The other new windows use ten accepted default-RK pilot steps. Dense output visits intermediate planes without forcing the integrator to land there. Far-field observations include apertures, spectral regions and periodic absorbed power. Fixed diagnostics time propagation alone and report observation costs separately.
The batch workload uses the actual backend batch implementation, retaining each
member’s own statistics, source counts and field check. Reset reuses member
buffers and FFT plans. These exercises can be timed before reference review;
their numerical evidence is collected separately through qualify. The eleven
adaptive exercises have reviewed 1e-4 relative field ceilings. The fixed batch
check remains a matched-method diagnostic.
Timing boundaries and accounting#
These boundaries implement the
measurement windows of the benchmark policy.
Each sample runs in a fresh process. Its thread environment is set before scientific
imports, with solprop_native loaded before pyFFTW. Budget policies clear inherited Kokkos
pool overrides and the FFT-size override. all-pools-N explicitly forces the pools;
as-installed preserves the environment. This keeps an automatic-policy measurement
separate from a forced-width measurement. The backend and FFT plans are constructed
once. After a first complete window, the worker calls set_initial, repeats the
bounded lead-in outside warm timing, and measures the declared window again.
Adaptive timing includes propagation, declared observations, ordinary statistics and in-memory output. Fixed timing includes propagation; the final observation and statistics are measured separately. Fresh-process startup is measured by the parent through receipt of the first completed window. Process startup and warm propagation answer different questions and are reported separately.
source_evaluations counts actual Runge–Kutta source dispatches since the most recent
set_initial. Rejected trials contribute work; a reused stage contributes no new
evaluation. NumPy may therefore report more evaluations than a backend that reuses
DOPRI5’s last stage. Adams retains its existing response-call ledger, and low-storage
methods retain their existing evaluation counters. These are execution facts, not
changes to the simulation or kernel-contract schemas.
The worker reports lifetime peak RSS after measurement and before reference loading.
Allocation-ledger bytes are reported separately. Unsupported telemetry carries an
unavailable reason; a missing counter is not zero. Admission estimates are conservative
provisional budgets until compatible empirical receipts are qualified. An unknown
estimate requires --allow-unestimated and an explicit --memory-limit in bytes;
such a collection is exploratory.
Each attempt also reports controller_cpu_seconds: CPU time consumed by the parent
while launching, monitoring and reading the worker. It includes process sampling
and receipt handling; it is separate from the child’s warm propagation time.
Collection, recovery and comparison#
Quick mode takes one sample per configuration and has no adoption verdict or MAD estimate. Standard mode starts with five samples per configuration, uses balanced shuffled rounds, and alternates adjacent baseline/candidate order. A short separate pilot can select up to ten individually timed repetitions; the same count is frozen for both arms. No repetition is selected merely because it was fastest.
For a first look, collect the same selection before and after a change, then compare the saved bundles. Quick comparison prints descriptive percentage changes even without qualified references or a clean baseline; it does not approve adoption:
uv run poe bench compare .benchmarks/suite/runs/before .benchmarks/suite/runs/after
Use compare --json for the detailed machine-readable result, including resource
flags. For a controlled paired comparison, prepare both Python environments first:
uv run python -m benchmarks run --mode standard --set core \
--machine-profile .benchmarks/suite/profiles/workstation.json \
--baseline-python /path/to/baseline/bin/python \
--candidate-python /path/to/candidate/bin/python \
--out .benchmarks/suite/runs/comparison
uv run python -m benchmarks compare .benchmarks/suite/runs/comparison
The controller admits one measurement worker at a time. A guard miss defers the
whole pair once in standard mode, then records contention if it persists. Contended
samples remain in all-sample tables. Clean paired summaries omit both members if
either is contended. Unknown guard confidence cannot establish a clean comparison.
--force skips waiting and explicitly makes the collection exploratory.
Run bundles live below the ignored .benchmarks/suite/ directory unless --out
overrides it. They contain a manifest, immutable attempt shards, raw worker logs,
and derived samples.csv, summary.csv and accuracy.csv tables. A run lock prevents
concurrent writers. Temporary partial files do not count as completed attempts.
Use run --resume RESULTS to restore the saved selection and options and retry an
interrupted run; completed sample identities are skipped and previous failures remain
on disk. Worker files left by a canceled collector remain intact; a retry uses a
fresh attempt number. An explicit conflicting option refuses resume.
Changed harness, environment, selection or machine identity refuses resume.
Comparison requires the complete affected selection and compatible workload, resolved method, measurement and profile identities. Build identities may differ. Adaptive and fixed tracks, and different widths, have separate aggregates. Standard adoption applies the aggregate rule of the benchmark rules and additionally requires qualified numerical references, sufficient clean paired rounds and a gain exceeding measured adjacent-round repeatability. More than 20% contention, insufficient adjacent clean rounds, or missing qualification leaves the result unresolved. Missing rows are never removed to improve the aggregate. Peak-memory and startup regressions have separate advisory flags.
Use --allow-accuracy-failure when timing should continue despite failed numerical
checks. It preserves each failed check and its measured error, completes timing
rounds, and labels the entire collection exploratory. Successful execution then
exits zero even if an accuracy check failed; crashes, timeouts and memory refusals
still fail. This option does not turn a failed reference check into a pass, and an
override collection cannot establish adoption:
uv run python -m benchmarks run --case rdw --allow-accuracy-failure \
--out .benchmarks/suite/runs/rdw-exploratory
Fast A/B comparison while iterating#
A standard paired comparison is a final check, not an iteration tool. Each sample is a fresh process that imports, constructs the case, runs a first window and only then its warm repetitions; standard mode adds paired pilots, a counter guard before every pair and five to eleven rounds. Construction dominates: in a standard run of the advanced set on a 36-core workstation it took about 70 % of the collection time, the first and timed windows about 9 % each, and guards, process start and validation the rest. The whole set at two widths took about five hours, though most windows last milliseconds to seconds.
While developing a performance change, time only the cases it should affect with the
ab command, and keep the standard comparison for the settled change:
uv run python -m benchmarks ab --case step_index_pair --case taper_wall \
--track adaptive-rk --threads 1 \
--baseline-python /path/to/baseline/bin/python \
--candidate-python /path/to/candidate/bin/python
Selection (--case, --set, --all, --track, --threads, --backend,
--machine-profile) works as for run, defaulting like a quick run to the adaptive
tracks at the production width. Cases, measurement windows and lead-ins come from the
registry unchanged. Each round starts one worker per build and thread width. The
worker constructs each selected case once, runs one untimed warm-up window, then
times --repeats windows (default 5), each after the usual reset and lead-in. There
are --rounds rounds (default 3), and the build that runs first alternates between
rounds. A selection of a few cases therefore costs a few constructions per build
instead of one per sample: four advanced cases at one track compare in a few minutes.
The command prints, per configuration, each build’s median window time, the median over rounds of the paired candidate/baseline ratio of per-round medians (below 1 means the candidate is faster), the range of those ratios over rounds, whether both builds took the same accepted and rejected steps, and the relative L2 difference between the two builds’ retained fields from the first round. A geometric mean of the ratios follows. Passing the same interpreter for both builds gives an A/A control, whose ratio range shows the noise to expect on that machine.
Results go to .benchmarks/suite/ab/ unless --out names a new directory:
plan.json, results.json with every timed window and the runtime identity of each
worker, the raw worker logs and the saved fields. The guard takes one one-second
reading before each worker and labels a busy machine, but never waits. There is no
pilot, reference check, memory sampling, resume or adoption verdict; the batch
exercise is not supported. Use a quiet machine, and confirm a promising result with a
standard comparison.
Numerical qualification#
Reference preparation is explicit and runs outside ordinary timing collection:
uv run python -m benchmarks qualify --case rdw --threads 1 \
--out .benchmarks/suite/references/rdw-review
uv run python -m benchmarks run --case rdw \
--references .benchmarks/suite/references/rdw-review
Qualification is a one-time preparation step for each reference revision. Routine
timing validates the first successful sample for each arm/configuration after the
timer and memory receipt. Later samples check finite output and the validated shape,
and link to the original validation rather than repeating its error measurements.
A changed reference/policy or a failed sample requires a fresh check. Timing does not
run a reference convergence campaign. The qualification path retains tight RK at relative tolerance 1e-10, a
1e-9 refinement witness, a matched-method NumPy result, a candidate result, reset
evidence and array hashes. It evaluates the worst-plane relative field error in the
requested band and preserves the full-band error. Fixed methods use a same-schedule
NumPy reference. Qualification runs also retain fresh-versus-reset fields, work
counts, observed controller histories, statistics and noise state. RDW retains its
weak-bin and 100–150 nm band metrics; CtC retains its weak-bin metric. Modal energy
differences use the ordinary Parseval weights and are diagnostic only.
An empty mode can have an undefined spectral centroid, and a continuous wave can have an undefined pulse width. Reset evidence records these statistic masks and compares the finite entries separately. Non-finite fields, histories or infinities remain errors.
The benchmark’s solver tolerance remains rtol=1e-6. Its separate accuracy
envelope bounds the measured field and retained-band errors against the reference:
Adaptive case |
Largest pilot error over both integrators |
Reviewed ceiling |
|---|---|---|
RDW |
2.045 × 10⁻⁵ (UV band) |
1 × 10⁻⁴ |
CtC |
2.055 × 10⁻⁶ (weak bins) |
1 × 10⁻⁵ |
Radial 256 |
1.206 × 10⁻⁶ (worst-plane field) |
1 × 10⁻⁴ |
Nine added modal/GNLSE cases |
6.013 × 10⁻⁷ (relative field) |
1 × 10⁻⁴ |
These ceilings reuse target levels from the source campaigns with headroom for
ordinary rounding and solver variation; they are not fitted to timing results.
The approved defaults match exact measurement identities. A changed workload must
be reviewed again. Other measurements without a reviewed positive envelope remain
not-qualified. The explicit --accuracy-bound option supplies a reviewed
replacement ceiling. Adaptive field and band ceilings must remain at least ten
times their respective measured reference refinement floors.
An envelope pass alone does not qualify adoption. After reviewing the retained
reset fields, controller histories, statistics and work counts, use
qualify --recheck ... --reviewed to mark that reference eligible for standard
comparison. This checks that all four reference runs succeeded and retained reset
evidence, with reset fields inside the same approved field ceiling. History and
statistics need their case-specific numerical interpretation; this option confirms
that review without imposing identical adaptive trajectories. A changed policy does
not inherit a previous review automatically. Ordinary timing needs neither this
review nor a reference. Clean-pair, warning and resource checks remain part of each
standard comparison.
Revise an accuracy policy or reference#
Workload, reference, accuracy-policy and result-schema revisions are independent. An improved reference or a revised accuracy limit does not rename an unchanged benchmark case. Receipts are immutable, carry the source/build evidence, and link to the receipt they supersede with a revision note.
To reassess retained evidence with a reviewed ceiling, without executing another simulation:
uv run python -m benchmarks qualify --case rdw \
--recheck .benchmarks/suite/references/rdw-v1 --accuracy-bound 2e-4 \
--revision-note "Reviewed margin after numerical investigation" \
--out .benchmarks/suite/references/rdw-v2
The ceiling in this example illustrates the command; it is not an additional approved RDW default. Rechecking verifies artifact hashes, reevaluates retained errors and refinement floors, and writes a new receipt. It cannot fix an incorrect reference field. After fixing a reference implementation, prepare fresh evidence:
uv run python -m benchmarks qualify --case rdw \
--supersedes .benchmarks/suite/references/rdw-v1 \
--revision-note "Recomputed after correcting the reference implementation" \
--out .benchmarks/suite/references/rdw-v2
Replacement reference revisions advance automatically; a changed ceiling also
advances the policy revision. Explicit --reference-revision and --policy-revision
values may advance these further. Both comparison arms must be validated against
the same receipt to support adoption. Old bundles remain historical evidence under
their original policy; changing a ceiling does not rewrite their accuracy results.
Revalidation against a replacement needs retained output fields or a new collection.
Warnings are captured with phase, category, message and occurrence count. A case may declare a narrow expected pattern; undeclared warnings prevent adoption. The Kerr recipe retains its source’s Malitson UV extrapolation warning explicitly.
Native source coverage#
Coverage is an explicit developer diagnostic. It reports how much of the compiled native CPU backend the selected benchmark cases execute; it is not run by ordinary timing commands and has no automatic notifications or numerical target.
Prepare a separate Clang CPU build of native/ with
SOLPROP_NATIVE_ENABLE_COVERAGE=ON as described in native/README.md. Use LLVM tools from
the same compiler release. Keep the ordinary timing environment separate: timing
commands refuse an instrumented build. Then, from the repository root:
uv run python -m benchmarks coverage --set backend-exercise \
--python /path/to/coverage-environment/bin/python \
--native-root native \
--llvm-bin /path/to/matching/llvm/bin > coverage.log
The command prints a redirectable line/function/branch summary and the local report
path. Defaults are the core set and one thread. All admitted tracks of each case
are included; --case, --set, --all, --track, --threads and --diagnostic
select a narrower or broader diagnostic. Memory admission and timeouts still apply.
Failed, refused and excluded configurations remain visible.
Each configuration runs once, including construction, its declared lead-in and observations. There are no warmups, calibration loops or timing samples. A separate second execution collects Kokkos Tools labels. Capability tags describe intended workloads; observed labels show which named operations executed. Neither implies that every branch of a capability was exercised.
Reports default to ignored .benchmarks/suite/coverage/; --out chooses another
local directory. The bundle contains per-case, per-set and union HTML reports,
line/function/branch CSV views, labels, raw profiles and a copy of the exact binary.
They are local development artifacts, never committed automatically. Delete them
when no longer useful. Generated benchmark or coverage results do not belong in
the repository; only definitions, tests, policies and concise implementation notes
are versioned. export below writes an explicitly requested sanitized snapshot;
it does not publish or commit one.
Atomic Clang counters support threaded CPU execution. Process/module-specific profile names avoid collisions; source digests, binary hashes and profile hashes prevent mixing builds. Dependency code is excluded by source path, including dependency templates instantiated in a project translation unit. LLVM supplies the line-count aggregation. Uncovered compiled functions and branch outcomes are reported as misses. Unsupported configurations and compiled-out device capabilities are separate. Uninstantiated templates and preprocessor-elided paths have no LLVM coverage-map denominator; their counts remain unavailable, not zero. See the Clang coverage workflow.
Coverage is informational and has no required percentage. A timeout or memory
refusal leaves the selection incomplete and returns a nonzero exit status, while
reports for successful configurations remain available. Inspect summary.json
and configurations.csv alongside the HTML union to see its actual scope.
Instrumented execution can be much slower than ordinary propagation; its elapsed
time is not a benchmark result. A retry at another thread width is a separate
collection and does not erase the original failure.
Local tables and public export#
Collection writes normalized CSV views for runs, cases, configurations, systems, CPU allocations, measured processes and observed libraries alongside the existing sample, summary and accuracy tables. Records link through run, configuration and attempt identifiers. Missing telemetry carries a reason rather than a measured zero. Library records distinguish the initial inventory from pools observed after the measurement, including libraries loaded lazily by a backend.
Linux allocation records include physical cores, sockets, sibling CPUs and NUMA nodes when the operating system exposes them. Scheduler variables describe the allocation but do not prove exclusivity. Missing topology or residency information retains an explicit reason.
Collect thread and binding details separately from a timing campaign:
uv run poe bench diagnose --threads 1,production \
--out .benchmarks/suite/thread-diagnostics
This runs the small diagnostic case at each width serially, recording per-thread CPU time and, on Linux, allowed CPUs and resident NUMA pages. It does not change affinity. An allowed CPU set is not evidence of where a thread actually executed. These exploratory results cannot establish adoption.
Export a separate public snapshot explicitly:
uv run poe bench export .benchmarks/suite/runs/my-run \
--out .benchmarks/public/my-run --alias apple-silicon-development
The destination must be new or empty. The export retains timings, failures, contention, work counts, safe build identities and the selected configurations. It omits hostnames, original machine aliases, local paths, process identities, environment values, raw logs and free-form diagnostics. Its manifest states those omissions. The command writes files; it does not commit or upload them.
The runner and explicit native coverage command are ready for development use. Clean machine baselines and complete reference checks for the largest spatial cases remain follow-up work. Planning currently uses conservative memory budgets and reports unknown runtime costs; automatic reuse of measured memory and cost receipts is also a follow-up. These limits do not prevent exploratory timing.
A performance baseline belongs to a particular source and build. Prepare a fresh one after integrating performance changes, using matched workloads and thread budgets when comparing Numba and native CPU. This does not require repeating numerical reference preparation unless the reference’s workload or numerical assumptions changed.
Indicative results of earlier measurements are summarised under indicative results.
See SEP 30, Part II for the implementation decisions, measured evidence and remaining limitations.