<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>nanami</title><description>nanami 的个人博客</description><link>https://nanami233.com/</link><language>zh_CN</language><item><title>RTX 4090 Tensor Core + PCIe P2P 双解锁：两台四卡服务器的部署与实测</title><link>https://nanami233.com/posts/rtx4090-tensor-unlock-pcie-p2p-warewulf/</link><guid isPermaLink="true">https://nanami233.com/posts/rtx4090-tensor-unlock-pcie-p2p-warewulf/</guid><description>从 Warewulf 无状态启动、Ada 固件前置解锁到 NVIDIA Open P2P、32GiB BAR1 和 NCCL 实测：一次可以复盘的 RTX 4090 GPU 节点改造。</description><pubDate>Tue, 27 Oct 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;说明与脱敏&lt;/strong&gt;：本文基于真实完成的双节点实验，主机名统一替换为 &lt;code&gt;compute-a&lt;/code&gt; / &lt;code&gt;compute-b&lt;/code&gt;，不包含真实域名、IP、MAC、个人账户、管理接口与设备 PCI BDF。所有管理和部署路径均为示例，请按自身环境替换。固件解锁与 NVIDIA 驱动补丁均非官方支持功能，可能引发设备不可用、数据错误、安全隔离问题或硬件风险；不要在缺乏带外恢复与回滚能力的生产环境直接执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;先看结果&lt;/h2&gt;
&lt;p&gt;我们在&lt;strong&gt;两台各有 4 张 RTX 4090 24GB&lt;/strong&gt; 的 GPU 服务器上，结合 &lt;a href=&quot;https://github.com/JustAResearcher/gpu-unlock-ada&quot;&gt;gpu-unlock-ada&lt;/a&gt; 与 &lt;a href=&quot;https://github.com/Duanyll/open-gpu-kernel-modules&quot;&gt;Duanyll 的 P2P 补丁&lt;/a&gt; 完成了两类改造：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tensor Core 初始化：每台的 4 张卡均出现 &lt;code&gt;gpu_unlock: unlocked&lt;/code&gt;；在特定 MMA 模式中，FP16/FP32 从 &lt;strong&gt;161.8&lt;/strong&gt; 增至 &lt;strong&gt;323.6 TF/s&lt;/strong&gt;，BF16/FP32 从 &lt;strong&gt;161.7&lt;/strong&gt; 增至 &lt;strong&gt;323.4 TF/s&lt;/strong&gt;，接近 &lt;strong&gt;2 倍&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;BAR1：每卡由 &lt;strong&gt;256 MiB&lt;/strong&gt; 扩至 &lt;strong&gt;32768 MiB（32 GiB）&lt;/strong&gt;；这不是增加显存容量。&lt;/li&gt;
&lt;li&gt;CUDA P2P：两台服务器共 &lt;strong&gt;24 条有向卡对&lt;/strong&gt;全部数据校验通过，&lt;code&gt;errors=0&lt;/code&gt;，单方向 64MiB 拷贝吞吐约 &lt;strong&gt;16–21 GiB/s&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;NCCL：单机四卡 AllReduce 全部校验 &lt;code&gt;#wrong=0&lt;/code&gt;。32–256MiB 下，&lt;strong&gt;默认 AUTO 拓扑策略约 18.5 GB/s&lt;/strong&gt;，快于手动指定 PHB 与 SYS。&lt;/li&gt;
&lt;li&gt;测试边界：这不是跨服务器八卡 NCCL 测试，也没有完成长期高负载稳定性认证。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;最容易误解的地方&lt;/strong&gt;：特定 MMA 指令 2 倍，不等于 GEMM 或 AI 训练整体 2 倍；&lt;code&gt;topo -p2p&lt;/code&gt; 显示 OK，也不等于 NCCL 一定选 P2P，更不代表全局应用必然加速。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/cover.svg&quot; alt=&quot;双节点 GPU、Tensor 解锁与 PCIe P2P 组合架构&quot; /&gt;&lt;/p&gt;
&lt;p&gt;与“复制命令然后宣布成功”不同，这次实验围绕三个实际问题展开：&lt;strong&gt;消费级 Ada 显卡究竟限制了什么、PCIe P2P 卡在哪里、为什么有些 NCCL 测试打开 P2P 后反而更慢？&lt;/strong&gt; 我们逐一以固件初始化日志、PCIe 资源分配、CUDA 数据校验与 NCCL 重复实验回答。&lt;/p&gt;
&lt;p&gt;:::note[如何阅读]
本文的配置和命令是经过脱敏的实验复盘，不是任何主板或驱动版本的通用“一键脚本”。先看机制与风险，再结合自己的 PCIe 拓扑、GSP/驱动版本和启动链修改。
:::&lt;/p&gt;
&lt;h2&gt;1. 实验环境与双解锁机制&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;项目&lt;/th&gt;
&lt;th&gt;配置&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;节点&lt;/td&gt;
&lt;td&gt;2 台，每台 4 × RTX 4090 24GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU 拓扑&lt;/td&gt;
&lt;td&gt;双路 Xeon；GPU0/1、GPU2/3 位于不同 NUMA 域&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;计算节点&lt;/td&gt;
&lt;td&gt;Fedora 44，内核 &lt;code&gt;6.19.10-300.fc44.x86_64&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;管理/启动&lt;/td&gt;
&lt;td&gt;Warewulf 4.7，dracut + wwinit，Slurm&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;旧驱动&lt;/td&gt;
&lt;td&gt;NVIDIA Open 610.57.04&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;新驱动&lt;/td&gt;
&lt;td&gt;NVIDIA Open 615.71.09 + P2P Patch&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;固件解锁&lt;/td&gt;
&lt;td&gt;gpu-unlock 1.1.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CUDA Toolkit&lt;/td&gt;
&lt;td&gt;13.3；驱动升级后 CUDA UMD 显示 13.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;NCCL&lt;/td&gt;
&lt;td&gt;2.31.2；nccl-tests 2.21.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;两个计算节点没有互联网。所有源码下载、RPM 准备、镜像处理均在联网管理端完成，计算节点只运行本地测试，再把日志拉回持久存储。&lt;/p&gt;
&lt;h3&gt;1.1 Tensor Core 是初始化阶段的限制&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/JustAResearcher/gpu-unlock-ada&quot;&gt;gpu-unlock-ada&lt;/a&gt; 并不是传统意义上的超频。它通过预先生成的 AD102 固件资产和 &lt;code&gt;gpu_unlock.ko&lt;/code&gt;，在 NVIDIA 驱动接管 GPU &lt;strong&gt;之前&lt;/strong&gt;完成特定速率配置。正确的逻辑顺序是：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;冷启动 → initramfs 内 gpu_unlock + AD102 资产
      → NVIDIA Open Kernel Modules → CUDA / cuBLAS / NCCL
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;普通系统运行后再加载模块，不等价于在 GPU 固件初始化前介入。固件资产的取得和再分发必须遵守上游项目与原始许可证。&lt;/p&gt;
&lt;h3&gt;1.2 P2P 是 GPU 显存映射与驱动能力问题&lt;/h3&gt;
&lt;p&gt;RTX 4090 没有 NVLink。原始驱动即使枚举了四张卡，&lt;code&gt;nvidia-smi topo -p2p r/w&lt;/code&gt; 仍可能全部显示 &lt;code&gt;GNS&lt;/code&gt;。P2P 驱动补丁修改 NVIDIA Open 模块的 GPU peer mapping 支持；参考 &lt;a href=&quot;https://duanyll.com/2026/7/13/4090-48G-P2P/&quot;&gt;作者关于 4090 48GB、动态 BAR1 的技术文章&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;BAR1 是 PCIe MMIO 可映射窗口，不是额外显存&lt;/strong&gt;。GPU 自身报告 ReBAR 最高支持 32GB，并不代表 BIOS 当时实际给它分配了 32GB。本次初始 &lt;code&gt;current size&lt;/code&gt; 只有 256MB。&lt;/p&gt;
&lt;h3&gt;1.3 从 CPU 到 GPU：为什么 NUMA 位置决定通信上限？&lt;/h3&gt;
&lt;p&gt;消费级 GPU 之间的 P2P 并不是虚拟的“GPU 私有高速总线”。它仍需走 GPU PCIe Endpoint → Root Port/PCIe Bridge → 对端 GPU 的物理路径。如果两卡落在不同 CPU Socket 的 Root Complex 后面，数据还会涉及处理器之间的互连；启用 P2P 能减少主机内存中转，但不能消除硬件跳数。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/topology.svg&quot; alt=&quot;双路 NUMA 下四张 GPU 的拓扑示意&quot; /&gt;&lt;/p&gt;
&lt;p&gt;在我们的机器上，GPU0/1 和 GPU2/3 是两个相对接近的组合；GPU0→GPU2 属于跨 NUMA 通路。这一硬件结构解释了后面为什么同 NUMA 单向复制达到约 21 GiB/s，而部分跨 NUMA 方向约为 16–17 GiB/s。这里的图是&lt;strong&gt;拓扑示意而非真实机器的 PCI BDF/布线图&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;1.4 为什么必须由两个独立机制组合？&lt;/h3&gt;
&lt;p&gt;Tensor Unlock 发生在 NVIDIA 驱动加载&lt;strong&gt;之前&lt;/strong&gt;，目的是更改特定运算速率配置；P2P 补丁则是 NVIDIA Open Kernel Modules 层的 peer mapping 能力。二者在不同层面工作，既不能互相代替，也不意味着理论加速比可以相乘。&lt;/p&gt;
&lt;p&gt;这也是我们先用一张卡验证 Tensor，再在克隆镜像中升级 NVIDIA 615 和 P2P、最后检查 GPU 间 NCCL 的原因。按阶段验收能把“启动失败”“GPU 数值错误”“通信错误”定位到不同层。&lt;/p&gt;
&lt;h2&gt;2. 通过 Warewulf 部署 Tensor Unlock&lt;/h2&gt;
&lt;p&gt;最重要的工程决策是：&lt;strong&gt;永远复制专用镜像，不在整个集群共用的 GPU 镜像上试错&lt;/strong&gt;。下列镜像和目录名称都是示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;wwctl image copy fedora44-gpu-base fedora44-gpu-tensor
mkdir -p /srv/rtx4090-lab/src
git clone https://github.com/JustAResearcher/gpu-unlock-ada.git /srv/rtx4090-lab/src/gpu-unlock-ada

cd /srv/rtx4090-lab/src/gpu-unlock-ada
git rev-parse HEAD
make inputs
make firmware
make test-full
make rpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本次 &lt;code&gt;test-full&lt;/code&gt; 执行 33 项测试，30 通过、3 项可选离线解码测试跳过。生成 &lt;code&gt;gpu-unlock-firmware&lt;/code&gt;、&lt;code&gt;gpu-unlock-dkms&lt;/code&gt; 两个 RPM，在 Fedora 44 独立镜像里安装。注意 RPM 是在另一发行版构建机上生成的 &lt;code&gt;noarch&lt;/code&gt; 包，因此不能只看安装成功，要实查 &lt;strong&gt;Fedora 内核版本对应的 DKMS 状态&lt;/strong&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KVER=6.19.10-300.fc44.x86_64
dkms status
modinfo -k &quot;$KVER&quot; gpu_unlock
cat /usr/lib/dracut/dracut.conf.d/gpu-unlock.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本次成功后可以看到：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;gpu-unlock/1.1.1, 6.19.10-300.fc44.x86_64, x86_64: installed
force_drivers+=&quot; gpu_unlock &quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;容易踩的坑：Warewulf 的 PXE/wwinit 启动链不等于普通磁盘系统的 GRUB。&lt;/strong&gt; 仅把模块放进镜像文件系统并不能确保它在 NVIDIA 驱动之前运行。目标 Fedora 镜像中生成 dracut initramfs，并明确加入 wwinit：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;KVER=6.19.10-300.fc44.x86_64
INITRD=/boot/initramfs-$KVER.img
dracut --force --no-hostonly --add wwinit &quot;$INITRD&quot; &quot;$KVER&quot;
lsinitrd -m &quot;$INITRD&quot; | grep wwinit
lsinitrd &quot;$INITRD&quot; | grep -E &apos;gpu_unlock|v67-ad102|gsp_boot_ad102&apos;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后退出镜像，使用 &lt;code&gt;wwctl image build fedora44-gpu-tensor&lt;/code&gt;。实际节点需确认其 iPXE 模式就是 dracut 路径，启动参数确实传入解锁模块。内核模块和 AD102 固件应出现在&lt;strong&gt;真正的早期启动环境&lt;/strong&gt;；NVIDIA 完整驱动可以后续加载，不能仅凭早期 initramfs 里没有 &lt;code&gt;nvidia.ko&lt;/code&gt; 就判为失败。&lt;/p&gt;
&lt;p&gt;第一次只针对一张 RTX 4090，在节点专用启动参数中配置 &lt;code&gt;gpu_unlock.targets=&amp;lt;GPU_BDF&amp;gt;&lt;/code&gt;。BDF 必须从目标机器的 &lt;code&gt;lspci -Dnn&lt;/code&gt; 查询，&lt;strong&gt;不可把另一台的 PCI 地址照搬过去&lt;/strong&gt;。单卡日志确认 &lt;code&gt;gpu_unlock: unlocked&lt;/code&gt; 后，再扩展为四张。Warewulf 的 &lt;code&gt;Kernel.Args&lt;/code&gt; 是逗号列表：多 BDF 字符串要作为&lt;strong&gt;一个参数元素&lt;/strong&gt;传入，并核对 &lt;code&gt;/proc/cmdline&lt;/code&gt;，避免默认 profile 参数重复。&lt;/p&gt;
&lt;p&gt;初次测试在设备重新上电后完成；内核出现过模块签名未被信任的 taint 日志，但并未阻止解锁。正式 Secure Boot 环境应另行处理模块签名信任链。&lt;/p&gt;
&lt;h2&gt;3. 升级 NVIDIA 615.71.09 并编译 P2P 补丁&lt;/h2&gt;
&lt;h3&gt;3.1 驱动版本必须匹配&lt;/h3&gt;
&lt;p&gt;目标分支为 &lt;code&gt;615.71.09-p2p-48g&lt;/code&gt;。原环境的 610.57.04 用户态驱动不能直接混装 615 的内核模块。第二个 Warewulf 镜像从&lt;strong&gt;已通过 Tensor 验证的镜像&lt;/strong&gt;复制，保留可回滚的旧镜像。&lt;/p&gt;
&lt;p&gt;Fedora 44 的 NVIDIA 仓库提供 615.71.09 的用户态组件与 Open DKMS 包。先用精确版本做 &lt;code&gt;dnf install --assumeno&lt;/code&gt; 事务预演，再安装同版的 &lt;code&gt;nvidia-driver-common&lt;/code&gt;、&lt;code&gt;nvidia-driver-cuda&lt;/code&gt;、&lt;code&gt;nvidia-driver-cuda-libs&lt;/code&gt;、&lt;code&gt;nvidia-kmod-common&lt;/code&gt;、&lt;code&gt;kmod-nvidia-open-dkms&lt;/code&gt;、&lt;code&gt;nvidia-modprobe&lt;/code&gt;、&lt;code&gt;nvidia-persistenced&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这里曾踩过一个关键依赖坑：预演时为了避免官方 DKMS 覆盖补丁，排除了 &lt;code&gt;kmod-nvidia-open-dkms&lt;/code&gt;，却使 &lt;code&gt;nvidia-kmod-common&lt;/code&gt; 所需的 &lt;code&gt;nvidia-kmod = 615.71.09&lt;/code&gt; 依赖缺失。解决方法是&lt;strong&gt;先完整升级官方 615.71.09 包组，再单独构建补丁模块&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;另一个细节：RPM 安装成功后 &lt;code&gt;dkms status&lt;/code&gt; 显示 &lt;code&gt;nvidia/615.71.09: added&lt;/code&gt;，但 &lt;code&gt;modinfo&lt;/code&gt; 查询不到 NVIDIA 模块。&lt;code&gt;added&lt;/code&gt; 只是已注册源码，并不是已构建并安装。&lt;/p&gt;
&lt;h3&gt;3.2 在 Fedora 44 内核开发环境构建&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;home&lt;/code&gt; 类型的管理端即使有网，也不能使用管理端 Rocky 内核头文件替 Fedora 44 编译模块。源代码先从管理端只读 bind 到镜像，再复制到镜像本地构建：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git clone https://github.com/Duanyll/open-gpu-kernel-modules.git
cd open-gpu-kernel-modules
git switch 615.71.09-p2p-48g
git rev-parse HEAD
cat version.mk

# 以下 make 在 Fedora 44 构建镜像内进行
KVER=6.19.10-300.fc44.x86_64
make -j16 modules SYSSRC=&quot;/usr/src/kernels/$KVER&quot; SYSOUT=&quot;/usr/src/kernels/$KVER&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;生成并核实版本的模块有：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;nvidia.ko
nvidia-modeset.ko
nvidia-uvm.ko
nvidia-drm.ko
nvidia-peermem.ko
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;五个模块的 &lt;code&gt;modinfo version&lt;/code&gt; 都是 &lt;code&gt;615.71.09&lt;/code&gt;，&lt;code&gt;vermagic&lt;/code&gt; 均匹配 &lt;code&gt;6.19.10-300.fc44.x86_64&lt;/code&gt;。编译中存在 &lt;code&gt;objtool&lt;/code&gt; 的 &lt;code&gt;naked return&lt;/code&gt; 警告及缺少 &lt;code&gt;vmlinux&lt;/code&gt; 导致的 BTF 生成跳过，但链接成功；是否运行正确仍以后续 GPU 实测为准。&lt;/p&gt;
&lt;p&gt;本次首次验证把这些补丁模块安装到独立镜像的 &lt;code&gt;/lib/modules/&amp;lt;KVER&amp;gt;/updates/dkms/&lt;/code&gt;，执行 &lt;code&gt;depmod -a &quot;$KVER&quot;&lt;/code&gt;，再用 &lt;code&gt;modinfo -k &quot;$KVER&quot; -F filename nvidia&lt;/code&gt; 验证最终模块优先路径。重新生成包含 &lt;code&gt;wwinit&lt;/code&gt; 与 &lt;code&gt;gpu_unlock&lt;/code&gt; 的 dracut initramfs，随后 &lt;code&gt;wwctl image build&lt;/code&gt;，最后只切换两台已排空的节点。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;不能忽视的运维技术债&lt;/strong&gt;：P2P 模块最初是手工放入 &lt;code&gt;updates/dkms&lt;/code&gt;，而官方 &lt;code&gt;nvidia/615.71.09&lt;/code&gt; DKMS 源码注册项可能仍存在。将来执行 &lt;code&gt;dkms autoinstall&lt;/code&gt; 或升级驱动会有覆盖补丁的风险。真正长期维护应封装成版本固定、可重建的补丁 DKMS/RPM，而不是永久依赖一次性手工覆盖。&lt;/p&gt;
&lt;h2&gt;4. BIOS / BAR1 / IOMMU 配置&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/bar1.svg&quot; alt=&quot;BAR1：映射窗口与物理显存的区别&quot; /&gt;&lt;/p&gt;
&lt;h3&gt;4.1 BAR1 扩容不是显存扩容&lt;/h3&gt;
&lt;p&gt;CPU 可通过 PCIe MMIO 窗口访问 GPU 的部分设备/显存地址空间。BAR1 资源的“size”表示主机为这个 PCIe BAR 分配的&lt;strong&gt;地址窗口容量&lt;/strong&gt;，而不是 GPU 搭载了多少显存。大 BAR1 对静态映射覆盖整卡显存非常关键，但它也占用平台的 PCIe MMIO 地址空间；四卡同时选择 32GiB BAR1，理论上需要约 128GiB 的窗口地址资源（还未计入其他 BAR）。&lt;/p&gt;
&lt;p&gt;动态 BAR1 映射并非简单“开了 ReBAR 就变成动态”：它还依赖相应的驱动映射策略。我们这里的卡是&lt;strong&gt;标准 24GB&lt;/strong&gt;，而原始研究重点包括 &lt;strong&gt;48GB 改装卡&lt;/strong&gt;。24GB 容量小于已分配的 32GiB 窗口，因此不能仅凭本次结果证明 48GB 场景下的动态窗口回收算法已被充分验证。本文只声称本次 24GB 环境的 peer copy / NCCL 结果。&lt;/p&gt;
&lt;h3&gt;4.2 从能力位到实际映射有三层检查&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;§lspci -vv§ 的 Resizable BAR &lt;strong&gt;supported sizes&lt;/strong&gt;：GPU 宣称支持哪些窗口。&lt;/li&gt;
&lt;li&gt;§lspci -vv§ 的 &lt;strong&gt;current size&lt;/strong&gt; 与 §nvidia-smi -q§ 的 BAR1 Total：平台实际上分配了多少。&lt;/li&gt;
&lt;li&gt;§nvidia-smi topo -p2p§、CUDA Peer Access 与数据一致性：驱动和上层运行时是否真正可用。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;即便第三层返回 OK，也仍需要验证集合通信的数值和性能。&lt;/p&gt;
&lt;p&gt;两台机器的 GPU 都报告 &lt;code&gt;Physical Resizable BAR&lt;/code&gt; 支持 BAR1 最大 &lt;strong&gt;32GB&lt;/strong&gt;；但刚开始 &lt;code&gt;lspci -vv&lt;/code&gt; 的 &lt;strong&gt;current size&lt;/strong&gt; 只有 &lt;strong&gt;256MB&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;维护窗口使用带外控制台检查主板 BIOS/UEFI：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;设置&lt;/th&gt;
&lt;th&gt;本次方向&lt;/th&gt;
&lt;th&gt;为什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Above 4G Decoding&lt;/td&gt;
&lt;td&gt;启用&lt;/td&gt;
&lt;td&gt;为大 PCIe MMIO 预留地址空间&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Resizable BAR&lt;/td&gt;
&lt;td&gt;有此选项则启用&lt;/td&gt;
&lt;td&gt;允许扩大 BAR1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;High MMIO 相关配置&lt;/td&gt;
&lt;td&gt;按主板文档确保充足&lt;/td&gt;
&lt;td&gt;四卡 32GiB 共约 128GiB 的窗口地址需求&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CSM / UEFI&lt;/td&gt;
&lt;td&gt;与既有 UEFI 启动保持一致&lt;/td&gt;
&lt;td&gt;防止变更造成不能启动&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PCIe 链路&lt;/td&gt;
&lt;td&gt;Auto / 合理的 Gen4 配置&lt;/td&gt;
&lt;td&gt;空闲的 2.5GT/s 不等于负载最大速率&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IOMMU&lt;/td&gt;
&lt;td&gt;在可信环境中评估 passthrough&lt;/td&gt;
&lt;td&gt;对 DMA 隔离存在安全权衡&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;我们将节点内核 IOMMU 默认域切为 passthrough，实际日志为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;iommu: Default domain type: Passthrough (set via kernel command line)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;安全提醒&lt;/strong&gt;：&lt;code&gt;iommu=pt&lt;/code&gt; 改变 DMA 隔离语义，不应不加评估地应用在多租户/不可信 PCIe 设备环境。也不要为“让拓扑好看”盲目设置 &lt;code&gt;pcie_acs_override&lt;/code&gt;，它不会改变物理 PCIe 路径。&lt;/p&gt;
&lt;p&gt;冷启动后，每张卡的 &lt;code&gt;nvidia-smi -q&lt;/code&gt; 均显示 &lt;code&gt;BAR1 Total: 32768 MiB&lt;/code&gt;，&lt;code&gt;nvidia-smi topo -p2p r&lt;/code&gt;、&lt;code&gt;w&lt;/code&gt; 中 12 个非对角有向卡对全部为 &lt;code&gt;OK&lt;/code&gt;。这是能力枚举成功，尚需 CUDA 与 NCCL 数据验证。&lt;/p&gt;
&lt;h2&gt;5. Tensor Core 实测：2 倍的是哪一层？&lt;/h2&gt;
&lt;p&gt;首次单卡验证时以一张解锁卡对照一张未解锁卡，同条件运行项目的 &lt;code&gt;mma_bench&lt;/code&gt; 与 &lt;code&gt;gemm_bench&lt;/code&gt;，数值测试均为 &lt;code&gt;failures=0&lt;/code&gt;、&lt;code&gt;max_abs=0&lt;/code&gt;。跨物理卡的对比仍可能受到功耗、时钟和调度差异影响，因此报告实测而非保证。&lt;/p&gt;
&lt;h3&gt;MMA 指令吞吐（best TF/s）&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/mma.svg&quot; alt=&quot;Tensor Core MMA：原始卡与解锁卡对照&quot; /&gt;&lt;/p&gt;
&lt;p&gt;指令层基准特意保留未变化的 INT8、FP16/FP16 和普通 FP32 FFMA 作为&lt;strong&gt;负对照&lt;/strong&gt;。如果所有模式都同幅度上升，就需要怀疑是频率、功耗或测试方法而不只是某个 Tensor 模式的限制被解除。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;模式&lt;/th&gt;
&lt;th&gt;原始/对照&lt;/th&gt;
&lt;th&gt;解锁&lt;/th&gt;
&lt;th&gt;加速&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FP16/FP32&lt;/td&gt;
&lt;td&gt;161.8&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;323.6&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.00×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BF16/FP32&lt;/td&gt;
&lt;td&gt;161.7&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;323.4&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2.00×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP8 E4M3&lt;/td&gt;
&lt;td&gt;323.3&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;644.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1.99×&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP16/FP16&lt;/td&gt;
&lt;td&gt;323.7&lt;/td&gt;
&lt;td&gt;323.7&lt;/td&gt;
&lt;td&gt;1.00×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;INT8/INT32&lt;/td&gt;
&lt;td&gt;646.9&lt;/td&gt;
&lt;td&gt;646.9&lt;/td&gt;
&lt;td&gt;1.00×&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP32 FFMA&lt;/td&gt;
&lt;td&gt;77.3&lt;/td&gt;
&lt;td&gt;77.4&lt;/td&gt;
&lt;td&gt;约 1.00×&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;不是所有 Tensor 模式、所有精度都翻倍&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;cuBLAS GEMM 中位吞吐（TF/s）&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/gemm.svg&quot; alt=&quot;cuBLAS GEMM 中位吞吐对比&quot; /&gt;&lt;/p&gt;
&lt;p&gt;GEMM 的实际吞吐包含 Kernel 实现、访存、矩阵维度与调度成本。特别是 BF16/FP32 4096² 只改善约 0.6%，提示这类任务可能不是被解锁的指令速率控制。&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;算例&lt;/th&gt;
&lt;th&gt;原始/对照&lt;/th&gt;
&lt;th&gt;解锁&lt;/th&gt;
&lt;th&gt;改善&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;FP16/FP32，1024²&lt;/td&gt;
&lt;td&gt;110.38&lt;/td&gt;
&lt;td&gt;126.72&lt;/td&gt;
&lt;td&gt;+14.8%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP16/FP32，4096²&lt;/td&gt;
&lt;td&gt;163.09&lt;/td&gt;
&lt;td&gt;199.54&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+22.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BF16/FP32，4096²&lt;/td&gt;
&lt;td&gt;152.31&lt;/td&gt;
&lt;td&gt;153.22&lt;/td&gt;
&lt;td&gt;+0.6%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;FP16/FP32，8192²&lt;/td&gt;
&lt;td&gt;171.07&lt;/td&gt;
&lt;td&gt;189.02&lt;/td&gt;
&lt;td&gt;+10.5%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;BF16/FP32，8192²&lt;/td&gt;
&lt;td&gt;167.42&lt;/td&gt;
&lt;td&gt;187.42&lt;/td&gt;
&lt;td&gt;+11.9%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这里已经能看到：指令性能即便 2×，应用 GEMM 的吞吐提升也会受算子实现、访存和调度影响。&lt;/p&gt;
&lt;h2&gt;6. CUDA Peer Copy 实测：24 条方向全部 PASS&lt;/h2&gt;
&lt;p&gt;每个方向使用 64MiB 数据，重复 20 次；4 张 GPU 每节点共有 12 条有向卡对，两台共 &lt;strong&gt;24 条&lt;/strong&gt;。所有卡对的 &lt;code&gt;peer_access=1&lt;/code&gt;、&lt;code&gt;correct=1&lt;/code&gt;，结果均为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;RESULT: PASS; errors=0
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;挑选代表性路径（GiB/s）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;路径&lt;/th&gt;
&lt;th&gt;compute-a&lt;/th&gt;
&lt;th&gt;compute-b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU0 → GPU1，同 NUMA&lt;/td&gt;
&lt;td&gt;21.321&lt;/td&gt;
&lt;td&gt;21.334&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU2 → GPU3，同 NUMA&lt;/td&gt;
&lt;td&gt;21.187&lt;/td&gt;
&lt;td&gt;21.194&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU0 → GPU2，跨 NUMA&lt;/td&gt;
&lt;td&gt;16.040&lt;/td&gt;
&lt;td&gt;16.027&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU2 → GPU0，跨 NUMA&lt;/td&gt;
&lt;td&gt;17.311&lt;/td&gt;
&lt;td&gt;17.298&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;跨 NUMA 通常比同 NUMA 慢，这是物理主机桥/处理器互连拓扑的结果。此表是&lt;strong&gt;单向拷贝带宽&lt;/strong&gt;，不是 NCCL 的 &lt;code&gt;busbw&lt;/code&gt;。&lt;/p&gt;
&lt;h2&gt;7. NCCL：为什么四卡结果没有“暴涨”？&lt;/h2&gt;
&lt;p&gt;从 &lt;a href=&quot;https://github.com/NVIDIA/nccl&quot;&gt;NVIDIA NCCL&lt;/a&gt; 源码构建 &lt;strong&gt;2.31.2&lt;/strong&gt;，测试采用 &lt;a href=&quot;https://github.com/NVIDIA/nccl-tests&quot;&gt;nccl-tests&lt;/a&gt; &lt;strong&gt;2.21.1&lt;/strong&gt;。计算节点未安装 NCCL RPM，官方 CUDA 仓库中也未找到该 Fedora 版本的 &lt;code&gt;libnccl-devel&lt;/code&gt;，故由联网端取源码并在 Fedora 构建镜像编译。&lt;/p&gt;
&lt;p&gt;当时 &lt;code&gt;nvcc 13.3&lt;/code&gt; 报：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#error -- unsupported GNU version!
gcc versions later than 15 are not supported!
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Fedora 44 默认 GCC 16，因此改为安装兼容 &lt;code&gt;gcc15&lt;/code&gt;/&lt;code&gt;gcc15-c++&lt;/code&gt;，明确传入 &lt;code&gt;CC=/usr/bin/gcc-15&lt;/code&gt;、&lt;code&gt;CXX=/usr/bin/g++-15&lt;/code&gt;，没有直接绕过 &lt;code&gt;nvcc&lt;/code&gt; 的编译器版本检查。期间还曾因 &lt;code&gt;cd&lt;/code&gt; 失败而误在 NCCL 源码目录再次 &lt;code&gt;make&lt;/code&gt;，耗时很长；之后通过核对工作目录，只构建测试程序。&lt;/p&gt;
&lt;h3&gt;7.1 单机四卡，开启与关闭 P2P&lt;/h3&gt;
&lt;p&gt;首轮 8–512MiB AllReduce，平均 &lt;code&gt;busbw&lt;/code&gt;（GB/s）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;节点&lt;/th&gt;
&lt;th&gt;P2P Enabled&lt;/th&gt;
&lt;th&gt;P2P Disabled&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;compute-a&lt;/td&gt;
&lt;td&gt;18.4579&lt;/td&gt;
&lt;td&gt;18.4074&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;compute-b&lt;/td&gt;
&lt;td&gt;18.0705&lt;/td&gt;
&lt;td&gt;18.3846&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;这组数字并未证明四卡 AllReduce 因 P2P 大幅加速。&lt;/strong&gt; 某些配置甚至更慢，属于需要进一步分解 NCCL 运行策略的问题。&lt;/p&gt;
&lt;p&gt;但开启详细初始化日志并设置 &lt;code&gt;NCCL_P2P_LEVEL=SYS&lt;/code&gt; 后，两台的 NCCL 明确报告：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;Check P2P Type isAllDirectP2p 1 directMode 1 isAllCudaP2p 1
Channel ... via P2P/direct pointer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;证明该诊断实验里 NCCL 确实使用了 CUDA 直接 P2P 路径。&lt;code&gt;SYS&lt;/code&gt; 是允许访问的最远拓扑级别，不是“一定选最快路由”的开关。&lt;/p&gt;
&lt;h3&gt;7.2 两卡的 P2P 收益很明显&lt;/h3&gt;
&lt;p&gt;在其中一台服务器上，32–256MiB 双卡 AllReduce 平均 &lt;code&gt;busbw&lt;/code&gt;（GB/s）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;卡对&lt;/th&gt;
&lt;th&gt;P2P 开&lt;/th&gt;
&lt;th&gt;P2P 关&lt;/th&gt;
&lt;th&gt;提升&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPU0–GPU1&lt;/td&gt;
&lt;td&gt;19.0955&lt;/td&gt;
&lt;td&gt;15.8076&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+20.8%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU2–GPU3&lt;/td&gt;
&lt;td&gt;19.1395&lt;/td&gt;
&lt;td&gt;15.7801&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+21.3%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU0–GPU2（跨 NUMA）&lt;/td&gt;
&lt;td&gt;17.2592&lt;/td&gt;
&lt;td&gt;13.7892&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;+25.2%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;全部 &lt;code&gt;#wrong=0&lt;/code&gt;。跨 NUMA 禁用 P2P 的数据存在一次明显低值，&lt;code&gt;+25.2%&lt;/code&gt; 可能有异常值放大效应，不能无条件外推。&lt;/p&gt;
&lt;h3&gt;7.3 三轮复测：AUTO 比强制 PHB / SYS 更快&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;/images/posts/rtx4090-unlock/nccl.svg&quot; alt=&quot;四卡 NCCL AllReduce：AUTO、PHB、SYS 的重复实验&quot; /&gt;&lt;/p&gt;
&lt;p&gt;为何不把双卡的 21% 改善直接推广到四卡？因为 AllReduce 不是一次独立 Peer Copy，而是涉及同步、分块、通信环/树与不同拓扑边的集合操作；最慢链路、通道选择和 CPU Socket 间路径会影响总吞吐。强制扩大 P2P 允许距离，可能令 NCCL 不再采用其默认认为更好的组合。&lt;/p&gt;
&lt;p&gt;因此我们固定消息大小与迭代数量，对 AUTO、PHB、SYS 各重复 3 次，并以所有轮次的平均 §busbw§ 讨论性能，而不是挑最快的一条数据。&lt;/p&gt;
&lt;p&gt;32–256MiB 单机四卡 AllReduce，每策略 3 次，平均 &lt;code&gt;busbw&lt;/code&gt;（GB/s）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;NCCL 策略&lt;/th&gt;
&lt;th&gt;compute-a&lt;/th&gt;
&lt;th&gt;compute-b&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;AUTO（不设置 P2P_LEVEL）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18.4943&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;18.4803&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PHB&lt;/td&gt;
&lt;td&gt;16.9091&lt;/td&gt;
&lt;td&gt;16.9329&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SYS&lt;/td&gt;
&lt;td&gt;16.5636&lt;/td&gt;
&lt;td&gt;16.5749&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;AUTO 比 PHB 快约 &lt;strong&gt;9.4%&lt;/strong&gt;，比 SYS 快约 &lt;strong&gt;11.6%&lt;/strong&gt;。全部 18 次测试正常结束，&lt;code&gt;#wrong&lt;/code&gt; 均为 0，没有越界数据错误。AUTO 由 NCCL 自己选择拓扑和通道，&lt;strong&gt;不要把调试时的 &lt;code&gt;NCCL_P2P_LEVEL=SYS&lt;/code&gt; 永久写到集群全局环境&lt;/strong&gt;。但 AUTO 的详细底层路径仍需要针对具体任务诊断，不能仅凭总线带宽反推所有环节的传输方式。&lt;/p&gt;
&lt;p&gt;推荐维持默认：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;unset NCCL_P2P_LEVEL
unset NCCL_P2P_DISABLE
unset NCCL_ALGO
unset NCCL_PROTO
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;7.4 对性能指标的解释&lt;/h3&gt;
&lt;p&gt;NCCL 的 §algbw§ 是算法层有效带宽；§busbw§ 是依据通信原语和卡数折算的总线带宽，&lt;strong&gt;不能直接与单向 CUDA Peer Copy 的 GiB/s 作数值等价比较&lt;/strong&gt;。另外本次 §GB/s§ 为 NCCL 的十进制单位，Peer Copy 的 §GiB/s§ 为二进制单位，单位差异也是比较时必须说明的。&lt;/p&gt;
&lt;p&gt;实验证据分四级：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;证据&lt;/th&gt;
&lt;th&gt;能证明什么&lt;/th&gt;
&lt;th&gt;不能证明什么&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;§gpu_unlock: unlocked§&lt;/td&gt;
&lt;td&gt;固件阶段报告解锁&lt;/td&gt;
&lt;td&gt;所有应用都加速&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;§topo -p2p OK§&lt;/td&gt;
&lt;td&gt;运行时宣称可访问&lt;/td&gt;
&lt;td&gt;数据必定正确&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;24/24 Peer Copy PASS&lt;/td&gt;
&lt;td&gt;指定大小/方向数据正确&lt;/td&gt;
&lt;td&gt;NCCL 必选此路径&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;§via P2P/direct pointer§ + AllReduce&lt;/td&gt;
&lt;td&gt;NCCL 此次使用直接指针、数值通过&lt;/td&gt;
&lt;td&gt;全部模型训练都提升&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;这四级证据也是本文最希望提供的一套评估方法。&lt;/p&gt;
&lt;h2&gt;8. 这次最有用的踩坑清单&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Warewulf bind 的 &lt;code&gt;not a directory&lt;/code&gt;：&lt;/strong&gt; 目的路径可能在挂载失败时留下 0 字节普通文件。先 &lt;code&gt;stat&lt;/code&gt; 确认、清理该特定空文件，再创建目录；不要盲目递归删除。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;交互 Shell 意外退出：&lt;/strong&gt; 直接启用 &lt;code&gt;set -euo pipefail&lt;/code&gt;，后续命令出错可能退出当前交互 Shell。长步骤使用单独 &lt;code&gt;bash&lt;/code&gt; 脚本并保留日志。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;DKMS added&lt;/code&gt; ≠ &lt;code&gt;installed&lt;/code&gt;：&lt;/strong&gt; 不要仅以 RPM 安装完成判断 NVIDIA 内核模块存在；看 &lt;code&gt;modinfo -k&lt;/code&gt; 与 &lt;code&gt;vermagic&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dracut 的 &lt;code&gt;No /dev/log&lt;/code&gt; 提示：&lt;/strong&gt; 需结合真实退出码、&lt;code&gt;lsinitrd -m&lt;/code&gt; 的 &lt;code&gt;wwinit&lt;/code&gt;、固件和模块检查判断，不应只看日志中 &lt;code&gt;[E]&lt;/code&gt; 就宣告失败。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NFS root_squash：&lt;/strong&gt; 无状态节点直接以 root 写 NFS 可能遇到 Permission denied；测试结果先写节点本地，再从管理端主动拉取归档。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误地在 NCCL 源码里运行 make：&lt;/strong&gt; 由于上一条 &lt;code&gt;cd&lt;/code&gt; 失败，后续 &lt;code&gt;make&lt;/code&gt; 启动了完整 NCCL 构建。关键目录切换用 &lt;code&gt;cd ... || exit 1&lt;/code&gt; 防止误操作。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;INFO 日志污染性能输出：&lt;/strong&gt; NCCL &lt;code&gt;INFO&lt;/code&gt; 可能与性能表格输出交错；性能跑分用 &lt;code&gt;WARN&lt;/code&gt;，路径诊断单独保留 &lt;code&gt;INFO&lt;/code&gt; 日志。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;9. 运维结论和下一步&lt;/h2&gt;
&lt;h3&gt;9.1 可回滚比“一次成功”重要&lt;/h3&gt;
&lt;p&gt;维护期应先通过 Slurm drain 保护作业，保留原始 NVIDIA 610 镜像、仅 Tensor 解锁的已知可用镜像，以及 615+P2P 独立测试镜像。任何 boot 参数（尤其 IOMMU、GPU BDF）须在节点级设置并检查实际 §/proc/cmdline§；不要改共享 GPU profile 后让另一台不相关节点意外继承。&lt;/p&gt;
&lt;p&gt;除冷启动恢复，还应把补丁源码提交哈希、目标内核 ABI、最终 §modinfo filename/version/vermagic§、NCCL 测试日志等收进可追踪的维护记录。&lt;/p&gt;
&lt;p&gt;这次已实证完成：两个节点的 Tensor 解锁、32GiB BAR1、24/24 CUDA P2P 有向传输校验、NCCL 直接指针路径验证及短时 AllReduce 数值正确性。&lt;strong&gt;双卡 P2P 收益明显，四卡应保留 NCCL AUTO。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;尚未完成的是长时间满载老化测试、跨节点八卡 NCCL 以及&lt;strong&gt;把手工补丁模块纳入正式 DKMS/RPM&lt;/strong&gt; 的持久化管理。特别是驱动/内核自动升级可能覆盖 &lt;code&gt;updates/dkms&lt;/code&gt; 的补丁模块；应固定镜像版本、保留可冷启动回滚的原镜像，并在实际科研或训练负载中继续记录温度、功耗、Xid 和 PCIe AER。&lt;/p&gt;
&lt;p&gt;这次最大的经验不是某个跑分数字，而是要把四件事分别验收：&lt;strong&gt;驱动初始化成功、CUDA 能直接通信、NCCL 实际选择直接通信、应用端最终得到性能收益&lt;/strong&gt;。没有这四层分离，就很容易把“能用”误写成“加速已经完成”。&lt;/p&gt;
&lt;h2&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/JustAResearcher/gpu-unlock-ada&quot;&gt;JustAResearcher/gpu-unlock-ada&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/Duanyll/open-gpu-kernel-modules&quot;&gt;Duanyll/open-gpu-kernel-modules&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://duanyll.com/2026/7/13/4090-48G-P2P/&quot;&gt;RTX 4090 48G P2P 与动态 BAR1 技术文章&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/NVIDIA/nccl&quot;&gt;NVIDIA NCCL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/NVIDIA/nccl-tests&quot;&gt;NVIDIA nccl-tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://warewulf.org/&quot;&gt;Warewulf&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item></channel></rss>