
今天早上的文章《PCIe协议经常谈到的Memory-Mapped I/O究竟是啥?》发了以后,有工程师留言问:
接大量 GPU 时主板不认设备或无法启动,是不是 MMIO 不足?除了换主板还有办法吗?
先说结论:YES,极有可能就是 MMIO 不够导致的。
尤其是:
-
大量 GPU(每张 GPU 有多个 BAR)
-
使用 PCIe Switch(会增加层级和 BAR 空间需求)
-
旧主板(BIOS MMIO 空间少)
-
服务器主板没有 64-bit MMIO 优化
先通俗讲一下 MMIO 为什么会不够
每个 PCIe 设备,都要在 Host 地址空间里"要一块地儿":
-
BAR0:寄存器映射
-
BAR1:状态空间
-
GPU:可能要好几十 MB
-
Switch:也要 BAR
-
NVMe:每块盘也需要一些 BAR
BIOS 在开机早期负责给所有设备分配 MMIO 地址。
如果设备多到 BIOS 分配不出空间,就会发生:
GPU 不认
-
Switch 枚举不完全
-
BIOS 卡住
-
直接黑屏无法启动
这些在你的实验环境里都非常常见。
除了换主板,还有哪些真正有效的解决方法?
下面这些方法都是行业里真实有效的工程方案:
方案①:开启 "Above 4G Decoding" (一定要打开)
在 BIOS 里把:
-
Above 4G decoding
-
Large BAR support / Re-size BAR
全部打开。
作用:让 BIOS 使用 64bit MMIO 地址空间,而不受 32bit 的 4GB 限制。
这是最经济、成功率最高的方法。
方案②:关闭不需要的设备,释放 MMIO 空间
如:
-
主板自带 USB 控制器
-
SATA 控制器
-
Onboard NIC
-
声卡
-
Thunderbolt 控制器
这些全关后能腾出几百 MB 的 MMIO 空间。
方案③:减少 GPU BAR 的大小
某些 GPU 支持 BAR 大小调整,例如:
-
关闭 Resizable BAR
-
强制以小 BAR(32-bit BAR)方式工作
这样可以减少地址空间需求。
方案④:使用更"聪明"的 BIOS
一些服务器 BIOS 对 MMIO 分配策略不好,导致:
-
明明空间够,分配失败
-
BAR 没排序
-
不能跨域映射
升级到最新 BIOS 很多时候能解决问题。
方案⑤:使用带"多域"能力的 PCIe Switch 卡
例如 Broadcom(或从Saniffer公司购买使用Broadcom switch芯片)的专业 Switch 厂商的产品有:
-
Upstream Port MMIO aggregation
-
多域划分
-
BAR 转换 / 代理
-
64-bit MMIO remapping
这些高级功能可以让多个 GPU 共享 MMIO 空间。
方案⑥:换 CPU 反而比换主板有效
一些 CPU:
-
PCIe Root Port 数量少
-
64-bit MMIO 支持不完整
-
BIOS 固件太保守
例如 server-grade Xeon / EPYC 通常 MMIO 能力远强于桌面 CPU。
最终总结
大量 GPU 不认 → 90% 可能是 MMIO 不够
解决方法按效果从强到弱排序:
-
打开 above 4G decode / 64-bit MMIO
-
关闭主板不用的设备释放 MMIO
-
调整 GPU BAR 大小
-
升级 BIOS
-
使用专业 PCIe Switch(支持多域)
-
更换 CPU / 主板(最后手段)