GPU-Initiated On-Demand High-Throughput Storage Access in the BaM System Architecture

Zaid Qureshi, Vikram Sharma Mailthody (equal contribution), Isaac Gelado, Seungwon Min, Amna Masood, Jeongmin Park, Jinjun Xiong, C. J. Newburn, Dmitri Vainbrand, I-Hsin Chung, Michael Garland, William Dally, Wen-mei Hwu | NVIDIA / UIUC / AMD / University at Buffalo / IBM Research / Stanford | ASPLOS '23, Vancouver, BC, pp. 325–339 | DOI: 10.1145/3575693.3575748

"BaM" stands for Big accelerator Memory.


Problem

Emerging data-center workloads — graph and data analytics, recommender systems, and graph neural networks — operate on massive array datasets (tens of GBs to tens of TBs) that far exceed GPU memory capacity (an A100 has only 80GB despite a 53× growth from G80 to A100). They also need fine-grained, data-dependent access to storage. Existing solutions are CPU-centric: the CPU either tiles the dataset and orchestrates storage→GPU transfers, or services GPU page faults via the OS page-fault handler. Both are bottlenecked by CPU software, CPU–GPU synchronization, OS kernel crossings, long CPU latencies, and I/O traffic amplification (fetching unneeded bytes). The DRAM-only alternative — host memory or pooling many GPUs — is prohibitively expensive (a 10TB GPU pool needs 125 A100s) and still requires preloading data that may go unused. No system architecture or software stack existed for efficient GPU-initiated storage access, and prior GPU-initiated attempts (ActivePointers, GPUfs) reached only ~823K IOPs on an A100 because they still relied on the CPU to serve data.


Core Insight

BaM is the first accelerator-centric architecture letting GPU threads directly initiate and orchestrate on-demand, fine-grained, high-throughput storage accesses — via a highly concurrent GPU-resident software cache plus lock-minimized NVMe submission/completion queues mapped into GPU memory — which eliminates the CPU from the storage control path. It introduces a new GPUDirect Async variant, GPUDirect Async KI (Kernel Initiated) Storage.


Method

BaM presents an mmap-like bam::array abstraction. A GPU thread accessing array[tid] computes the cache line, warp-coalesces with peers via the __match_any_sync primitive (a per-group leader probes the cache, broadcasting via __shfl_sync), and probes a software-defined write-back cache kept entirely in GPU memory. On a hit it reads GPU memory directly; on a miss it locks the line, evicts a victim by a clock replacement algorithm, and issues an NVMe I/O request.

The I/O path uses GPU-resident NVMe submission (SQ) and completion (CQ) queues with lock-minimized enqueue: per-SQ metadata holds local head/tail, an atomic ticket counter, a turn_counter array, a mark bit-vector, and a lock. A thread atomically increments the ticket by two, deriving an entry and turn into a 2³² virtual queue, polls until its turn, writes its command, and sets its mark bit; a single thread then runs move_tail to advance the tail, reset_marks, and ring the doorbell once (coalescing expensive PCIe doorbell writes). Completion is polled lock-free.

The prototype uses a custom Linux driver (character device per SSD), GPUDirect RDMA to pin NVMe queues and I/O buffers in GPU memory for peer-to-peer DMA, and GPUDirect Async + cudaHostRegister to map SSD doorbell registers into the CUDA address space. Queue depth follows Little's Law (T × L = Q_d); for PCIe ×16 Gen4 at 26 GBps, sustaining 51M 512B accesses needs Q_d = 561 for Optane (L = 11 μs) and 16,524 for Samsung 980pro (L = 324 μs).


Experimental Setup

Aspect Details
GPU NVIDIA A100 80GB PCIe (Gen4 ×16), 1 per drawer
CPU / DRAM 2× AMD EPYC 7702 (64-core); 1TB Micron DDR4-3200
System Supermicro AS-4124GS-TNR; H3 Platform Falcon-4016 PCIe expansion chassis (2 drawers, 8 ×16 slots each, PCIe switches, bifurcation)
SSDs Intel Optane P5800X; Samsung DC PM1735 (Z-NAND); Samsung 980pro (NAND); up to 10 U.2 per drawer; experiments use 1–10 SSDs
Software Ubuntu 20.04, NVIDIA Driver 470.82, CUDA 11.4, Linux 5.8.x, custom libnvm driver
Baselines T (optimistic host-memory DRAM-only); GDS (GPUDirect Storage + fio); ActivePointers/GPUfs; RAPIDS v21.12; proactive-tiling (vectorAdd)
Workloads 512B/4KB random read/write microbenchmark; BFS, CC graph analytics (K, U, F, M, Uk datasets); NYC taxi data analytics (Q0–Q5); vectorAdd (4B elements)
Default config 8GB cache, 4KB cache-line, 4 Intel Optane SSDs, 128 queue-pairs at depth 1024
Metrics IOPS, bandwidth (GBps/Gbps), end-to-end time, speedup, $/GB

Headline Quantitative Results

Raw throughput (10 Optane SSDs, 512B):

Versus GDS and ActivePointers:

Graph analytics vs host-memory baseline T:

Config BFS CC
BaM 1 Optane (B_1I) vs T 1.43× slower 1.27× slower
BaM 4 Optane (B_4I) vs T 1.00× speedup 1.49× speedup
4-SSD vs 1-SSD scaling 3.48×
naive cache vs no-cache 11.9× 12.65×
+ warp coalescing & reference reuse 6.07× 11.24×

Data analytics (NYC taxi vs RAPIDS v21.12):

Cost: BaM gives a 4.3–21.8× cost-per-GB advantage over DRAM-only; on-par with a host-memory solution up to 21.7× more expensive.


Limitations


Open Problems

  1. Enable asynchronous write-back to overlap read-miss handling with write-back and hide write latency.
  2. Application-level work-assignment/scheduling changes to trigger BaM cache misses earlier and improve I/O-request generation rate and SSD scaling.
  3. Use emerging disaggregated storage hardware components for very large real-world datasets.
  4. Broader adoption of zero-trust / trusted-service security models to secure user-level storage queues at data-center scale.