我使用了多个PCIe 3.0扩展卡(GPU和Infiniband互连)。我想知道如何实际管理通道,以及我是否可以通过更改端口或使用某些适配器(16x - > 8x)来优化我的设备。 Intel Haswell-EP 可以管理 40通道PCIe 3.0 。在英特尔的原理图中,PCIe 3.0控制器似乎分为两个x16和一个x8子桥。
在Haswell-EP CPU的一些商业原理图中,我们可能会读到:
最多40个PCIe Gen3通道2x16 + 1x8至3x8图形。
是否所有设备都连接到主PCIe桥(并为每个设备自动协商通道数量),或主板是否将设备直接连接到所谓的3个子桥 16x 之一, 16x 和 8x (然后为每个子桥协商车道数量)?
我无法直接访问主板以了解设备是如何连接的,但我怀疑所谓的8x子桥的通道未被使用。此外,我想知道如果使用16x至8x适配器,我可以利用更多通道并增加我的总PCIe带宽(即使很难,最大理论带宽将被该设备除以2)。
[编辑]
我为一个带有lstopo
的CPU插槽获得的示例:
HostBridge L#0
PCIBridge
PCI 15b3:1011
Net L#16 "ib0"
OpenFabrics L#17 "mlx5_0"
PCIBridge
PCI 8086:1d6b
PCIBridge
PCI 102b:0532
GPU L#18 "card0"
GPU L#19 "controlD64"
答案 0 :(得分:4)
是否所有设备都连接到主PCIe桥接器(以及每个设备自动协商的通道数量),或者主板是否将设备直接连接到所谓的3个子桥接器16x,16x和8x之一(通道数量)然后为每个子桥协商?)
这是主板设计的功能,至少部分是这样,所以不能给出具体的答案。但假设您的主板没有额外的PCIE硬件,如PCIE交换机,那么您的主板可能至少有1个PCIE x16“端口”和一些其他“端口”即插槽,可能有不同的“宽度”,即x16 ,x8,x4,x2,x1等
现代英特尔CPU具有内部PCIE“根复合体”,由离开设备的所有通道共享。离开设备的通道将被分组为一个或多个“端口”。 PCIE根联合体是一个逻辑实体,而端口同时具有逻辑和物理特性。
存在自动通道宽度协商,但这通常仅作为支持和错误缓解策略。如果将x16“端点”(即设备)插入其中,则x16端口将期望协商到x16宽度(如果检测到可对特定通道本地化的错误,则它还可以协商到较低宽度)。通常一个端口可以处理宽度较小的设备,所以如果x8设备插入x16端口,事情通常会“正常工作”,虽然这通常不意味着你有8个额外的通道你可以“在其他地方”使用
将x16端口重新配置为两个x8端口通常不会通过插入“x16到x8适配器”自动发生,无论是什么。您当然可以将x16端口缩减为x8端口,但这不会为您提供8个额外的通道,以便自动在其他地方使用。
将离开Haswell设备的40个通道细分为逻辑“端口”的过程涉及主板的硬件设计以及固件(BIOS)设计。 x16端口不能自动拆分为两个(逻辑)x8端口。有些主板具有这样的配置选项,通常通过一些明确的方式选择,例如BIOS配置或修改交换机或路由PCB,以及提供两个插槽,每个插槽用于一个可能的端口。
然而,相当普遍的是使用PCIE交换机。这种交换机允许单个PCIE(上游)端口为两个(或更多)下游端口提供服务。这并不一定意味着将x16逻辑字符转换为x8逻辑字符(尽管它可能取决于实现),但它通常意味着上游端口聚合应用于下游端口的任何带宽限制。然而,这是一个相当常见的产品策略,你可以找到主板的例子,这些主板设计有这些设备(有效地提供更多的插槽或端口)以及可以插入现有端口的适配器/平面(即插槽)并将从该单个端口/插槽提供多个端口/插槽。
在linux空间中,lstopo
命令对于发现这些拓扑非常有用。您可能需要在Linux发行版中安装hwloc
包。