Skip to content

#17 - Add RTX PRO 6000 benchmark YAMLs and baseline#162

Open
chloecrozier wants to merge 9 commits into
mainfrom
ccrozier-rtx-pro-6000-bench
Open

#17 - Add RTX PRO 6000 benchmark YAMLs and baseline#162
chloecrozier wants to merge 9 commits into
mainfrom
ccrozier-rtx-pro-6000-bench

Conversation

@chloecrozier

@chloecrozier chloecrozier commented Jun 12, 2026

Copy link
Copy Markdown
Member

Addresses #17

RTX PRO 6000 raw/RoCE/socket benchmarks, now validated over a real wire closed-loop (two ConnectX-7 400G ports cabled together) with a multi-queue core-scaling sweep and plots.

What this PR adds / fixes

Bug fixes (found via wire testing):

  • Cross-GPU illegal memory access in the GPU workload path — cuFFT/cuBLAS handles and reorder buffers were created on the default CUDA device while wire RX buffers live on GPU 1 (affinity: 1), faulting the context and stalling RX. rx_count_worker now binds to the RX buffer's device before workload init (fixes both dpdk and dpdk-hds fft/gemm on the wire).
  • RDMA YAML schema — replaced the removed protocol:/remote_ip keys with socket_config.local_addr: roce://… on one connected subnet.
  • Runner — auto RoCE IP/sysctl setup + teardown, parse_rdma_drops integer bug, and scoped the "RX too low" stall guard to raw packet backends (RDMA/socket move large messages).

New tooling:

  • Multi-queue (TX,RX) core-scaling base YAML + gen_rtx_pro_mq_config.py + run_rtx_pro_mq_bench.sh (sweeps payload × core cells).
  • scripts/plot_rtx_pro_bench.py — pure-stdlib SVG plots (white background), no matplotlib dependency.
  • run_rtx_pro_push_400g.sh — batch / host_pinned / dual-loop experiments toward line rate.

Results (wire closed-loop, 15 s/cell)

Backend none fft gemm Notes
dpdk (GPUDirect) 216.0 215.3 215.2 0 drops
dpdk-hds 218.9 218.2 218.3 0 drops
ibverbs (MPRQ) 130.2 128.8 129.8 paired DPDK TX
rdma (RoCE, 8 MB msg) 378.6 137.9 5.2 gemm compute-bound

Memory kind (same cable, 8 KB): device GPUDirect 216 Gbps vs host_pinned 384 Gbps (~96% of 400G) — the GPUDirect RX DMA path, not the NIC/PCIe (Gen5 x16), is the current ceiling.

Core scaling × payload (GPUDirect RX Gb/s):

Cell 64 B 256 B 1 KB 8 KB
1 TX / 1 RX 31 76 188 216
1 TX / 2 RX 55 130 213 215
2 TX / 2 RX 56 129 210 215

Extra RX cores ~2× small-packet throughput; at jumbo all cells converge to link-limited ~215 Gbps.

How to run

cmake -S . -B build -DCMAKE_CUDA_ARCHITECTURES=120 && cmake --build build -j
source scripts/discover_rtx_pro_topology.sh
# Backend matrix
sudo -E env ETH_DST_ADDR="$ETH_DST_ADDR" ./examples/run_rtx_pro_bench.sh dpdk issue17 --seconds 15
# Multi-queue core/payload sweep + plots
sudo -E env ETH_DST_ADDR="$ETH_DST_ADDR" ./examples/run_rtx_pro_mq_bench.sh

@greptile-apps

greptile-apps Bot commented Jun 12, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR completes the RTX PRO 6000 benchmark suite originally started in the earlier partial commit, adding nine new examples/ YAML configs, a full wire-tested benchmark runner, multi-queue core-scaling tooling, and three bug fixes validated over a real ConnectX-7 400G closed loop.

  • Engine fixes: ibverbs catch-all matcher priority corrected (1,000,0000) to prevent uint16_t truncation that caused ENOMEM on mlx5dv rule creation; socket set_packet_lengths now validates negative lengths and oversized payloads before assigning to pkt_lens. The DrMatchBuf struct (64 B) is retired in favour of the existing DrMatchParam (512 B) for all flow rules including the catch-all.
  • New configs: eight RTX PRO 6000 YAML files registered in examples/CMakeLists.txt, spanning sw-loopback, dual-port NIC, HDS, ibverbs MPRQ, multi-queue base, and RoCE closed-loop; accompanied by run_rtx_pro_bench.sh (auto RoCE IP/sysctl setup/teardown, stall-guard scoped to raw backends) and run_rtx_pro_mq_bench.sh sweeping payload × core cells with pure-stdlib SVG plotting.
  • Doc sync: AGENTS.md benchmark table, docs/benchmarks/raw_benchmarking.md tip block, and docs/tutorials/configuration-walkthrough.md decision tree are all updated to cover every new config.

Confidence Score: 4/5

Safe to merge once the missing sign-off on commit ef9bcc6 is added.

The engine bug-fixes are narrowly scoped and well-motivated by wire-test evidence. One merge commit is missing a DCO sign-off trailer while every other commit carries one correctly. Resolving that single item unblocks merge.

Only AGENTS.md is flagged for the DCO issue; all source and YAML files are clean.

Important Files Changed

Filename Overview
src/engines/ibverbs/daqiri_ibverbs_engine.cpp Priority constant corrected from 1,000,000 (silently truncates to 16960 in uint16_t) to 0, and the catch-all path upgraded from the removed 64-byte DrMatchBuf to the full DrMatchParam so the rule no longer fails with ENOMEM.
src/engines/socket/daqiri_socket_engine.cpp set_packet_lengths now guards against negative lengths and validates against the endpoint's max_packet_size, preventing a silent negative-to-uint32_t wrap and catching oversized payloads before they corrupt the buffer.
examples/CMakeLists.txt Registers eight new RTX PRO 6000 YAML configs for cmake install and adds ibverbs to the static-link engine loop — correct since daqiri_ibverbs is now a distinct target from daqiri_rdma.
examples/daqiri_bench_rdma_tx_rx_rtx_pro_6000.yaml RoCE closed-loop config using socket_config.local_addr: roce:// endpoints; fixed YAML schema (no removed protocol:/remote_ip keys). Memory regions use host_pinned with correct numa affinity split.
examples/run_rtx_pro_bench.sh New 855-line runner covering dpdk/dpdk-hds/rdma/ibverbs/socket-udp/socket-tcp backends; includes RoCE IP auto-setup/teardown with a trap on EXIT. Logic looks complete; references bench_capture_environment.sh which must already exist in examples/.
AGENTS.md Benchmark table updated with all new RTX PRO 6000 YAML configs and the ibverbs RX / tx-only pair.
docs/benchmarks/raw_benchmarking.md Adds RTX PRO 6000 tip block with config links, run commands, tx_phy_packets/rx_phy_packets verification note — mirrors the DGX Spark block in structure.
docs/tutorials/configuration-walkthrough.md Decision tree extended with all eight new RTX PRO 6000 configs including ibverbs MPRQ, HDS, MQ, and RoCE entries.

Reviews (8): Last reviewed commit: "#17 - Fix ibverbs catch-all flow steerin..." | Re-trigger Greptile

Comment thread examples/CMakeLists.txt
Partial #17: raw GPUDirect configs for RTX PRO 6000 Blackwell plus
measured baseline on the dev box. No HDS, RoCE, FFT, or GEMM yet.

Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>
Adjust sw loopback IP placeholders; expand raw_benchmarking tip block.

Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>
@chloecrozier chloecrozier force-pushed the ccrozier-rtx-pro-6000-bench branch from 6b83d46 to 694e527 Compare June 12, 2026 19:46
Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>
Fix three failure classes surfaced by wire closed-loop testing and add a
multi-queue core/payload sweep with plotting.

Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>
…-bench

Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>

# Conflicts:
#	AGENTS.md
#	examples/CMakeLists.txt
#	examples/bench_pipeline.cu
#	examples/bench_workload.cu
#	examples/bench_workload.h
#	examples/raw_bench_common.cpp
#	examples/raw_bench_common.h
#	examples/raw_gpudirect_bench.cpp
#	examples/raw_hds_bench.cpp
#	examples/rdma_bench.cpp
#	examples/socket_bench.cpp
The merge brought five RTX PRO 6000 example YAMLs (HDS, MQ base, ibverbs RX,
TX-only, RoCE) into examples/ that lacked a leaf in the configuration
walkthrough decision tree, failing scripts/check_doc_refs.py in the docs CI.
Add a decision-tree entry for each so every shipped YAML is covered.

Signed-off-by: Chloe Crozier <chloecrozier@gmail.com>
Add rtx_pro_discover.py to pick PIX-linked CUDA ordinals per NIC and
isolcpus-based poll cores from topology. Wire discovery into the MQ and
single-backend runners, split multi-queue TX across two GPUs, default
RoCE workload-max-inflight, and add run_rtx_pro_suite.sh for the standard
RTX PRO sweep.

Signed-off-by: ccrozier <ccrozier@nvidia.com>
Use priority 0 for the mlx5dv_dr catch-all matcher so the uint16_t priority
does not truncate and rule creation no longer fails with ENOMEM during
daqiri_init. Also pin the RTX PRO ibverbs RX hugepage region to NUMA node 0.

Signed-off-by: ccrozier <ccrozier@nvidia.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant