这个仓库用于在两台节点之间测试 GPU memcpy、NCCL send/recv、GPUDirect RDMA Copy,以及 RoCE QoS 限流配置对带宽的影响。
bench/ benchmark CUDA 源码
gdr/ GPUDirect RDMA Copy 支撑代码
scripts/nic/ NIC QoS 配置脚本
build/ make 生成的二进制目录
run.sh cuda_bench / gdr_bench 启动脚本
run_gdr_qos.sh gdr_qos_bench 启动脚本
默认使用 /usr/local/cuda 和 /usr/local/nccl,如路径不同可以在编译时覆盖:
make CUDA_HOME=/usr/local/cuda NCCL_HOME=/usr/local/nccl也可以只编译单个目标:
make cuda_bench
make gdr_bench
make gdr_qos_bench如果 GPU 架构不是 sm_90,覆盖 CUDA_ARCH:
make CUDA_ARCH="-gencode arch=compute_80,code=sm_80"在两台节点上使用同一份代码,分别启动 rank0 和 rank1。推荐先通过环境变量配置,不必直接改脚本:
export NODE0=<rank0_ip>
export NODE1=<rank1_ip>
export NCCL_IB_HCA=mlx5_4
export BENCH_GPU_ID=4
export BENCH_BUF_KB=4
export BENCH_P2P_BUF_KB=4
export BENCH_GDR_ITERS=10000
export BENCH_GDR_WARMUP=1000
export BENCH_NCCL_ITERS=2000
export BENCH_NCCL_WARMUP=200
export NCCL_IB_GID_INDEX=3BENCH_BUF_KB 和 BENCH_P2P_BUF_KB 按 KiB 解释:1 个变量单位 = 1ULL << 10 bytes。比如 4 表示 4 KiB,$((1 << 20)) 表示 1 GiB。输出带宽仍然使用 GiB/s。旧的 BENCH_BUF_GB / BENCH_P2P_BUF_GB 仍可作为兼容 fallback 使用,但新配置建议统一写 KB。
带宽统计使用批量异步模式:每个测量阶段先连续下发指定迭代次数的传输,再统一等待 stream / GDR completion 结束,最后用 buffer_size * iterations / total_time 计算带宽。输出里的 avg/p99/std 是整批耗时折算到单次传输的展示值,不再是每次传输单独同步得到的 latency。
gdr_bench 和 gdr_qos_bench 使用 BENCH_GDR_ITERS / BENCH_GDR_WARMUP 控制 GDR,使用 BENCH_NCCL_ITERS / BENCH_NCCL_WARMUP 控制 NCCL。cuda_bench 没有 GDR 路径,run.sh 会用 BENCH_NCCL_ITERS / BENCH_NCCL_WARMUP 作为它的通用迭代配置。
如果 RoCE 环境需要指定 GID index,默认脚本已经设置为 3,也可以手动覆盖:
export NCCL_IB_GID_INDEX=<gid_index>cuda_bench 测试 rank0 本地 H2D/D2H 和 node0 到 node1 的 NCCL send/recv 并发干扰。
在 node0:
bash run.sh rank0在 node1:
bash run.sh rank1gdr_bench 使用 GPUDirect RDMA Copy 替代 rank0 本地 memcpy 路径。BENCH_GDR_NIC 默认从 NCCL_IB_HCA 去掉端口后得到,也可以显式指定。
export BENCH_GDR_NIC=mlx5_4
export BENCH_GDR_USE_ODP=0在 node0:
BENCH_BIN=gdr_bench bash run.sh rank0在 node1:
BENCH_BIN=gdr_bench bash run.sh rank1NIC 配置脚本集中在 scripts/nic/。默认网卡名是 enp25s0f0np0,可以用 IF 覆盖。
启用 QoS 限流配置:
IF=enp25s0f0np0 bash scripts/nic/nic_qos.sh恢复默认 NIC 配置:
IF=enp25s0f0np0 bash scripts/nic/nic_default.sh当前 QoS 脚本使用的默认映射:
NCCL: Traffic Class 104 -> DSCP 26 -> prio 6 -> TC6 -> 99%
GDR : Traffic Class 0 -> DSCP 0 -> prio 0 -> TC0 -> 1%
这些脚本依赖 Mellanox mlnx_qos,需要在对应节点上有 sudo 权限。交换机侧也需要按 DSCP/PCP 做队列映射、ETS/PFC 等配置,否则 benchmark 只能打标和验证,不能单独完成真实限流。
先在需要的节点上应用 NIC QoS 配置,然后设置 QoS 相关变量:
export NCCL_IB_TC=104
export BENCH_GDR_IB_TC=0
export BENCH_QOS_MIN_NCCL_RATIO=0.99在 node0:
bash run_gdr_qos.sh rank0在 node1:
bash run_gdr_qos.sh rank1gdr_qos_bench 会比较 solo NCCL 带宽和 concurrent GDR + NCCL 带宽。如果 concurrent / solo 达到 BENCH_QOS_MIN_NCCL_RATIO,结果显示 PASS;否则显示 FAIL,通常需要继续检查 NIC 和交换机 QoS 策略。
确认 RDMA 设备名:
ibv_devinfo | grep hca_id确认链路是 RoCE/Ethernet:
ibstat清理构建产物:
make clean