bench/: repro.sh (Linux, macOS) and repro.ps1 (Windows) print the machine, check the genesis pack's lottery hash vectors on the CPU and every GPU, hash for 120 s per card at 1 GiB, probe random reads at 4, 64, 256 and 1024 MiB, sweep the same sizes, prove and verify one fixture shard when a 12 GB NVIDIA card and a prover host exist, and write one JSON result (the bench table's row shape, every command, every binary's sha256, the tolerances) plus a table. make-package.sh builds igneum-repro-<tag>.tar.gz and .zip from the existing cross-build scripts; ingest.mjs checks a result against bench/reference.json and adds "reproduced externally" rows to site/miner-bench.json only when every number agrees; publish-public.sh --repro publishes next to the downloads (not deployed). The workers gained --list, --bench --pack --seconds --dataset-mib and --memprobe (CUDA from the readwidth branch, OpenCL memprobe from opencl-rdna4, Metal new) with RESULT and DEVICE lines; igneum-pow gained check-pack; the pack reader accepts a string-seed pack. Runs (docs/benchmarks/repro.md, the bench-log entry, evidence rows 4, 5, 15): the Mac under the measure lock (Metal 27.674 MH/s, Apple OpenCL 26.875, 96/96 on CPU, Metal and OpenCL, 2^24 fingerprint 25f96e7dce90bd4e, 3.40 G random reads/s, CPU verify 0.611 ms per warp); PC 2 (96/96 through NVRTC, NVIDIA OpenCL and AMD OpenCL with the same fingerprint; gfx1036 3.312 MH/s; the 5090 rows beside the app's live miner, 62.4 MH/s, not the card's; the live host proved and verified the shard through step 6, compressed 33.9 s). PC 1 went down before its slot; owed. Classes closed: the PC job parses the package script before touching a card and bench/ is in the Windows 5.1 parse job; the card-off is confirmed by nvidia-smi's compute-apps list and the prover's state read from settings.json, never api/state; PowerShell case-only variable pairs fail CI (bench/jobs/ps-case-check.sh); the package builder keeps the Mac workers outside the stage and checks every binary with file -b. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| jobs | ||
| ingest.mjs | ||
| make-package.sh | ||
| README.md | ||
| reference.json | ||
| repro.ps1 | ||
| repro.sh | ||
Igneum reproducible benchmark
One command reproduces the numbers on the Igneum bench table on your own machine, on day one, with no secrets, no node, no wallet and no network connection. The result is one JSON file you can send back, signed by nothing, that names every command run and the sha256 of every binary used.
Run it
| Platform | Command |
|---|---|
| Linux (x86_64, NVIDIA driver or any OpenCL driver) | tar xzf igneum-repro-<tag>.tar.gz && cd igneum-repro-<tag> && ./repro.sh |
| macOS (Apple silicon) | the same tar.gz; ./repro.sh |
| Windows 10 or 11 (x64) | unzip igneum-repro-<tag>.zip, then in PowerShell: powershell -ExecutionPolicy Bypass -File repro.ps1 |
Options: --seconds 120 (per card, the default), --only cuda:0,opencl:1 (one card; the indexes are the ones --list
prints at the start), --no-probe, --no-sweep, --no-prove, --out <dir>. On Windows the same as -Seconds,
-Only, -NoProbe, -NoSweep, -NoProve, -Out.
Stop mining on the card first. A number taken while a miner, a game or another benchmark holds the card is not a number; the result file does not know, so you do.
Time: about 4 minutes per card (120 s hash benchmark, three short sweep sizes, the probe table), plus the CPU check (one second). The optional proving step takes about a minute on an RTX 5090 class card and needs a prover host you built (below).
What runs, in order
| Step | What | What it needs | What it reports |
|---|---|---|---|
| 1 | The machine | nothing | OS, CPU, memory, every GPU each worker sees (name, driver, memory) |
| 2 | The lottery hash vectors of the published genesis pack (packs/igneum-genesis-mh: seed igneum-genesis, day 2026-10-03, generator 2, memory-hard 1 GiB dataset, program id bcc1248b10cc90f2) |
a CPU; every GPU present | bit-exact or not: 3 warps, 96 lanes, the cache FNV, on the CPU through the Rust interpreter and on every GPU through its own compiler (NVRTC, the OpenCL driver, Metal) |
| 3 | The hash benchmark, 120 s per card at 1 GiB | a GPU with 1.3 GB free | MH/s, the hashes done, and the fingerprint of the first 2^24 outputs (equal fingerprints on two machines mean every one of those 16.7 million hashes agreed) |
| 4 | The random-read probe at 4, 64, 256 and 1024 MiB | a GPU | dependent random 4-byte reads per second (the hash's access pattern) and their latency, eight independent chains, 64-byte lines, the coalesced stream bandwidth, an integer chain |
| 5 | The chip-resistance sweep: the same program at 4, 64, 256 and 1024 MiB | a GPU | MH/s per size; the ratio in-cache to 1 GiB; the hash's share of the card's random-read ceiling (MH/s x 128 loads against step 4's chase at 1 GiB) |
| 6 | One fixture shard proven with the pinned guest and verified (optional) | an NVIDIA card with 12 GB or more, Linux or WSL2, a built igneum-prove-host (IGNEUM_PROVE_HOST) |
execute, core and compressed proof times, the verify time, VERIFIED or not; otherwise the line says why it was skipped |
| 7 | The result | nothing | results/igneum-repro-<os>-<time>.json and .md, plus the full log |
The CUDA worker needs only the NVIDIA driver on Windows (the runtime compiler ships in the package) and the driver plus
libnvrtc.so.12 on Linux (from the CUDA toolkit or NVIDIA's nvrtc redistributable). The OpenCL worker needs the GPU
driver's OpenCL (AMD Adrenalin or ROCm, Intel, NVIDIA, Apple). An NVIDIA card is run through CUDA for the full time and
through OpenCL for a quarter of it as a cross-check; an Apple card through Metal and through Apple's OpenCL the same way.
The pass marks and the tolerances
| Number | Pass mark |
|---|---|
| Vectors | exact: every lane of every warp, on the CPU and on every GPU |
| Fingerprint | exact across machines at the same --batch-log2 |
| Hash MH/s at 1 GiB | within 3% of the published figure for the same card model |
| Sweep MH/s | within 10% |
| Random reads at 1 GiB (G loads/s), stream GB/s | within 10% |
| CPU verify per warp | under 10 ms on any core (the chain's verification gate); the published cores are under 1 ms |
| Proof times | within 25% |
A row on the bench table (/miners) becomes "reproduced externally" when an unrelated operator's result agrees with the
team's reference within these tolerances. Disagreeing results are published too, as "submitted", with the deltas.
Send it back
Attach results/igneum-repro-<os>-<time>.json (and the .md if you like) to an issue on the Igneum repository once it
is public, or email it to the address on igneum.network. Say which card was idle (no miner, no game) during the run.
The file carries no hostname, no user name and no address; it carries your GPU and CPU models, your OS version and the
driver version.
The reproduction reward
The reward terms are the ones of docs/benchmarks/proving-e2e.md section 8.1, unchanged: a published fixed reproduction
reward, equal for everyone and announced before the run, is allowed and disclosed; three operators are unrelated when
they are different persons not paid by the project beyond that reward, on hardware bought separately with no shared
host, card, rack or power meter, on different autonomous systems and at different sites, running the same published
release by hash, with no payment, loan or equipment between them or from the project beyond the disclosed reward. The
amount and who pays it are in docs/plans/funding.md (challenge reward row); nothing is funded as of 6 October 2026,
and reproduction is asked for without a reward, which the standard allows.
Build the package yourself
From the Igneum repository at the tagged commit: bench/make-package.sh (macOS with swiftc, cargo, zig and mingw-w64;
every binary comes from the repository's own cross-build scripts). The sha256 of every file is in SHA256SUMS, and the
VERSION file names the tag and commit. bin/windows-x86_64/THIRD-PARTY.md lists the one third-party component (NVIDIA's
NVRTC runtime compiler) with its licence.