"让数据和计算更紧密地结合在一起"并不像听起来那么简单,但功耗/性能和延迟方面的好处可能是巨大的。
处理器的速度已经提高到不再是许多系统的性能瓶颈的程度,现在的瓶颈往往是数据访问。
移动数据既费时(latency)又费力(power),开发人员正在寻找减少数据移动距离的方法,这意味着使数据和内存更接近彼此。
许多计算密集型应用(如机器学习 (ML))的处理任务相对较简单,但对于数据的需求很频繁。
此时,数据移动成为应用的瓶颈。计算更小、更简单,因此将数据靠近计算是有意义的。解决此问题的几种方法涉及 SRAM、DRAM 和存储( storage),它们彼此之间有很大不同。
“内存memory”和“存储storage”之间的区别可能会令人困惑,对于从业相关技术的工程师而言,“内存”是仅指易于访问的工作内存 — DRAM 和 SRAM。
我们需要区分另外两个相似的术语:“near-memory computing” 和 “in-memory computing”。后者通常是指使用模拟方法在 memory中实现乘法累加 (MAC) 功能的手段。这不是本次讨论的主题,本次讨论的主题是将是使计算能力和数据更紧密地结合在一起。
有两种方法可以使这些资源更接近 - 将数据移近处理器或将处理移近数据。这些架构在high level上是相似的。因此,如果是数据靠近处理器,则拥有具有本地内存的处理器。如果是处理器在移动,那么就是可以存储大量数据,并且附近具有适度处理能力的内存。
针对不同存储器的不同方法
存储器技术的三个主要类别是 SRAM、DRAM 和非易失性存储器 (NVM)。这三者正在做非常不同的事情。
一些人指出,cache形式的SRAM是使数据更接近处理器的最古老的方法。“近内存计算并不是一个新想法 。所有的cache减少了访问常用数据的延迟,但其使用限制了在cache以外的任何内容。如果有一种简单的方法来使用AI cache,可能就不会有这篇文章了。
在这种情况下,更令人感兴趣的是紧耦合内存(tightly coupled memories,TCM)的使用增加。这些是处理器可以直接访问的SRAM,而不必共享和竞争内存总线。TCM的使用方式对开发人员和特定应用程序的需求是完全开放的。
紧耦合的存储器直接连接到处理器,而不是通过标准总线。
还有一个办法是UPMEM提出的在 DRAM 芯片上增加了一个小型处理器,以便在同一芯片上拥有 DRAM 和处理能力。
但是DRAM工艺和处理器制造工艺是不同的,DRAM 工艺未针对高速计算进行优化,所以无法在这颗芯片上制造最复杂的处理器内核。因此,UPMEM在DRAM芯片上安装的处理器必然是不够强大的,其指令集比标准处理器更有限。但它声称,整体上仍然可以获得性能提升,因为:
- 你可以更轻松地访问大量数据,节省数据传输时间,并且
- 你可以分配计算,使用不同的 DRAM 芯片并行处理不同的任务。
UPMEM 的方法将处理器与 DRAM 放在同一芯片上。
这种方法尚未证明成功,最主要的挑战是,程序必须以不同的方式编写程序才能利用这一点。第二个问题是,在这颗芯片上需要为处理器留出空间,所以这些格外空间导致的内存密度损失真的值得获得的额外计算能力么?
所以,近存计算中将处理能力靠近内存似乎不是很有价值。
计算存储(storage)
借助 NVM,我们进入了一个完全不同的领域。在这种情况下,我们谈论的是存储storage,因此它离处理更远,并且可以通过类似驱动器的接口或总线协议(例如 PCIe 和 NVMe)访问。它实际上是一个具有额外处理能力的固态硬盘 (SSD)。
“它具有巨大的意义,超出了人们所认为的存储storage,这是一个非常有活力的市场。计算存储仍将被归类为新兴市场。仅有几家供应商提供解决方案,并被客户使用。”
至少在今天,正在使用的内存技术是闪存 flash。其他有抱负的 NVM 技术也存在,其中 3D Xpoint(相变)和 MRAM(磁性)存储器在商业上走得最远,但两者都很难在成本上竞争。其他存储器,如RRAM和NRAM,成本仍然是问题。
目前的市场更愿意为容量买单,而不是速度。
从概念上讲,计算存储设备(CSD)可以具有不同级别的功能灵活性。它们中最简单的将具有固定功能,专用于单个应用程序。这些可以是各种卸载功能,例如重复数据消除、加密、解密、压缩或其他类似的明确定义的任务。
鉴于这些任务定义比较明确,处理可以在硬件逻辑中实现,而不是在软件中实现,所以这些是内置处理服务的SSD。
如果内存包含一个或多个代码段,每个代码段用于不同的任务,则具有更大的灵活性。其他位置的主处理器可以通过发送指向当时所需的特定代码的指针或使用自定义命令来启动任务。
CSD 最灵活的方法是允许下载任意代码,无论是对象格式还是源代码格式。如果下载了源代码,则处理器需要支持实时编译。
计算存储有两个级别——系统和驱动器。我们一直在讨论的内容是驱动器,它是一块看起来像恰好具有计算能力的单板。对于大多数人来说,当你使用计算存储时,这意味着你把CPU放在驱动器上。
这不是唯一的方案。一个系统可能由多个驱动器组成,每个驱动器可以有计算,也可以是标准驱动器。大多数计算存储将在系统级别,而不是驱动器级别。即使有驱动器,也会由系统供应商进行集成。
这些软件比典型应用程序更难编程,因为内存管理以不同的方式运行,并且host程序需要在 CSD 上安排任务 - 这些事务的运行级别低于大多数开发人员想要处理的级别,而程序员都希望用比C语言更高层次的语言编程。