PICO: Performance Insights for Collective Operations

Saverio Pasqualoni, Tommaso Bonato, Lorenzo Piarulli, Torsten Hoefler, Marco Canini, Daniele De Sensi | Sapienza University of Rome / KAUST / ETH Zurich | IEEE-conference-style preprint, 2025 | Open-source: https://github.com/HLC-Lab/pico


Problem

Collective operations are cornerstones of both HPC applications and large-scale AI training/inference, and at scale their communication cost often dominates application runtime. But benchmarking them systematically and reproducibly is hard on modern heterogeneous stacks: collectives intertwine network transfer, memory movement, and reduction/computation across scale-up/scale-out fabrics, multiple communication libraries (MPI implementations and *CCL), evolving network middleware (OFI/libfabric, UCX/UCC), and time-varying runtime conditions (congestion, allocation policies, task-to-node mappings). Each collective has several algorithms, each optimal for different node-count/message-size regimes, and libraries choose among them with conservative general heuristics. Existing tools (OMB, IMB, NCCL Tests, ReproMPI, CommBench) report only end-to-end timings, lack fine-grained phase/step profiling and controlled cross-library comparison, and do not systematically record experimental conditions.


Core Insight

A benchmarking framework should move from end-to-end reporting to diagnosis — controlled experiments that explain why a collective underperforms and which algorithmic step or subsystem dominates. PICO achieves this by decoupling a portable experiment description (test.json) from platform-specific execution (env.json), pairing it with backend-neutral, instrumentable reference collectives and metadata-rich run capture, so that default algorithm/transport choices can be shown to be up to 5x slower than the best available option and the loss localized to a specific phase.


Method

PICO is built around six requirements: R1 fine-grained profiling, R2 backend-neutral references, R3 portable spec and control, R4 automation, R5 metadata-rich reproducibility, R6 extensibility across stacks. Its architecture (Fig. 3) is:

TUI / CLI  ->  test.json (control intent)  +  env.json (platform capabilities)
                              |
                    Benchmark Orchestrator  (resolves + submits jobs)
                              |
                        pico_core  (timing-critical engine, backend adapters)
                          |     \
                    libpico       standardized results + metadata store
             (plain-MPI refs,          |
              tag instrumentation)  Post-processing tools
                                    (network tracer, plotters)

pico_core runs on compute nodes, initializes the communication context, applies requested controls via uniform backend adapters (compile-time selection, e.g. #ifdef NCCL/CUDA), and times target collectives across message sizes and scales. libpico supplies plain-MPI reference collectives (adapted from Open MPI and MPICH, built on point-to-point primitives) that isolate algorithmic differences from backend effects, and hosts optional tag-based instrumentation (PICO_TAG_BEGIN/PICO_TAG_END, nestable, compiled out when disabled, < 100 ns overhead per tagged region) that attributes time to phases, rounds, and steps. Results are stored per test-point with both requested and effective configuration, at configurable granularity (Full / Statistics / Minimal / Summary / None). A network traffic tracer estimates per-algorithm link utilization across topology domains (intra-node / intra-switch / inter-group) from allocation and topology metadata.


Experimental Setup

Component Value
Supercomputers Leonardo (Open MPI 4.1.6, UCX 1.15.0, Dragonfly), LUMI (Cray MPICH 8.1.29), MareNostrum 5 (Open MPI 4.1.5)
MPI collectives studied MPI_Allreduce (algorithm sweeps + Ring fixed), MPI_Bcast (distance-doubling vs distance-halving binomial), Rabenseifner Allreduce (instrumented)
Scales Leonardo 32-2048 nodes; LUMI up to 1024; MareNostrum 8-64; Bcast case 128 nodes x 4 procs/node; instrumentation 8 nodes; RNDV-rails test 32 nodes
Message sizes 32 B to 512 MiB
Metrics Median latency, best-to-default ratio r = t_best/t_def, normalized time, per-phase absolute/relative breakdown, network-volume estimates
AI trace replay ATLAHS toolchain, GOAL traces, NCCL 2.22 traces
AI workloads LLaMA 7B (16 & 128 GPUs), Mistral MoE 8x8B (64 GPUs)
NCCL algorithms/protocols Ring, Tree, Binomial Butterfly (PAT); Simple (large-message bandwidth), LL (small-message latency)

Headline Quantitative Results

Default-vs-best collective algorithm (MPI_Allreduce sweeps):

Backend/transport parameter (UCX_MAX_RNDV_RAILS, Ring Allreduce, Leonardo 32 nodes):

Broadcast algorithm comparison (Leonardo, 128 nodes, 4 procs/node):

Fine-grained instrumentation (Rabenseifner Allreduce, 8 nodes):

End-to-end AI training (ATLAHS trace replay):


Limitations


Open Problems


Note on NCCL Tuning

PICO's ATLAHS study is a direct demonstration that per-collective algorithm and protocol selection drives end-to-end training time. Replacing NCCL 2.22's default Ring/Simple choices for AllGather and ReduceScatter with Binomial Butterfly + Simple for those collectives, plus Tree + LL for the small (< 1 KiB) Allreduce, cut simulated LLaMA 7B iteration time by 21% at 16 GPUs and 44% at 128 GPUs. The paper cleanly separates the algorithm-vs-protocol axes that map onto NCCL's own knobs: Simple favors large-message bandwidth while LL (flag-based synchronization) favors small-message latency, and the winning protocol tracks the collective's message-size distribution. The MoE null result — where large collectives already favored Ring — shows the best configuration is workload- and size-dependent rather than a fixed default, exactly the regime a per-collective tuner targets.