STREAM
STREAM measures sustainable main-memory bandwidth using large vector kernels, with Triad the headline metric. It exposes the memory ceiling that CPU benchmarks miss but is sensitive to threading and NUMA setup.
STREAM, created by John McCalpin, is the de facto standard for measuring sustainable memory bandwidth. Unlike CPU benchmarks that often fit in cache, STREAM deliberately uses arrays far larger than the last-level cache so that performance is bound by the path to main memory (DRAM, HBM, or similar). It answers a question CPU scores cannot: how fast can the machine actually feed data to the cores. For many real workloads, this memory ceiling, not peak FLOPS, determines achievable performance.
What It Measures
STREAM runs four simple vector kernels over large arrays and reports the achieved bandwidth in MB/s or GB/s for each: Copy (a[i]=b[i]), Scale (a[i]=qb[i]), Add (a[i]=b[i]+c[i]), and Triad (a[i]=b[i]+qc[i]). Triad is the most cited because it mixes a multiply and an add and best reflects real numerical loops. The numbers represent sustained, not peak theoretical, bandwidth, which is what applications can realistically expect rather than the marketing figure derived from clock and channel width.
Methodology
The arrays must be sized at least four times the last-level cache so cache reuse cannot inflate results. The kernels run many times; the best timing is reported to minimize noise from the operating system and other processes. Correct measurement requires proper memory allocation across NUMA nodes, thread affinity (pinning threads to cores), and OpenMP parallelism to saturate all memory channels. On multi-socket systems, first-touch allocation matters because pages map to whichever node first writes them. Run rules require disclosing array size, compiler, thread count, and pinning so others can reproduce the result.
How to Interpret Results
Higher bandwidth is better. Compare Triad numbers across systems for the cleanest read on memory-bound capability. A STREAM result well below theoretical peak usually signals misconfiguration: too few threads, poor NUMA placement, unpopulated memory channels, or a compiler that failed to use non-temporal stores. STREAM is essential for HPC, in-memory databases, analytics engines, and any workload that streams large datasets, where memory bandwidth sets the ceiling and adding cores yields no further speedup once that ceiling is hit.
Limitations
STREAM measures only sequential, bandwidth-bound access; it says nothing about random-access latency, compute throughput, or cache behavior for small working sets. Real applications with irregular or pointer-chasing access patterns may see far less effective bandwidth than STREAM reports. Results are highly sensitive to compiler, threading, and NUMA setup, so cross-system comparison demands matching configurations. Use it alongside latency tests, random-access microbenchmarks, and compute benchmarks for a complete picture of the memory subsystem.