
## Memory bandwidth per box — STREAM triad

`triad.c`: `a[i] = b[i] + scalar*c[i]` over 100,000,000 doubles per array
(**2,289 MiB working set**, far larger than any last-level cache in the estate),
24 bytes of traffic scored per element, OpenMP across all logical CPUs,
`gcc -O3 -march=native -fopenmp`, first of 10 reps discarded as warmup, **best of the
remaining 9**. No hardware identity is needed to read this table.

Built natively on two of the three boxes; the third had no C compiler, so its binary was
cross-built to the same ISA target (`receipts/triad-cpu-mini.txt`, and DS1 in `prereg.md`).

**The rule for the spread column, stated, and it is NOT the dispersion table's rule:**
spread here is **(best − worst) as a percentage of the WORST** — 59.31 − 49.21, over 49.21,
= 20.5%. Over the best instead it is 17.0%. Two tables in this kit, two denominators; both
are named where they stand. See `counting-rules.md`, rule 5.

| box | threads used | best triad GB/s | worst triad GB/s | spread |
|---|---|---|---|---|
| a server with 128G of ECC RAM | 64 | **100.69** | 100.36 | 0.3% |
| test Rig B laptop | 24 | **59.31** | 49.21 | 20.5% |
| a mini PC with 32G RAM | 16 | **51.12** | 50.85 | 0.5% |

Ratios: server **1.70x** the laptop, **1.97x** the mini PC; the laptop **1.16x** the mini PC.

Rig B's 20% spread is real and is reported rather than smoothed: OpenMP splits 24 threads
statically across 8 performance and 16 efficiency cores, so each rep's time depends on how
those halves interleave. Read it as "roughly 50–59 GB/s". The other two boxes repeat to
within half a percent.

The server measurement ran on an idle machine (loadavg `0.09 0.06 0.03` on 64 threads
immediately before, no bench processes, GPU at its standing 38,764 MiB / 0% baseline — the production seats, idle and resident, untouched by this bench), took
about 30 seconds, and the binary plus its source were deleted in the same command.

