2. 硬件基础

做多卡通信驱动,第一关就是搞懂硬件长什么样。

说白了,你写的驱动代码,最终要跑在PCIe、NVLink或者InfiniBand这些物理链路上。不懂它们的脾气,性能调优就是瞎蒙。我这些年踩过的坑,十有八九都跟没吃透硬件拓扑有关。

PCIe总线拓扑与带宽

PCIe,全称是Peripheral Component Interconnect Express。几乎所有GPU、网卡、NVMe硬盘,都挂在这条总线上。

拓扑结构:典型的PCIe拓扑是树形结构。CPU内部集成Root Complex,下面挂Switch,Switch再分出多个Endpoint。GPU和网卡就是Endpoint。

我个人习惯,拿到一台服务器,第一件事就是跑lspci -t看拓扑树。为什么?因为跨Switch通信和同Switch通信,延迟差一大截。

关键点:PCIe是点对点串行总线。每个通道(Lane)是一对差分信号,收发独立。

带宽计算:PCIe版本不同,单通道速率也不同。

PCIe版本 单通道速率(GT/s) 编码方式 有效带宽(x16)
PCIe 3.0 8 128b/130b 约15.75 GB/s
PCIe 4.0 16 128b/130b 约31.5 GB/s
PCIe 5.0 32 128b/130b 约63 GB/s

注意,GT/s是每秒传输的Giga Transfers,不是Giga Bits。因为编码开销,实际有效带宽要打个折扣。PCIe 3.0用128b/130b编码,效率约98.5%。

我的经验:我曾经调试一个4卡互联的项目,发现GPU间通信带宽只有理论值的一半。查了半天,原来是PCIe链路协商到了x8而不是x16。用lspci -vvv一看,有个金手指接触不良。嗯,硬件问题往往最隐蔽。

NVLink/NVSwitch互联架构

PCIe带宽再高,也扛不住多GPU之间的AllReduce流量。NVIDIA搞了NVLink,专门给GPU之间高速互联。

NVLink:直接连接GPU到GPU,不走PCIe。每路NVLink带宽约50 GB/s(双向100 GB/s)。A100有12路NVLink,总带宽600 GB/s。H100更猛,18路,900 GB/s。

NVSwitch:当GPU数量超过4个,全互联拓扑就不现实了。NVSwitch登场,它是一个交换芯片,所有GPU通过NVLink连到Switch上,形成全互联。

你想想看,8卡A100通过NVSwitch互联,任意两张卡之间都是600 GB/s带宽,延迟极低。这比走PCIe Switch快了一个数量级。

避坑指南:我曾经在DGX A100上跑分布式训练,发现通信效率上不去。后来发现,NVLink拓扑是分组的。8张卡分成两组,每组4张卡内部全互联,组间通过NVSwitch桥接。如果你的通信模式是跨组AllReduce,带宽会受限。所以,nvidia-smi topo -m一定要看。

拓扑示例:

# nvidia-smi topo -m 输出示例
        GPU0    GPU1    GPU2    GPU3    GPU4    GPU5    GPU6    GPU7
GPU0     X      NV1     NV1     NV2     NV2     SYS     SYS     SYS
GPU1    NV1      X      NV1     NV2     NV2     SYS     SYS     SYS
GPU2    NV1     NV1      X      NV2     NV2     SYS     SYS     SYS
GPU3    NV2     NV2     NV2      X      NV1     SYS     SYS     SYS
GPU4    NV2     NV2     NV2     NV1      X      SYS     SYS     SYS
GPU5    SYS     SYS     SYS     SYS     SYS      X      NV1     NV1
GPU6    SYS     SYS     SYS     SYS     SYS     NV1      X      NV1
GPU7    SYS     SYS     SYS     SYS     SYS     NV1     NV1      X

NV1表示直接NVLink连接,NV2表示通过NVSwitch连接,SYS表示走PCIe。你看,GPU0到GPU4是NV2,带宽没问题。但GPU0到GPU5是SYS,那就惨了,只能走PCIe。

InfiniBand与RoCEv2网络对比

多机互联,目前两大主流:InfiniBand和RoCEv2。

InfiniBand:专用网络,端到端设计。HCA(Host Channel Adapter)直接插在PCIe上,通信走RDMA,不经过CPU。延迟极低,1-2微秒。带宽也高,HDR 200Gbps,NDR 400Gbps。

RoCEv2:基于以太网的RDMA。把RDMA报文封装在UDP里,走标准以太网。好处是便宜,用普通交换机就行。但延迟比IB高一些,大概3-5微秒。

特性 InfiniBand RoCEv2
延迟 1-2 us 3-5 us
带宽 200-400 Gbps 100-200 Gbps
成本 高 中
拥塞控制 硬件级,优秀 依赖DCQCN,较复杂
生态 NVIDIA独家 开放,多厂商

我的建议:如果预算充足,上InfiniBand。性能稳定,调优省心。如果预算有限,RoCEv2也能用,但要做好拥塞控制。我曾经在一个RoCEv2集群上,因为PFC死锁导致全网瘫痪。嗯,那滋味不好受。

核心区别:InfiniBand是Lossless网络,RoCEv2也是Lossless,但依赖PFC(优先级流控制)。PFC配置不当,容易引发死锁。IB的Credit-based流控,天生不会死锁。

知识体系总览

下面这张图,是我自己总结的多卡通信硬件知识体系。你看一眼,心里就有谱了。

多卡通信硬件知识体系 机内互联 PCIe总线 树形拓扑,带宽共享 NVLink/NVSwitch GPU直连,高带宽低延迟 典型场景:单机8卡、4卡DGX 机间互联 InfiniBand 专用网络,硬件流控 RoCEv2 以太网RDMA,成本低 典型场景:多机集群、超算 核心关注点 带宽 理论带宽 vs 有效带宽 延迟 微秒级延迟优化 拓扑感知 通信亲和性调度 调优目标:让数据走最快的路,避开瓶颈

这张图把机内互联和机间互联分开。左边是PCIe和NVLink,右边是InfiniBand和RoCEv2。底下是三个核心关注点:带宽、延迟、拓扑感知。你调优的时候,就盯着这三个指标。

个人习惯:我每次接手一个新集群,都会先画一张这样的拓扑图。然后对照着跑ib_write_bw或者nvidia-smi topo -m,验证实际带宽。纸上得来终觉浅,绝知此事要躬行。