Benchmarking ALCF systems with torch-hammer
Nine GPU benchmarks on Sunspot (PVC Max 1550) and Sirius (A100). Aurora and Polaris are queued. PVC Max 1550 measured 8.4× A100 on Sparse MM.
torch-hammer is an HPE-maintained GPU benchmark suite. It runs 9 workloads, from batched GEMM and stencil PDEs to sparse matmul. Telemetry uses NVML, ROCm-SMI, and xpu-smi. It writes CSV and HTML fleet reports and aggregates multi-GPU results with multiprocessing.spawn. One codebase supports CUDA, ROCm, XPU, and MPS.
Results
Both completed runs used the same 9 benchmarks, --stress-test, and HBM-scaled sizing. Aurora and Polaris were queued in debug behind reservations when this snapshot was recorded.
1-GPU stress (HBM-scaled, float32):
| Benchmark | Unit | Sunspot XPU Max 1550 | Sirius A100 40GB SXM4 | Winner |
|---|---|---|---|---|
| Batched GEMM | GFLOP/s | 18,907 | 18,861 | Tie |
| Convolution | img/s | 1.64M | 9.36M | A100 5.7× |
| 3D FFT | GFLOP/s | — | — | — |
| Einsum Attention | GFLOP/s | 14,240 | 17,058 | A100 1.2× |
| Memory Traffic | GB/s | 27.7 | 29.6 | A100 1.07× |
| Heat Equation | MLUPS | 10,613 | 15,501 | A100 1.46× |
| Schrödinger Equation | iter/s | 43.2 | 58.8 | A100 1.36× |
| Atomic Contention | Mops/s | 1,734 | 9,176 | A100 5.3× |
| Sparse MM | GFLOP/s | 2,028 | 243 | XPU 8.4× |
All-GPUs fleet (stress, per-node):
| System | GPUs | Batched GEMM | Convolution | Einsum | Mem BW | Verdict |
|---|---|---|---|---|---|---|
| Sunspot | 24 (2×12 tiles) | 18.0 TFLOP/s | 1.49M img/s | 13.9 TFLOP/s | 27.0 GB/s | 2/2 PASS · CV 0.7–5.7% |
| Sirius | 4 visible (2 allocated) | 18.9 TFLOP/s | 9.39M img/s | 17.1 TFLOP/s | 29.6 GB/s | 1/1 PASS · CV ≤0.2% |
PVC Max 1550 measured 2,028 GFLOP/s on Sparse MM; A100 measured 243 GFLOP/s, an 8.4× difference on this unstructured sparse workload. A100 led the other reported benchmarks or tied Batched GEMM.
Neither system completed 3D FFT. XPU returned an MKL DFT “unimplemented” error for the configured shape. Sirius ran out of memory at 11.75 GiB under stress fill on its 40 GB GPU; earlier benchmarks already held about 30 GiB.
What was needed per machine
| Sunspot | Aurora | Polaris | Sirius | |
|---|---|---|---|---|
| GPU | PVC Max 1550 · 12 tiles/node | PVC Max 1550 · 12 tiles/node | A100 40GB · 4/node | A100 40GB · 4/node |
| Queue | workq · datascience | debug · AuroraGPT | debug · datascience | workq · datascience |
| Filesystems | home:tegu | home:flare | home:eagle | home |
| Env | ezpz_setup_env → frameworks/2026.1.0 | ezpz_setup_env or venv | conda base | miniconda3/envs/cu122-pt221 |
| MPI | mpiexec --ppn | mpiexec --ppn | mpiexec --ppn | none — head-node fallback |
| Telemetry | placeholder (no xpu-smi) | placeholder | NVML (full) | NVML (full) |
Sirius defaults to Python 3.6, which raises a SyntaxError on from __future__ import annotations. It has no mpirun, srun, or pbsdsh, and the report tool also fails under Python 3.6. The run used miniconda3/envs/cu122-pt221 with Python 3.11 and torch 2.2. A single-node --all-gpus fallback uses torch.multiprocessing.spawn to run on all 4 A100s.
The same PBS template works on the larger systems with per-system account, queue, and filesystem values. Each host uses one rsync staging step for torch-hammer.py, reports/, and config-examples/ in ~/thammer-staging.
How the run is structured
Every job does the same four phases:
- Single-GPU quick: all 9 benchmarks at small sizes with
--device-index 0. This checks the run and exercises the CSV, JSON, and HTML report paths. - Single-GPU stress: all 9 benchmarks with
--stress-test, sized to fill about 50% of free HBM. The memory benchmark measured0.3 GB/sbefore the sizing fix and27.7 GB/safter. The earlier run used a 4 KiB buffer and measuredrandintoverhead. - Per-node all-GPUs: the
gemm,conv,einsum, andmemory-trafficsubset under stress. Onempiexecrank runs per node and starts the node’s GPUs. - Reports:
hammer_report.pyreads each CSV and JSON artifact. A fleet rollup readsall-benchmarks/.
Phase 3 is what produces the fleet verdict. Mixing quick + stress CSVs in one directory gives a spurious 0/N OUTLIER report (different problem sizes) — isolated per-phase outputs are the correct inputs to the fleet report.
Detailed results
Sunspot — Intel Data Center GPU Max 1550
2 nodes, 12 PVC tiles each, 24 GPUs total. Job 12483256, walltime 00:12:18, via ezpz_setup_env → frameworks/2026.1.0 (torch 2.13 + XPU).
Single-GPU stress (head tile):
| Benchmark | mean | unit | min | max |
|---|---|---|---|---|
| Batched GEMM | 18,907 | GFLOP/s | 18,900 | 18,921 |
| Convolution | 1,640,940 | img/s | 1,635,519 | 1,662,918 |
| Einsum Attention | 14,240 | GFLOP/s | 13,977 | 16,456 |
| Memory Traffic | 27.7 | GB/s | 27.3 | 28.0 |
| Heat Equation | 10,613 | MLUPS | 5,606 | 10,720 |
| Schrödinger Equation | 43.2 | iter/s | 42.7 | 43.3 |
| Atomic Contention | 1,734 | Mops/s | 1,732 | 1,735 |
| Sparse MM | 2,028 | GFLOP/s | 2,010 | 2,054 |
Fleet (4 benches, stress, both nodes):
Batched GEMM 18.0 TFLOP/s CV 0.7%
Convolution 1.49M img/s CV 1.0%
Einsum 13.9 TFLOP/s CV 5.7%
Memory Traffic 27.0 GB/s CV 4.6%
FLEET VERDICT: 2/2 PASS
No power/temp columns — xpu-smi / Level Zero telemetry is not yet wired on the compute image; IntelTelemetry currently returns N/A for those fields.
Sirius — NVIDIA A100-SXM4-40GB
1 node, 4 visible A100s (2 allocated; head-node fallback). Job 33426 (retry after pbsdsh fix), walltime 00:02:08 / 00:01:14, via miniconda3/envs/cu122-pt221 (torch 2.2, CUDA 12.1, driver 535).
Single-GPU stress (head GPU):
| Benchmark | mean | unit | min | max | power | temp |
|---|---|---|---|---|---|---|
| Batched GEMM | 18,861 | GFLOP/s | 18,849 | 18,870 | 323 W | 48 °C |
| Convolution | 9,364,516 | img/s | 9,310,987 | 9,421,163 | 390 W | 52 °C |
| Einsum Attention | 17,058 | GFLOP/s | 17,012 | 17,084 | 347 W | 52 °C |
| Memory Traffic | 29.6 | GB/s | 29.6 | 29.6 | 194 W | 49 °C |
| Heat Equation | 15,501 | MLUPS | 15,420 | 15,510 | 289 W | 45 °C |
| Schrödinger Equation | 58.8 | iter/s | 57.0 | 59.0 | 201 W | 45 °C |
| Atomic Contention | 9,176 | Mops/s | 9,134 | 9,179 | 124 W | 41 °C |
| Sparse MM | 243 | GFLOP/s | 243 | 243 | 221 W | 44 °C |
Fleet (4 benches, stress, 4 GPUs):
Batched GEMM 18.9 TFLOP/s CV 0.2% 313 W 48 °C
Convolution 9.39M img/s CV 0.2% 386 W 52 °C
Einsum 17.1 TFLOP/s CV 0.2% 339 W 53 °C
Memory Traffic 29.6 GB/s CV 0.0% 191 W 52 °C
FLEET VERDICT: 1/1 PASS
Full NVML telemetry — power, temp, SM util, clocks — in every row.
Aurora & Polaris — queued
Both jobs were queued in debug behind unrelated reservations and a 58-deep prod routing queue. Their results are not included here.
Reproducing the runs
- Stage
torch-hammer.py,reports/, andconfig-examples/in~/thammer-stagingon each host. - Set the system account, queue, filesystem, environment, and MPI launcher in the PBS template.
- Keep report inputs separated by phase. Mixing quick and stress CSVs produces a
0/N OUTLIERresult because the problem sizes differ. - Run
hammer_report.pyon each single-GPU, stress, and fleet artifact.
Artifacts
- Code:
saforem2/torch-hammer, branchfeature/intel-xpu-support(XPU backend and--stress-testHBM fix) - HTML report snapshots: combined 1-GPU comparison and stress comparison; Sunspot compact 1-GPU, full 1-GPU, 24-GPU fleet, and fleet rollup; Sirius compact 1-GPU, full 1-GPU, and 4-GPU fleet.
- Jobs: Sunspot
12483256(F 00:12:18), Sirius33426(E 00:02:08 → R 00:01:14 after fix)