FGDS is an optimized alternative to NVIDIA GDS that provides a direct data path between NVMe SSDs and GPU memory. This document describes how to build FGDS from source and load the kernel module. See the main README for an overview, API example, and performance results.
- CMake >= 3.18
- GCC / G++ >= 11
- Linux kernel headers
- liburing-devel (liburing-dev on Debian/Ubuntu)
- pkg-config
- CUDA Toolkit >= 12.4 (tested with 12.8)
- NVIDIA driver with kernel module sources (
nv-reg.h/nv-p2p.hunder/usr/src/nvidia-*)
Ubuntu / Debian:
sudo apt install cmake build-essential linux-headers-$(uname -r) liburing-dev pkg-configRHEL / CentOS / Fedora:
sudo dnf install cmake make gcc gcc-c++ kernel-devel liburing-devel pkgconfigInstall CUDA Toolkit from the NVIDIA CUDA download page. Verify:
nvcc --versionmkdir -p build && cd build
cmake ..make -j$(nproc)A successful build produces (relative to the current build/ directory):
module/fgdsfs.ko— the kernel module (loaded in step 3.2)libfgds.so— the userspace librarybin/example— the C++ example (run in step 3.3)bin/microbenchmark— the micro benchmark binary
Return to the project root first.
Edit config.json in the project root to specify which GPUs to bind.
use_all_gpus: truebinds all GPUs;falsebinds only the GPUs listed in thegpuidsarray.gpuidsis an integer array of GPU IDs, such as[0, 1].
bash scripts/load_fgds.shThis script binds the GPUs specified in config.json. The NVIDIA driver must be loaded first — run nvidia-smi to verify.
If some GPUs cannot be bound, FGDS skips them and keeps the rest; the module fails to load only when all specified GPUs fail to bind. See Troubleshooting for details.
After loading, confirm the module is loaded and the GPU devices are exposed:
lsmod | grep fgdsfs
ls /dev/fgds_dev*Run the C++ example to do a GPU↔SSD read/write round-trip:
./build/bin/example 0 /path/to/test.dataUse a path on a filesystem that supports O_DIRECT (a local NVMe/SSD, not /tmp). For performance testing, see Micro Benchmark.
bash scripts/unload_fgds.sh