GPU Communication
Follow values, dependencies and buffer ownership. Then optimize the cost that remains exposed.
On this page
What must move before the next operation can start?
A distributed layer can finish its local matrix multiplication and still be unable to start the next operation. The missing result belongs to another GPU. Communication must deliver the required values, make them visible, and preserve them until the receiver finishes.
For a visual reference to each operation, start with Collective Communication. A collective coordinates a group of ranks. A rank is one participant, often one GPU. AllReduce applies a reduction across inputs and returns the complete result to every rank. ReduceScatter leaves each rank with one reduced partition. AllGather distributes partitions without reducing them.
The important question is not only “how many bytes?” Ask which rank owns each value and which dependency waits for it. Distributed Training and Parallelism explains why a tensor layout requires a particular collective. This note follows the implementation that makes that collective correct and fast.
Arrival, visibility, consumption and reuse
| Event | Required guarantee | Failure without it |
|---|---|---|
| Arrival | The data transfer reaches the destination | Receiver reads old contents |
| Visibility | The consuming GPU observes the intended writes in order | Readiness appears before valid payload |
| Consumption | The receiver finishes reading the epoch | Producer cannot yet reclaim the storage |
| Reuse | The next writer has permission to overwrite | Fast sender destroys unread data |
A completion flag can represent one event without representing all four. A kernel launch is not a completion boundary. A NIC completion is not automatically every GPU visibility guarantee. Keep the data lifetime and memory-order contract explicit.
Four choices behind one collective
| Choice | Question | Example |
|---|---|---|
| Algorithm | Who exchanges which partition in what order? | Ring, Tree, one-shot, two-shot |
| Protocol | How does the receiver recognize and consume ready data? | Simple, LL, LL128 |
| Transport | How does one logical edge move bytes? | P2P, SHM, Socket, IB/RoCE |
| Channels | How many parallel work pipelines partition the operation? | Several active CUDA blocks |
“Ring” does not reveal whether the operation uses LL128 over NVLink or Simple through an RDMA proxy. The choices interact, but they are not synonyms. The historical implementation discussion below follows the paper’s NCCL 2.19.1 analysis; it is not a current-release support specification.
From API call to execution plan
API operation
→ plan: algorithm + protocol
→ active channels / CUDA blocks
→ channel regions and outer iterations
→ chunks / circular slots
→ fused device primitives
→ physical transportNCCL provides communicator creation and teardown, AllReduce, Broadcast, Reduce, AllGather, ReduceScatter, Send and Recv. GroupStart/GroupEnd can aggregate operations and combine point-to-point exchanges. Groups also prevent deadlock when one CPU thread manages several GPUs.
Ranks must issue matching operations in the required order. A call inside a group can return before enqueueing its work. Nonblocking GroupEnd can return ncclInProgress while enqueueing continues. Check communicator success before related CUDA synchronization; successful enqueue is still not GPU completion.
NCCL group semantics ↗ documents these distinctions. Grouping reduces particular launch costs, not every dependency between the grouped operations.
Launch models and communicator lifetime
| Organization | Useful property | Cost to inspect |
|---|---|---|
| One process per GPU | Process isolation and NUMA placement | IPC and extra processes |
| One process, one thread per GPU | Shared address space | Thread affinity and scheduling |
| One thread controlling several GPUs | Simple host organization | Required grouping and sequential control costs |
Each rank has a local communicator. Initialization discovers the topology and constructs reusable channels. A ring records predecessor and successor. A tree records parent and children. Initialization costs and per-collective costs need separate measurement windows.
Logical edges are not physical links
A logical edge describes a dependency between ranks. The transport maps that edge to NVLink, PCIe, host memory or a network path. Two logical neighbors need not be adjacent in the machine.
A scale-up domain is a tightly connected GPU fabric. It can span physical hosts, as in the paper’s NVL72 system. A host boundary alone does not identify a scale-out transfer. Rank placement, NIC affinity, rails and oversubscription determine the actual path.
Keep frequent activation collectives inside the fastest suitable domain when possible. That placement advice does not mean every direct path is automatically usable. Check topology and the selected transport rather than inferring them from a machine name.
Watch partial contributions become a complete sum
Split every input into N blocks. During reduce-scatter, each block travels around the ring and accumulates contributions. After N−1 transfer rounds, one rank owns each complete reduced block. AllGather then circulates those complete blocks for another N−1 rounds.
Follow one ring, block by block
State=0; phase=Local input partitions; transfer rounds completed=0; No transfer yet.
Conceptual integer example. Rank r starts with [10r+1,10r+2,10r+3,10r+4]. “Sources” identifies every input already included in that block. A completed block contains all four sources. Intermediate blocks are not all valid outputs. Layout order is fixed; there are three reduction rounds and three distribution rounds. This is not measured NCCL timing.
For the four-rank example, the final vector is [64,68,72,76]. A partially accumulated block is not a valid final output. The animation lists contributing ranks so a large partial value cannot be mistaken for a complete reduction.
Primitive actions and transfer rounds
| Indexed action | Fused work |
|---|---|
| 0 | send |
| 1 through N−2 | recvReduceSend |
| N−1 | recvReduceCopySend |
| N through 2N−3 | recvCopySend |
| 2N−2 | recv |
This convention counts 2N−1 primitive actions, including endpoint actions. The bandwidth model counts 2(N−1) transfer rounds. For N=2, both intermediate ranges are empty. Neither count implies that a kernel is a sequence of equal-duration global rounds.
Ring AllGather initializes with send or copySend, forwards with recvCopySend, and finishes with recv. A contributed block needs N−1 hops to reach all ranks. ReduceScatter starts with send, accumulates with recvReduceSend, and finishes with recvReduceCopy into the owning rank’s shard.
Trees and root-directed chains
A tree reduces toward a root and broadcasts away from it. A leaf sends its contribution, then receives the result. An internal rank receives children’s partial results, includes local input, and forwards the reduction. The root completes the sum and begins distribution.
| Role | Primitives |
|---|---|
| Leaf | send, then recv |
| Internal | recvReduceSend, then recvCopySend |
| Root | recvReduceCopySend |
The analyzed NCCL implementation branches primarily between nodes and can chain local GPUs. Double binary trees divide traffic and try to avoid making the same rank internal in both trees. The second tree mirrors the first for even rank counts and shifts it for odd counts.
Ring Broadcast and Ring Reduce become root-directed chains. Broadcast uses send/copySend, intermediate recvCopySend and terminal recv. Reduce uses initial send, intermediate recvReduceSend and root recvReduceCopy. A chain’s root and direction are part of the dependency graph.
What does pipelined mean here?
The paper calls Ring AllReduce, AllGather and ReduceScatter non-pipelined across outer loop regions. A channel finishes the current region’s dependent primitive sequence before starting the next region. That classification does not deny overlap between slots, channels or thread roles.
Tree AllReduce and chain-like Broadcast/Reduce can pipeline successive regions. An upstream stage starts a later chunk while a downstream stage handles an earlier one. Reduction and distribution can overlap on different chunks, not on a result that does not yet exist.
The analyzed tree implementation can divide thread resources between reduction and distribution, assigning more threads to the reduction side. That allocation does not guarantee an exclusive partition of physical SMs under every CUDA schedule.
When a diagram says “overlap,” identify the independent pieces of work. Async submission alone does not prove that the critical-path transfer is hidden.
Channels expose bandwidth and consume resources
One pipeline may not saturate the available links. NCCL partitions the collective across active channels. In the analyzed kernel layout, each active channel maps to one CUDA block and processes its region. Different channels can use different logical paths.
More channels can expose parallel bandwidth and stripe across NICs. They also consume buffers, SM resources, registers and cache capacity. Smaller per-channel chunks can leave network FIFO slots partly filled. More queue pairs and small packets can reduce useful transfer efficiency.
The analyzed Simple network slot is 512 KiB. That historical size explains one fragmentation mechanism; it is not a universal tuning threshold. CUDA does not guarantee one exclusive, distinct SM for each channel block. Benchmark nearby channel counts with the real concurrent workload.
Regions, chunks and circular slots
workOffset identifies a channel’s region; channelCount gives its size. The runtime divides a large region into outer iterations and chunkCount-sized pieces. The final piece can be shorter. Track element units: reduction elements have the declared arithmetic type, while copy paths can process byte-oriented payloads internally.
| Protocol | Channel capacity | Slot capacity | Useful payload per slot |
|---|---|---|---|
| Simple | 4 MiB | 512 KiB | 512 KiB |
| LL | 256 KiB | 32 KiB | 16 KiB |
| LL128 | about 4800 KiB /4.69 MiB | 600 KiB | 562.5 KiB |
Different slots can be produced, queued, in flight, reduced or consumed at once. The eight slots are pipeline depth, not permission to overwrite eight arbitrary outstanding transfers. Per-slot metadata and producer/consumer counters retain ownership.
A slot needs a consumption credit
A producer can write epoch e into slot e mod capacity only after the previous occupant has been consumed. The consumer checks the expected epoch, not merely “nonempty.” Counters distinguish a new cycle from stale data in the same address.
if produced - consumed == capacity:
wait_for_consumer_credit()
slot = produced % capacity
write_payload(slot, produced)
publish_ready_with_required_ordering(slot, produced)
produced += 1This is illustrative pseudocode, not CUDA code. The real implementation must define atomic operations, memory scope, fences and counter wraparound. A correct abstract queue does not establish the hardware visibility protocol.
Communication also executes on the GPU
The analyzed launch grid is (nChannels,1,1). A channel mask maps block indices to active logical channels. The first two warps load communicator and channel metadata into shared memory. Other warps perform communication, copies and reductions; point-to-point kernels divide send and receive roles.
The work descriptor’s nWarps field controls working-warps allocation. A mask can select nonconsecutive logical channels: blockIdx.x maps to the corresponding set bit, not necessarily the same numeric channel ID. These are version-specific launch details.
Threads process protocol-specific vector units with warp-uniform control flow. Parallelism exists across blocks/channels, slots, specialized warps and vectorized elements. These layers explain why one latency/bandwidth number can miss implementation behavior.
Communication kernels contend with model kernels for SMs, registers, caches and HBM bandwidth. Increasing communication concurrency can reduce model compute throughput even if link utilization improves. Profiling helps locate the exposed effect.
Fuse receive, reduce, copy and send
recvReduceSend means receive a partial value, combine local input, then forward the new partial value. recvReduceCopy also stores the completed local result. recvReduceCopySend stores and forwards. copySend and recvCopySend distribute data without another reduction.
Fusing these operations avoids extra kernels and intermediate user-buffer trips. Direct variants can bypass a FIFO when pointers and lifetime rules permit it. Bypass does not remove synchronization.
These primitives favor small fixed peer counts, as in rings and trees. AllToAll has many destinations and variable ownership. Grouped Send/Recv can express an application-level exchange, but full AllToAll is not simply the same two-peer primitive at a larger message size. MoE connects that exchange to expert dispatch.
Direct pointers, P2P and host staging
GPUDirect P2P lets one GPU access another GPU’s memory without host payload staging. NVLink and supported PCIe P2P are possible physical paths. Same-process P2P_DIRECT can use device pointers without IPC-handle exchange and can bypass an intermediate FIFO. Head/tail ownership still matters.
When P2P is unavailable or a cross-socket route is poor, shared host-memory staging can be faster. The extra GPU-to-host and host-to-GPU copies do not automatically make that path worse than every direct route.
Some local GPU pairs can communicate through nearby NICs: GPU→NIC→NIC→GPU. “Intra-node” therefore does not guarantee NVLink. NCCL_CROSS_NIC controls inter-node NIC/rail choices; it is not a general switch that forces this local transport.
The network data path and its control plane
Socket payload:
GPU → pinned host buffer → TCP/network
→ remote host buffer → remote GPU
Supported GPUDirect RDMA payload:
GPU memory ↔ NIC ↔ network ↔ NIC ↔ GPU memoryThe socket fallback adds PCIe copies and CPU/network stack work. A CPU proxy coordinates network progress and rendezvous state. Separate payload staging from bootstrap and control traffic; removing a payload copy does not remove all host involvement.
Direct GPU access needs a supported path
The IB transport uses verbs for InfiniBand or RoCE. Remote direct memory access(RDMA) transfers into registered memory. Without supported GPU registration and topology, the registered staging buffer remains host-resident. With GPUDirect RDMA, the NIC can access GPU memory directly.
Registration mechanisms include nvidia-peermem and supported DMA-BUF paths. Drivers, IOMMU/PCIe topology and GPU/NIC capabilities matter. The paper’s same-PCI-switch-only wording is too restrictive as a universal rule. Current NCCL documentation distinguishes several allowed GPU–NIC distances.
Direct GPU payload access removes host staging, not necessarily CPU proxy/control-plane work. Verify the selected path in the deployed release rather than treating registration success as proof of good bandwidth.
Queue pairs, notifications and clear-to-send
A queue pair(QP) contains network work queues and connection state. Bulk RDMA writes and clear-to-send control serve different purposes. The described forward path writes data and uses WRITE_WITH_IMM for completion/size notification. The reverse clear-to-send advertises address, registration key and tag.
Small transfers can combine data and notification. Large adaptive-routing transfers can send bulk data separately from the ordered notification. Aggregated transfers can publish detailed sizes in an array. These are version-scoped implementation patterns, not every RDMA library’s contract.
Multiple QPs can add routing entropy for equal-cost multipath(ECMP) networks. The paper describes two logical connection bundles but conflates them with QPS_PER_CONNECTION. NCCL 2.19.1 source sets that QP parameter’s default to 1, as do the current docs. Keep bundles and QPs distinct.
Split mode divides a message across QPs; round-robin mode distributes successive messages. The default changed after2.19. More QPs can improve path diversity or add latency. Inspect the exact version and operation pattern.
NIC completion is not every visibility guarantee
Before a GPU kernel consumes NIC-written data, the receive path needs the required visibility guarantee. The inspected2.19.1 ncclIbIflush takes a receiving communicator and issues a loop-back RDMA_READ. That flush orders prior PCIe writes on the receiving side.
The read need not leave the host or transfer the user payload. It is an ordering mechanism, not another remote input fetch. The paper’s “sender” wording is misleading here; the receive communicator in the implementation resolves the direction.
Pinned NCCL transport source ↗ is the reference for these targeted source checks. It does not certify every current transport or platform’s memory semantics.
Simple, LL and LL128 choose different readiness units
| Protocol | Synchronization/granularity | Payload fraction | Cost |
|---|---|---|---|
| Simple | Larger chunks and ordering/fences | Near100% before transport overhead | Coarse readiness and fixed overhead |
| LL | 4B data+4B flag in8B unit | 50% | Extra wire/scratch bytes |
| LL128 | 120B data+8B flag in128B unit | 93.75% | Hardware/path visibility requirements |
LL means Low Latency. A receiver polls the embedded epoch flag, then consumes the accompanying data. The paper’s historical LL network staging is host-resident for CPU-proxy polling; do not assume that specific path describes every newer device API.
LL128’s cache-line visibility requirement is not a generic128-byte CUDA atomic-store guarantee. Unsupported paths cannot use the same assumption safely. The paper reports approximate per-hop6/1/2 µs for Simple/LL/LL128 and 25–50% peak LL bandwidth. These historical explanatory figures are not portable constants. Payload fraction and achieved bandwidth are different quantities. On the analyzed scale-out path, LL128 still aggregates chunks before notifying the CPU proxy; a wider readiness unit does not make every network transfer fine-grained.
The Alps GH200 comparison reports150 GB/s intra-node links,25 GB/s per-direction Slingshot network, up to 16 nodes and 20 runs after warmup. Small inter-node messages below about 64 KiB favor LL/LL128; large ones favor Simple. Intra-node LL128 stays strong over a broader range. In the same benchmark, Ring favors large messages and Tree favors smaller ones. Those crossovers are platform-specific. The published Fig. 6 has an apparent intra-node axis/inset unit inconsistency; do not infer exact latencies from that panel.
Why decoding exposes collective startup
Tensor-parallel decode often combines a partial activation before the next dependent layer operation. A decode step handles few tokens, so the message can be small even when the model is large. Long-context KV storage can restrict the active batch further.
The second estimate applies only when those collectives remain sequentially exposed. It is not permission to sum every profiler duration. Context length affects memory, attention work and scheduling as well as batch size. Decode-specific message distributions need measurement.
Fewer bytes do not remove fixed latency
For small messages, fixed phase and synchronization costs dominate. Doubling peak bandwidth changes little when the receiver mostly waits for readiness. For large messages, payload efficiency and sustained paths become more important.
A ring has O(N) transfer rounds. Trees and recursive-doubling schedules can reduce dependent rounds toward O(logN), but are distinct algorithms. One-/two-shot designs use a constant number of phases at the cost of different peer traffic and scratch. One phase does not mean no peer waiting or constant physical congestion.
Push stores; pull loads
Push means the sender issues a remote store into the receiver’s incoming buffer. Pull means the receiver issues a remote load from the sender’s input. Both move the same logical value. The initiating GPU and the memory-lifetime contract differ.
On the paper’s scale-up fabric, a remote store can make data visible with roughly half the round-trip latency of a remote load. That comparison motivates push, but is not a universal interconnect law. Push requires incoming scratch and correct reuse. Pull requires the source to remain ready and unchanged until all readers finish.
Same sum, different owner and initiating GPU
Local inputs
Stage=0; logical state=0; shots=1; mode=push; transfers=0; transferred elements=0.
| Rank | Output currently available |
|---|---|
| 0 | Not complete |
| 1 | Not complete |
| 2 | Not complete |
| 3 | Not complete |
Read the individual peer operations
- No peer operation in this state.
One-shot sends or loads each entire peer vector. Every rank computes the full sum locally. Push and pull change the initiating rank, not the intended result. Pull assumes a valid source-ready lifetime contract. Remote data must be visible before reduction in either mode. Playback stages are normalized for comparison; repeated states are not extra communication rounds.
Spend another phase to move fewer bytes
One-shot communicates complete peer contributions and reduces them locally on every rank. Two-shot first reduces partition r at owner r, then distributes the reduced partitions. The extra phase lowers per-rank traffic, which helps once bytes matter more than startup.
| Variant | Wire-volume model | Scratch for D input bytes/iteration |
|---|---|---|
| One-shot LL | ||
| One-shot sentinel | ||
| Two-shot LL | ||
| Two-shot sentinel | ||
| Two-shot LL128 atomic |
N is the integer rank count, . M is the logical message size in bytes; D is input bytes per iteration. These are per-GPU quantities, not total cluster traffic. Multiply outgoing volume by N for the corresponding cluster aggregate. Incoming+outgoing bytes use a different convention. Scratch entries describe an epoch/iteration’s working storage, not the full allocator footprint.
Count traffic and scratch separately
Message=1024B; ranks=4; sync=sentinel; one-shot wire=3072B/rank; two-shot wire=1536B/rank; one-shot scratch=512B/epoch/rank; two-shot scratch=128B/epoch/rank.
Logical payload per rank: one-shot 3072B; two-shot 1536B. LL doubles the illustrative wire bytes. Atomic two-shot counts are approximate; this model omits displaced payload and transport headers. Scratch uses D=128B of input per iteration, not the complete M-byte message. Two epoch regions and implementation metadata require extra allocation. These byte counts do not predict elapsed time or guarantee an algorithm crossover.
Barrier-free still means synchronized
A conventional readiness protocol writes data, enforces the required order, then publishes a flag. Peers wait for the corresponding flags before consuming. Separate global barriers can be expensive for small messages.
The low-latency paper measures more than 1 µs for a barrier on its GB200 setup. Two such barriers account for roughly40% of an illustrative5 µs collective. “Barrier-free” replaces separate barriers with data-ready protocols; it does not remove synchronization semantics.
The paper’s newer LLBuffer example can pair8B payload with 8B flag in a16B atomic unit. That is not the same unit size as historical NCCL LL’s4+4 format. Both spend half the transmitted bytes on readiness. Sender and receiver types/layouts must match.
Readiness can be a reserved bit pattern
Initialize incoming storage with a reserved bit pattern. A receiver polls until the sender replaces that pattern. This removes embedded flag bytes but creates a data constraint: a valid payload must never equal the sentinel.
The paper uses a negative-NaN sentinel. Test the intended bit pattern, not ordinary floating-point NaN equality. NaN compares unequal even to itself. Resetting a buffer also needs the required visibility before the next peer write. A source-level reset instruction alone does not prove global ordering.
Sentinels can improve payload efficiency for larger messages. They cannot be used safely for arbitrary bit patterns without another protocol. Epoch reuse and initialization lifetime remain correctness requirements.
Two buffers are safe only with a reuse rule
Two scratch regions allow epoch e+1 to arrive while a receiver still reads epoch e. However, an ungated fast sender can write epochs0,1,2 into slots0,1,0 and overwrite unread epoch0. Alternating addresses alone is insufficient.
The paper’s bidirectional protocol sends once per peer per epoch and consumes before advancing. Receiving peer epoch e+1 proves that peer finished its epoch e receive. That arrival supplies an implicit credit before the local sender reuses epoch e’s slot for e+2.
A fast peer must earn permission to reuse a slot
State=0; peer epochs=0,0; unread buffers=[[null,null],[null,null]]; last action=none.
The faster rank sends epoch 1 while the slower rank still consumes epoch 0. The faster rank then waits. Arrival of the slower rank’s epoch 1 proves that the slower rank consumed epoch 0. Only then can the faster rank reuse buffer 0 for epoch 2. There is one send per peer per epoch, and each peer consumes before advancing. Those rules—not merely two allocations—prevent overwrite. This sequentially consistent illustration does not certify GPU fences or memory visibility.
Do not transfer this proof blindly to a unidirectional ring or several stores per peer per epoch. Different dependency graphs need explicit credits or another reuse proof. Memory visibility is a separate obligation even when the epoch schedule is safe.
Use the cache line to count contributions
The two-shot LL128 atomic design accumulates contributions at one partition owner. Eight threads each handle16B, covering a128B cache line. One thread acts as flag carrier. It saves the displaced first element, then substitutes1 so atomic additions count contributors.
In the FP32 example,496 regular threads and 16 extra threads preserve the displaced values. FP16 needs8 extra threads. When the owner observes count N under the required hardware visibility semantics, the line’s contributions are complete. Threads restore the displaced payload before writing the reduced result.
AllGather distributes that result, and receivers use sentinel readiness for output partitions. The method reduces scratch because contributors accumulate into the destination instead of retaining every peer input. Its cache-line/atomic behavior belongs to the demonstrated NVLink implementation, not a general portable CUDA recipe.
One owner avoids different sums on different ranks
Floating-point atomic additions can occur in different orders across runs. The resulting reduced value can therefore be nondeterministic. Reduction precision, cancellation, overflow and underflow affect the error; a small nominal unit-roundoff bound is not a universal relative-error guarantee.
Two-shot gives each partition one reducing owner and distributes that owner’s result. Independent atomic reductions on every rank could instead produce different values on different ranks, violating the intended identical-output contract. Test numerical tolerance and reproducibility as well as latency.
The demonstrations above use exact small integers and fixed contribution order. They do not simulate floating-point GPU atomics. Precision and Quantization owns the broader numerical contract.
Corresponding buffers enable direct peer addressing
Symmetric memory gives participating ranks corresponding remotely accessible regions with matching layouts. Rank plus logical offset identifies a peer address. Symmetry does not necessarily mean identical numerical virtual addresses in every process.
CUDA virtual-memory mechanisms can support load/store-accessible regions inside an NVLink domain. Buffer registration, mapping, alignment and lifetime are implementation requirements. A layout mismatch can make an otherwise valid remote access read the wrong logical value.
The paper’s one-shot kernel needs symmetric scratch. Two-shot and atomic paths also need suitable symmetric output access. This distinction explains why enabling symmetric input/output in the serving integration changes which kernels are available.
A small device-side communication vocabulary
Device-side communication lets a kernel initiate peer loads, stores, reductions and readiness checks. It can remove particular host launch/coordination edges and fuse communication with local computation. It does not make every transport or synchronization action host-free.
The LLBuffer API describes send, recv, compile-time-unrolled recvUnrolled, recvReduce, bcast and reset/resetRange. A multicast bcast can replace a peer loop when supported. CTA identity and epoch select scratch offsets. roundRobinFactor=0 disables automatic round-robin offset/advance behavior.
# Illustrative LLBuffer sequence, not a compilable CUDA kernel.
initialize_symmetric_scratch_and_epoch_layout()
for chunk in assigned_chunks:
values = load_local_input(chunk)
broadcast_to_peer_slots(values, epoch)
total = poll_receive_and_reduce(epoch)
store_output(chunk, total)
reset_consumed_sentinel_slots_if_required()
advance_epoch_under_bidirectional_credit_contract()The API must retain matching send/receive types, valid sentinel initialization, reset visibility and buffer reuse. The paper’s experimental NCCL_SYM_KERNEL and NCCL_SYM_LLBUFFER_SYNC settings select artifact kernels/modes. They are not stable universal knobs for every installed NCCL release. Follow the pinned artifact for exact initialization and allocation helpers.
The fabric can distribute and reduce
NVSwitch multicast can distribute values without a separate software store to every peer. NVLink SHARP can reduce inside the fabric; multimem.ld_reduce is one relevant operation. Hardware support and registration determine whether the path exists.
Small-rank multicast overhead can exceed its benefit. At larger scale, fewer explicit peer operations and less software reduction can help. The paper finds that trend on GB200, not universal dominance at every size.
In NCCL 2.19.1’s reported matrix, CollNet uses network-assisted SHARP; NVLS uses NVLink/NVSwitch reduction. Tree is listed for AllReduce; NVLS supports AllReduce and selected ReduceScatter/AllGather Simple paths. PAT arrived after2.19 and is outside the detailed Ring/Tree analysis. Check the deployed support matrix rather than treating this history as current.
An optimistic data-movement bound
Speed of Light(SoL) here means optimistic minimum data movement, not the propagation time of light through a cable. The paper models one128B cache line: local L2 load, parallel remote stores, peer L2 loads, then local reduction/output.
The model omits instruction scheduling, reduction overhead and final output-store completion, treating that write as background. It assumes sufficient scratch and simultaneous peer movement. It is not a complete request-latency bound or a guarantee of rank-independent measured performance.
The authors estimate remote-store latency from a ping-pong round trip after subtracting local cache costs. The relative measured overhead is , with LSoL>0 and both times measured under the same boundary. State the completion boundary before comparing another kernel’s timing.
More scratch is not always faster
The scratch sweep uses 8 GB200 GPUs, a32 MiB message,64 CTAs and up to 512 threads/CTA. Small buffers require more iterations and readiness phases. Once one iteration holds the work, adding storage gives little benefit.
One-shot can experience more instantaneous peer traffic as buffers grow. More scratch can therefore slightly hurt after the useful range. The authors select 4 MiB for one-shot and 64 MiB for two-shot/atomic in their evaluation. These are empirical artifact choices, not portable allocation defaults.
A production selector must include scratch availability, message distribution and buffer registration. A microbenchmark that reserves abundant scratch may not represent a server under KV-cache pressure.
Read the GB200 comparison within its scope
The primary comparison runs2–64 GB200 GPUs in one NVL72 domain. Four GPUs occupy a physical node. The container uses Ubuntu 24.04, CUDA 13.1, vLLM 0.15.1, PyTorch 2.11 and OpenMPI 4.1.9. Each microbenchmark point reports a mean over 10 trials, with standard-deviation error bars.
Compared versions include NCCL 2.29.1, NVSHMEM 3.5.21, MSCCL++ 0.8.0 and vLLM 0.15.1. NCCLX direct and vLLM custom AllReduce only appear in supported single-node cases. MSCCL++ multicast hung on the evaluated setup and was excluded; its non-multicast cases are limited to 2/4 GPUs. Missing points are not measured losses.
The best two-GPU one-shot result is about 7% above the estimated SoL. At64 GPUs, a multicast one-shot variant stays roughly70% above it. These are different scales, not one universal overhead.
LL favors the smallest messages; sentinels become preferable as message/rank counts grow. Two-shot and atomic variants cover parts of the medium regime. Multicast helps scaling. The new kernels complement bandwidth-oriented implementations rather than replacing them for all large messages.
The empirical4-rank selector uses one-shot below 1 MiB and two-shot around1–2 MiB. Those thresholds belong to this measured setup. Neither traffic formulas nor constant phase counts establish the same crossover elsewhere.
What changed in the vLLM workload?
The vLLM case study uses TP 4 on one physical GB200 node and TP 8 on two nodes within the same NVLink domain. Inputs contain100–200K tokens; generation produces16K tokens; batch size is 8. Each setting uses 5 trials of the serving benchmark.
The models include Llama3.1-70B-Instruct, DeepSeek-R1-Distill-Llama-70B, Qwen3-Next-80B-A3B-Instruct, DeepSeek-V3 and Qwen3-235B-A22B-Thinking-2507. Dense, MoE and hybrid-attention architectures do not make the workload a representative sweep of all serving conditions.
The best configurations reduce mean inter-token latency by approximately 7–13% atTP 4 and 9–11% atTP 8. The baseline uses legacy NCCL kernels. No-MC disables multicast; SymMem registers suitable input/output and unlocks additional two-shot/atomic paths. Without it, larger messages can fall back to legacy kernels.
Throughput counts generated tokens over total wall time, including prefill. ITL measures a narrower decode window. Similar throughput and ITL improvements need not be numerically identical. These source-specific results do not predict gains for short requests, other batches or scale-out networks.
Throughput savings are not a full deployment cost
The paper uses a historical CoreWeave price input and estimates savings exceeding $11 per million output tokens for DeepSeek-V3 atTP 8. This is a throughput conversion for that experiment, not a current price quote or a full deployment model.
Prefill/decode disaggregation, reservations, idle time, CPU/storage/network and reliability change total economics. Preserve the workload and baseline alongside the estimate. Compute, Memory, and Performance separates such accounting boundaries.
The scientific workload used different hardware
The cuSOLVERMp eigensolver study uses a different platform: one Alps node with four GH200 GPUs and 150 GB/s local NVLink. It does not use the GB200 microbenchmark platform. The container uses CUDA 12.6, OpenMPI 4.1.7 and cuSOLVERMp 0.7.2.
The generalized symmetric-definite solver mp_sygvd runs distributed matrices of order 32768 on 2 GPUs and 65536 on 4 GPUs. Fig. 14 reports mean estimated GFLOP/s per GPU over 5 trials and standard-deviation bars. Improvements are+7.0% and +1.5%, respectively.
Buffers are not registered as symmetric output, so the experiment uses one-shot kernels below 1 MiB. MSCCL++ was excluded because of MPI errors. The result shows another latency-sensitive application, not a generic improvement for every HPC solver.
Investigate the actual collective distribution
- Record release, GPU/NIC topology, rank placement, data type and message distribution.
- Log selected algorithm, protocol, transport and channel count.
- Check expected P2P/GDR access versus SHM/Socket fallback.
- Compare scale-up and scale-out paths separately.
- Inspect CPU-proxy affinity, NUMA locality and progress.
- Check per-channel chunks, partial FIFOs and NIC/QP striping.
- Measure NCCL GPU-resource contention with model kernels.
- Force one supported choice at a time as a diagnostic experiment.
- Validate complete step time or serving latency after microbenchmarks.
NCCL_PROTO can force protocol choices for diagnosis. A winner on one size need not win the workload mixture. Unsupported combinations can change selection or fail. Keep autotuning as the baseline and retain enough logs to reproduce a regression.
Dependencies matter more than total bytes
A faithful communication simulator needs primitive dependencies, outer-region pipeline behavior, channels, slots, GPU work, CPU-proxy progress and physical paths. Injecting total collective bytes into a network model misses these constraints.
The NCCL analysis informs ATLAHS’s fine-grained GOAL schedules. The reported simulation error below 5% belongs to its evaluated workloads and configurations. It is not a certificate for arbitrary models or fabrics. The paper deliberately avoids a universal closed-form latency prediction because placement and implementation choices change the dependencies.
Choose a regime, then validate the whole application
For tiny exposed messages, reduce startup and readiness costs. For larger messages, reduce traffic and preserve payload efficiency. Increasing rank count can change both constraints. Kernel selection also needs scratch capacity, multicast support and buffer registration.
Keep correctness gates separate from performance gates: exact result ownership, permitted payload patterns, visibility, safe reuse and acceptable precision come first. Then measure the actual message distribution under concurrent model execution.
These low-latency techniques target the demonstrated NVIDIA scale-up paths. They do not solve arbitrary scale-out network latency. Speculative Decoding reduces serial generation work through a different mechanism; combine the ideas only after measuring their shared critical path.
Sources and connected topics
- Demystifying NCCL ↗—historical2.19.1 analysis; ATLAHS ↗.
- Every Microsecond Matters ↗—low-latency scale-up kernels; Reference implementation ↗.
- NCCL source ↗; NCCL documentation ↗. Targeted current documentation checked2026-10-06; installed-version behavior still needs validation.
The interactive scenes are original conceptual models, not benchmark traces. Continue with Parallelism for tensor ownership, MoE for dispatch/return traffic, and Profiling for measurement.