新闻中心

技术博文 | 重新定义内存?从CXL内存看内存架构创新

2024-01-08

摘要:随着CXL技术的普及,内存作为一个非常重要的计算机组成部分将被重新定义。在本文中,国数集联从内存池化的业务需求出发分析内存池化的重要性,然后从第一性原理分析内存的定义和面临的挑战,在软件和硬件层面探讨内存创新的可能和路径。最后,国数集联用CXL技术实现Cache、DDR和HBM不同类型存储的池化,并测量其性能,为CXL Switch和内存软件架构创新做准备。


01
业务背景:内存扩展的需求

扩展的需求主要源自以下两个方面的发展趋势:

首先,云计算中普遍存在的资源超卖问题催生了一项硬件创新——内存池化技术。此技术通过共享内存池的方式进行分配,有效降低了客户主机对内存需求的不稳定性及差异性带来的冲击。通过这种聚合与分配内存资源的手段,不仅提升了资源的使用效率,还显著减少了系统的总体成本。

其次,随着大规模语言模型(LLM)的飞速发展,模型参数的数量不断攀升。庞大的参数集需要更大容量的内存以实现快速处理。传统的CPU和GPU因采用了并行内存设计,其内存通道的数量难以与模型参数的膨胀速度相匹配,这限制了语言模型的性能表现。反观采用了PCIe和高带宽内存(HBM)等串行设计方案的内存体系结构,则大大提高了性能。在芯片集成和近邻连接技术(如芯片堆叠、系统封装、多芯片模块)中,高带宽内存预计将主导大容量内存技术的未来趋势。同时,内存扩展解决方案也正逐步采用PCIe扩展的方式实现,这正是国数集联CXL协议的作用所在。

由这两种需求推动下的内存扩展在实践中存在细微的差别。在内存池化应用中,降低成本、动态内存管理以及确保内存的安全隔离成为重点考虑的核心因素,而响应时间的延迟则相对较少被关注。相反,在LLM的计算场景下,内存的响应延迟和数据吞吐量的敏感度则要大得多,对性能的优化需求更为迫切。

CXL技术以其低延迟、高带宽的互联特性,以及支持跨设备内存一致性的能力,恰好满足了内存池化和LLM计算领域的这些需求。通过CXL协议实现的内存扩展方案,不但能够融合并最大化上述场景中的内存资源,还能为各种密集型计算任务提供强大的性能支持。


02
技术趋势:内存标准化?

虽然主流芯片公司以业务需求看待内存扩展,但从第一性原理出发,我们需要深入挖掘需求和技术发展的背后原因,以便架构师能从系统层面设计和优化系统,并为应用软件指明方向。

在理解内存池化的原因之前,我们需要提出以下几个问题:

1) 为什么内存池化较为复杂,而存储池化早已通过网络磁盘实现?特别是现在的NVMe-oF技术结合RDMA技术已大大提升了远程硬盘的性能,与本地硬盘性能差距非常小。

2) 为什么大型模型不能在硬盘上运行?从严格意义上讲,NVMe固态硬盘的容量已足够支持当前大型模型的参数。那么CXL控制器和NVMe控制器的设计有什么联系和区别?

3) 没有CXL,我们无法实现内存池化吗?不能使用PCIe吗?未来会使用UCIe吗?

回答问题前,我们需要了解内存和存储的区别,以及在Linux内核中如何驱动内存和存储。以现代存储技术NVMe为例,它作为一个PCIe设备存在于标准Linux系统中。Linux内核启动后,通过扫描PCIe设备树来发现设备的基本信息(如PCI信息),然后加载相应的驱动程序,例如NVMe驱动,并将其识别为块设备。块设备中定义了与输入输出相关的模块,如bio。通过bio和NVMe/PCIe的输入输出操作结合,实现了系统对NVMe设备的使用。因此,NVMe设备本质上是PCIe设备的块设备抽象。系统通过块设备对象进行交互,底层的I/O和DMA技术则旨在降低延迟并提高设备吞吐量。

然而,当涉及到内存设备时,内存在系统中是什么样的设备?它是块设备、字符设备还是网络设备?答案都是否定的。在Linux系统中,内存是一块连续的地址空间,I/O操作通过内存管理单元(MMU)实现,地址空间映射由内存块页表处理,而转换缓冲区查找缓冲(TLB)则负责管理热页(hot page)。

图片

了解了NVMe和内存的区别后,我们可以理解CXL Memory的作用是什么。通过Home Agent模块,它扮演了MMU和MC的角色,方便内核系统初始化并建立Memblock页面表。同时,通过CXL Controller将MC连接到PCIe插槽上。为了实现上述步骤,系统的各个环节都需要参与其中:Bios负责将CXL Home Agent的地址类型设置为内存类型,CXL Controller插在PCIe插槽上,系统需要提前初始化这一部分内容,而在添加物理内存模块时,需要提前加载原本属于PCIe插槽的空间。总之,当使用Home Agent作为内存功能时,系统初始化需要Bios和CXL控制器的协作。否则,系统可能会被识别为一个内存设备,然后按照块设备驱动程序使用了。

那为什么不将CXL Memory作为块设备来使用?答案显而易见,但很少有人仔细思考。块设备的堆栈过于复杂,包含各种排队和系统调用,这会极大地增加系统延迟,大约在1到5微秒左右。而国数集联希望内存设备的延迟达到200纳秒级别,即性能提升10倍。尽管目前实际差距不到5倍,但技术趋势是朝着10倍规划发展的,因此我们需要继续优化。

如果CPU不支持CXL Controller,例如较旧的CPU没有此功能,那该如何使用?但聪明的人总能找到解决问题的办法。据我们所知,确实有公司将CXL Memory驱动成原生的Ramdisk,然后用该Ramdisk构建Swap空间。是的,没错,就是虚拟内存页面,通过增加虚拟页面交换的方式来扩展用户"感觉"足够的内存。毕竟大多数后台运行的程序稍微慢一点也没关系,并且配合页面压缩技术(如zram),效果更好。在计算机体系结构中,时间换空间的方法非常常见。然而,这种方式显然对于大型模型不友好,因为让大型模型的程序主动处理页面交换需要具备非常高超的技术和艺术,很少有人能够做到。

因此,总的来说,通过PCIe插槽(包括CXL插槽)来扩展内存的核心问题在于"如何定义这块内存"。在Linux最初的设计中,可能没有预料到"内存不等于地址"这一现象会如此迅速地发展,或者说"内存模块需要重新设计"。事实上,当Apple引入硬件内存压缩技术时,这个趋势就变得非常明显了。然而,遗憾的是,Linux社区没有及时对这一趋势作出反应,而只是改进了软件级的页面压缩技术。当然,Linux本身就是一个软件社区,所以这种状态也是正常的。

理解了以上信息,我们再回头来回答以上三个问题:

1) 内存之所以还没有池化的原因是,软件还没有ready,只能通过硬件控制器的方式来扩展,而CXL作为一个新兴的协议才刚刚被接受

2) 大型模型可以在硬盘上运行,但需要超高的技术和艺术来管理内存页面和虚拟页面的交互问题。在各个厂家拼命堆料来“省钱”的时代,这个方式属于小众,或者属于穷人的开心果

3) 没有CXL,只有PCIe我们也是可以实现内存池化的,但由于软件没有ready,只能作为虚拟页面的方式存在,属于发paper的技术路线。未来UCIe估计会彻底打破MC和UCIe controller的联系,或者多模态形式出现。

在技术的今天,我们终于开始思考内存的本质,这是将计算机领域彻底改变的节奏。


03
设计思路:内存管道化

本文国数集联将重心放在硬件设计和性能测试上。未来国数集联将专门写一篇文章介绍内存设备化。在理解了内存扩展需求、推动内存技术创新的驱动力,以及可能采用的创新途径之后,国数集联将遵循主流的串行发展方向,在系统设计时期充分考虑性能的扩展性。我们将通过内存的特点构建不同通道的方式着重提升延迟性能,而利用DMA来大幅增加数据吞吐量。

系统架构设计的指导原则如下:

3.1)数据平面和控制平面的分离以及多种内存类型的支持。

我们将扩展内存划分为缓存(Cache)、内存(RAM,DDR)和高带宽内存(HBM)三个主要模块,实现了控制面和数据面的分离。鉴于缓存、内存和高带宽内存在延迟和容量方面存在差异,我们将缓存作为高性能通道来使用,而内存和高带宽内存则与DMA协同工作,提供强大的数据吞吐率。

3.2)支持多个RC(Root Complex),为内存复用做准备,并为支持CXL Switch做准备。

尽管单个RC扩展内存是一项要求,但为了兼容未来的CXL Switch和多主机内存复用,我们在设计初期就考虑了多个RC的支持。

最终,我们将这些设计原则融合在一起,形成了以下系统架构:

图片

测试结果:

在CXL 2.0 Controller和FPGA支持下,结合工程师的努力,我们结果如下:

图片

在Cache channel我们达到350ns的延迟,而DDR和HBM则在600ns左右。下一步国数集联将继续优化总线结构,预计延迟还可以降低100~200ns左右。

内存扩展作为一项新兴前沿技术,与CXL的特点和应用场景相结合,正在重塑计算机架构中尚未解构的内存模块。通过解构内存模块,我们不仅重新定义了计算机总线架构,还对网络拓扑和网络协议产生了深远影响。例如,利用基于CXL的技术构建的GPU大内存体系,便是这种趋势和实践的范例之一。在计算机架构迅猛变革的时代,国数集联注重成本、性能和应用场景的转变,从小型计算走向巨型计算,真正实现了超级计算的普及化。在内存扩展和网络协议方面,国数集联将为这一领域做出自己的贡献。


END