Combined memory and compute over a direct high-speed link
Two multi-node capable hardware platforms can be connected directly by two ConnectX-8 (CX8) QSFP cables — one cable per rail — with no switch and no rail bonding. Each rail is an independent 400 Gb/s RoCEv2 path: rail 0 maps to mlx5_0 (QSFP0-to-QSFP0) and rail 1 maps to mlx5_1 (QSFP1-to-QSFP1). Cross-node traffic uses CX8 RoCEv2; there is no inter-node NVLink.
This playbook walks through the manual fabric bring-up from a separate control host (Linux, macOS, or Windows). The control host SSHs into both nodes and runs numbered setup scripts that configure rail IPs, MTU 9000, RoCEv2, and GPUDirect runtime settings, then validate the two-rail fabric before you move on to NCCL, Ray, vLLM, or other distributed workloads.
You'll connect two nodes of multi-node capable hardware with two CX8 QSFP rails and prove the fabric in two levels:
ib_write_bw) per rail.perftest flags and ACS/Data Direct topology before starting a GDR test../08_run_perftest_pair.sh --rail <0-or-1> --gdr.After ./07_validate_setup.sh passes, the basic two-rail RoCE fabric is up. After the host-memory ./08_run_perftest_pair.sh tests pass, basic RDMA bandwidth is proven. Before using the pair for GPU-performance workloads such as NCCL, Ray, vLLM, or other distributed applications, require the perftest-capability and ACS/Data Direct checks to pass on both DUTs, then use the GDR variant on both rails to prove the CUDA DMA-BUF/Data Direct GPU-memory RDMA path.
Required:
Optional:
ibdev2netdev and ib_write_bwUse the matrix below to confirm your hardware platform, recommended default local settings, and whether multi-node applies.
| Hardware platform | OS | Memory | Recommended default local settings | Multi-node capable hardware |
|---|---|---|---|---|
| DGX Station | DGX OS (Linux) | Large HBM + Grace DRAM | Two CX8 QSFP rails (mlx5_0 / mlx5_1); control-host setup scripts | ✅ (ConnectX-8 QSFP rails) |
Hardware requirements
mlx5_0 and mlx5_1ssh, and tar — Linux, macOS, or WindowsSoftware requirements
On both nodes:
nvidia (or your configured CX8_OS_USER)sudo for privileged network and module commands on the DUTsibdev2netdev, ibv_devinfo, show_gids, ib_write_bwmlnx_qos, cma_roce_tos (where supported by the installed OFED/DOCA image)flint and mlxconfig are optional. nmcli is required only when NetworkManager is active; when NetworkManager is inactive or unavailable, the supported ip-based configuration path does not require nmcli.ib_write_bw must advertise both --use_cuda_dmabuf and --use_data_direct, rdma_topo must be installed, and the Script 11 ACS/Data Direct inspection must pass on both DUTs before Script 08 starts a GDR test.On the control host:
ssh and tar (OpenSSH client on Windows if using PowerShell)PATH for the cross-platform cx8_setup.py wrapperAll required assets can be found in the playbook repository. Run the setup from the playbook assets/ directory.
00_env.local.example — Template for the local configuration file; copy to 00_env.local and edit hostnames/IPs before running the setup scripts00_env.local — Your lab-specific configuration (git-ignored; the only file operators should create or edit)01_probe_access.sh through 11_configure_acs_grub.sh — Numbered control-host scripts for setup, validation, and required GPUDirect/Data Direct readiness checks99_cleanup_runtime.sh — Optional runtime cleanupcx8_setup.py — Cross-platform Python wrapper (Windows, macOS, Linux) that runs the same steps as the shell scriptsdut-assets/ — Linux DUT helper scripts copied to both nodes by ./02_push_assets.shCable error, High Temperature) require physical intervention before software setup can continue--persist is used; a reboot clears non-persistent settings99_cleanup_runtime.sh to remove rail IPs and reset MTU; add --remove-persist if netplan was written; add --down to bring interfaces downib_write_bw selection (NVBug 6725953)ib_write_bw capability detection| Term | Meaning in this setup |
|---|---|
| DUT | Device under test — the two hardware platforms being connected |
| Control host | The separate system where you run this playbook; requires ssh and tar |
| CX8 | ConnectX-8, the NVIDIA network adapter used for the direct two-node connection |
| Rail | One independent network path between the two nodes (mlx5_0/QSFP0 and mlx5_1/QSFP1) |
| Rail IP | Private IP assigned to one CX8 rail (for example 192.168.100.1 on DUT A, 192.168.100.2 on DUT B) |
| MTU | Maximum Transmission Unit; this setup uses MTU 9000 for jumbo frames |
| Jumbo ping | Large-packet ping with do-not-fragment set; proves MTU 9000 works end to end |
| RDMA | Remote Direct Memory Access — low-CPU-overhead data movement between systems |
| RoCE | RDMA over Converged Ethernet; this setup uses RoCEv2 over the CX8 rails |
| GPUDirect RDMA | NVIDIA technology for RDMA to access GPU memory directly |
| CUDA DMA-BUF/Data Direct | GPUDirect path used by the optional --gdr perftest when supported by ib_write_bw |
| ACS/Data Direct GRUB configuration | Boot-time PCIe/ACS configuration written by rdma_topo when the GPU and CX8 Data Direct path are not in the required topology for GPUDirect/Data Direct |
nvidia_peermem | Optional legacy/module-based GPUDirect path on some stacks; default OS images may not load it, and this playbook does not require it when CUDA DMA-BUF/Data Direct works |
| MFT | NVIDIA/Mellanox Firmware Tools (flint, mlxconfig); optional for this basic setup |