基于PCIe 5.0的CXL是什么?
前一阵举行的“Interconnect Day 2019”,Intel宣布了一系列新技术。其中CXL(Compute Express Link)看起来并不显眼,却为Intel的Xe显卡的未来发展投射出一条可能的方向:
CXL有很大的野心:解决CPU和设备、设备和设备之间的memory鸿沟。普通电脑用户也许偶尔会想到用用显存,用不了也无伤大雅,这个需求并不强烈。但服务器用户有巨大的内存池和数量庞大的基于PCIe运算加速器,每个上面都有很大的内存。内存的分割已经造成巨大的浪费、不便和性能下降。CXL就是为解决这个问题而诞生。我在前文:显存为什么不能当内存使?内存、Cache和Cache一致性 里面介绍了内存一致性的重要性,那么CXL会带来什么,它和PCIe 5.0又是什么关系呢?
CXL的先驱者们
说PCIe不能访问主存并不严谨,实际上PCIe可以访问内存-通过DMA的方法。PCIe设备可以发起一个DMA来访问内存,只要知道目标物理地址即可。DMA访问避免了CPU作为二传手,加快了内存访问速度,但也带来了一定的安全问题。曾经有黑客通过定制的PCIe卡,通过DMA扫描内存,可以偷走所有内存数据,从而让内存变成完全不设防的城市,这给BIOS工程师造成了一定的麻烦,不得不到处封堵漏洞。DMA对内存的访问还是要通过内存控制器,延迟问题相当高,基于此,Intel推出了I/OAT技术,DMA可以直接访问CPU LLC cache,大大提高了性能,I/OAT在网卡等高速设备上得到了广泛应用。
尽管I/OAT解决了部分问题,但主存和设备内存的割裂问题远远没有得到解决,它们的地址不能统一编址,缓存一致性也不能保证。那么在CXL之前,有没有相关的解决方案呢?有的,还不只一种。其中就有以IBM牵头的OpenCAPI,ARM为代表支持的CCIX,AMD等支持的GenZ和Nvidia自行提出的Nvlink等等多种协议,可谓一个乱字了得。因为篇幅所限,我们单独简单了解一下和CXL定位比较接近的Nvlink[1]。
Nvlink解决GPU到GPU,CPU到GPU的内存一致性和统一问题
Nvlink可以替代SLI来连接GPU和GPU;如果CPU也支持Nvlink,则整个CPU和GPU的cache一致性和内存统一编址也可以做到。不过悲剧的是AMD和Intel并不打算在CPU里面支持nvlink,没有CPU的支持,Nvlink功能就被大大矮化,只能看作SLI的升级版。不过IBM却为此两肋插刀,尽管有自己的OpenCAPI,还在power CPU里面集成了NvLink[2]:
CXL来了
CXL标准预览版文档已经开放下载[3],大家可以下载下来仔细研究一下。现代主存和设备内存是割裂的,相互交互延迟非常大:
初代CXL包括自己的协议,但是运行在PCIe gen5 (5.0)的物理层上,并寄希望在Gen 6上能够得到更广泛的应用:
CXL协议包括[4]三个子协议:
CXL. io 是IO类型,和传统PCIe类似
CXL.cache 允许设备访问主存和cache
CXL.memory 允许CPU访问设备的内存.
来源:参考资料4
CXL相比上文介绍的基于CA和HA的引擎简单了很多:
来源:参考资料4
和UPI的cache一致性对称性设计不同,CXL是非对称的。UPI的对称性设计是指各个node都有HA和CA;而CXL则只有CPU有HA和CA,设备没有CA,只有HA。这简化了设备的设计,并允许没有cache的设备加入cache一致性的大家庭。
结语
通过CXL,主存和设备内存可以在保证Cache一致性的前提下,还提供Bias的灵活性。相信传说中的Xe显卡应该会自带这种高级特性。同时在不远的未来,应该会出现PCIe形式出现的内存扩展卡。
CXL和它的竞争对手的较量还远远没有结束,有些厂商为了避免掉队,纷纷脚踩两只甚至数只船。谁能在未来脱颖而出,也许取决于谁更开放,谁更能够和PCIe协议更好的融合。未来如何,让我们拭目以待。
参考资料
[1] Nvlink官网 https://www.nvidia.com/en-us/data-center/nvlink/
[2] IBM Blog https://www.ibm.com/blogs/systems/ibm-power8-cpu-and-nvidia-pascal-gpu-speed-ahead-with-nvlink/
[3] CXL About Page https://www.computeexpresslink.org/about-cxl
[4] CXL资料 https://www.techpowerup.com/254462/intel-reveals-the-what-and-why-of-cxl-interconnect-its-answer-to-nvlink