作者:赵瑜斌,文章来源:IC后摩号
近存计算(near memory computing, NMC)将计算单元与存储单元物理紧耦合,在数据“原地”附近完成处理,大幅降低数据搬运带来的能耗和延迟。它突破了以CPU/GPU为核心的冯·诺依曼瓶颈,是AI、大数据时代走向“存算一体”的重要里程碑,开启了以数据为中心的架构革命。
概述
在传统冯·诺依曼架构中,CPU与存储通过总线连接,数据需在存储单元与计算核心间频繁搬运。这种分离式设计在AI训练场景中暴露出严重问题:以ResNet-50模型为例,其训练过程需要处理超过2500万次矩阵乘法,每次运算都涉及大量数据在存储与缓存间的搬运,导致实际计算时间仅占总耗时的5%-10% 。
行业常见技术方案通过增加缓存层级(L1/L2/L3)或采用高带宽存储(HBM)缓解问题,但这些方法本质仍是“用带宽换性能”。
以存储为中心的处理架构(memory-centric process, MCP)则提出根本性变革:将计算单元嵌入存储模块,使数据无需跨总线传输即可完成计算。测试数据显示,在图像分类任务中,该类架构可使存储访问延迟降低70%,整体吞吐量提升3-5倍。
近存/存内架构与演进层次
架构分类
近存计算(near memory computing)是在靠近存储的逻辑中执行计算。近存计算架构最初的出现即为存内处理 (processing in memory, PIM),后也被统称为(有时候混称为)存内计算,或存储为中心的处理架构(memory-centric processing,MCP),其大致的三个演进层级:
1. 近存计算(NMC):在存储控制器或DIMM模块中集成计算单元,典型实现如某新型HBM3存储堆叠中嵌入的128核加速器
2. 存内计算(IMC):在DRAM阵列内部嵌入逻辑门,通过修改存储单元结构实现位运算,如基于RRAM的阻变存储器计算
3. 存内处理(PIM):完整计算核心嵌入存储芯片,支持浮点运算和分支预测,研究已实现类似ARM Cortex-M0的完整处理单元。
存内计算(IMC)和近存计算(NMC)的界限有时在不同上下文(例如存内数据库)是模糊的,但是其本质是改变了计算存储架构 、计算方案、数据访问方案、以及数据处理与存储的邻近程度。


IM-P和IM-A两种细分结构见后文
存内处理 vs 近存计算
近存计算中,逻辑电路的实现独立于存储结构。而存内计算中,在计算这一方面密切地涉及了存储元件、存储阵列和外围电路。通常需要对它们进行结构修改或附加特殊电路来支持计算。
自 2010 年代以来,商用 3D 堆叠存储 (3D stacked memories,如谢源老师团队研究成果) 的出现重新引起了人们对 PIM 的兴趣。Micron 的 Hybrid Memory Cube (HMC) 在一个多 DRAM 层的堆叠下面合入了一个逻辑层,并有望在这个逻辑层内实现自定义逻辑。

近存架构与传统 Von Neumann 架构的关键区别如下。
1. 计算逻辑靠近存储放置,通常使用高带宽电路集成技术(例如 2.5D 和 3D 集成)来充分利用存储内部可用的巨大存储带宽。
2. 存储元件 (memory cells)、存储阵列、以及存储元件中提供基础读写功能的外围电路通常是原封不动的。
3. 存储介质可以是SRAM、DRAM、NVMe等
由于存内计算需要修改存储元件 (memory cells) 给存储器设计增加了不小的再投资成本,还需要针对当前存储架构的统一元件结构 (uniform cell structure) 进行深度优化。此外,修改后的元件会导致存储密度大大降低,这可能使以存储为中心的架构难以证明其性能与面积(或性能与成本)权衡的合理性。
随着非易失性存储 (non-volatile memories, NVMs) 的出现,存内计算的概念被重新审视。某些 NVM 具有在模拟域 (analog domain) 中执行计算所需的物理特性,因此只需对存储阵列进行最小的设计更改即可实现存内计算。


此外,存储元件的非易失性特性解决了 DRAM 元件的破坏性读取访问问题,而后者迫使 DRAM 存内计算要求在计算之前执行一次复制。
缺点方面,模拟域的存内计算仍然是一种推测性 (speculative) 技术。例如,由于工艺变化和扩展的电流路径而存在的非理想性可能会损害计算结果。此外,随着模拟信号转换需要处理更多的位数,数模转换 (DAC) 和模数转换 (ADC ) 的成本将变得令人望而却步。
存内计算
存内计算方法可以进一步细分为两类:in-memory (array) 和 in-memory (periphery):

In-memory (array) 或 IM-A 使用特殊的计算操作在存储阵列中生成计算结果。IM-A 架构可以提供最大的带宽和能效,因为操作发生在存储阵列内部。IM-A 还可以为简单的操作提供最大的吞吐率。
缺点方面,复杂的功能可能会导致高延迟,并需要为此类特殊计算操作重新设计存储元件,扩展正常的位线和字线结构。由于元件 (cells) 和阵列 (arrays) 的设计和布局针对特定电压和电流进行了大量优化,因此导致大量的重新设计和表征工作。以及要修改外围电路以支持 IM-A 计算。因此,IM-A 包括 (a) 存储阵列发生较大变化的 IM-A,以及 (b) 存储阵列发生较大变化且外围电路发生较小变化的 IM-A。
In-memory (periphery) 或 IM-P 在外围电路内产生计算结果。可以进一步分为数字 IM-P 方法(仅处理数字信号)和模拟 IM-P 或 IM-P (analog) 方法(在模拟域中执行计算)。修改后的外围电路可实现正常读写以外的操作,例如与不同元件交互或是加权读取电压 (weighting read voltages)。此类修改包括支持 wordline driver 中的多行激活以及用于多级激活和感测的 DAC/ADC。它们被设计用于逻辑操作以及算术操作(例如向量矩阵乘法中的点积)的计算。
缺点方面,虽然结果是在外围电路中产生的,但存储阵列也执行了大量的计算。外围电路的改变可能导致需要采用与传统存储阵列中不同的电流/电压。因此,为了稳健性,IM-P 可能会使用稍微不同的元件设计。用于支持复杂功能的外围设备的附加电路可能会导致更高的成本。
与近存方法相比,存内计算支持对数据进行大带宽访问,不仅用于解决存储墙问题,还用于大规模并行处理。
近存计算
一种常见的解决方案是将处理器和 DRAM 集成到同一芯片上,用片上数据移动代替芯片间通信。

Near DRAM处理系统主要由标量处理系统、内存系统和向量处理单元组成。 标量处理系统仍然具有与 CPU 类似的结构,具有处理器内核和高速缓存系统。内存接口单元与高速缓存系统和 DRAM 模块交互,充当实现近 DRAM 处理的桥梁。 为了充分利用集成 DRAM 的高带宽,放置了矢量处理单元来执行数据并行操作。
内存系统本身被组织在多个 DRAM 模块中。 它设计有比普通 DRAM 芯片更宽的 I/O 接口,以获得更高的聚合数据带宽来服务处理系统。 在运行时,处理器的工作方式与正常系统类似,不同之处在于当需要从内存中获取数据时,它们直接通过片上接口传输。
NMP系统产生了多个优点。 首先,内存带宽显著增加,因为外部内存数据总线不再是瓶颈。 其次,内存访问的延迟也更短,因为可以消除外部数据总线中的长线延迟。 最后,系统能效也得到了提高,因为片上数据移动比片外数据总线消耗更少的能量。
主要缺点是这样的集成处理器的性能比独立芯片中的普通处理器要弱。 这是因为处理器是采用 DRAM 工艺实现的,要集成在同一芯片中。 处理器的逻辑电路和 SRAM 阵列在 DRAM 工艺中实现时都较慢,该工艺针对内存成本和能源进行了优化,但没有针对逻辑速度进行优化。
此外,in DRAM 逻辑只能访问 DRAM 工艺中使用的 2-3 个金属层; 即使是简单的逻辑电路也将具有比通常更大的占用空间。
独立 vs 集成内存加速器
NMC或 IMC 的存储器模块可以设计为独立加速器,也可以设计为集成到现有存储层次中的存储模块中的加速器。

独立加速器 (discrete accelerator) 不受限制地完全访问其存储空间,类似于暂存器存储 (scratchpad memory)。独立存储空间将加速器与操作系统分页策略、一致性协议、数据加扰 (data scrambling) 和地址加扰 (address scrambling) 解耦。它还提供了灵活数据排列的控制。
缺点是仍然需要通过 PCIe 等外部链路从存储层次加载数据的瓶颈。在商用加速器中也同样存在:GPU 花费大量时间、通过 PCIe 总线将数据在主机存储和设备存储之间来回拷贝。由于数据加载成本可通过数据重用 (reuse) 来平摊,故能够实现高性能的应用程序、通常仅限于那些呈现高重用性或高 GOPs (giga-ops) 者。
集成加速器 (integrated accelerator) 非常适合绕过存储墙。然而,存储层次每一层中的许多现有方案和约束都是为了访问性能和安全性而实现的,这使得设计成熟的集成 NMC/IMC 系统具有挑战性。例如,为了在计算之前对齐 SRAM subarray 中的操作数,仅为它们分配足够的地址是不够的;它们还需要以特定的方式关联起来。
DRAM 使用了各种加扰技术 (scrambling techniques),并且获取操作数访问的虚拟地址也需要通过操作系统的页表。
NAND flash 则使用了闪存翻译层 (flash translation layer, FTL),它增加了另一层地址转换并封装在闪存设备中。
许多 NVM 的写入耐久性有限,这些转换层有助于磨损均衡 (wear-leveling)。对它们的干扰 (interference) 最终会缩短存储元件的寿命。
并且,集成系统需要与现有框架的磨合,包括操作系统和编程模型 ,这些都尚在发展早期。另外,独立加速器和集成加速器并不是互斥的选择。可以采用两者混合的方法,比如在现有的存储层次中创建暂存器存储。
3D DRAM 近存加速器
3D DRAM 为近存处理提供了一个有效的基础。 逻辑层实现了高速逻辑处理,因此任何NMP逻辑都可以在这里实例化。 同时,由于 3D 堆叠结构,逻辑层可以与通过TSV 和 DRAM 模块高数据传输率通信。

优点: 在基于3D DRAM的近存处理中,PE 是在高性能逻辑工艺节点中实现的,因此不会出现性能下降。 整体性能还得益于3D DRAM改进的延迟和内存带宽。与所有近存处理设计一样,内存和处理器之间的数据移动有效减少,从而节省能源。
缺点:尽管数据在 DRAM 附近处理,但对 DRAM 模块的访问次数仍然没有减少。 此外,当操作涉及来自遥近位置(在不同vaults 中)的数据时,数据在处理之前仍会产生近程传输开销。
NMC硬件实现方法
硬件实现原理
某研究机构的测试平台显示,在64GB DDR5存储中集成2048个计算核心后,矩阵乘法运算的能效比达到传统GPU的8倍,而硬件成本仅增加23%。近存计算架构核心实现包含三个关键组件:
计算存储单元:在每个DRAM Bank中嵌入4-8个轻量级ALU,支持8/16位整数运算
智能存储控制器:负责任务调度与数据分发,采用硬件加速的路由算法
原子操作指令集:扩展存储访问指令,支持存储内加法、比较等原子操作
存储映射编程范式
近存计算架构 “计算靠近数据”的编程思想,开发者需重新设计数据布局策略。以图像处理为例:
# 传统架构数据搬运模式
def
conv2d_traditional(input, kernel):
# 数据需从存储搬运至GPU缓存
result = gpu_conv(input, kernel)
return result
# NMC架构近存计算模式
class
MCPConv2D:
def __init__(self, memory_region):
self.memory = memory_region # 直接操作存储区域
def execute(self, kernel_data):
# 在近存执行卷积运算
for i in range(self.memory.shape[0]-2):
for j in range(self.memory.shape[1]-2):
patch = self.memory[i:i+3,j:j+3]
self.memory[i,j] = np.sum(patch*kernel_data)
任务调度应用场景
某开源框架实现的调度器可将任务分配时间从120μs降至8μs,在128节点集群中实现92%的计算资源利用率。NMC架构的性能优化通常考虑三个维度:
数据局部性:通过数据分块(Tiling)确保计算任务在单个存储Bank内完成
并行度控制:动态调整每个存储模块的计算负载,避免总线争用
故障恢复机制:针对存储计算单元的高故障率,设计检查点重试机制
近存计算应用
AI场景落地加速案例
三星HBM-PIM将AI处理器直接集成到HBM内存中。在与AMD Instinct MI100加速器的合作测试中,HBM-PIM使性能提升超过2倍,能耗降低超过50%。在Xilinx Virtex Ultrascale+的AI加速器上,实现近2.5倍系统性能提升,能耗降低超过60%。并以一个60亿(6B)参数规模的AI模型为例,超过80%的计算功能可通过PIM加速处理,性能提高3.5倍。
阿里达摩院研发的全球首款基于DRAM的3D键合堆叠存算一体AI芯片,采用混合键合技术将计算芯片与存储芯片“面对面”互联,专为数据中心推荐系统设计。相比Intel Xeon Gold 5200平台,在特定AI场景中性能提升超过10倍,能效比提升高达300倍。
代码实现:存内矩阵乘法
class MCPMatrixMultiplier:
def __init__(self, bank_size=4096):
self.bank_size = bank_size
self.banks = [np.zeros(bank_size) for _in range(16)] # 模拟16个存储Bank
def load_matrices(self, A, B):
# 分块加载矩阵到不同Bank
for i in range(0, A.shape[0],self.bank_size):
bank_idx = i // self.bank_size
self.banks[bank_idx][:] = A[i:i+self.bank_size]
for j in range(0, B.shape[1], self.bank_size):
bank_idx = j // self.bank_size + 8
self.banks[bank_idx][:] = B[:,j:j+self.bank_size].T
def multiply(self):
result = np.zeros((A.shape[0], B.shape[1]))
# 并行执行Bank内乘法
for i in range(0, result.shape[0], self.bank_size):
for j in range(0, result.shape[1], self.bank_size):
a_bank = i // self.bank_size
b_bank = (j // self.bank_size) + 8
# 模拟存储内乘法运算
partial_result = np.dot(
self.banks[a_bank][i%self.bank_size:],
self.banks[b_bank][j%self.bank_size:]
)
result[i:i+self.bank_size, j:j+self.bank_size] += partial_result
return result
存储中心计算挑战与展望
存储中心处理(IMC/NMC/PIM)架构发展中面临的挑战:
硬件成本:3D堆叠技术使存储计算模块成本增加40%-60%
编程复杂度:开发者需同时掌握存储管理和并行计算技术
生态兼容性:需与现有CUDA/OpenCL生态实现无缝对接
未来发展方向包括:
异构集成:将IMC/NMC与存算一体芯片(如某新型存内计算加速器)结合
标准制定:推动存储计算指令集(如MC-ISA)的标准化
软件栈完善:开发自动化的数据分块与任务调度工具链
以存储为中心的处理架构从底层重构存储与计算的关系,为AI、大数据等带宽密集型应用提供了突破性能瓶颈的新路径。
参考文献
Daichi Fujiki, In-/Near-Memory Computing
Joo-Young Kim, Processing-in-memory for AI : from circuits to systems
Hybrid memory cube (HMC), 2011
百度开发中心,MCP架构解析
CSDN, https://blog.csdn.net/younger_china/article/details/136057846