1. 项目概述:当随机计算遇上存内计算
在芯片设计领域干了十几年,我见过太多为了追求极致能效和算力而绞尽脑汁的方案。传统的冯·诺依曼架构,计算和存储分离,数据在两者之间来回搬运产生的“内存墙”问题,就像一条越来越宽的护城河,严重制约了系统性能,尤其是在处理图像识别、贝叶斯推理这类需要海量数据并行处理的任务时。与此同时,随着晶体管尺寸逼近物理极限,热噪声和随机比特翻转带来的可靠性挑战也日益严峻。正是在这种背景下,随机计算和存内计算这两种非传统计算范式走进了我们的视野。
随机计算的核心思想很巧妙:它不直接用0和1的确定值来表示数据,而是用一长串随机比特流中“1”出现的概率来编码一个数值。比如,概率0.3就代表数值0.3。这样做的好处是,一些复杂的算术运算(比如乘法、除法、甚至指数函数)可以用极其简单的逻辑门(比如一个与门就能做乘法)来实现,硬件开销极低,并且对电路中的噪声和随机错误天生具有鲁棒性。然而,它的“阿喀琉斯之踵”在于生成这些高质量随机比特流的硬件——传统的CMOS随机数生成器(如线性反馈移位寄存器或环形振荡器)往往会吃掉整个电路80%以上的面积和能耗,这让随机计算的能效优势大打折扣。
另一方面,存内计算旨在打破“内存墙”,将计算单元直接嵌入到存储阵列中,实现数据在原地处理。计算随机存取存储器正是这一方向的明星架构。但传统的CRAM(conv-CRAM)处理的是确定性二进制数据,在面对需要复杂概率运算的神经形态计算任务时,其硬件成本和噪声敏感性问题依然突出。
那么,有没有可能把这两者的优势结合起来,创造一个“1+1>2”的方案?明尼苏达大学团队提出的SC-CRAM方案,就给出了一个令人兴奋的答案。它的核心创新在于,利用磁隧道结这种器件的固有物理随机性,直接在CRAM阵列内部、在同一个硬件单元中,完成了随机比特的生成和后续的逻辑计算。这相当于把随机计算的“发动机”和“处理器”做成了一个不可分割的整体,从根源上消除了随机数生成带来的额外面积和延迟开销。简单来说,SC-CRAM不是简单地把一个随机数生成器模块塞进内存里,而是让内存里的每一个存储单元,本身就具备了“随机化”和“计算”的双重能力。
这篇文章,我就结合自己多年在电路设计和新兴计算架构评估方面的经验,为你深入拆解SC-CRAM这项技术。我会从它的核心设计思路讲起,一步步剖析它是如何在CRAM阵列中调度任务、实现各种算术功能的,并通过几个具体的应用案例(如图像阈值分割、贝叶斯推理),对比分析它与传统方案在面积、延迟、能耗和噪声容限上的优劣。无论你是从事芯片设计的工程师,还是对前沿计算架构感兴趣的研究者,相信都能从中看到一种解决未来计算挑战的全新可能性。
2. SC-CRAM的核心设计思路与架构拆解
要理解SC-CRAM的精妙之处,我们得先把它拆成几个关键部分来看:它所依赖的物理器件基础、它所构建的计算架构,以及它是如何将随机性与计算在时间和空间上融合的。
2.1 物理基石:磁隧道结的随机开关特性
SC-CRAM方案的核心物理器件是磁隧道结。你可以把它想象成一个纳米尺度的“磁阀门”。它由两层铁磁层和中间一层极薄的绝缘层(隧道势垒)构成。其中一层铁磁层的磁化方向是固定的(参考层),另一层(自由层)的磁化方向可以改变。当两层磁化方向平行时,MTJ呈现低电阻态;反平行时,呈现高电阻态。这两种状态可以分别代表逻辑“0”和“1”。
MTJ之所以能成为随机计算的理想器件,关键在于其开关过程的内在随机性。当我们施加一个电压脉冲(称为扰动脉冲,Perturb Pulse)试图翻转自由层的磁化方向时,成功翻转的概率并非100%。这个概率受到热涨落的显著影响,并且可以通过精确控制脉冲的电压幅值和持续时间来连续、可调地设定。例如,施加一个特定强度和宽度的电压脉冲,可能让MTJ有30%的概率从平行态翻转到反平行态。这种概率性开关特性,使得单个MTJ就能作为一个可调的真随机数发生器,这正是生成随机计算所需比特流的物理基础。
注意:MTJ的这种随机性源于物理本质,与基于确定性算法的CMOS伪随机数生成器有根本区别。后者生成的序列在理论上是可以预测的,而MTJ产生的是基于热力学噪声的真随机数,这为随机计算提供了更坚实的随机性保障,也避免了为提升“随机性质量”而增加的电路复杂度。
2.2 计算舞台:CRAM阵列的存算一体架构
有了随机的“砖块”,我们还需要一个能高效砌墙的“工地”。这就是计算随机存取存储器阵列。传统的STT-MRAM存储单元是1晶体管1 MTJ(1T1M)结构,主要用于存储。而CRAM单元则升级为2晶体管1 MTJ(2T1M)结构,这多出来的一个晶体管和额外的控制线,是其实现存内计算的关键。
CRAM阵列有两种工作模式:
- 存储模式:此时操作和普通内存类似,通过字线选择特定行,在位线上进行数据的读取或写入。
- 逻辑模式:这是其精髓所在。在逻辑模式下,通过启用逻辑位线,可以将同一行内的多个MTJ单元通过一条共享的“逻辑线”连接起来。通过对各个单元的位选择线施加特定的电压组合,就能让电流流经这些串联的MTJ,最终根据电流大小决定输出单元的状态是否翻转,从而实现如与、或、非等基本逻辑运算。这意味着,数据不需要被读出到外部的ALU,计算直接在存储数据的原地完成。
2.3 灵魂融合:SC-CRAM的任务调度与嵌入策略
SC-CRAM的创新,正是将上述两者深度融合。它不再像传统随机计算那样,先在一个地方(RNG模块)生成随机比特流,再把这些比特流送到另一个地方(计算单元)进行处理。SC-CRAM设计了一套全新的任务调度周期,每个计算周期包含四个同步的步骤:
- 复位:将所有参与计算的MTJ(包括输入和输出单元)初始化为一个已知的确定状态(通常是平行态)。
- 扰动:仅对输入单元施加特定幅值的电压脉冲。每个输入MTJ会根据脉冲参数设定的概率,独立地、随机地切换到反平行态(或保持原状)。这一步,就是随机比特的“生成”时刻。脉冲的电压值直接对应了输入数据的概率值(例如,图像中某个像素的灰度值)。
- 逻辑:紧接着,CRAM阵列切换到逻辑模式。根据预设的逻辑功能(如AND、MUX),对已经处于随机状态的输入MTJ施加逻辑运算电压。电流流经这些MTJ,确定性地改变输出MTJ的状态。这一步,就是利用上一步生成的随机状态进行“计算”。
- 读取:读取输出MTJ的最终电阻状态,得到本次时钟周期的计算结果(0或1)。
这个流程的精妙之处在于:
- 时空统一:“生成”和“计算”发生在相同的硬件单元(MTJ)和相同的时钟周期内。扰动步骤结束后,输入MTJ的随机状态立即被用于逻辑计算,没有数据搬运开销。
- 概率直接映射:模拟的输入数据(电压值)直接控制MTJ的翻转概率,省去了传统方案中先进行模数转换,再与随机数比较的复杂电路。
- 步骤重叠优化:对于多级计算,可以将前一级的“读取”步骤与后一级的“逻辑”步骤在时间上重叠,进一步压缩整体计算延迟。
通过这种设计,SC-CRAM成功地将随机计算的概率编码优势,与存内计算的高能效、低延迟优势结合在了一起,形成了一种真正“内生”的随机计算架构。
3. 关键算术功能在SC-CRAM中的实现详解
理解了SC-CRAM的基本调度周期后,我们来看看它如何具体实现随机计算中那些关键的算术功能。这就像知道了汽车的发动机原理,现在要看看它怎么实现加速、转弯和倒车。在随机计算中,复杂的数学运算被分解为对随机比特流的逻辑操作。
3.1 基础运算:乘法、缩放加法与绝对值减法
乘法:这是随机计算最直观的优势。两个独立的随机比特流A和B,它们同时为“1”的概率就是P(A)*P(B)。因此,用一个简单的与门对两个比特流进行逐比特的与操作,输出的比特流中“1”的概率就等于两个输入概率的乘积。在SC-CRAM中,这直接对应着在CRAM阵列中配置一个AND逻辑操作。如图4所示,输入MTJ(A和B)在扰动步骤后随机置位,然后在逻辑步骤中,通过施加合适的电压,使输出MTJ(Y)的状态由A和B的串联状态决定,实现了嵌入式的随机乘法。
缩放加法:对两个概率值进行加权求和,例如 Y = S*A + (1-S)*B,其中S是一个选择概率。这可以通过一个多路复用器来实现。MUX根据第三个选择比特流S的值,决定输出是A还是B。当S固定为0.5时,就实现了取平均的功能。在SC-CRAM中实现MUX需要多个步骤:先对A、B、S进行扰动,然后通过NOT、AND和OR逻辑的组合来模拟MUX功能(如图5)。另一种更节省资源的方法是使用三输入多数门,当其中一个输入固定为0.5时,其输出就是另外两个输入概率的平均值。MAJ3门在SC-CRAM中所需的MTJ数量和计算步骤都比MUX少,但灵活性稍差。
绝对值减法:计算 |P(A) - P(B)|。这可以通过异或门来实现。但需要注意的是,异或门输出概率等于|P(A)-P(B)|的前提是,两个输入比特流A和B是最大相关的(即一个总是另一个的反)。在大多数计算中,我们需要比特流尽量不相关,但有些特定应用(如后文将提到的局部图像阈值化)可以利用这种特性。SC-CRAM中实现XOR需要NAND、OR和AND逻辑的组合(如图6)。
实操心得:在选择使用MUX还是MAJ3进行缩放加法时,需要权衡。如果只是简单的两输入平均,MAJ3更高效。但如果需要非0.5的权重,或者要进行多输入加权和,MUX虽然步骤多,但架构更规整,易于扩展。在实际硬件映射时,这是一个关键的优化点。
3.2 复杂函数:平方根与缩放除法
随机计算的威力在于,它还能用简单的门电路逼近一些复杂的函数。
平方根:计算 Y ≈ √X。论文中展示了一种巧妙的实现方式(如图7)。它需要两个独立的、概率均为X的比特流(X1, X2),以及两个固定概率的比特流(C1=0.67, C2=0.18)。通过一层AND逻辑和两层OR逻辑的组合,最终输出的比特流Y的概率近似等于√X。这里的数学原理涉及概率论的组合,其核心思想是通过逻辑门的组合来构造一个输出概率与输入概率呈平方根关系的函数。
缩放除法:计算 Y ≈ A / (A + B)。这是一个非常重要的函数,在贝叶斯推理中无处不在(后验概率计算)。在随机计算中,这可以通过一个JK触发器的电路来近似实现(如图8)。将比特流A和B分别接入J和K端,在一定的时钟周期后,触发器输出Q的概率就会收敛到 A/(A+B)。在SC-CRAM中,需要构建一个由多个NAND门和缓冲器组成的时序电路来模拟JK触发器的行为。
表1:SC-CRAM中各类算术功能的硬件开销与步骤对比(相对于传统CRAM)
| 算术功能 | SC-CRAM所需MTJ数量 (相对值) | SC-CRAM计算步骤 (相对值) | SC-CRAM子阵列规模 (行x列) | 传统CRAM子阵列规模 (行x列) |
|---|---|---|---|---|
| 乘法 | 显著减少(约1/10量级) | 增加 (约2-3倍) | 单行 | 多行 |
| 缩放加法 (MUX) | 减少 | 显著增加(约10倍) | 单行 | 多行 |
| 绝对值减法 (XOR) | 减少 | 显著增加(约10倍) | 单行 | 多行 |
| 平方根 | 显著减少(约1/20量级) | 减少(约1/3) | 单行 | 多行 |
| 缩放除法 (JK-FF) | 减少 | 增加 (约5倍) | 单行 | 多行 |
从上表我们可以解读出SC-CRAM的几个关键特征:
- 面积优势巨大:对于所有功能,尤其是乘法和平方根,SC-CRAM所需的MTJ数量远少于传统CRAM。这是因为传统CRAM处理8位二进制数需要复杂的加法器、乘法器阵列(如华莱士树),而SC-CRAM用几个MTJ和简单的逻辑连线就实现了相同功能。
- 延迟的权衡:除了平方根运算,SC-CRAM其他功能的计算步骤数都多于传统CRAM。这是随机计算的固有特点:用更简单的硬件,但需要更多的时钟周期(比特流长度)来达到精度。然而,步骤多不等于总时间长,因为SC-CRAM的每个步骤可能更短,且能重叠执行。
- 阵列规模扁平化:所有SC-CRAM运算都只需要单行子阵列,而传统CRAM的复杂运算需要多行。这一点至关重要。更少的行数意味着互连寄生效应(如IR压降)更小,从而带来更高的噪声容限和电路可靠性。
4. 应用案例实战与性能深度评估
理论再优美,也需要实战检验。论文中选择了四个具有代表性的神经形态计算应用来评估SC-CRAM,这些应用恰好涵盖了随机计算的优势领域。我们来逐一拆解,并看看SC-CRAM到底表现如何。
4.1 应用一:局部图像阈值化
- 任务描述:这是一个经典的图像处理步骤,用于将灰度图像转换为二值图像(黑白)。例如Sauvola算法,它为每个像素计算一个局部阈值,根据该像素邻域内的均值和标准差动态决定该点应为黑还是白。计算涉及均值、标准差(需要平方、开方)、比较等操作。
- SC-CRAM实现:图像的每个像素值被转换为电压,控制对应输入MTJ的翻转概率。在CRAM阵列中,通过组织MTJ单元,并行地对多个像素邻域执行包含乘法、平方根、缩放的运算链。随机计算的噪声免疫特性在这里特别有用,因为图像处理本身允许一定的近似。
- 性能亮点:如表3所示,对于此应用,SC-CRAM使用的CRAM单元数比传统CRAM少约180倍,计算步骤数少约1/3。最关键的是,SC-CRAM的噪声容限远高于传统CRAM,使得其实用性大大增强。虽然SC-CRAM的总能耗是传统CRAM的12.9倍,但考虑到传统CRAM的能耗本就比现代近存处理系统低约40倍,SC-CRAM的能耗水平仍然极具竞争力。
4.2 应用二&三:贝叶斯推理与信念网络
- 任务描述:
- 对象定位:根据传感器的不确定观测数据,推断目标最可能的位置。这涉及大量的条件概率乘法和归一化(缩放除法)。
- 心脏病预测:基于贝叶斯信念网络,综合多个风险因素(年龄、血压、胆固醇等)计算发病概率。网络中的每个节点都进行概率信息的融合与传递。
- SC-CRAM实现:贝叶斯公式中的连乘运算天然适合用随机计算的与门实现。后验概率计算中的归一化(除以总和)则通过前文提到的JK触发器(缩放除法)来实现。整个推理网络可以映射到CRAM阵列中,形成并行的概率更新流水线。
- 性能亮点:在这两个应用中,SC-CRAM在单元数量上仍有20-60倍的优势。在计算步骤上,对象定位应用两者相当,而心脏病预测应用SC-CRAM步骤数减少约一半。两者的总能耗处于同一数量级。这表明对于这类以概率乘除为核心的算法,SC-CRAM在保持能效的同时,大幅缩减了硬件面积。
4.3 应用四:核密度估计
- 任务描述:一种非参数的概率密度估计方法,在机器学习中用于数据分布建模。计算涉及对每个数据点施加一个核函数(如高斯函数),并求和。核函数计算通常涉及指数或类似复杂函数。
- SC-CRAM实现:利用随机计算可以用多项式(通过乘加操作)或特定逻辑电路逼近复杂函数(如指数、双曲正切)的能力,在阵列内实现核函数的计算和求和。
- 性能亮点:SC-CRAM的单元数优势约为20倍,步骤数相当,但能耗是传统CRAM的5.4倍。然而,与传统CRAM极低的噪声容限(几乎不可行)相比,SC-CRAM提供了可靠的运行电压窗口,使其成为唯一可行的存内计算解决方案。
表2:四个应用场景下SC-CRAM vs. Conv-CRAM全面性能对比
| 性能指标 | 局部图像阈值化 | 贝叶斯推理 (对象定位) | 贝叶斯信念网络 (心脏病预测) | 核密度估计 |
|---|---|---|---|---|
| CRAM单元数减少倍数 | ~180x | ~60x | ~20x | ~20x |
| 计算步骤数对比 | SC-CRAM少 ~1/3 | 两者相当 | SC-CRAM少 ~1/2 | 两者相当 |
| 总能耗对比 | SC-CRAM高 12.9x | 两者同一量级 | 两者同一量级 | SC-CRAM高 5.4x |
| 噪声容限 | SC-CRAM可行,Conv-CRAM过低不可行 | SC-CRAM显著更高 | SC-CRAM显著更高 | SC-CRAM可行,Conv-CRAM过低不可行 |
| 关键优势 | 面积巨幅减少,可靠性高 | 面积减少,能效相当 | 面积减少,延迟更低 | 唯一可行的存内计算方案 |
4.4 能耗分解与深入洞察
图9的能耗饼图提供了更细微的洞察。在SC-CRAM中,总能耗由复位、扰动、逻辑三步构成。其中,扰动步骤(即随机比特生成)的能耗占比很小,在四个应用中最高仅占9.5%(对象定位),最低的甚至不到1%。这与传统CMOS随机计算中随机数生成占80%能耗的常态形成了鲜明对比。SC-CRAM的能耗大头依然是逻辑操作,其次是复位。
这揭示了一个重要结论:SC-CRAM通过硬件层面的融合,几乎将随机比特生成的“额外”能耗降到了零。它主要的能耗开销与执行计算本身相关,而非为计算准备随机数。这使得它的能效模型与传统计算架构更具可比性,而其面积和可靠性优势则成为额外的红利。
5. 设计考量、挑战与未来展望
尽管SC-CRAM前景诱人,但从实验室走向实际芯片,还有一系列工程挑战需要攻克。结合我的经验,以下几个问题至关重要:
5.1 精度与比特流长度的权衡
随机计算的根本限制在于精度。输出概率的估计精度与随机比特流的长度N的平方根成正比(~1/√N)。要达到8位二进制精度(约0.4%误差),需要约256位的比特流长度。这意味着每个计算需要重复256个时钟周期。
- 挑战:对于高精度应用(如科学计算),可能需要更长的比特流,导致延迟增加。
- 应对策略:
- 混合精度设计:系统关键路径或对误差敏感的部分采用较高精度(长比特流),其他部分采用较低精度(短比特流)。
- 非传统编码:探索双极编码、值域重叠编码等,可能在某些运算上获得更好的精度-效率权衡。
- 与确定性计算融合:构建异构系统,让SC-CRAM处理其擅长的近似计算、概率推理部分,而让传统ALU处理需要精确结果的确定性问题。
5.2 MTJ器件非理想性的影响
SC-CRAM的性能严重依赖于MTJ的器件特性。
- 工艺波动:不同MTJ之间的开关概率可能存在偏差,导致计算系统性误差。
- 耐久性与漂移:MTJ在多次翻转后特性可能退化,概率特性发生漂移。
- 温度敏感性:热涨落是随机性的来源,但温度变化也会影响开关概率的标定。
- 应对策略:
- 片上校准电路:集成简单的电路,定期测量和校准关键MTJ的开关概率曲线。
- 冗余设计与错误校正:采用多数表决或更复杂的概率纠错码来容忍个别单元的偏差。
- 算法层面的鲁棒性设计:利用随机计算和贝叶斯方法本身对噪声的容忍性,在算法层面吸收部分硬件误差。
5.3 系统集成与编程模型
如何高效地将一个算法映射到SC-CRAM阵列上,是一个复杂的编译器和工具链问题。
- 挑战:需要将计算图(如贝叶斯网络、神经网络层)高效地分割、调度到二维的CRAM阵列中,优化数据流,最小化中间结果的移动。
- 应对策略:开发专为SC-CRAM设计的高级综合工具或领域特定语言,让开发者能够以高层次的概率运算描述算法,由工具自动完成到MTJ阵列操作的映射、时序调度和电压配置。
5.4 与其它存内计算方案的对比
SC-CRAM并非存内计算的唯一路径。还有基于ReRAM/Memristor的模拟存内计算、基于SRAM的数字存内计算等。
- SC-CRAM的优势:数字友好(输出是明确的0/1,抗噪声)、概率计算原生支持、与成熟MRAM工艺的潜在兼容性。
- SC-CRAM的潜在劣势:计算速度可能慢于纯模拟计算(需要多个周期);功能灵活性可能低于可编程的数字存内计算单元。
- 未来方向:SC-CRAM很可能不会取代所有计算,而是在异构计算系统中作为一个高效的“概率处理单元”或“神经形态加速器”存在,专门处理其擅长的任务。
从我个人的角度看,SC-CRAM最大的启发在于它提供了一种“从物理本质出发”的设计哲学。它没有试图用完美的数字电路去模拟或对抗噪声与随机性,而是巧妙地利用器件本身的物理随机性作为计算资源,并将计算深深地嵌入到存储的结构中。这种“顺应物理,而非对抗物理”的思路,或许是后摩尔时代突破能效和算力瓶颈的关键之一。当然,这条路上布满了器件、电路、架构、工具链各方面的挑战,但正是这些挑战,为我们这些硬件工程师和研究者提供了广阔的探索空间。