坑边闲话:坑边闲话:快过年了,家里什么年货也没买,就剩一张 RTX3090 Vulcan OC,那么是插 PCIe 3.0 x8 好呢还是插 PCIe 3.0 x16 好呢?废话,有条件当然是插 PCIe 3.0 x16 咯。但是两者差别大吗?让我们一起来看看。

图 1. RTX3090 七彩虹火神 Vulcan OC,机箱是糟糕的 bequiet Dark Base Pro 900.

作为一个 X299 的老用户,虽然我 PCIe 版本老,但是我通道数量多啊!M.2 扩展卡、U.2 扩展卡、显卡、万兆网卡、SAS-RAID 卡任君选择。

然而,事情的真相是主板的 PCIe slot 插槽数量、带宽分配方式都决定,你不能随便插。就比如我这个某嘉的主板有四条 PCIe 插槽,从上到下分别是

  • x16_A
  • x8_B(与 x16_B 共享带宽)
  • x16_B
  • x8_C

其中后缀为 B 的共享带宽,用 switch 芯片做切分,且 x16 的优先级更高。于是总带宽就是 16 + 16 + 8 + (4 + 4 两个 M.2) 共计 48 lane,正好全部利用到位。相邻插槽之间是两槽宽度。于是庞大的 3090 最好是插在 x16_A 上,这样你的 3090 会挡住 x8_B,但是 x16_B 会完整留出来,可以插 bifurcation 分叉卡扩展硬盘。

当然,在这种情况下,如果你想在 x8_B 上插双口万兆网卡(x8)、在 x16_B 上插 raid 卡(x8)就不行了,因为显卡挡住了  x8_B. 所以只要用了三槽厚度的 3090,你就必须挡住一个插槽。那你可能会问,把显卡插在 X16_B 上不好吗?当然不好,因为这样会挡住独立的 X8_C,浪费极大!

可怜的我当初以为技嘉的主板 PCIe 插槽和内存插槽挨太近导致无法把显卡插在 x16_A 上,于是我只能插在 x8_B 上。而今天我发现把电脑搬出来放平了,是能把 3090 塞进 x16_A 插槽的。

这就是 NVIDIA RTX3090 的智障之处!背面 12 颗显存发热大,然后就得在背板上做散热,火神和 MSI 超龙还加了热管,这就导致背板厚度比以往显卡厚很多。这在 X299X Aorus Master 这种主板上就是灾难。

图 2. Z690 Maximus 也是这种糟糕的设计!万一内存马甲太长就凉凉。

看另一个技嘉主板:

图 3. 型号是 X299X Designare 10G,大家自己搜一下吧,看看内存槽和最上面的 PCIe 插槽的距离就行。某嘉还是得继续批评!刻不容缓。

OK,那么我从 X8 换到 X16 之后,性能有提升吗?看图:

图 4. AIDA64 GPGPU 在 PCie 3.0 x8 通道数量下的测试截图。

图 5. AIDA64 GPGPU 在 PCie 3.0 x16 通道数量下的测试截图。

画个图看一下对比:

图 6. AIDA64 GPGPU 不同通道数量下测试结果的量化分析。

可以看到 Memory Read/Write 确实翻倍了,这个不服不行。我也曾用类似的方法测试过雷电 3 显卡坞的吞吐水平,局限也就在这里。那如果你问我为啥不测测雷电 3 显卡坞 + RTX3090 呢?我只能说大可不必。(实际是我嫌麻烦。)

另外可以看到在单精度、双精度、不同字长的整数做算术运算方面,x8 和 x16 几乎没有区别,当然这也与 AIDA64 的测试程序如何编写的有关。或许可以发一个指令给 GPU,让它在一定范围内生成一些数字然后去并行计算,这样指令传送所用的带宽就很小,不同 lanes 的差异不明显。

最后,在 AES256 分组密码、SHA1 哈希、Julia 的单精度科学计算、Mandel 双精度计算等需要大规模 CPU 参与的测试里,x16 的优势就很明显了。写过 CUDA 程序的同学应该对此很清楚,哪些变量需要显式传递给 GPU 都需要在 C++ 代码里指明,然后交给 CUDA 的编译器去做优化。如果 CPU 和 GPU 之间需要频繁传递大数组,那么 GPU-CPU 的带宽将成为计算的一大瓶颈。所以现在 NVIDIA 正在用自己牛逼的 vSwitch 技术取代 PCIe 做通信,原因就在于 PCIe 限制了 GPU 性能。

那么打游戏呢?老湿基并不喜欢打游戏,所以也没什么可以测试的。不过还是那句话,好不好得看代码怎么写

M1 Max 牛就牛在内存这一块做的比较好。另外,统一内存指的是物理上通信代价差不多,并不是仅仅指内存、显存的进程虚地址空间统一编码。统一地址空间这件事在 x86 上早就有了。

OK,本期视频专栏就到这里了。老湿马上就晋级 LV6!