Skip to content

Topologies: fat-tree, rail-optimized, twin-plane

S3·E4The budget cut, read in a hotel lobby · Hotel lobby, 07:40, one hour before the design meeting

S3·E4Analyze~30 minsources checked todayverified against DGX SuperPOD H200, B300-XDR and GB200 reference architectures; QM97XX and Q32xx/Q34xx user manuals; OpenSM master current-routing.txt; UFM Enterprise 6.24.1; IBUtils2 2.24.0. Research notes fetched 2026-09-07

Builds on: Routing engines and how OpenSM picks a path, SHARP: in-network reduction

Before you read: what do you already know?

3 quick questions. Wrong answers are fine and expected; trying first makes the lesson stick.

After this lesson you can

  • Explain rail optimization as a cabling contract and predict the hop count between any two GPUs from the rail map alone.
  • Reproduce the published scalable-unit tables for an NDR and an XDR SuperPOD, including the cable columns.
  • Compute leaf, spine and cable counts for a partly populated scalable unit and state both answers with their consequences.
  • Explain what an asymmetric tree does to the fat-tree routing rules and which SM parameters exist for it.
  • Separate what NVIDIA publishes about twin-plane from what is commonly assumed about it.

Episode 4 — The budget cut, read in a hotel lobby

The situation · Hotel lobby, 07:40, one hour before the design meeting

An hour before the design meeting, a lobby table, a cold coffee, and the email that rewrites the agenda: about 50 H200-class nodes instead of the 63 in the drawing. The SE has already redone it - fewer leaves, fewer spines, cable what gets populated. Procurement, right about one thing this quarter, wants the delta on the same page as the price. It reads like arithmetic.

It is not arithmetic, and NVIDIA published the reason. If a different node count is required due to budgetary constraints, data center constraints, or other needs, the fabric should be designed to support the full SU, including leaf switches and leaf-spine cables, and leave the portion of the fabric unused where these nodes would be located; this ensures optimal traffic routing and consistent performance across all portions of the fabric.[6] Shrink it instead and the tree is asymmetric, and the fat-tree engine’s rules are written in terms of symmetry - same-rank switches with identical numbers of up-going and down-going port groups, and all the CAs at the same tree level.[9]

Rail optimization exists because the dominant collective in training is per-rail: cable rail N of every node to leaf N and that traffic is one hop. Traffic per rail of the DGX H200 systems is always one hop away from the other 31 nodes in a SU, and traffic between nodes, or between rails, traverses the spine layer.[1]

Buy the shape of the full unit and populate it later. You cannot cable back to symmetry.

One hour to turn that into two priced options.

1Rail optimization is a cabling contract

NVIDIA describes the H200 SuperPOD compute fabric as a rail-optimized, non-blocking, full fat-tree network with eight NDR400 connections per system.[2] The behaviour that phrase buys is stated exactly: each group of 32 nodes is rail-aligned, traffic per rail of the DGX H200 systems is always one hop away from the other 31 nodes in a SU, and traffic between nodes, or between rails, traverses the spine layer.[1]

The same sentence reappears at every generation with different numbers. At B300 and XDR scale: each group of 72 nodes is rail-aligned, traffic per rail of the DGX B300 systems is always one hop away from the other 72 nodes in a SU, and traffic between SUs, or between rails, traverses the spine layer.[3] At GB200 rack scale: each compute rack is rail-aligned, traffic per rail of each compute tray is always one hop away from other compute trays in the same scalable unit, and traffic between different compute racks, or between different rails, traverses the spine layer.[6]

Nothing in those sentences is a switch setting. Rail alignment is produced by where the technician plugs each cable: rail 0 of every node to leaf 0, rail 1 to leaf 1, and so on. To OpenSM the result is an ordinary fat tree, and no SM parameter reports it. That is why it belongs in the cabling map and the acceptance test, not in a configuration review.[1][9]

a cabling contract, not a switch feature
Rail-optimized fat tree — one slice: 3 nodes × 4 rails, 4 leaf, 2 spineS0spine (root)S1spine (root)L0leaf — rail 0L1leaf — rail 1L2leaf — rail 2L3leaf — rail 3node n0 — 4 of 8 rails shownr0srcr1r2r3node n1 — 4 of 8 rails shownr0dstr1r2r3node n2 — 4 of 8 rails shownr0r1r2r3
2 SU
Path

1 switch hop · 1 equal-cost path · same rail (rail 0)

L0

One hop is the rail-optimization payoff: same-rail traffic never touches a spine.

Rail-optimized fat tree

  • Every GPU's rail-N port lands on leaf N: "Traffic per rail of the DGX H200 systems is always one hop away from the other 31 nodes in a SU. Traffic between nodes, or between rails, traverses the spine layer."
  • Same rail, different node = 1 switch hop. Different rail = 3 hops through a spine.
  • H200 SuperPOD compute fabric: QM9700 NDR, "Rail-optimized, non-blocking, full fat-tree network with eight NDR400 connections per system".
  • Nothing is enabled on the switch to get this. It is decided by where the technician plugs the cable.

FAE angle. On an eight-rail PowerEdge XE9680 the rail map is the deliverable. Dell's slot priority for NDR400 1P cards is 33, 37, 35, 39, 32, 36, 34, 38, leaving 31 and 40 for the storage NIC or a BlueField-3 — DPUs over 75 W are legal only in 31/40. Check it against ibdev2netdev and each card's numa_node, then validate with ibdiagnet --rail_validation (→ ibdiagnet2.rails).

DGX H200 SuperPOD RA — Network Fabrics

Scalable-unit arithmetic — 2 SU

DGX H200 SuperPOD compute fabric — QM9700 NDR

Sources: opensm(8) · UFM SM defaults · MLNX-OS Subnet Manager · SHARP environment · Quantum-X800 switches · MCA4J80 ACC · ibdiagnet · ibdiagnet dump files · Dell XE9680 technical guide

Two nodes, same rail: pick the two highlighted HCAs and read the hop count. Then pick two HCAs on different rails and read it again. Switch to the plain fat tree and repeat the same pair - the cabling is the only thing that changed.

2The published sizing tables

Reproducing the tables is the exercise, because a customer conversation about scale is a conversation about switch and cable counts.

DGX H200, NDR, QM9700. The compute fabric per SU is 31 nodes and 248 GPUs on 8 leaf and 4 spine switches, with 252 compute-and-UFM cables and 256 spine-leaf cables. Two SU is 63 nodes and 504 GPUs on 16 leaf and 8 spine, with 508 compute-and-UFM cables and 512 spine-leaf; three SU is 95 nodes and 760 GPUs on 24 leaf and 16 spine, with 764 and 768; four SU is 127 nodes and 1,016 GPUs on 32 leaf and 16 spine with 1,020 plus 1,024 cables.[1] The footnote is the part people miss: this is a 32 node per SU design, however a DGX system must be removed to accommodate for UFM connectivity.[1]

DGX B300, XDR, Quantum-X800 Q3400-RA. The SU is 72 nodes and 576 GPUs at 4 DGX B300 per rack and roughly 56 kW per rack.[5] The component table reads: 1 SU, 8 leaf, 4 spine, 576 node-leaf and 576 leaf-spine cables; 2 SU, 16 and 8, 1,152 plus 1,152; 4 SU, 32 and 18, 2,304 plus 2,304; 8 SU, 64 and 36, 4,608 plus 4,608; 18 SU, 144 leaf, 72 spine, 10,368 node-leaf and 10,368 leaf-spine cables for 1,296 nodes and 9,216 GPUs.[5] Two things to quote carefully. The 4 SU spine column reads 18, not 16 - copy the published row rather than “fixing” it. And 1,296 nodes at eight GPUs each would be 10,368 GPUs while the table’s GPU column reads 9,216; quote the RA and flag the arithmetic instead of silently choosing one.[5] The RA itself is focused on 8 SU with 576 DGX nodes and states that DGX SuperPOD can scale to much larger configurations, up to and beyond 72 SU with 2,000 plus DGX B300 nodes.[5]

DGX GB200, rack scale. The unit of scale is the spine-leaf-group: each SU contains 4 SLGs to match the number of IB rails, which equals the number of GPUs per compute tray, and there are 8 leaf switches, one for each compute rack, and 6 spine switches in each SLG, allowing a fully non-blocking fat tree for each SU to be attached to 6 core groups, scalable up to and including 16 SUs.[6] The published scale-out rows: 1,152 GPUs at 2 SU gives 3 switches per core group, 18 core switches, 64 leaf and 48 spine; 2,304 GPUs at 4 SU gives 6, 36, 128 and 96; 4,608 GPUs at 8 SU gives 12, 72, 256 and 192; 9,216 GPUs at 16 SU gives 24 per core group, 144 core switches, 512 leaf and 384 spine.[6]

3Partial builds, and what asymmetry breaks

The design rule for a customer who cannot fill a scalable unit is published and unambiguous: if a different node count is required due to budgetary constraints, data center constraints, or other needs, the fabric should be designed to support the full SU, including leaf switches and leaf-spine cables, and leave the portion of the fabric unused where these nodes would be located; this will ensure optimal traffic routing and ensure that performance is consistent across all portions of the fabric.[6][3]

The cost of ignoring it is a routing story, not a bandwidth story. A shrunken fabric is an asymmetric tree, and the fat-tree engine’s rules are stated in terms of symmetry: same-rank switches must have identical numbers of up-going and down-going port groups and identical port counts per group, and all the CAs have to be at the same tree level.[9] Break those and ftree declines, OpenSM moves to the next engine in the -R list, and without no_fallback that is eventually MinHop.[9] The customer sees no error - they see job-to-job timing that varies with which part of the cluster the scheduler picked.

NVIDIA does ship parameters for the asymmetric case - ar_tree_asymmetric_flow = 1, ar_tree_asymmetric_flow_threshold = 0 and ar_tree_asymmetric_flow_threshold_limit = 2 - and their existence is a hint about how common the situation is.[10] They are not a licence to design an asymmetric tree on purpose; they help adaptive routing cope with one.[10]

Two commands make this checkable rather than arguable. ibdiagnet --rail_validation checks topology being rail optimized and writes ibdiagnet2.rails; --ft produces a fat-tree analysis and --dfp a DragonFly+ analysis, with --ft_roots_regex_opt and --dfp_roots_regex to name the roots.[11][12]

ibdiagnet --rail_validation      # is the cabling actually rail optimized
ibdiagnet --ft                   # fat-tree analysis
ibdiagnet -r                     # routing report, credit loops

4Twin-plane, and where the published record stops

Twin-plane is the XDR-era shape. The B300 compute fabric is described as rail-optimized, non-blocking, twin-plane, fat tree topology for next-generation extreme-scale AI factory, built on the NVIDIA Quantum-X800 Q3400-RA at 800 Gbps.[4] The design requirements section adds that the compute fabric is a rail-optimized, full-fat tree topology and that managed Quantum-X800 switches are used throughout the design to provide better management of the fabric.[4]

What the fetched pages do not publish is how the two planes are wired. The common reading is two independent planes, each with its own spines, so a port on one plane cannot reach the other through the compute fabric - but that model is an inference, not an NVIDIA statement. Say “as drawn” when you present it, and do not put plane wiring in a customer design document as if it were quoted.[4]

Two ceilings anchor the scale conversation. On Quantum-X800, the switches’ high radix supports a two-level fat-tree topology capable of connecting up to 10,368 network interface cards with minimal latency and optimal job locality.[8] On Quantum-2, the platform claims over one million 400 Gb/s nodes in a four-switch-tier (three hops) DragonFly+ network, 6.5 times higher than the previous generation.[13] Between them sits the QM9700 positioning: the family enables small to medium-sized deployments to scale with a two-level fat tree topology while reducing power, latency and space requirements.[7] Quantum-2 switches also enable a variety of topologies including Fat Tree, SlimFly, DragonFly+, multi-dimensional Torus and more, which is the sentence to quote when a customer asks whether a shape is supported at all.[7]

Fabric management changes shape here too, and it changes a rack elevation. On NDR the RA gives up a whole compute node for UFM connectivity; on Quantum-X800, UFM 3.5 nodes are connected to four FNM ports on the Q3400 switches, the dedicated in-band management port each switch carries so that the full set of standard ports stays available for data.[1][3][8]

B300 + Quantum-X800 shape
plane A — rails 0–1plane B — rails 2–3Twin-plane fat tree (XDR) — one slice: 3 nodes × 4 rails, 4 leaf, 2 spineleaf→spine: optics across the rownode→leaf: DAC ≤ 2 m / ACC 3–5 mS0spine (root)OSFP cagesS1spine (root)OSFP cagesL0leaf — rail 0OSFP cagesL1leaf — rail 1OSFP cagesL2leaf — rail 2OSFP cagesL3leaf — rail 3OSFP cagesnode n0 — 4 of 8 rails shownr0OSFP / QSFP112r1OSFP / QSFP112r2OSFP / QSFP112r3OSFP / QSFP112node n1 — 4 of 8 rails shownr0OSFP / QSFP112r1OSFP / QSFP112r2OSFP / QSFP112r3OSFP / QSFP112node n2 — 4 of 8 rails shownr0OSFP / QSFP112r1OSFP / QSFP112r2OSFP / QSFP112r3OSFP / QSFP112
8 SU
Path

Click one HCA for the source, another for the destination. Hops are counted as switch ASICs traversed — a link count is hops + 1.

Twin-plane fat tree (XDR)

  • The DGX B300 compute fabric is "Rail-optimized, non-blocking, twin-plane, fat tree topology for next-generation extreme-scale AI factory".
  • Drawn as two independent planes: rails 0–1 on plane A, rails 2–3 on plane B, each with its own spines. No leaf joins them, so a rail-0 port cannot reach a rail-2 port through the compute fabric at all.
  • "Traffic per rail of the DGX B300 systems is always one hop away from the other 72 nodes in a SU." 72 nodes / 576 GPUs per SU; 18 SU = 1,296 nodes, 144 leaf, 72 spine.
  • UFM stops costing a compute node: "UFM 3.5 nodes are connected to four (4) FNM ports on the Q3400 switches" — the dedicated in-band management OSFP port on every Quantum-X800 switch.

⚠ Unverified: The RA names the shape "twin-plane" but never spells out the plane wiring. The two-independent-planes model drawn here is the common reading, not an NVIDIA quote — say "as drawn" in front of a customer.

FAE angle. Put the two management stories side by side on the quote. An NDR SuperPOD sacrifices a whole DGX — "a DGX system must be removed to accommodate for UFM connectivity" — while Quantum-X800 gives you FNM ports in hardware and keeps all 144 data ports.

DGX B300 SuperPOD RA — Key Components

What each link class costs in LinkX parts
  • Node-to-leaf runs stay inside or beside the rack; leaf-to-spine runs cross the row. That distinction is the whole cable BOM.
  • NDR copper reach in NVIDIA's own catalogue: passive DAC MCP4Y10-Nxxx up to 2 m (0.5 / 1 / 1.5 / 2 m), active copper MCA4J80-Nxxx at 3, 4 and 5 m. Anything longer is optics.
  • Twin-port OSFP is the arithmetic trap: one cage carries "two transceiver engines… creating 800Gb/s electrical to the switch and 2x400G optics". One MCP4Y10 is one 800G switch-to-switch link; one MCP7Y00 1:2 splitter is two 400G node links. Count OSFP cages, not ports.
  • Top type is thermal, not preference: finned-top at the air-cooled switch, flat-top (-FLT) at DGX and liquid-cooled ends, -FTF ("flat to finned") for an asymmetric run.
  • Fiber rules: multimode "up to 100-meters straight and 50-meters for splitters"; both fibers of a twin-port link same type and roughly the same length — 4.5 ns/m of delay.
  • A QM9700 gives 64 NDR 400 Gb/s ports over 32 OSFP cages (or 128 × NDR200 split); a Q3400-RA gives 144 × 800 Gb/s over 72 OSFP cages.
mlxlink -d <mst_dev> -p 1 -m       # vendor, PN, length, temperature
ibdiagnet --get_cable_info         # fabric-wide → ibdiagnet2.cables

LinkX twin-port OSFP overview

Scalable-unit arithmetic — 8 SU

DGX B300 SuperPOD compute fabric — Quantum-X800 XDR

Sources: opensm(8) · UFM SM defaults · MLNX-OS Subnet Manager · SHARP environment · Quantum-X800 switches · MCA4J80 ACC · ibdiagnet · ibdiagnet dump files · Dell XE9680 technical guide

Twin-plane at 8 SU with the cable overlay. Read the sizing panel against the B300 table in segment 2, and read the note about what the RA publishes versus what the drawing assumes.

5Doing the arithmetic in front of a customer

Sizing an NDR pod, twice

A Dell customer wants “about 50 nodes” of H200-class GPU servers on an NDR fabric and asks for a switch and cable count.

Answer A: the RA-conformant design. Fifty nodes is more than one SU (31) and fewer than two (63), so the fabric is a 2-SU design: 16 leaf and 8 spine switches.[1] Cable it for the full 2 SU: at 8 rails per node, 63 nodes is 504 node-leaf runs, and the RA’s published 2 SU row is 508 compute-and-UFM cables with 512 spine-leaf cables.[1] Leave the unpopulated positions empty, exactly as the RA instructs.[6] Consequence: the tree stays symmetric, ftree’s rules hold, routing quality is uniform, and adding the remaining thirteen nodes later is a cabling job with no re-design.[9]

Answer B: the shrunken design they will ask for. Buy leaf and spine switches proportional to 50 nodes and cable only what is populated. Consequence: unequal port-group counts per rank, so the fat-tree engine declines and OpenSM falls to the next engine in the list.[9] Adaptive routing has asymmetric-tree knobs for this case, but they mitigate rather than restore.[10] The customer-visible symptom is variable job time by node placement, and the fix is re-cabling.[6]

How to present it. Give both, with the delta in switches and cables as a number and the delta in risk as a sentence. Then name the acceptance test: ibdiagnet --rail_validation for the cabling contract and ibdiagnet -r for routing and credit loops, both captured at handover.[11]

Two options on one page

How it ended

The RA-conformant design is a 2 SU fabric at 16 leaf and 8 spine switches, cabled for the full 63 nodes at the published 508 compute-and-UFM and 512 spine-leaf rows, unpopulated positions left empty.[1][6] The shrunken design gets the same page: the delta in switches as a number, the delta in risk as one sentence. Acceptance at handover is ibdiagnet --rail_validation for the cabling contract and ibdiagnet -r for routing.[11]

What you say when they ask why they are buying cables for nodes they do not yet own: rail alignment is plugged in, not configured, and the later fix is re-cabling a live cluster.

They take the conformant option. The cable list goes to the integration partner, who returns it the same day with every port count adding up.

Lab

Goal: inventory what an eight-rail node really looks like on Dell hardware and produce the rail-to-slot map as a deliverable.

Pre-flight inventory (read-only). lspci | grep -i mellanox for the adapter list with bus addresses; ibdev2netdev for the device-to-interface mapping; ibstat -l for the device names; lspci -vv -s <bdf> | grep -i 'physical slot' for slot numbers where the platform reports them. Save all four with today’s date.

  1. lspci | grep -i mellanox - expected: one line per adapter with its PCI address. Record the count. On a single-card Dell lab host you will see one or two functions, not eight; write down the real number rather than pretending the lab is a pod.
  2. ibdev2netdev - expected: mlx5_N port 1 ==> <ifname> (Up|Down) per port. This mapping is the spine of the rail map: rail numbering is yours to assign, but the device-to-interface mapping is the machine’s.
  3. cat /sys/class/infiniband/*/device/numa_node - expected: a NUMA node id per device. Record it against each device. On an eight-rail server this is how you check that the cards are spread across both sockets the way the platform’s slot map intends.[14]
  4. cat /sys/class/infiniband/*/device/uevent | grep PCI_SLOT_NAME - expected: the PCI address per IB device, which lets you join the NUMA and slot views together.
  5. Build the deliverable: a table with columns rail, Dell slot, PCI address, mlx5_N, interface, NUMA node, and target leaf switch. Populate the columns you can read on this host and fill the Dell slot column from the published priority order 33, 37, 35, 39, 32, 36, 34, 38, then 31 and 40, noting Dell’s >75 W guidance for 31 and 40 and the mixed NIC/DPU rule that puts the smaller-quantity card type there first.[14] Expected: a table a cabling technician could work from without asking you a question.
  6. Add the caveat line: the XE9680 technical guide publishes riser-to-processor mapping and slot priority, but GPU-to-slot rail affinity - whether the eight IB slots map one-to-one to the eight GPUs - is not stated on the fetched Dell material, so the rail map is an assignment you are making, not one Dell publishes.[14]
  7. Re-run the pre-flight commands and diff. Expected: identical output; this lab is read-only and there is nothing to roll back.
  8. Optional, only in a customer lab with a cabled fabric and written permission: ibdiagnet --rail_validation and read ibdiagnet2.rails. Expected: the rail-optimization check reports on the discovered cabling. Read the tool’s own tail line for the output directory rather than assuming a path.[11][12]

Retrieval check

10 questions from memory. Answer before looking anything up; misses become flashcards.

Explain it to a Dell SE

Explain to a Dell account team, in five sentences, what rail optimization buys a customer, why the reference architecture tells them to cable a full scalable unit even when they cannot fill it, and what happens if they ignore that.

14 flashcards for this lesson — 0 in deck. Spaced review lives at /review.

Sources

Facts in this lesson were checked against DGX SuperPOD H200, B300-XDR and GB200 reference architectures; QM97XX and Q32xx/Q34xx user manuals; OpenSM master current-routing.txt; UFM Enterprise 6.24.1; IBUtils2 2.24.0. Research notes fetched 2026-09-07. Dates are when each page was fetched.

  1. DGX SuperPOD RA featuring DGX H200: Network Fabrics · fetched 2026-09-07
  2. DGX SuperPOD RA featuring DGX H200: Key Components · fetched 2026-09-07
  3. SuperPOD with DGX B300 RA: Network Fabrics · fetched 2026-09-07
  4. SuperPOD with DGX B300 RA: Key Components · fetched 2026-09-07
  5. SuperPOD with DGX B300 RA: DGX SuperPOD Architecture · fetched 2026-09-07
  6. DGX SuperPOD RA featuring DGX GB200: Network Fabrics · fetched 2026-09-07
  7. QM97XX 1U NDR 400Gbps InfiniBand Switch Systems User Manual: Introduction · fetched 2026-09-07
  8. NVIDIA Q32xx and Q34xx XDR 800Gb/s InfiniBand Switch Systems User Manual: Introduction · fetched 2026-09-07
  9. Current OpenSM Routing (routing-engine reference) · fetched 2026-09-07
  10. UFM Enterprise 6.24.1 User Manual: UFM Subnet Manager Default Properties · fetched 2026-09-07
  11. ibdiagnet Basic Commands | IBUtils2 · fetched 2026-09-07
  12. ibdiagnet Dump Files | IBUtils2 · fetched 2026-09-07
  13. NVIDIA Quantum-2 InfiniBand Platform (product page) · fetched 2026-09-07
  14. Dell PowerEdge XE9680 Technical Guide (Regulatory Model E90S), PDF · fetched 2026-09-07
  15. NVIDIA-Certified Professional: AI Networking (NCP-AIN) certification page · fetched 2026-09-07

The same idea elsewhere

Other lessons that cover this ground, sometimes from another course's angle.