Note · Performance

The scaling result I published, and why I retracted it

PETSc · MPI · OpenMP · ARCHER2

An earlier version of this page said pure MPI won at every size. A larger experiment says the opposite.

Stage 1

What I claimed

A single-node sweep over every legal rank/thread split of 128 cores.

Layout (128 cores) 1.00 M unknowns 40.96 M unknowns
128 ranks × 1 thread3.9 s846.9 s
64 ranks × 2 threads4.4 s850.8 s
32 ranks × 4 threads6.4 s866.4 s
16 ranks × 8 threads15.5 s1140.0 s
1 rank × 128 threads208.4 s

// superseded

Pure MPI wins every column. I wrote that up as a finding.

Stage 2

What broke it

Two audits, neither about performance.

Retracted: Retracted: every layout ranking in the original table.
Stage 3

The experiment that replaced it

Rebuilt: CG + GAMG fixed everywhere, 5M–165M unknowns, up to 4,096 cores.

408 runs passed a six-point content audit; failures are kept but never aggregated.

Stage 4

The opposite answer

Hybrid wins in both dimensions, with a different layout each time.

Experiment Fastest layout Result
2D weak scaling64 × 2794.8M eq/s @ 165M / 32 nodes · +13.1% vs flat MPI
3D weak scaling32 × 4+33.2% throughput at best point · 24.9% time saved
2D strong scaling, fixed 20M64 × 229.83× on 32 nodes · 93.2% efficiency
3D strong scaling, fixed 20M16 × 83.81× faster than flat MPI on 32 nodes

There is no single best thread count — only a best one for a given work per core.

Stage 5

Why, this time with a mechanism

MPI exposure collapses as OpenMP waiting rises; the ranking is where they cross.

Layout PETSc kernels OpenMP waiting MPI
64 × 24.5%48.3%46.7%
32 × 47.5%69.3%22.6%
16 × 815.6%76.5%6.2%

Threaded BLAS is not the explanation either.

What I actually changed

Full experiment and audit summary: hpc_benchmark_archer2. The earlier single-node dataset is what the agent in hpc-benchmark-agent reads.