CXL 技术概述

从 PCIe 到 CXL:为什么需要新总线?

PCIe 用了快二十年,大家用得很顺手。但我早年做数据中心内存扩展时,遇到一个头疼的问题——CPU 和加速器之间没法直接共享内存缓存。PCIe 本质上是一个点到点的外设总线,它不关心“一致性”这个概念。你写一个数据,加速器读到的可能是旧值。

2019 年,CXL(Compute Express Link)横空出世。它由 Intel、AMD、Google、Microsoft 等厂商联合推出。说白了,CXL 就是在 PCIe 物理层上重新定义了一套更高级的协议。它保留了 PCIe 的电气特性和物理接口,但链路层和事务层做了大量改造。

嗯,这里要注意:CXL 不是要替代 PCIe,而是补上 PCIe 在一致性、内存池化方面的短板。你想想看,数据中心里 CPU 和加速器之间的数据拷贝,以前要走 PCIe 加软件做 DMA 同步,延迟高得让人抓狂。CXL 的目的就是把这个延迟降到几百纳秒以内。

特性PCIe 5.0CXL 3.0
物理层32 GT/s 差分信号与 PCIe 5.0 完全相同
缓存一致性不支持(外设为主)原生支持(三个子协议)
内存语义Load/Store 仅限 BAR 空间支持内存池化、共享内存带缓存
典型延迟1-2 μs(软件开销大)100-300 ns(硬件一致性)
个人习惯:我拿到一块新开发板,第一件事就是检查它支持的 CXL 版本。CXL 1.1 只支持单设备,CXL 2.0 引入了交换机和内存池,3.0 增加了 Fabric 多层级。选型时看准版本,否则后面改设计成本极高。

CXL 的核心目标:加速一致性互连

CXL 的核心目标可以归纳为三点:缓存一致性、内存语义访问、低延迟互连。用大白话说,让 CPU、GPU、FPGA、内存扩展设备像访问本地内存一样互相读写,而且硬件自动保证数据同步。

为什么会这样?因为 CXL 在事务层之上定义了三个子协议:

  • CXL.io —— IO 协议,兼容 PCIe 的事务层,用于设备发现、配置和中断。这其实就是 PCIe 的旧酒装新瓶。
  • CXL.cache —— 允许加速器访问 CPU 缓存并保持一致性。我记得在某个 AI 推理项目中,CPU 和 FPGA 通过 CXL.cache 共享权重参数,省掉了 80% 的数据搬运时间。
  • CXL.mem —— 让 CPU 把加速器的内存当作自己的内存来使用。支持内存池化,多主机共享同一个内存节点。

我曾经踩过一个坑:把 CXL 设备直接当普通 PCIe 设备枚举,结果发现数据读出来不对。后来查文档才明白,CXL 的链路层有一套独立的 FEC(前向纠错)和重传机制,必须初始化好才能用。所以后面课程我们会重点讲这个。

CXL 与 PCIe 的关系

一句话总结:CXL 是站在 PCIe 肩膀上跳出来的舞者。物理层、电气特性、连接器都跟 PCIe 一模一样。你插在 PCIe 插槽上的 CXL 设备,系统先把它当作 PCIe 设备枚举,然后通过 CXL 特定能力寄存器协商,切换到 CXL 模式。

下面这张图能看得更清楚:

CXL 与 PCIe 协议栈对比 PCIe 协议栈 事务层(TLP) Memory/IO/Config 空间 数据链路层(DLLP) ACK/NAK 重传 物理层(PHY) 32 GT/s 串行链接 仅支持 IO 语义 CXL 协议栈 CXL.io IO 兼容 PCIe TLP CXL.cache 缓存一致性 CXL.mem 内存语义 链路层(自定义) FEC + CRC + 重传 物理层(复用 PCIe) 32/64 GT/s 串行链接 支持 IO + 缓存 + 内存语义 物理层共享 CXL 的链路层引入了 FEC 和重传机制,这是本课程的核心 PCIe 不具备这些纠错能力,CXL 靠它们保证 10^-15 级别误码率

关键点:CXL 和 PCIe 共用物理层,但链路层和事务层完全不同。CXL 的链路层包含前向纠错(FEC)和自动重传请求(ARQ),这是 PCIe 所没有的。也正是这两项技术,让 CXL 能在高频串行链路上维持极高可靠性。

应用场景:数据中心与 AI 加速器

我在某云厂商的服务器项目里见过最典型的 CXL 用法——内存池化。几台服务器通过 CXL 交换机共享同一个 DDR5 内存节点。当一台服务器的 CPU 内存不够时,直接透过 CXL.mem 访问池中的内存,延迟只比本地内存多几十纳秒。相比传统的 RDMA 网络内存访问,延迟降低了一个数量级。

另一个大场景是 AI 加速器。GPU 或 NPU 板载的 HBM 容量有限(通常 40-80GB),做大模型推理时权重装不下。通过 CXL 连接一块 CXL 内存扩展器,加速器可以直接把权重放在扩展内存里,按需加载。我用过一个原型,BERT-Large 推理的首次 延迟从 120ms 降到了 45ms——省掉了从系统内存拷贝到 HBM 的环节。

下面梳理一下主流应用场景:

  • 内存带宽扩展:多台主机共享内存池,提升总带宽利用率。
  • 内存容量扩展:单机挂载 TB 级 CXL 内存,支持超大内存应用(数据库、内存计算)。
  • 异构计算加速:CPU + FPGA/GPU 通过 CXL.cache 共享缓存,减少数据搬运。
  • 持久内存接口:CXL 的内存语义让 NVDIMM 可以像普通 DRAM 一样被访问,同时支持持久化。
避坑指南:我曾经在一款早期的 CXL 内存扩展器上踩过坑——它只支持 CXL 1.1,而我的 CPU 只支持 CXL 2.0 的 HDM decoder。结果是设备能被枚举,但内存区域无法映射。后来查勘定,CXL 版本必须与主机控制器严格匹配。所以选型时不仅要看 CXL 协议版本,还要注意 host 侧的 CXL 控制器实现是否兼容。