如何在最近的 Xeon 处理器上嵌入的 PCIe 3.0 控制器上管理通道?

How are lanes managed on PCIe 3.0 controller embedded on recent Xeon processors?

我正在使用多个 PCIe 3.0 扩展卡(GPU 和 Infiniband 互连)。我想知道通道实际上是如何管理的,以及我是否可以通过更改端口或使用一些适配器(16x -> 8x)来优化我的设备。 Intel Haswell-EP 可以管理 40 通道 PCIe 3.0。在英特尔的示意图上,PCIe 3.0 控制器似乎分为两个 x16 和一个 x8 子桥。

关于 Haswell-EP CPU 的一些商业原理图,我们可能会读到:

Up to 40 PCIe Gen3 Lanes 2x16 + 1x8 up to 3x8 Graphics.

是所有设备都连接到主 PCIe 桥(以及为每个设备自动协商的通道数量),还是主板将设备直接连接到所谓的 3 个子桥之一 16x, 16x8x (然后为每个子桥协商车道数量)?

我无法直接访问主板以查看设备是如何连接的,但我怀疑所谓的 8x 子桥的通道没有被使用。另外,我想知道通过使用 16x 到 8x 适配器,我是否可以利用更多通道并增加我的总 PCIe 带宽(即使是最大理论带宽也会被该设备除以二)。

[编辑]

我用 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"

Are all devices connected to a main PCIe bridge (and quantity of lanes automatically negotiated for each device), or do the motherboard connect the devices directly to one of the supposedly 3 sub-bridges 16x, 16x and 8x (quantity of lane are then negotiated for each of those sub-bridges)?

这是主板设计的功能,至少部分是,所以无法给出具体的答案。但是假设您的主板没有额外的 PCIE 硬件,例如 PCIE 开关,那么您的主板可能至少有 1 个 PCIE x16 "port" 和一些其他 "ports" 即插槽,它们可能有不同的 "widths",即 x16、x8、x4、x2、x1 等

现代英特尔 CPU 有一个内部 PCIE "root complex",由离开设备的所有通道共享。离开设备的通道将被分组为一个或多个 "ports"。 PCIE 根复合体是一个逻辑实体,而端口则同时具有逻辑和物理特征。

有自动车道宽度协商,但这通常只是作为一种支持和错误缓解策略。如果插入 x16 "endpoint"(即设备),x16 端口将期望协商到 x16 宽度(如果检测到可定位到特定通道的错误,它也可能协商到较低的宽度)。通常一个端口可以处理宽度较小的设备,因此如果将 x8 设备插入 x16 端口,通常会 "just work",尽管这通常并不意味着您有 8 个额外的通道可以使用 "somewhere else".

将一个 x16 端口重新配置为两个 x8 端口通常不会通过插入 "x16 to x8 adapter" 自动发生,无论如何。您当然可以将 x16 端口减少到 x8 端口,但这不会自动为您提供 8 个额外的通道以用于其他地方。

将退出 Haswell 设备的 40 个通道细分为逻辑 "ports" 的过程涉及主板的硬件设计和固件 (BIOS) 设计。 x16 端口不能自动拆分为两个(逻辑)x8 端口。一些主板有这样的配置选项,通常通过一些明确的方式选择它们,例如 BIOS 配置或修改开关或路由 PCB,以及提供两个插槽,一个用于每个可能的端口。

然而,相当普遍的是 PCIE 开关的使用。此类交换机允许单个 PCIE(上游)端口为两个(或更多)下游端口提供服务。这不一定意味着 x16 逻辑字符到 x8 逻辑字符的转换(尽管它可能取决于实现),但它通常意味着上游端口的任何带宽限制都适用于聚合到下游端口。尽管如此,这是一个相当普遍的产品策略,您可以找到设计了这些设备的主板示例(以有效提供更多插槽或端口)以及 adapters/planars,它们可以插入现有的端口(即插槽)并将从单个 port/slot.

提供多个 ports/slots

在linuxspace中,lstopo命令对于发现这些拓扑很有用。您可能需要在 linux 发行版中安装 hwloc 软件包。