The Bittersweet Victory: Eight GPUs Online, But P2P Remains Elusive
In the long and winding journey to deploy a large language model across eight NVIDIA RTX PRO 6000 Blackwell GPUs inside a Proxmox virtual machine, message [msg 360] marks a genuine milestone—but one that arrives with a sobering asterisk. The assistant opens with the triumphant declaration, "All 8 GPUs detected! pci=realloc worked," before immediately pivoting to the next, more stubborn problem: Peer-to-Peer (P2P) DMA remains completely non-functional. This single message encapsulates the dual nature of systems engineering at the frontier of GPU virtualization: a hard-won victory that simultaneously reveals an even harder constraint.
The Road to Eight GPUs
To understand the significance of this message, one must appreciate the battle that preceded it. The user had been attempting to run the GLM-5-NVFP4 model—a massive Mixture-of-Experts language model—across eight RTX PRO 6000 Blackwell GPUs, each equipped with 96GB of VRAM. The VM, running on a Proxmox host with an AMD EPYC 9335 processor and an ASUS ESC8000A-E13 motherboard, had been suffering from a severe BAR (Base Address Register) allocation failure.
The problem was rooted in the PCIe memory-mapped I/O (MMIO) aperture. Each RTX PRO 6000 requires a staggering 128GB of contiguous address space for its BAR2 register, which maps the GPU's VRAM into the system's physical address space. With eight GPUs, the firmware needed to allocate 1TB of contiguous 64-bit MMIO space—a demand that exceeded what the default SeaBIOS firmware could handle. The result was catastrophic: only two of the eight GPUs would initialize, while the remaining six produced the ominous error BAR2 is 0M @ 0x0, indicating complete failure to assign their memory regions.
Earlier in the conversation ([msg 339]), the assistant had laid out a detailed root-cause analysis and proposed a three-option remediation plan. The user chose Option 2: adding pci=realloc to the guest kernel command line. This Linux kernel parameter instructs the PCI subsystem to aggressively reassign resources during boot, reallocating BARs that the firmware failed to place.
The implementation, however, was not straightforward. The first attempt to modify /etc/default/grub (<msg id=343-345>) appeared to succeed, but after reboot, the VM came back with only two GPUs and the kernel command line conspicuously lacked pci=realloc ([msg 351]). The assistant diagnosed the issue: a cloud-init configuration file at /etc/default/grub.d/50-cloudimg-settings.cfg was overriding GRUB_CMDLINE_LINUX_DEFAULT after the main GRUB file was sourced (<msg id=352-353>). This is a classic Ubuntu cloud-image pitfall—the cloud-init settings take precedence, silently discarding any modifications made to the main GRUB configuration. The fix required editing the cloud-init file directly, appending pci=realloc to its existing console parameters.
After a second reboot and a tense period of network unavailability (<msg id=355-357>), the VM came back fully operational. The user confirmed it was "up with changes and ovmf" ([msg 358]), and the assistant's follow-up check ([msg 359]) revealed all eight GPUs detected, each with its full 96GB VRAM.
Anatomy of the Subject Message
The subject message at [msg 360] contains three diagnostic commands executed in parallel, each probing a different dimension of the GPU configuration:
nvidia-smi topo -p2p r
nvidia-smi topo -m
sudo dmesg | grep -i 'BAR\|NVRM\|nvidia.*probe\|can.t assign\|can.t claim\|failed to assign\|pci_realloc\|realloc'
These three commands form a comprehensive health check: the first tests P2P DMA capability directly, the second reveals the PCIe topology connecting the GPUs, and the third searches the kernel log for any lingering resource allocation errors. The assistant is systematically verifying that the BAR fix worked cleanly while simultaneously assessing the next bottleneck.
The Triumph: All Eight GPUs Online
The most important result is implicit in the fact that the commands succeeded at all. Before the fix, the VM could only see two GPUs; now, nvidia-smi topo -m shows all eight GPUs enumerated (GPU0 through GPU7), and nvidia-smi topo -p2p r produces a full 8×8 matrix. This confirms that the pci=realloc kernel parameter was the correct intervention.
The mechanism by which pci=realloc works is worth understanding. During the boot process, the firmware (SeaBIOS in this case) assigns PCI BARs based on its own heuristic for sizing the 64-bit MMIO aperture. When the aperture is too small, some BARs remain unassigned—they exist as capabilities of the device but have no valid address range. The Linux kernel's PCI subsystem normally respects the firmware's assignments, but with pci=realloc, it discards the firmware's failed placements and performs its own allocation pass. Because the kernel has full knowledge of the system's physical address space (including memory above 4GB that SeaBIOS may not have properly exposed), it can find room for all eight 128GB BAR2 regions.
The clean dmesg output in the third command confirms this. The grep pattern searches for BAR assignment errors, NVIDIA probe failures, and the pci=realloc string itself. The output shows only the kernel command line confirming the parameter was active, and then... nothing. No can't assign, no can't claim, no failed to assign errors. This silence is the sound of a problem solved.
The Disappointment: P2P Still Broken
Yet the P2P topology test delivers the bad news. The nvidia-smi topo -p2p r output shows an 8×8 matrix where every off-diagonal cell reads "NS" (Not Supported). The legend explains the possible values:
- X = Self
- OK = Status Ok
- CNS = Chipset not supported
- GNS = GPU not supported
- TNS = Topology not supported
- NS = Not supported
- U = Unknown Every cross-GPU pair returns "NS"—not even "CNS" (Chipset Not Supported), which would suggest a software or chipset limitation that might be fixable. "NS" is a flat rejection: the hardware topology does not support direct GPU-to-GPU communication. The
nvidia-smi topo -moutput explains why. The topology matrix shows "PHB" (PCIe Host Bridge) for every GPU-to-GPU connection. In NVIDIA's topology taxonomy, "PHB" means the two GPUs are connected through separate PCIe root complexes—they do not share a common PCIe switch or bridge. Each GPU is on its own dedicated PCIe lane, connected directly to the CPU's root complex. This is a direct consequence of the motherboard design. The ASUS ESC8000A-E13, built around the AMD EPYC platform, provides eight physical PCIe slots, each wired to a distinct root complex on the CPU. This design maximizes per-GPU bandwidth (each slot can operate at Gen5 x16), but it completely eliminates the possibility of P2P DMA through the PCIe fabric. For P2P to work, GPUs must share a common PCIe switch or be connected via NVLink—neither of which exists in this configuration. The implications for the ML workload are significant. Tensor parallelism across eight GPUs requires frequent all-reduce and all-gather operations between GPUs. Without P2P DMA, every cross-GPU communication must traverse system memory via the CPU, which adds latency and consumes CPU and memory bandwidth. This is the virtualization overhead that the segment summary described as "the stark reality" of running tightly-coupled GPU workloads in a VM.
The Clean Slate: What the dmesg Confirms
The third command's output is deceptively sparse. It shows:
[ 0.000000] Command line: BOOT_IMAGE=/vmlinuz-6.8.0-100-generic root=UUID=... ro console=tty1 console=ttyS0 pci=realloc
[ 0.345433] Kernel command line: BOOT_IMAGE=/vmlinuz-6.8.0-100-generic root=UUID=... ro console=tty1 console=ttyS0 pci=realloc
The pci=realloc parameter is present in both the raw and parsed kernel command lines, confirming the fix was applied correctly. The absence of any BAR-related errors in the subsequent lines is the positive result—the kernel successfully reassigned all GPU BARs without conflict.
This clean output also validates the assistant's earlier diagnostic reasoning. In [msg 339], the assistant had hypothesized that the firmware's 64-bit MMIO window was correctly sized (the bridge windows totaled ~1.5TB) but that individual bridge prefetchable windows were too small (only 160GB each) to accommodate a single GPU's 128GB BAR2. The pci=realloc approach bypasses this firmware limitation entirely by letting the kernel perform its own allocation, which can span multiple bridge windows or use the full 64-bit address space.
What This Message Creates: Output Knowledge
This message produces several critical pieces of output knowledge:
- Confirmed fix: The
pci=reallockernel parameter is a viable and complete solution for the 8-GPU BAR allocation failure on this hardware. Any future system with similar large-BAR GPUs and SeaBIOS firmware can apply this fix. - P2P baseline: The P2P topology is definitively characterized as "Not Supported" across all GPU pairs, with a PHB topology indicating separate PCIe root complexes. This is now a known constraint, not a mystery to be debugged.
- Clean system state: The dmesg confirms no residual BAR assignment errors, meaning the PCIe subsystem is in a healthy state. Future debugging can focus on higher-level issues (P2P, NVLink, or software configuration) without worrying about resource allocation problems.
- Next-problem framing: By presenting the P2P failure alongside the BAR success, the assistant implicitly frames the next phase of work. The user now knows that the immediate next challenge is finding a way to enable or work around P2P DMA in this virtualized, multi-root-complex topology.
Assumptions and Implications
The assistant makes several assumptions in this message, most of them well-founded:
- That
nvidia-smi topo -p2p ris the authoritative test for P2P capability. This is correct for NVIDIA GPUs; the tool queries the NVIDIA kernel driver's topology database, which reflects the actual hardware capabilities. - That the PHB topology is immutable. This assumption is correct at the hardware level—you cannot create a shared PCIe switch where none exists. However, the assistant may be implicitly assuming that software workarounds (like
nv_peer_memor GPUDirect RDMA) cannot bridge separate root complexes, which is a more nuanced question explored in subsequent messages. - That the clean dmesg means no further PCIe issues. This is a reasonable inference but not guaranteed—some PCIe issues manifest only under load, not during enumeration. The assistant's next message ([msg 361]) does check for additional NVIDIA-specific messages and confirms all GPUs report their full 96GB VRAM. The message also reflects an assumption about the user's priorities: by immediately checking P2P after confirming all eight GPUs are detected, the assistant signals that P2P is the next critical bottleneck. This is correct for the user's ML inference workload, where cross-GPU communication bandwidth directly impacts model serving performance.
The Broader Context
This message sits at a transition point in the overall session. The earlier segments (0-2) focused on environment setup, driver installation, and model deployment. Segment 3, where this message appears, shifts to investigating and attempting to enable P2P DMA. The BAR allocation fix was a necessary prerequisite—without all eight GPUs operational, P2P was moot. Now that the prerequisite is met, the investigation can proceed to the harder problem.
The message also reveals something about the assistant's methodology: it systematically verifies each layer before moving to the next. First, confirm the GPUs are detected. Then, check P2P topology. Then, verify no kernel errors. This layered debugging approach ensures that each fix is validated before the next problem is tackled, preventing cascading assumptions about system state.
Conclusion
Message [msg 360] is a study in contrasts: a hard-won success that immediately reveals a deeper challenge. The pci=realloc fix was elegant in its simplicity—a single kernel parameter that resolved a complex firmware limitation—but its implementation required navigating the subtleties of Ubuntu's cloud-init GRUB configuration. The result is a fully operational eight-GPU system, but one where the GPUs are isolated from each other by the very hardware design that gives each one dedicated PCIe bandwidth.
For the user's GLM-5-NVFP4 deployment, this message represents both progress and a pivot. The BAR allocation problem is solved, but the P2P problem is now center stage. The assistant's next steps will involve exploring whether software workarounds—potentially including insecure kernel parameters, GPUDirect RDMA, or NVLink alternatives—can bridge the gap that the hardware topology has created. The bittersweet victory of eight GPUs online is a necessary foundation for the harder work ahead.