存内计算(Computing-in-Memory)最常被引用的卖点,是让权重不必搬出存储阵列、就地完成乘加运算;但真正决定一块芯片能耗与面积的,往往不是运算本身,而是运算前后那几次模拟-数字转换。
近期一篇围绕”开关电容电荷重分配”展开的工作,把输入转换、模拟域乘累加、加权移位累加以及读出量化,统一收纳在同一组电容之上,再用差分读出路径让一对部分和在ADC量化阶段直接合并——结果是把模拟存内计算里那道常被点名的”ADC墙”,从电路层面拆掉了一截。
一、模拟存内计算的瓶颈,究竟卡在哪里
模拟存内计算加速神经网络推理的核心思路并不复杂:权重驻留在存储单元里,输入通过数模转换变成电压或电荷,在阵列里一次性完成与权重的乘加,最后由模数转换器读出结果。
看上去很流畅,实际工程里却有一个反复出现的卡点——ADC的能耗与面积。当权重以低位宽切片、连续多轮在阵列里累加时,每一次切片都要触发一次ADC量化;切得越细,ADC调用次数越多,整条流水线的能耗与时延就被这堵墙越撑越厚。
已有的一些解法可以归结为两条路:要么降低ADC的读出精度,换能耗下降但损失输出保真度;要么在时间维度上复用同一组ADC,换吞吐下降但牺牲并行度。Charge-CIM属于第三条路:不改ADC、不降精度,而是在ADC之前,把本该两次量化的部分和,通过差分结构先合并成一次。
二、同一组电容,为什么能做这么多事
Charge-CIM的关键设计,是把开关电容当成一种”统一底座”。在常规的模拟存内计算架构里,输入转换、模拟域乘累加、移位累加和读出量化,往往对应着不同的电路模块;它们各自有各自的采样、保持、放大链路,也各自有各自的噪声源。
在这套新方案里,这些步骤被折叠到同一组开关电容之上:输入电压以电荷的形式落到电容上,权重通过电容比例完成乘加,移位累加通过电容网络的电荷重分配实现,而读出阶段则由同一组电容直接驱动ADC。
这种”一物多用”的直接好处,是模块之间的中间转换被压缩:原本在不同电路之间来回搬运的电压或电荷,现在可以在同一片电容网络上直接接力。最终,独立的ADC调用次数减少,部分和可以以更紧凑的形式汇入下一级。
三、差分读出:让一对部分和共用一次ADC
如果说统一的电容底座解决的是”模块之间不重复搬运”的问题,那么差分读出解决的就是”ADC之前能不能更省”的问题。
在按位切片的模拟乘加里,正负两路部分和往往需要分别量化,再在数字域做减法。Charge-CIM给出的办法是,在ADC量化的同一时刻,让一对符号相反的部分和通过差分结构直接相减,相当于把一次数字域减法挪到了ADC之前。
这件事的工程意义很直接:一次差分量化替代了两次单端量化,ADC的调用次数进一步压缩,同时相减操作在模拟域天然地共享了部分噪声源,对共模干扰也有一定的抑制效果。配合前面”统一底座”的折叠,整条流水线的能耗与面积,因此有了双重下降。
四、实测:CNN和Transformer都受益
论文里的评估覆盖了从CNN到Transformer的多种典型深度网络负载。对这类工作而言,单纯看能耗数字往往会被质疑——毕竟基准选择、位宽设置和工艺节点都会让数字上下浮动。
更值得关注的,是两条横向对比:在同样的网络与位宽设置下,与典型的低精度读出方案相比,Charge-CIM在保持输出保真度的同时显著降低了ADC相关开销;与时间复用的串行化方案相比,则在不引入额外串行延迟的前提下,获得了更紧凑的能耗与面积表现。
这意味着Charge-CIM并不是只在某一个特定负载上”挑出来好看”,而是在两类常见的工作负载上同时把指标往下压——这是模拟存内计算架构最希望看到的结果,也是过去几年这一领域最难同时拿到的两个分数。
五、对存内计算意味着什么
把视角拉远一点看,模拟存内计算过去几年一直在反复回答同一个问题:怎么让ADC墙矮一点。
Charge-CIM给出的回答,核心不在于”换一种ADC”或”换一种工艺”,而在于把整个数据通路重新折叠一遍:让同一组电容承担更多步骤,让一对部分和在ADC之前相减,让原本散落在不同模块之间的转换次数整体下降。
这种思路的可贵之处,在于它并不依赖某一类特殊器件或激进工艺,而是建立在相对成熟的开关电容技术上。当一项架构改进可以靠”少做几次搬运”就换来能耗与面积的双重收益时,它的工程门槛会比想象中更低,也更容易在不同的工艺节点上被复现。
对存内计算这个方向而言,这是一次值得记住的”少做几步”的胜利。