Thesis
Understanding GPU-Driven RDMA requires not the narrow lens of "GPU initiates RDMA," but the systems thinking of multiple execution units working in tight coordination — the same mindset that defined the multi-core era. When multiple CPU cores began sharing memory, cache coherence and memory ordering transformed from "implicit assumptions" into first-class design problems — you could no longer pretend each core owned its own memory. The same paradigm shift is now happening in GPU communication: as GPU, NIC, and CPU become tightly coupled through PCIe and NVLink, sharing the HBM address space, memory consistency and data ordering are no longer "implementation details" of the communication stack — they are fundamental constraints that define the entire system design.
GPUDirect RDMA (2013) let NICs DMA directly into GPU HBM, breaking the traditional boundary that "data must stage through CPU memory." GPUDirect Async (2016) let the GPU trigger RDMA via MMIO doorbells, breaking the control boundary that "communication must be initiated by the CPU." GDAKI / GIN (2024) gave GPU kernels full ownership of the RDMA lifecycle (create QP, issue transfer, track completion), breaking the role boundary that "GPU is a compute device, network devices belong to the CPU."
Each broken boundary tightens the coupling between memory and communication — and sharpens the urgency of ordering (in what order does the remote peer see data updates) and consistency (when can the remote peer actually observe the data). Just as multi-core programming demands explicit memory model reasoning (acquire / release / sequential consistency), GPU-Driven RDMA programming demands explicit reasoning about signal / counter / fence semantics — not as an optimization, but as a correctness prerequisite.
"GPUDirect RDMA provides consistency guarantees only at kernel boundaries. GPU memory model semantics (relaxed ordering, write-back caching) prevent safe concurrent access to RDMA-registered memory from executing kernels, forcing applications to separate computation and communication."
GIN's design — one-sided semantics, windows-based (a)symmetric memory, GIN contexts, asynchronous completion tracking, ordering semantics — is a systematic response to these five fundamental challenges born from the tight convergence of memory and communication.
1. Three Generations: The QP Control Transfer
| Generation | Technology | QP Creator | Operation Trigger | CPU in Hot Path | Year |
|---|---|---|---|---|---|
| Gen 1 | GPUDirect RDMA | CPU (ibv_create_qp) | CPU (ibv_post_send) | Every operation | ~2013 |
| Gen 2 | GPUDirect Async | CPU (pre-configured) | GPU (doorbell MMIO) | Setup only | ~2016* |
| Gen 3 | GDAKI / GPUNetIO | GPU kernel | GPU kernel | None | ~2024 |
\Gen 2 date reflects the general GPUDirect Async doorbell-triggering concept (~2016). IBGDA — the concrete InfiniBand implementation of this concept, used inside NVSHMEM — shipped later, in NVSHMEM 2.6.0 (~2022, experimental mode). The two dates should not be conflated.*
The critical metric is per-operation control overhead:
(Latency figures below are order-of-magnitude estimates based on known syscall/MMIO overheads, not figures reported in the GIN paper — the paper's own measured latencies appear in §V, e.g. 16.7μs GDAKI ping-pong at small message sizes, cited separately below.)
Gen 1 path: GPU → CPU syscall → kernel transition → MMIO doorbell → NIC (~1-2μs)
Gen 2 path: GPU → MMIO doorbell → NIC (~300ns, but QP static)
Gen 3 path: GPU → create QP + MMIO doorbell → NIC (~100-300ns, fully dynamic)
As the GIN paper states: "GPUDirect Async introduced partial control-path offload: GPU threads trigger pre-configured network operations writing to NIC doorbell registers that are memory-mapped into the GPU address space. However, the CPU must pre-construct communication descriptors, limiting operations to those pre-configured by the host and preventing fully autonomous device-driven networking."
Gen 2's fundamental limitation: QP is static — fixed count, fixed configuration, no runtime adaptation, no GPU-side error recovery.
2. Concept Hierarchy
GPUDirect (NVIDIA umbrella brand)
├── GPUDirect RDMA — NIC DMA directly to GPU HBM (zero-copy data path)
├── GPUDirect Async — GPU triggers pre-configured RDMA via doorbell
│ └── IBGDA — InfiniBand-specific implementation
├── GPUDirect Storage — SSD DMA directly to GPU HBM (GDS)
└── GDAKI (GPU full control of RDMA lifecycle, GPU creates/destroys QP)
└── DOCA GPUNetIO — the underlying SDK/device-verbs layer
├── used directly by NVSHMEM 3.7.0+ (see §3.2)
└── used by NCCL GIN's "GDAKI backend" (one of GIN's two backends, see §3.3)
Software Ecosystem
├── NCCL GIN — Collective communication + GIN device API (3 modes: LSA, Multimem, GIN)
├── NVSHMEM — PGAS one-sided put/get (≤3.6: IBGDA, 3.7.0+: GPUNetIO)
└── DeepEP — MoE communication library (V1: NVSHMEM, V2: NCCL GIN)
Note: "GDAKI" (GPUDirect Async Kernel-Initiated) is the name the GIN paper gives to its own direct-mode backend — not a pre-existing NVIDIA umbrella term. Both NVSHMEM's GPUNetIO backend and NCCL GIN's GDAKI backend are built on the same underlying DOCA GPUNetIO device-verbs layer; they are two different API surfaces over one substrate, not two names for the same thing.
GIN's Three Device API Modes (NCCL 2.28+)
Per the arXiv paper, NCCL 2.28 Device API supports three distinct modes:
| Mode | Interconnect | Mechanism | Use Case |
|---|---|---|---|
| LSA (Load/Store Accessible) | NVLink / PCIe | Direct memory load/store | Intra-node P2P |
| Multimem | NVLink SHARP | Hardware multicast | Intra-node broadcast |
| GIN | InfiniBand / RoCE | GPU-initiated RDMA | Inter-node communication |
3. NVSHMEM vs GIN: Convergent Bottom, Divergent Top
3.1 NVSHMEM ≤3.6: IBGDA Backend
- CPU creates QP at init time; GPU triggers via doorbell
nvshmemi_ibgda_put_nbi— GPU kernel issues RDMA put- Limitation: QP count static, error handling requires CPU
3.2 NVSHMEM 3.7.0+: GPUNetIO Backend
- GPU kernel creates/destroys QP dynamically via DOCA GPUNetIO
- Full lifecycle control:
gpunetio_create_queue→gpunetio_workq_complete - CPU completely off the hot path
3.3 NCCL GIN: Dual Backend
The GIN paper reveals a critical design insight: two interchangeable backends for different hardware:
| Backend | Hardware Requirement | Mechanism |
|---|---|---|
| GDAKI | ConnectX-6 Dx+ / BlueField (DOCA GPUNetIO capable) | GPU directly programs NIC via device verbs |
| Proxy | Any RDMA-capable NIC | GPU enqueues 64-byte descriptors to lock-free queue; CPU proxy thread executes |
"The GDAKI backend leverages DOCA GPUNetIO for direct GPU-to-NIC communication, while the Proxy backend provides equivalent functionality via lock-free GPU-to-CPU queues over standard RDMA networks."
This dual-backend design means GIN is not limited to latest hardware — it degrades gracefully on older NICs via Proxy.
3.4 Convergence Point
Both NVSHMEM 3.7.0+ GPUNetIO and NCCL GIN GDAKI backend converge on the same mechanism:
GPU kernel → DOCA GPUNetIO device verbs → MMIO doorbell → NIC hardware
The hardware requirement is identical: NIC must expose memory-mapped queue pairs and doorbell registers via PCIe BAR (ConnectX-6 Dx and later).
4. GIN's Ecosystem Play: Plugin Architecture for Multi-Vendor Expansion
GIN's core strategy is not merely to provide a GPU-initiated communication API, but to build a GPU-centric communication ecosystem. This strategy is most clearly reflected in its three-layer software architecture and extensible network plugin framework.
4.1 Three-Layer Architecture: Separation of Concerns
GIN's three-layer architecture (NCCL Core → Device GIN API → GIN Network Plugin) defines clear responsibility boundaries for each layer:
| Layer | Responsibility | Key Design |
|---|---|---|
| NCCL Core (Host) | Communicator initialization, memory window registration, resource allocation | Extends existing NCCL infrastructure without breaking compatibility |
| Device GIN API (GPU) | put/signal primitives callable from CUDA kernels | Unified interface, transparent backend switching (GDAKI or Proxy) |
| GIN Network Plugin | Concrete implementation of remote data movement | Dual semantics (GDAKI + Proxy), supports vendor customization |
"GIN builds on a three-layer architecture: i) NCCL Core host-side APIs for device communicator setup and collective memory window registration; ii) Device-side APIs for remote memory operations callable from CUDA kernels; and iii) A network plugin architecture with dual semantics (GPUDirect Async Kernel-Initiated and Proxy) for broad hardware support."
4.2 Dual Backend → Multi-Vendor Expansion
GIN's network plugin architecture was designed from the ground up for multi-vendor participation:
| Backend Type | Control Path Ownership | Hardware Requirement | Current Support |
|---|---|---|---|
| GDAKI | Plugin fully owns (createContext + device code) | ConnectX-6 Dx+ / DOCA GPUNetIO | NVIDIA InfiniBand |
| Proxy | NCCL Core owns control structures; plugin provides only CPU data path | Any RDMA-capable NIC | NVIDIA InfiniBand |
| External Plugin | Dynamically loaded via libnccl-net.so | Vendor-defined | Open to third-party vendors |
"NCCL's InfiniBand transport implements both, while external vendors may supply their own. Under the Proxy interface, NCCL Core owns control structures, device-side queuing logic, and device API implementations, while plugins provide only CPU-based put, signal, test, and regMr operations, enabling networks without GPU-direct capabilities and lowering the barrier to GIN adoption."
The key mechanism is the NCCL_NET_PLUGIN environment variable — external plugins are loaded at runtime without modifying NCCL core code. This means:
- AWS EFA (Elastic Fabric Adapter) can join the GIN ecosystem by implementing a Proxy-semantics
libnccl-net.soplugin - Other NIC vendors (Marvell/Cisco/Mellanox, etc.) need only provide 4 basic CPU data-path operations (put/signal/test/regMr) to gain full GIN Device API capability
- No GPU-direct capability required — the Proxy backend allows NICs without DOCA GPUNetIO to participate in the ecosystem
4.3 Ecosystem Goal: A GPU-Centric Unified Communication Layer
GIN's ecosystem logic can be summarized as:
┌─────────────────────────────────┐
│ Application Layer │
│ (PyTorch, vLLM, SGLang, TRT) │
└──────────────┬──────────────────┘
│
┌──────────────▼──────────────────┐
│ NCCL Device GIN API │ ← Unified programming interface
│ (put / signal / flush / ...) │
└──────────────┬──────────────────┘
│
┌─────────────────────┼─────────────────────┐
│ │ │
┌────▼─────┐ ┌────▼─────┐ ┌────▼─────┐
│ GDAKI │ │ Proxy │ │ External │
│ (NVIDIA │ │ (Generic │ │ (AWS EFA,│
│ IB/RoCE)│ │ RDMA) │ │ others) │
└──────────┘ └──────────┘ └──────────┘
"By providing both hardware-direct and CPU-assisted plugin interfaces, GIN offers functionality across diverse deployment scenarios while maintaining compatibility with NCCL's existing ecosystem."
GIN's ecosystem bet is: when all NIC vendors connect via plugins, NCCL GIN becomes the "USB interface" for GPU communication — universal, plug-and-play, hardware-agnostic. This stands in stark contrast to NVSHMEM's path: NVSHMEM is a single-vendor (NVIDIA) vertical integration solution, while GIN attempts to build a horizontally-layered, multi-vendor ecosystem.
5. What Problems Does GIN Solve? The Five Fundamental Challenges
GIN's design essentially answers one question: when a GPU directly initiates network communication, what fundamental problems must be solved? The paper itself names 5 design elements in §III-A (one-sided semantics, symmetric memory windows, GIN contexts, completion tracking, ordering semantics), listed as a flat set. Grouping them into "3 fundamental challenges in one-sided communication plus 2 programming usability requirements" below is my own reading of how these elements relate — not a taxonomy the paper draws explicitly.
5.1 Three Fundamental Challenges
In any one-sided communication system (GIN, NVSHMEM, OpenSHMEM), three foundational problems must be addressed:
| # | Challenge | Core Question | GIN's Solution |
|---|---|---|---|
| 1 | Data Transfer | How does a GPU remotely write/read data? | One-Sided Semantics (put / put with signal) |
| 2 | Ordering | In what order does the remote peer see data updates? | Ordering Semantics (signal guarantees visibility order of preceding puts) |
| 3 | Consistency | When can the remote peer actually observe the data? | Asynchronous Completion Tracking (Signal/Counter for remote visibility notification) |
"These components enable device-initiated one-sided communication through several key design elements: one-sided semantics for unilateral data movement, symmetric memory windows for zero-copy remote access, and asynchronous completion tracking with flexible ordering semantics."
5.2 Two Programming Usability Requirements
Beyond the three foundational challenges, GIN must also make it easy for programmers to write correct communication code:
| # | Requirement | Core Question | GIN's Solution |
|---|---|---|---|
| 4 | Network Parallelism | How to fully utilize multiple NICs/ports/QPs? | GIN Contexts (each context abstracts a GPU↔NIC channel) |
| 5 | Memory Flexibility | Must memory be symmetric? | Windows-based (A)Symmetric Memory (supports asymmetric capacities) |
"GIN windows are designed to support asymmetry in capacity: each rank may register different buffer sizes. This flexibility proves essential for disaggregated serving architectures where prefill ranks require larger buffers than decode ranks."
5.3 Why Ordering and Consistency Are the Cornerstones of One-Sided Communication
Consider a simple example illustrating why these two concepts matter.
Scenario: GPU A needs to send a batch of data to GPU B and notify B that "data is ready."
GPU A (Sender) GPU B (Receiver)
───────────── ─────────────
put(data[0] → B) ──────→ (in network...)
put(data[1] → B) ──────→ (in network...)
signal(B, ready) ──────→ (in network...)
...
How does B know the data truly arrived?
Problem 1 — Ordering:
If signal arrives at B before the data (network reordering), B thinks "data is ready" but data[0] and data[1] are still in transit. B reads stale data.
GIN's solution:
"When a signal operation completes at the destination, it guarantees that all preceding put operations to that peer on the same context have completed and are visible to remote GPU threads."
A signal is an ordering anchor: signal visible = all preceding puts visible. Programmers need only attach a signal to the final put and then waitSignal — guaranteeing ordered visibility of the entire batch.
Problem 2 — Consistency:
Even after data arrives in B's HBM, B's GPU kernels may not immediately see it — because GPUs have write-back caches and relaxed memory models.
GIN distinguishes two completion states:
- Local completion (
flush): source buffers can be safely reused (data has left the sender) - Remote completion (
waitSignal): data has arrived at destination and is visible to remote GPU threads
"The flush operation ensures only local completion—all pending operations have been consumed and source buffers can be safely reused—but makes no guarantees about remote visibility."
In one sentence: Ordering answers "in what order is data seen," Consistency answers "when can data be seen." Both are indispensable — without Ordering, data may arrive out of order; without Consistency, data may have arrived but remain unreadable. GIN unifies both through the signal mechanism: a signal guarantees both ordering (all preceding puts complete) and visibility (visible to remote GPU threads).
5.4 GIN vs NVSHMEM: Same Problems, Different Solutions
Notably, NVSHMEM as a mature PGAS library must also address all 5 challenges. The comparison:
| Design Element | GIN | NVSHMEM |
|---|---|---|
| Data Transfer | put(team, peer, win, off, ...) | put_nbi(dst_ptr, src_ptr, count, pe) |
| Ordering | Signal-based (ID-addressed, lightweight) | fence / quiet (QP-level) |
| Consistency | Counter (local) + Signal (remote) | quiet() per QP |
| Network Parallelism | GIN Context (explicit multi-channel) | QP per PE |
| Memory Model | Window-based (supports asymmetric capacity) | Symmetric Heap (global address space) |
GIN's signal-based ordering is lighter-weight than NVSHMEM's fence/quiet — it guarantees only "put-signal order within the same context to the same peer," not global ordering. This selective guarantee enables higher network efficiency.
6. Runtime Ecosystem: Where the Real Difference Lies
Since the physical layer is identical, the differentiation is purely at the runtime semantic level.
NCCL: Collective-First
- API: AllReduce, AllGather, ReduceScatter, Broadcast + device-side put/signal primitives
- Topology: Deep NVLink/IB hierarchy awareness (rail/plane/world)
- In-network compute: SHARP hardware reduction inside IB switches
- Memory model: Collective symmetric memory via
ncclCommWindowRegister - Elasticity: Dynamic rank join/leaving for production fault tolerance
NVSHMEM: PGAS-First
- API: One-sided put/get/atomics (OpenSHMEM compatible)
- Memory model: Symmetric heap (
nvshmem_alloc) — all ranks see same global address space - HPC compatibility: OpenSHMEM standard API — existing HPC codes port with minimal changes
- Transport: IBGDA (≤3.6) or GPUNetIO (3.7.0+) for inter-node, symmetric memory for intra-node
Key Semantic Difference
| Property | NCCL | NVSHMEM |
|---|---|---|
| Communication pattern | Collective (all ranks participate) | One-sided (initiator-only) |
| Synchronization | Implicit (collective barrier) | Explicit (fence, barrier, quiet) |
| Address space | Window-based (rank-relative offset) | Global symmetric address |
| Completion tracking | Signal (remote) + Counter (local) | fence / quiet / barrier |
| Standard compatibility | NVIDIA-proprietary | OpenSHMEM standard |
7. The DeepEP Signal: Migration from NVSHMEM to NCCL GIN
DeepEP's version history is the clearest signal of ecosystem convergence:
| Version | Symmetric Memory Allocation | Communication Backend |
|---|---|---|
| V1 Legacy | nvshmem_alloc | NVSHMEM IBGDA (nvshmemi_ibgda_put_nbi) |
| V2 Elastic | ncclMemAlloc / CUDA Driver API | NCCL GIN (ncclGin put/signal) |
The GIN paper explicitly uses DeepEP as the integration demonstration: "We demonstrate GIN's practicality through integration with DeepEP, an MoE communication library."
Why the migration matters: DeepEP V1 proved that GPU-initiated communication is essential for MoE. DeepEP V2 proves that GIN can match NVSHMEM's device-initiated capability while retaining NCCL's production infrastructure (hierarchical communicators, elasticity, fault tolerance).
8. Future Trajectory
Open Questions
1. If bottom converges, what decides the winner?
- The runtime abstraction's ability to exploit GPU-initiated capability — not the raw mechanism itself.
- NCCL's structural advantage: SHARP in-network reduction + topology-aware collectives.
- NVSHMEM's structural advantage: OpenSHMEM standard + one-sided semantics for irregular patterns.
2. Will NVSHMEM be absorbed into NCCL?
- Short term (1-2yr): No. OpenSHMEM compatibility is independent value for HPC.
- Medium term: Partial. NCCL may expose one-sided put/get primitives, eroding NVSHMEM's differentiation.
- Key signal: Does NCCL add a one-sided API? If yes, NVSHMEM's reason to exist shrinks dramatically.
3. Or long-term coexistence?
- Most likely: unified bottom + divided top. GPU-initiated RDMA as common substrate; NCCL for ML collectives, NVSHMEM for HPC PGAS. Ecosystem inertia > technical merit.
9. References
| # | Source | URL |
|---|---|---|
| 1 | GPU-Initiated Networking for NCCL (NVIDIA, arXiv:2511.15076) | https://arxiv.org/abs/2511.15076 |
| 2 | NVIDIA GPUDirect RDMA Documentation | https://docs.nvidia.com/cuda/gpudirect-rdma/ |
| 3 | NVIDIA Blog: Improving Network Performance using GPUDirect Async | https://developer.nvidia.com/blog/improving-network-performance-of-hpc-systems-using-nvidia-magnum-io-nvshmem-and-gpudirect-async/ |
| 4 | NVIDIA DOCA GPUNetIO | https://docs.nvidia.com/doca/archive/doca-v2.5.0/gpunetio/index.html |
| 5 | NVSHMEM Installation Guide | https://docs.nvidia.com/nvshmem/release-notes-install-guide/install-guide/abstract.html |
| 6 | DeepEP GitHub | https://github.com/deepseek-ai/DeepEP |
| 7 | NCCL Documentation | https://docs.nvidia.com/deeplearning/nccl/user-guide/docs/ |
Key Source Paths (DeepEP)
| File | Purpose |
|---|---|
deep_ep/symmetric.hpp | V1 NVSHMEM alloc vs V2 NCCL ncclMemAlloc / CUDA Driver API |
deep_ep/nccl.cu | NCCL GIN context creation (ncclDevCommCreate with ginContextCount) |
deep_ep/handle.cuh | gin.put, gin.signal — GPU kernel-side remote operations |
deep_ep/internode.cu | V1 nvshmemi_ibgda_put_nbi_warp vs V2 GIN put |
Key GIN Paper Sections
| Section | Content |
|---|---|
| § III-A | Key GIN Design Elements (one-sided semantics, symmetric memory windows, GIN contexts, completion tracking, ordering semantics) |
| § III-B | Device-Side API and Programming Model (ncclGin class, API organization, usage workflow) |
| § III-C | Backend Implementations (GDAKI vs Proxy comparison, Table I) |
| § IV | DeepEP Integration (integration requirements, backend strategy, Table II API mapping) |
| § V | Performance Evaluation (point-to-point microbenchmarks, DeepEP HT/LL benchmarks) |
Date: 2026-08-16
Method: Source analysis (DeepEP) + NVIDIA official docs + arXiv:2511.15076 (full paper deep read)