Skip to content

Chapter 10: The Storage Fabric · Part 3 of 10

Act 2 -- GPUDirect Storage: removing the CPU from the data path

Before GPUDirect Storage existed, loading a training batch into GPU memory required five distinct operations involving the host CPU.

GPUDirect Storage — data path comparison

Before GDS: data passes through CPU RAM twice. After GDS: CX7 NIC DMA writes directly to GPU HBM.

CPU involvedStorage applianceNVMe SSDConnectX-7 NICRX bufferCPU copySystem RAMkernel bufferCPU copySystem RAMuser bufferGPU HBMtraining data5 hops · 2 CPU copies
Before GDS
Hops5
CPU copies2
System RAM touchedYes — twice
cudaMemcpy requiredYes
640 GB HBM load time~3.2 sec
After GDS
Hops3
CPU copies0
System RAM touchedNever
cudaMemcpy requiredNo
640 GB HBM load time~1.4 sec

The pre-GDS path:

The application calls a read from the NVMe-oF storage appliance. The request goes to the kernel. The kernel asks the NIC to fetch the data. The data arrives at the NIC and is DMA'd into a kernel-space buffer in system RAM. The CPU copies it from kernel-space RAM to a user-space application buffer. The application then calls cudaMemcpy to move the data from the CPU-side application buffer into GPU HBM across PCIe.

Count the hops: storage -> NIC -> system RAM (kernel buffer) -> system RAM (user buffer) -> PCIe -> GPU HBM. Five hops. Two CPU memory copies. Every byte of training data touches CPU RAM twice before the GPU sees it.

On a DGX H100 with 80 GB of HBM per GPU and 8 GPUs, the node needs to fill 640 GB of HBM at the start of training. Pre-GDS, that requires moving 640 GB through CPU RAM twice -- 1.28 TB of CPU memory bandwidth consumed for data that the CPU never uses. The 2 Intel Xeon CPUs in a DGX H100 have approximately 400 GB/s of combined memory bandwidth. At full theoretical throughput, pre-loading 640 GB of training data would take at minimum 3.2 seconds -- and that assumes the CPUs are doing nothing else.

The GDS path:

With GPUDirect Storage, a direct DMA channel is established between the NVMe-oF storage target and GPU HBM, bypassing system RAM entirely. The GPU registers a memory buffer and posts a read request. The host NVMe-oF initiator stack (running on the host CPU, using the dual-port ConnectX-7 cards in Slot1/Slot2 as its network interface) translates this into an NVMe-oF command over the storage fabric. The storage appliance transmits the data. The storage ConnectX-7's DMA engine writes it directly into GPU HBM across PCIe -- without the data ever appearing in system RAM, without a CPU memory copy, without a cudaMemcpy.

The path collapses to: storage appliance -> storage CX7 DMA -> PCIe -> GPU HBM. Three hops instead of five. The CPU manages the NVMe-oF command queuing but does not touch the data itself.

Why this matters for checkpoint write speed:

The same mechanism runs in reverse for checkpoint writes. The GPU has computed and accumulated gradients in HBM. The checkpoint must be written to durable storage. With GDS, the storage CX7's DMA engine reads from GPU HBM directly and streams the data to the NVMe-oF target. The 140 GB checkpoint flows from GPU memory to storage with the CPU managing commands but never copying data.

The 800 Gb/s figure from Chapter 0 -- 2x dual-port ConnectX-7 storage cards at 400G each -- is the raw theoretical bandwidth of this path. Real-world checkpoint throughput is typically 60-80% of theoretical, constrained by PCIe bandwidth, storage appliance write throughput, and the parallel file system's write striping efficiency.