想象一座繁忙的餐厅后厨:主厨(CPU)技艺再精湛,也要一次次放下锅铲,跑到几十米外的仓库(内存)去取食材(数据)。取一趟葱、切一刀、再跑一趟拿高汤——真正“颠勺”的时间不到三成,大部分时间和电费都耗在了“跑腿”上。这就是冯诺依曼架构最著名的“存储墙”。而“存内计算”给了我们另一种可能:干脆把灶台搬进仓库,让食材就摆在手边的“智慧调料架”上。每个格子是一个能记住自己开度的“记忆阀门”(忆阻器),高汤从顶部倒下,流过每个阀门后汇入底部水槽,水槽收集的总量就是一次矩阵向量乘法的结果。这篇文章会带你从“跑腿的主厨”出发,看懂存内计算如何用欧姆定律和基尔霍夫定律替代软件循环,也看清真实阀门并不完美——以及聪明的主厨们如何见招拆招。
存内计算是突破冯诺依曼瓶颈的关键技术路径,已用于边缘 AI 推理芯片与数据中心加速卡。理解它的原理与工程挑战,你才能在 AI 硬件选型、芯片评估和推理部署中做出正确决策,为投身 AI 芯片行业打下扎实基础。
可视化演示
展示系统处理流水线、实时性能指标曲线及多方案对比分析,包含数据流转、吞吐延迟监控与方案评估。
本节配有交互动效(进入视口后自动加载,约 3KB)。
系统可视化 处理流程:输入→处理→模型→输出 性能监控:实时指标 P=L×T
冯诺依曼瓶颈
想象一家生意火爆的餐厅后厨。主厨(处理器)手艺再快,每做一道菜都得放下锅铲,一路小跑去储藏室(内存)取食材(数据):跑一趟拿葱、跑一趟拿蒜、再跑一趟取高汤……一餐饭下来,主厨真正“颠勺”的时间不到三成,其余全耗在跑腿上。图里那条 CPU 与内存之间的粗箭头,就是一条永远拥挤的传菜通道——计算机体系结构里,它叫“存储墙”。
冯诺依曼架构把“计算”与“存储”拆成两个独立部件:CPU 负责算,内存负责存,二者通过总线来回搬运数据。随着处理器主频一路飙升而内存带宽增长缓慢,搬运造成的浪费被急剧放大。到了今天动辄数十亿参数的神经网络时代,待搬运的数据量多到难以想象,“跑腿”开销早已盖过了“做饭”本身。
更深层的问题出在能量上:一次数据搬运消耗的能量,远高于一次乘加运算本身。即便计算单元全速运转,系统能效也被搬运拖垮,这便形成了“功耗墙”。把搬运成本与计算成本之比写出来,差距一目了然:
所以,业界常开玩笑说“没有跑腿,就没有瓶颈”。要打破这道墙,光把储藏室搬近一点远远不够——最好的办法,是让主厨直接在储藏室里做菜。
- 搬运能量分子 $E_{\text{搬运}}$ 表示处理器从内存读写一次数据所消耗的能量,是传统架构里最容易被忽视的“隐形电费”。
- 计算能量分母 $E_{\text{计算}}$ 表示执行一次加法或乘法运算需要的能量,是衡量算力能效的基本单位。
- 数量级$\approx 10^2 \sim 10^3$ 说明搬运成本比计算成本高出一到三个数量级,这正是存储墙与功耗墙共同的数学根源。
存内计算思想
如果给储藏室装上灶台,食材就摆在手边,主厨再也不用跑腿了。更进一步,把菜谱提前写成调料架上一排排可调的阀门——这便是存内计算(Computing-in-Memory)的蓝图:不仅让“做饭的地方”挨着“原料”,还让原料本身参与烹饪。
存内计算的核心思想是“原位计算”:把矩阵向量乘法这类最耗时的操作,直接在存储阵列内部完成,而不是先把全部数据搬出内存再运算。按存储介质不同,主流方案可分为三类:SRAM 存内计算速度快、易与逻辑工艺兼容;RRAM(忆阻器)存内计算密度高、可非易失存储;此外还有基于 DRAM、Flash 等的探索。无论哪种介质,目标都是让数据“就地生成结果”。
从能耗结构上看,存内计算把功耗公式里最大的“搬运项”直接清零:
主厨还是那个主厨,但灶台、调料架与食材融为一体,出菜速度自然天翻地覆——这正是存内计算在推理场景能效远胜传统芯片的根本原因。
- 总功耗$P_{\text{总}}$ 是整个系统运行时的功率,由计算与搬运两部分构成,是衡量芯片能效的总账本。
- 搬运项$P_{\text{搬运}}$ 对应数据在处理器与存储之间穿梭所消耗的功率,是传统架构中的“大头开销”。
- 原位计算转移$\xrightarrow{\text{原位计算}}$ 表示通过把运算搬进存储阵列,使搬运功率趋近于零,总功率约等于计算功率。
忆阻器原理
智慧调料架的关键,是每个格子里的“记忆阀门”:你把它拧到某个开度,它就牢牢记住这个位置,即使断水断电也不松手。酱汁流过阀门的量,恰好等于“阀门开度 × 倒入流速”——开度大,过汤多;开度小,过汤少。
这个会记忆开度的阀门,在电路世界里就是忆阻器(Memristor)。忆阻器的核心参数是电导 $G$(电阻的倒数):$G$ 越大,阀门开得越大、越容易导电。关键在于,$G$ 可以被编程为多个稳定档位,断电后依然保持,天然充当“模拟权重存储器”。实际芯片中,忆阻器通常排成横纵交错的交叉阵列:水平方向是字线,竖直方向是位线,每个交叉点就是一个忆阻器单元,整块阵列如同一面巨大的调料架。
忆阻器表达权重的本质,是让电导落在某个离散档位上。档位越多,单个器件能存储的比特数越高:
有了会“记得开度”的阀门,调料架才能一边存储一边参与做菜——“存”与“算”在物理层面合为一体,这正是存内计算区别于传统存储芯片的分水岭。
- 电流$I$ 表示流过忆阻器单元的电流,它是后续列线求和的最小贡献单位。
- 电导$G$ 是器件的模拟电导,好比阀门的开度,决定了“导通能力”的大小。
- 欧姆关系$I = G \times V$ 表明电流由电导与电压共同决定,乘法在物理上一步完成,无需软件指令。
- 档位集合$\{g_1, \ldots, g_{2^B}\}$ 表示电导可编程为 $2^B$ 档,即单个器件可存储 $B$ 比特权重。
矩阵乘法实现
做菜时,主厨从架子顶部把高汤缓缓倒下:汤水沿每一行流过,路过每个阀门时,流过的量由“阀门开度 × 该处汤水量”决定;底部每一列的水槽把所有来水汇在一起——整套流程,恰好完整实现了矩阵向量乘法。
在交叉阵列上,这条流程的电路实现是:行线施加输入电压 $V_i$(对应向量的每个分量),交叉点的忆阻器电导 $G_{ij}$ 代表权重矩阵的元素,列线上汇集的电流 $I_j$ 就是乘加结果。整个过程完全由欧姆定律和基尔霍夫电流定律驱动,没有任何软件循环,因此天然具备极高的并行度。
第 $j$ 列汇集的总电流,可以写成一个优雅的式子:
不过,电导只能是正数,而神经网络权重有正有负。实际芯片因此常采用“差分阵列”:每个权重用一对器件($G^+$、$G^-$)表示,二者之差还原权重的符号与大小。这就好比每道配方都配一甜一咸两瓶阀门,最终味道由两者之差决定——一石二鸟的设计。
- 行输入$V_i$ 是施加在第 $i$ 行的输入电压,对应向量 $x$ 的第 $i$ 个分量,好比倒入第 $i$ 排格子的汤汁量。
- 单元电导$G_{ij}$ 是 $(i,j)$ 位置忆阻器的电导,代表权重矩阵第 $i$ 行第 $j$ 列的元素,好比该格阀门的开度。
- 支路电流$V_i \times G_{ij}$ 由欧姆定律给出,是该单元流入第 $j$ 条列线的电流贡献。
- 求和汇聚$\sum_{i=1}^{N}$ 依据基尔霍夫电流定律,把同一列所有电流相加,结果恰好等于矩阵向量乘法的第 $j$ 个输出分量。
精度与挑战
完美的阀门只存在于图纸上。真实的记忆阀门会生锈、弹簧会疲劳:开度随时间慢慢偏移,反复拧动还会松脱;更麻烦的是,同一家工厂出品的阀门,彼此之间天然就存在细微差别——这就是“工艺变异”。主厨若对阀门误差不闻不问,再好的菜谱也会翻车。
对应到器件层面,忆阻器存在三大非理想特性。其一是电导漂移:写入的状态会随时间和温度缓慢偏离;其二是 I-V 非线性:电流与电压并非严格成正比,阀门“开得越大越容易松”;其三是器件间变异:同一阵列中每个器件的特性都不完全一致,仿佛每只阀门的弹簧硬度都略有不同。再叠加外围电路的限制——输入需要 DAC 编码、输出需要 ADC 量化——实际推理精度会显著偏离理想值,这就是“映射精度损失”。
把一只阀门的真实开度写出来,理想值背后跟着一串“偏差项”:
所以,把菜谱刻进真实世界的调料架后,出锅的味道总难免有点“走样”。好消息是——经验丰富的主厨们早就备好了对策。
- 理想值$G_{\text{理想}}$ 是写入时希望达到的目标电导,对应训练好的精确权重。
- 漂移项$\Delta G_{\text{漂移}}$ 表示电导随时间、温度缓慢偏移,如同阀门弹簧逐渐松弛。
- 噪声项$\Delta G_{\text{噪声}}$ 是读写过程中的随机扰动,每次读取都会带来微小起伏。
- 变异项$\Delta G_{\text{变异}}$ 反映制造工艺造成的器件间固有差异,属于“出厂自带”的误差。
缓解与验证
有经验的主厨不会坐等阀门完美,他们会做三件事:给每道配方装两瓶互相对冲的阀门,抵消开度波动;开张前逐格校准所有阀门;再在菜谱设计时就故意留出容错空间。这套方法论放进芯片设计里,每一件都有对应的技术落点。
缓解策略可以概括为三个层次。器件与电路层面:采用差分阵列抵消共模漂移,并用“写入-校验-重写”(write-verify)把每个电导校准到目标值附近。算法层面:通过含噪训练、量化感知训练提升模型对器件误差的鲁棒性,让网络“天生耐造”。系统层面:通过冗余计算和动态补偿兜底,即使个别阀门失效,整体推理结果依然可靠。
差分结构的核心收益在于共模误差消除。假设正、负阵列的电导同时漂移了同一个量,那么作差之后漂移被抵消:
正是靠着“阀门对冲 + 逐格校准 + 容错菜谱”这套组合拳,存内计算已经从论文走进真实芯片:IBM、台积电以及国内多家 AI 芯片公司,都已在 SRAM/RRAM 存内计算上跑通了语音唤醒、图像分类等真实应用,用极低功耗验证了方案的可行性与效果。
- 正支路$I_j^{+}$ 由正电导阵列($G^{+}$)产生,代表正权重的贡献部分。
- 负支路$I_j^{-}$ 由负电导阵列($G^{-}$)产生,代表负权重的贡献部分。
- 作差抵消$I_j^{+} - I_j^{-}$ 利用差分结构减去两路的公共漂移和噪声,使误差互相抵消。
- 权重还原$G_{ij}^{+} - G_{ij}^{-}$ 的差值正比于原始权重,既支持正负权值,又增强了抗干扰能力。
AI 应用场景
智能语音唤醒芯片
阶段:边缘端模型推理
解决的问题:智能音箱、耳机需要 7×24 小时监听唤醒词,传统方案中麦克风数据持续从内存搬运到 DSP 处理,待机功耗高、电池不耐用。存内计算把语音模型权重直接烧录进忆阻器阵列,音频特征输入后直接在阵列内完成矩阵乘法,将唤醒功耗从毫瓦级压到微瓦级。
具体案例:某国产 AI 芯片公司采用 RRAM 存内计算方案实现“小爱/天猫精灵”等唤醒词的本地识别,待机功耗较传统 DSP 方案降低约一个数量级,响应延迟也因省去搬运而明显缩短。
云端推荐排序加速
阶段:数据中心推理服务
解决的问题:推荐系统里 embedding 与 MLP 层包含海量矩阵乘加运算,GPU 内存带宽成为瓶颈,单次请求耗电高、延迟大。存内计算加速卡把权重驻留在片上的 RRAM 阵列中,输入特征直接完成乘加,显著缓解“搬运墙”。
具体案例:某互联网公司在广告点击率预估模型上部署存内计算原型卡,实测单卡能效比(每瓦特推理次数)较传统 GPU 提升 5~10 倍,端到端延迟降低约 40%。
可穿戴健康监测
阶段:端侧实时推理
解决的问题:手表、手环中的心电/血氧分析需要持续运行小型神经网络,电池容量有限。存内计算让网络权重“长在”存储里,省去频繁搬运,使可穿戴设备可以全天候分析心律异常,而无需频繁充电。
具体案例:某医疗可穿戴设备厂商在 PPG 信号分类器上采用 SRAM 存内计算协处理器,整机续航从 3 天延长到 10 天,房颤检测准确率保持在 93% 以上。
Python 演示
import numpy as np def train_layer(X, y, lr=0.1, epochs=100): """在普通计算机上训练单层感知机, 得到权重矩阵 W""" n = X.shape[0] W = np.random.randn(2, X.shape[1]) * 0.5 for _ in range(epochs): scores = X @ W.T exp = np.exp(scores - scores.max(axis=1, keepdims=True)) probs = exp / exp.sum(axis=1, keepdims=True) W -= lr * (probs - y).T @ X / n return W def map_to_conductance(W, G0=1.0, w_max=6.0): """把权重映射为差分忆阻器电导对 (G+, G-)""" G_plus = G0 + W / w_max G_minus = G0 - W / w_max return G_plus, G_minus def crossbar_inference(X, G_plus, G_minus, noise=0.02): """在模拟交叉阵列上执行矩阵向量乘法 I = V @ G""" I_plus = X @ G_plus.T I_minus = X @ G_minus.T I_plus *= 1 + noise * np.random.randn(*I_plus.shape) I_minus *= 1 + noise * np.random.randn(*I_minus.shape) return I_plus - I_minus def main(): rng = np.random.default_rng(42) X = rng.random((20, 4)) y = (X[:, 0] + X[:, 1] > 1).astype(int) y_onehot = np.eye(2)[y] W = train_layer(X, y_onehot) G_plus, G_minus = map_to_conductance(W) scores = crossbar_inference(X[:5], G_plus, G_minus) preds = np.argmax(scores, axis=1) print("预测类别:", preds) print("真实类别:", y[:5]) print("一致率:", np.mean(preds == y[:5])) if __name__ == "__main__": main()
W -= lr * (probs - y).T @ X / n梯度下降更新权重,等价于传统数字芯片里的“训练”阶段。G_plus = G0 + W / w_max把权重线性映射为正电导,模拟“阀门开度记录权重”。G_minus = G0 - W / w_max配套的负电导支路,差分结构于是可以表达正负权重。I_plus = X @ G_plus.T模拟阵列正支路的电流汇聚,一行代码对应整个物理阵列的并行乘加。I_plus *= 1 + noise * np.random.randn(...)给电流乘上随机扰动,模拟器件非理想特性中的噪声。return I_plus - I_minus差分作差抵消共模误差,正是芯片设计中削弱漂移的核心思想。
常见误区
误区既然问题是数据搬运太慢,那把 L1/L2 缓存多做大几级、让数据离 CPU 更近一些,不就是存内计算了吗?
正解完全不是一回事。缓存再大,也只是把仓库搬到后厨门口,主厨依然要一勺一勺地取食材——搬运并未消除,只是缩短。存内计算的本质是让运算直接在存储阵列内部发生:阀门(忆阻器)里的电导本身就是权重,通电即算,压根不需要把数据“搬出来”。
为何常见:因为两者从效果上看都缓解了访存延迟,初学者容易把“减少搬运距离”误当成“消除搬运”。
误区模拟电路嘛,只要把电压电流量得足够精细,精度就能做到和数字芯片一样的 16 位、32 位。
正解模拟计算的精度受器件噪声、电导漂移、ADC/DAC 量化等多重限制,实际有效精度通常只有 4~8 比特。数字芯片可以通过增加位宽无限提升精度,而模拟器件的物理噪声是“地板”,再精细的测量也绕不过去。
为何常见:课本上学的都是理想器件模型,忽略了真实世界中的热噪声、工艺误差和老化漂移。
误区权重一旦烧录进忆阻器,就像刻进石头一样稳固,推理结果永远精确,不需要任何维护。
正解忆阻器的电导会随时间漂移、受温度影响,反复读取也会造成轻微扰动,如同记忆阀门“弹簧疲劳”。因此真实芯片需要定期校准、写入校验,或配合容错训练来吸收误差。
为何常见:人们常把非易失存储器类比成 ROM,认为“断电不丢”就等于“永不改变”,忽略了模拟状态的连续漂移特性。
误区存内计算能效这么高,AI 芯片迟早全面换成存内计算架构,GPU 会被淘汰。
正解存内计算在矩阵乘加密集、容错性强的推理场景优势突出,但在通用计算、高精度训练、复杂控制流等任务上仍不如数字处理器。当前的主流趋势是异构融合:GPU/CPU 负责灵活调度与高精度运算,存内计算阵列充当高能效推理引擎。
为何常见:只盯着存内计算在特定 benchmark 上的亮眼数字,忽略了任务的多样性、生态兼容成本和精度天花板。
面试题
Q1. 冯诺依曼架构中“存储墙”问题的本质是什么?
- A.存储器容量增长停滞
- B.CPU与内存速度差距大← 正确答案
- C.存储器价格过于昂贵
- D.存储芯片体积难缩小
答案:B。“存储墙”指的是处理器计算速度与内存访问速度之间不断拉大的鸿沟。主厨(CPU)越跑越快,但仓库(内存)取食材的速度跟不上,跑腿时间成为瓶颈。容量、价格、体积都不是“墙”的核心含义。
Q2. 忆阻器中电流、电压与电导三者遵循哪条物理定律?
- A.欧姆定律← 正确答案
- B.库仑定律
- C.安培定律
- D.楞次定律
答案:A。忆阻器单元的关系式是 I = G × V,这正是欧姆定律的变体:电流等于电导乘以电压。就像水流量等于阀门开度乘以水压,这道题考的是存内计算诞生乘法的最基本原理。
Q3. 模拟存内计算中,神经网络权重通常以什么形式存储在器件中?
- A.数字二进制码
- B.模拟电导数值← 正确答案
- C.电容电荷数量
- D.晶体管开关状态
答案:B。在忆阻器阵列中,权重通过电导的多档位数值来表达,G 越大代表权重越大,如同阀门开度记录配方分量。数字二进制码是传统存储的做法;电荷和开关状态都不是忆阻器表达权重的核心方式。
Q4. 实际存内计算芯片常采用 (G+, G-) 差分结构,最主要的原因是什么?
- A.支持正负权重← 正确答案
- B.提升存储容量
- C.降低阵列面积
- D.简化外围电路
答案:A。电导只能是正数,而神经网络权重有正有负。差分结构用一对器件的电导之差还原权重符号,同时还能抵消两路的共模漂移。提高容量、减小面积、简化电路都不是差分设计的主要动机。
Q5. 电导漂移对神经网络推理的影响主要体现在哪个方面?
- A.输入电压幅度变化
- B.权重值缓慢偏离← 正确答案
- C.矩阵维度发生改变
- D.时钟频率逐渐降低
答案:B。电导漂移指写入的电导状态随时间、温度缓慢变化,而权重正是以电导形式存储的,所以漂移的直接后果是“菜谱分量走样”——权重值偏离训练好的数值。输入电压、矩阵维度、时钟频率都与电导漂移无直接关系。
Q6. 存内计算最核心的架构优势是什么?
- A.大幅提升存储密度
- B.消除数据搬运瓶颈← 正确答案
- C.提高时钟主频上限
- D.简化软件开发流程
答案:B。存内计算把乘法加法直接搬进存储阵列,让数据在“原产地”被消费,从而消除了最耗时的搬运环节。它并不提升存储密度或主频,反而对软件编译提出了新的适配要求。
Q7. 差分映射 w = α(G+ − G−),若 G+ 与 G− 同时漂移 +δ,则计算出的权重如何变化?
- A.变为零
- B.增大 δ
- C.保持不变← 正确答案
- D.变为负值
答案:C。两路电导同时漂移同一个量时,(G+ + δ) − (G− + δ) = G+ − G−,漂移被完全抵消。这正是差分设计“阀门对冲”的巧妙之处——公共误差消除,真实信号保留。
Q8. 存内计算面临的主要工程挑战包括哪些?
- A.器件工艺变异← 正确答案
- B.电导漂移非线性← 正确答案
- C.芯片面积变大
- D.映射精度受限制← 正确答案
答案:ABD。工艺变异让器件间特性不一致,电导漂移与 I-V 非线性使模拟结果偏离理想值,DAC/ADC 的有限位宽又导致映射精度损失,这三者共同构成主要挑战。芯片面积变大不是存内计算特有的核心难题。
Q9. 以下哪些属于缓解存内计算精度损失的策略?
- A.差分阵列映射← 正确答案
- B.写入后校准补偿← 正确答案
- C.取消输入转换
- D.容错网络训练← 正确答案
答案:ABD。差分阵列抵消共模漂移,写入-校验-重写把电导校准到目标值,含噪训练让模型对误差更鲁棒,三者都是主流缓解手段。取消输入转换意味着去掉 DAC,在实际系统中并不可行。
Q10. 忆阻器存内计算适合 AI 推理场景的原因有哪些?
- A.模拟域天然并行← 正确答案
- B.极低推理功耗← 正确答案
- C.精度无任何损失
- D.减少权重搬运← 正确答案
答案:ABD。交叉阵列在模拟域中所有乘加同时发生,天然并行;物理执行省去搬运,功耗极低且无需反复读取权重。但模拟计算存在精度损失,远非“无任何损失”,因此 C 错误。