1. PCIe概述:从并行总线到高速串行互联的演进
大家好,我是老李。做芯片验证十几年了,PCIe协议算是我打交道最多的接口之一。今天咱们聊聊PCIe的来龙去脉。说实话,刚入行那会儿我还在调PCI总线,那时候觉得32位并行总线挺快的。直到第一次接触PCIe,我才意识到——时代真的变了。
1.1 PCIe总线的发展历史
PCIe的历史,说白了就是计算机内部互联的提速史。
最早是PCI总线,1992年Intel推出的。32位宽,33MHz频率,理论带宽133MB/s。嗯,放在今天看确实慢得可怜。但当时可是革命性的——它解决了ISA总线的各种痛点,比如即插即用、中断共享这些。
后来有了PCI-X,频率提到133MHz,带宽到了1GB/s。但并行总线的瓶颈开始显现:信号同步难、布线复杂、功耗高。我记得有个项目,PCI-X的时钟歪斜问题折腾了我们整整两周。
2003年,PCI-SIG组织正式发布了PCIe 1.0。从并行改成串行,从共享总线改成点对点连接。这个转变,我打个比方:就像从一条多车道共享公路,变成了每家每户都有专属高速公路。
之后的发展速度就快了:
- PCIe 1.0(2003年):单通道2.5GT/s,编码8b/10b,有效带宽约2Gbps
- PCIe 2.0(2007年):速率翻倍到5GT/s,我那时候做显卡测试,明显感觉带宽不再是瓶颈
- PCIe 3.0(2010年):8GT/s,编码改成128b/130b,效率从80%提升到98.5%
- PCIe 4.0(2017年):16GT/s,信号完整性成了大难题
- PCIe 5.0(2019年):32GT/s,嗯,这时候做PCB设计已经像在走钢丝了
- PCIe 6.0(2022年):64GT/s,改用PAM4调制,NRZ的时代过去了
我个人习惯:看PCIe版本号,直接看速率就行。1.0到5.0,每代翻倍。6.0虽然也是翻倍,但调制方式变了,复杂度完全不是一个量级。
1.2 PCIe与PCI的区别
很多刚入行的朋友问我:PCIe和PCI到底差在哪?我通常用三个维度来解释:
| 对比项 | PCI | PCIe |
|---|---|---|
| 拓扑结构 | 共享总线,所有设备挂在一条线上 | 点对点交换,每个设备独享通道 |
| 数据传输 | 并行,32/64位宽 | 串行,差分对(1对发送+1对接收) |
| 带宽分配 | 所有设备共享,谁抢到谁用 | 每个设备独享,带宽可预测 |
| 热插拔 | 基本不支持,或者支持得很差 | 原生支持,链路训练自动协商 |
| 配置空间 | 256字节,功能有限 | 4KB,扩展了能力寄存器 |
你想想看,PCI时代最头疼的是什么?中断共享!两个设备抢一个IRQ,系统就崩了。PCIe用MSI/MSI-X解决了这个问题——每个设备有自己的中断向量,互不干扰。
避坑指南:我曾经在一个项目中,把PCIe的配置空间当成PCI的256字节来用,结果高级功能死活使能不了。后来才发现,PCIe的配置空间是4KB,很多扩展能力寄存器都在256字节之后。嗯,这个坑我替你们踩过了。
还有一个关键区别:链路训练。PCI上电后,设备直接就能用。PCIe不行——它需要经过一个复杂的链路训练状态机(LTSSM),协商速率、宽度、极性等等。这个过程,就是我们这门课的核心内容。
1.3 PCIe的应用场景
PCIe的应用,说白了就三个方向:高性能、低延迟、大带宽。我按场景给大家拆开讲。
服务器
服务器是PCIe最大的应用场景。CPU通过PCIe连接各种外设:网卡、存储控制器、GPU加速卡。我做过一个服务器项目,CPU有128条PCIe通道,分给8个x16插槽。布线的时候,PCB工程师差点跟我翻脸——128对差分线,还要保证等长,确实够呛。
服务器对PCIe的要求很明确:
- 高可靠性:链路不能随便掉,掉一次就是业务中断
- 热插拔:更换故障设备不能重启系统
- SR-IOV:一个物理设备虚拟成多个,云场景必备
存储
存储领域,PCIe直接催生了NVMe协议。传统SATA SSD走AHCI协议,延迟在微秒级。NVMe走PCIe,延迟降到纳秒级。差距有多大?我测过,同样的4K随机读写,NVMe比SATA快了10倍不止。
为什么会这样?因为AHCI是为机械硬盘设计的,队列深度只有1,一次只能处理一个命令。NVMe的队列深度可以到65536,一次能处理几万个命令。说白了,PCIe的高带宽和低延迟,让存储控制器可以充分发挥并行处理能力。
注意:NVMe over Fabrics(NVMe-oF)现在很火,它把PCIe的NVMe命令封装到网络协议里传输。但底层还是依赖PCIe的DMA能力。我建议做存储的朋友,先把PCIe的DMA机制搞透,不然NVMe-oF的调试会非常痛苦。
AI加速器
AI加速器,说白了就是GPU、FPGA、ASIC这些。它们对PCIe的要求就一个字:快。
训练一个大型语言模型,数据量动辄几百GB。CPU从内存搬到GPU,走的就是PCIe。如果PCIe带宽不够,GPU就在那干等——这就是所谓的「数据饥饿」。
我记得有个AI项目,客户抱怨训练速度慢。查了半天,发现PCIe链路只协商到Gen3 x8,实际带宽不到8GB/s。而GPU的计算能力,理论上需要16GB/s的数据吞吐。后来强制协商到Gen4 x16,训练时间直接缩短了40%。
AI场景对PCIe的特殊需求:
- 大带宽:Gen4 x16单向带宽约32GB/s,Gen5 x16能到64GB/s
- 低延迟:模型并行训练,节点间通信延迟要控制在微秒级
- P2P DMA:GPU直接访问另一个GPU的显存,不经过CPU
嗯,说到P2P DMA,这里有个坑。我曾经调试一个多GPU系统,P2P传输总是报错。后来发现是PCIe的ACS(Access Control Services)没配置对,导致跨域访问被拦截了。这个细节,很多工程师容易忽略。
小结
PCIe从诞生到现在,二十年了。从最初的2.5GT/s到现在的64GT/s,速率翻了25倍。但核心思想没变:串行、差分、点对点、链路训练。我个人觉得,理解PCIe的关键,不在于记住那些寄存器地址,而在于理解它的设计哲学——为什么这么设计?解决了什么问题?
下一章,咱们正式进入链路训练状态机(LTSSM),这是PCIe最核心、也最容易出问题的地方。准备好了吗?
一句话总结:PCIe是计算机内部互联的「高速公路」,链路训练就是上高速前的「安全检查」。检查不过关,车再好也跑不起来。