长期更新链接:https://littlenewton.uk/2021/12/hardware-rtx3090-8lane-vs-16lane/
坑边闲话:快过年了,家里什么年货也没买,就剩一张 RTX3090 Vulcan OC,那么是插 PCIe 3.0 x8 好呢还是插 PCIe 3.0 x16 好呢?废话,有条件当然是插 PCIe 3.0 x16 咯~ 但是两者差别大吗?让我们一起来看看。

B 站竟然不支持 HEIC 格式上传?
作为一个 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这种主板上就是灾难。

Z690 Maximus 也是这种糟糕的设计!万一内存马甲太长就凉凉。
看另一个某嘉主板:

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

PCie 3.0 x8

PCIe 3.0 x16
画个图看一下对比:

不知道哔哩哔哩会不会压缩图片,看不清的话就去我动态里看高清大图吧!
可以看到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的 带宽将成为计算的一大瓶颈。所以现在NV正在用自己牛逼的 vSwitch 技术取代 PCIe 做通信,原因就在于 PCIe 限制了 GPU 性能。
那么打游戏呢?老湿基并不喜欢打游戏,所以也没什么可以测试的。不过还是那句话,好不好得看代码怎么写。
M1 Max 牛就牛在内存这一块做的比较好。另外,统一内存指的是物理上通信代价差不多,并不是仅仅指内存、显存的进程虚地址空间统一编码。统一地址空间这件事在x86上早就有了。
OK,本期视频专栏就到这里了~
老湿马上就晋级LV6~