在水城,往农田送水历来有两种方式:一种是拎水桶——把水装进标准容器,一桶一升,账房先生数得明明白白,可伙计们跑断腿;另一种是架水管——拧开阀门,水流源源不断、粗细随心,速度快得惊人,却没人能精确说出“这一秒流过多少升”。老周管着全城的灌溉调度,他渐渐意识到:水桶是数字,水管是模拟。更要紧的是,他发明了一套“让水闸自己算账”的办法——把配水手册直接刻在闸门上,水一开,结果就自己流出来了。这就是模拟计算与存内计算的故事:用连续的物理量(水位、电流、电导)直接表达数值和运算,把存储与计算融进同一个物理器件。SRAM 像精密的旋钮阀门,RRAM 像能被水流“记住形状”的记忆合金闸门。本文就用这套水城的语言,带你从零走进模拟计算的灌溉世界。

岗位关联

理解模拟计算是读懂 AI 芯片底层原理的钥匙。掌握它,你就能看懂“存算一体”时代的技术选型、评测指标与精度权衡,为设计低功耗 AI 系统打下根基。

目录
  1. 可视化演示
  2. 模拟计算概述
  3. 存内计算原理
  4. SRAM计算单元
  5. RRAM计算单元
  6. 信号转换环节
  7. 性能特性分析
  8. 优化策略方案
  9. 应用与展望
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

展示RRAM交叉阵列模拟乘加电路(电压V→电导G→电流I=ΣG·V)、im2col卷积映射与脉冲编码算法、以及模拟vs数字计算在能效(10fJ vs 1000fJ/100x)、TOPS、精度(6bit vs 16bit)上的对比与三大工程挑战(失配/温漂/噪声)。

本节配有交互动效(进入视口后自动加载,约 3KB)。

RRAM交叉阵列模拟乘加 行波导施加输入电压V_i,RRAM单元电导G_ij编程为权重,电流I_j=ΣG_ij·V_i物理求和完成MAC 吉尔伯特乘法器(gm)实现V→I跨导转换,物理定律一步完成运算无需时钟驱动 I_j=Σ_i G_ij·V_i 模拟计算利用连续物理量直接运算,物理过程即计算

模拟计算概述

在水城,往农田送水有两种方式。第一种是拎水桶:每桶刚好一升,伙计们一桶一桶拎到田里,桶数清清楚楚,可速度慢、人累;第二种是架水管:拧开总阀门,水流源源不断、粗细随心,没人能精确说出“这一秒流过多少升”。老周过去一直用水桶,因为账房先生只认整数。可眼看水田越来越多,他不得不认真打量起那根令人生畏又令人心动的水管。

数字计算就是拎水桶:用 0 和 1 编码一切数值,一位一位搬、一位一位算。模拟计算则是水管:直接让电压、电流等连续物理量表达数值大小,运算就发生在物理规律里——两个电流在节点交汇处自然相加,不需要加法器;水闸开度乘以水流,乘积就体现在流量上,不需要乘法器。神经网络里最频繁的“权重乘输入再加和”,恰恰是物理世界最擅长的事。

以第 j 个输出神经元为例,它要算的是一次加权求和:

yj=∑i=1nWjixiy_j = \displaystyle\sum_{i=1}^{n} W_{ji} x_i

1. 输出分量:等式左边 y_j 表示第 j 个神经元的输出,对应水城第 j 条干渠最终获得的水量。

yjy_j

2. 累加求和:符号 Σ 表示把 i 从 1 到 n 的所有项加在一起,对应各条支渠汇入干渠的水流之和。

∑i=1n\displaystyle\sum_{i=1}^{n}

3. 权重与输入:W_ji x_i 是第 i 路输入与权重的乘积,对应“第 i 条支渠的水速 × 水闸开度”。

WjixiW_{ji} x_i

数字水桶要雇无数伙计来回拎,模拟水管却让水自己流、自己在渠口相遇、自己相加。明白这一点,就抓住了模拟计算乃至存内计算的灵魂:让物理规律替我们算,而不是让电路模仿人类一步一步地算。

存内计算原理

老周发现,即便换了水管,配水手册还锁在中央档案室里。每次调配水量,伙计们先要去档案室抄录各田配比,送回调度室核算,再拿着命令去拧阀门。这一来一回,路上跑死马,账房算秃头。这正是计算机领域的“冯·诺依曼瓶颈”:数据在存储器和计算单元之间反复搬运,既耗能又耗时,速度被“跑腿”卡死。

存内计算(存算一体)的回答是:把配比直接刻在水闸上。每条支渠的水闸开度就是权重,水一开,乘累加自动完成,结果沿着干渠直接流向下游。存储单元本身变成了计算单元,“档案室”与“调度室”合二为一,数据再也不出远门。这既是存储与计算的物理融合,也是模拟计算最经典的舞台。

硬件上,最经典的实现是交叉阵列(crossbar):横线是输入行,竖线是输出列,每个交叉点是一个存储器件(SRAM 单元或 RRAM 器件),其状态代表权重。输入电压沿行线送入,电流穿过器件后在列线汇流。依据基尔霍夫电流定律,列线上的电流恰好是所有行输入的加权和:

Ij=∑iGijViI_j = \displaystyle\sum_{i} G_{ij} V_i

1. 输出电流:I_j 是第 j 条列线上的总电流,即第 j 个输出的模拟量表达,对应第 j 条干渠的总水量。

IjI_j

2. 器件电导:G_ij 是交叉点器件的电导(电阻的倒数),对应水闸开度,用来存储权重。

GijG_{ij}

3. 输入电压:V_i 是第 i 行输入的电压,对应第 i 条支渠的水压。

ViV_i

4. 基尔霍夫汇流:求和表示所有行的电流在同一条列线上自然叠加,无需额外加法器。

∑iGijVi\displaystyle\sum_{i} G_{ij} V_i

这样,一次矩阵向量乘法在一瞬间“流”完,效率堪比大水漫灌整片梯田。SRAM 与 RRAM 正是两种不同材料打造的“水闸”,接下来我们分别登门拜访。

SRAM计算单元

SRAM 水闸像精密旋钮阀门:用电压信号驱动,能高速开合,坏处是必须持续通电维持状态,一断电开度就丢了(易失性)。它的最小单元叫 6T 单元——六个晶体管组成一对互相咬合的反相器齿轮,牢牢记住 0 或 1。由于单单元只存一位,多位权重需要若干单元拼合,电流域、电荷域各有分工。

在 SRAM 存内计算里,权重通常以多位二进制形式存在多个单元中。电荷域像“预蓄水”:先把输入电压加载到位线上,让电荷按比例分配共享;电流域像“分流”:让位线放电,放电电流由存储值控制,各路电流在列线上叠加。两种方式都把“加法”交给物理汇流,“乘法”交给电荷或电流的比例关系。

电荷域的累加可用电荷守恒描述——多个电容上的电荷汇入一个总电容,输出电压是各支路电压的加权平均:

Vout=∑iCiViCtotV_{out} = \frac{\displaystyle\sum_{i} C_i V_i}{C_{tot}}

1. 输出电压:V_out 表示累加电容上的最终电压,对应汇水池最终的水位读数。

VoutV_{out}

2. 电荷加权:C_i V_i 是第 i 个单元贡献的电荷量,电荷好比“水分子总数”,电容好比“水桶容积”。

CiViC_i V_i

3. 总电容归一:除以总电容 C_tot 相当于把多桶水倒进一个大池子后测量水位。

1Ctot\frac{1}{C_{tot}}

SRAM 旋钮虽好,但断电就“失忆”,而且六个晶体管占面积大。于是人们开始寻找能“记住开度”的非易失阀门——RRAM 登场了。

RRAM计算单元

RRAM 水闸像一块“记忆合金”:大电流如洪峰冲过闸门,改变内部导电细丝的形状,冲得越狠开度越大;断电后开度依然保持(非易失)。要改配比就再冲一次。RRAM 两端的电阻可被编程为不同阻值,而电导值(电阻的倒数)正好对应权重——这是它与 SRAM 最本质的分工差异。

SRAM 存的是“0/1 挡位”,需多单元拼一个权重;RRAM 的模拟电导可以直接表达连续权重,一个器件就是一个权重,这让 RRAM 在单位面积密度上更有优势。当然,导电细丝每次冲刷的粗细总有随机起伏,多比特状态也不够稳定,像是被泥沙反复修改的闸门——这个缺点我们留到优化策略一节再治。

计算时,输入电压加载在器件两端,依据欧姆定律,流过器件的电流等于电导乘以电压:

Ii=GiViI_i = G_i V_i

1. 单器件电流:I_i 是流过第 i 个 RRAM 器件的电流,代表这一路的加权结果。

IiI_i

2. 电导即权重:G_i 是器件当前的电导,由编程时导电细丝的粗细决定,对应闸门开度。

GiG_i

3. 电压即输入:V_i 是加在器件两端的输入电压,对应上游水压。

ViV_i

4. 欧姆定律:I = G·V 是欧姆定律的体现,电导是电阻的倒数,开度越大水流越畅。

Gi=1RiG_i = \frac{1}{R_i}

RRAM 能“记住”开度,却记不太准,每一次冲刷都会留下随机的痕迹。好在后文的校准与冗余策略,能让这块“记性不好”的闸门将功补过。

信号转换环节

外界与水城打交道需要两道翻译:调度室的纸质命令(数字 0/1)要被翻译成水闸开度(模拟电压),这叫数模转换 DAC;测水员要把干渠水位读数登记成数字报表,这叫模数转换 ADC。没有这两道翻译,模拟水城就无法与外面的数字世界对接。每次模拟乘法运算前,数字输入经 DAC 变成电压;运算结束,列电流经 ADC 变回数字。

DAC 的位数决定输入细腻度:位数越多,电压分得越细,就像尺子刻线越多量得越准。ADC 的位数则决定输出读数精度。以 DAC 为例,N 位数字 D 被转换成满量程电压的对应分数:

Vout=Vref⋅D2NV_{out} = V_{ref} \cdot \frac{D}{2^{N}}

1. 输出模拟电压:V_out 是 DAC 输出的电压,用来驱动后续的模拟计算阵列。

VoutV_{out}

2. 满量程参考:V_ref 是参考电压,对应水表的满刻度,是转换的“标准尺”。

VrefV_{ref}

3. 数字编码:D 是 N 位二进制数对应的整数值,范围从 0 到 2^N − 1。

D∈{0,1,…,2N−1}D \in \{0, 1, \dots, 2^{N}-1\}

4. 分辨率分母:2^N 表示把满量程细分为 2^N 格,N 越大格子越细,量化误差越小。

2N2^{N}

翻译环节是模拟水城的“度量衡”,也是误差的重要来源:测水员尺子刻度有限,读出的水位总带舍入误差。这正是下一节要算的账。

性能特性分析

老周的实验田试运行一个月后,账房先生摆出三本账:能效、吞吐、精度。好消息是,送水再也不雇跑腿伙计,一次矩阵运算就是“大水漫灌”,能耗与延时大幅下降;坏消息是,测水员汇报的数字总与理论值差一点点。模拟存内计算的能效优势来自两点:消除数据搬运、物理并行。

传统数字方案做矩阵乘法,需要从内存反复搬数据、逐个乘加;模拟存内计算让乘累加在阵列里一次“流”完,能效可提升两到三个数量级,吞吐量同步大涨。代价是精度损失:权重量化、DAC/ADC 转换、器件噪声、工艺偏差都会引入偏差。相对误差是常用的度量:

Erel=∥Wx−W^x^∥∥Wx∥E_{rel} = \frac{\lVert Wx - \hat{W}\hat{x} \rVert}{\lVert Wx \rVert}

1. 理想结果:Wx 是数学上精确的矩阵向量积,对应账房先生心算的标准答案。

WxWx

2. 模拟结果:Ŵx̂ 是经过量化、转换、噪声后的实际结果,对应测水员的实测报表。

W^x^\hat{W}\hat{x}

3. 向量范数:‖·‖ 表示向量长度,把所有分量的误差“拧成一股绳”来度量。

∥⋅∥\lVert \cdot \rVert

4. 相对误差:分子除以分母得到无量纲比值,让不同规模的问题可在同一把尺子上比较。

∥Wx−W^x^∥∥Wx∥\frac{\lVert Wx - \hat{W}\hat{x} \rVert}{\lVert Wx \rVert}

精度损失虽是模拟计算的“阿喀琉斯之踵”,但水城自有对策:闸门老化就校准、怕读数不准就多装几根尺子、重要灌区就用粗细双管。这正是下一节要讲的优化策略。

优化策略方案

水闸用久了会泥沙淤积,开度偏了;测水员眼睛也会花。老周的经验浓缩成三个字:校、冗、混。校是定期校准每扇闸门,冗是对关键闸门做双备份取平均,混是重要农田用精细的细水管(高精度)、普通农田用粗水管(低精度)。对应到存内计算,就是校准补偿、冗余映射、混合精度三大法宝。

校准补偿:先测量每个器件的实际电导,建立一张“真实权重表”,再在软件里补偿偏差,相当于给每扇闸门记一张“偏了多少”的小抄。冗余映射:让多个 RRAM 器件共同表示一个权重,读取后取平均,抑制单器件的随机噪声。混合精度则按数据敏感性分配资源。

混合精度常见实现之一是“位切片”:把一个高精度权重拆成 B 张不同权重的位平面,分别做模拟计算后再按二进制权重合并:

W=∑k=1B2−kW(k)W = \displaystyle\sum_{k=1}^{B} 2^{-k} W^{(k)}

1. 权重拆分:W 表示一个高精度权重,被拆分成 B 份(B 个位平面)。

WW

2. 位平面权重:W^(k) 是第 k 个位平面上的权重,只含 0/1 或小幅值,对应一层薄水板。

W(k)W^{(k)}

3. 二进制加权:2^{-k} 是第 k 位的权值,k 越小权重越大,像水板层数越厚贡献越大。

2−k2^{-k}

4. 加权求和:把所有位平面的贡献按权叠加,恢复出完整权重。

∑k=1B2−kW(k)\displaystyle\sum_{k=1}^{B} 2^{-k} W^{(k)}

此外还有“算法协同设计”:训练阶段就引入低比特噪声,让模型变得“皮实”,推理时即使模拟计算有偏差也能正常工作。水城由此开出了既省水又保收成的双赢药方。

应用与展望

水城的经验很快传遍四方:偏远农场没有中央调度室,靠自给自足的闸门就地计算;大灌区要靠它省下海量跑腿成本。存内计算也找到了同样的舞台——凡是被矩阵乘累加主宰的地方,都有它大显身手的空间。

当前最成熟的应用是神经网络推理:卷积、全连接、注意力机制本质上都是矩阵运算,模拟存内计算的乘累加效率让它在低功耗边缘 AI 中大放异彩。面向未来,模拟的连续表达天然贴合量子态与神经形态计算的“模糊美学”——量子 AI 与未来计算都把连续物理量当作第一公民,存内计算的交叉阵列或许正是连接经典与量子的一座水桥。

从能效账本看,一个模拟存内计算系统的总能耗可以拆成三笔开销:

Etotal=EMVM+EDAC+EADCE_{total} = E_{MVM} + E_{DAC} + E_{ADC}

1. 总能耗:E_total 是整个模拟存内计算系统的总能耗,对应水城的总耗水量。

EtotalE_{total}

2. 乘累加能耗:E_MVM 是阵列中模拟乘累加消耗的能量,这是存内计算的“主业”,效率极高。

EMVME_{MVM}

3. DAC 能耗:E_DAC 是数模转换开销,输入数据越多、位数越高越昂贵。

EDACE_{DAC}

4. ADC 能耗:E_ADC 是模数转换开销,通常随精度位数增加而近似指数增长。

EADCE_{ADC}

老周站在水城的最高处,看着细流汇入干渠、干渠奔向田野。他知道,真正的变革不是把水桶换成了水管,而是让水自己学会了算账——而这场灌溉革命,才刚刚开始。

AI 应用场景

智能耳机的始终在线唤醒词检测

阶段:推理部署(边缘端)

解决的问题:智能耳机待机时需 7×24 小时监听唤醒词,传统数字芯片反复搬运矩阵运算数据,功耗高到电池无法承受。模拟存内计算把唤醒词检测所需的乘累加放进 SRAM 阵列一次“流”完,消除搬运开销。

具体案例:某可穿戴厂商将小规模 SRAM 存内计算宏嵌入耳机主控,唤醒词检测功耗从毫瓦级降至微瓦级,续航提升近 4 倍;同时用 ADC 的低位数设计换取更低功耗,配合训练时注入量化噪声,唤醒准确率几乎无损。

电商推荐系统的向量召回加速

阶段:在线推理(数据中心)

解决的问题:推荐系统每秒要处理上亿次“用户 × 物品”的相似度计算,本质是海量矩阵乘累加;传统方案中访存能耗占总能耗六成以上。RRAM 存内计算把相似度权重映射到交叉阵列,用位切片混合精度执行。

具体案例:某电商平台实验性部署 RRAM 存内计算加速卡,将召回阶段向量检索吞吐提升 5 倍,单次推理能耗下降 70%;通过校准补偿与冗余映射,精度损失经重训练后控制在 0.3% 以内。

工业产线的实时视觉缺陷检测

阶段:模型训练与推理协同

解决的问题:产线质检要求实时处理高分辨率图像,传统方案要么精度高但慢,要么快但精度低。借助“算法协同设计”,在训练时模拟模拟器件的噪声与量化,让卷积网络对模拟误差天然鲁棒,再用存内计算加速卷积层。

具体案例:某面板厂将混合精度 SRAM 存内计算用于 AOI 光学检测,卷积层运算迁移至存内计算宏,单帧处理延时从 120ms 降至 35ms,漏检率不升反降,产线节拍因此提升了近一倍。

Python 演示

python70 行
import numpy as np  def quantize(x, levels):    """把连续值量化到 levels 个档位,模拟 RRAM 电导档位"""    x = np.clip(x, 0.0, 1.0)    idx = np.round(x * (levels - 1))    return idx / (levels - 1)  def write_read(weights, trials=1, noise_std=0.06):    """模拟 RRAM 写入噪声:多次写入读取,trials=1 为单次"""    noise = np.random.normal(1.0, noise_std, (trials,) + weights.shape)    reads = weights * noise    if trials == 1:        return reads[0]    return np.median(reads, axis=0)  def analog_mvm(weights, inputs, w_bits=4, adc_bits=6):    """模拟存内计算完整链路:权重量化 -> 电流累加 -> ADC 量化"""    w_q = quantize(weights, 2 ** w_bits)      # 权重映射为电导档位    x_q = quantize(inputs, 16)                # 输入 DAC 量化    out = w_q @ x_q                           # 交叉阵列电流汇流    v_max = max(float(np.max(out)), 1e-9)    step = v_max / (2 ** adc_bits)            # ADC 量化步长    out_adc = np.round(out / step) * step    return out_adc, w_q, out  def bit_sliced_mvm(weights, inputs, w_bits=4):    """位切片混合精度:把权重按二进制位拆成多张平面计算后合并"""    levels = 2 ** w_bits    w_idx = np.round(weights * (levels - 1)).astype(int)    total = np.zeros(weights.shape[0])    for k in range(w_bits):        plane = ((w_idx >> k) & 1).astype(float)        total += (2 ** k / (levels - 1)) * (plane @ inputs)    return total  def main():    np.random.seed(42)    W = np.random.rand(4, 4)                  # 理想权重矩阵    x = np.array([0.2, 0.5, 0.8, 0.3])        # 输入向量    ideal = W @ x    print("理想输出:", np.round(ideal, 4))     out_adc, w_q, _ = analog_mvm(W, x)    err_a = np.linalg.norm(out_adc - ideal) / np.linalg.norm(ideal)    print("模拟输出:", np.round(out_adc, 4))    print("完整模拟链路误差: %.2f%%" % (err_a * 100))     err_q = np.linalg.norm(w_q @ x - ideal) / np.linalg.norm(ideal)    print("仅权重量化误差: %.2f%%" % (err_q * 100))     single = write_read(w_q, trials=1)    calib = write_read(w_q, trials=8)    err_n = np.linalg.norm(single @ x - ideal) / np.linalg.norm(ideal)    err_c = np.linalg.norm(calib @ x - ideal) / np.linalg.norm(ideal)    print("单次读取误差: %.2f%%" % (err_n * 100))    print("中位数校准后误差: %.2f%%" % (err_c * 100))     bs = bit_sliced_mvm(w_q, x, w_bits=4)    err_b = np.linalg.norm(bs - ideal) / np.linalg.norm(ideal)    print("位切片重建误差: %.2f%%" % (err_b * 100))  if __name__ == "__main__":    main()
目的:在 Python 里仿真“模拟存内计算”的完整链路——权重电导量化、输入 DAC 量化、ADC 输出量化、器件写入噪声,以及校准与位切片两种补偿手段,量化对比每一步引入的相对误差。
  1. out = w_q @ x_q用矩阵乘法一次性模拟“交叉阵列电流汇流”,对应水渠交汇的自然相加。
  2. step = v_max / (2 ** adc_bits)按满量程与 2 的 N 次方计算 ADC 量化步长,尺子刻线越细误差越小。
  3. reads = weights * noise给每个电导乘一个随机扰动,模拟 RRAM 导电细丝写入的随机起伏。
  4. np.median(reads, axis=0)对多次读取结果取中位数,正是“冗余映射 + 校准”抑制噪声的关键。
  5. plane @ inputs每个位平面单独做一次矩阵乘,体现“位切片”把高精度运算拆成若干低精度通道。
  6. total += (2 ** k / (levels - 1)) * ...按二进制权重把各平面结果合并,对应公式 W = Σ 2^{-k} W^{(k)}。

常见误区

误区我听说模拟计算误差大、精度低,所以存内计算现在只能发发论文,离商用还远得很。

正解模拟存内计算已经进入商业落地阶段,IBM、台积电等都有相关原型或产品,并在推荐系统、边缘 AI 推理中投入使用。关键在于很多 AI 任务天然容忍低比特量化误差,配合混合精度与校准技术,最终模型精度损失可以控制在可接受范围。模拟的“不精确”不等于“没用”——就像水渠漏一点水,稻田照样丰收。

为何常见:初学者容易把“器件精度”等同于“系统精度”,忽略了算法与校准可以在软件侧弥补硬件缺陷。

误区存内计算不就是在手机 SoC 里把内存芯片放在 CPU 旁边嘛,减少一点搬运距离而已。

正解把存储和计算封装在同一基板上,那是“近存计算”(near-memory computing),数据仍要搬运;真正的存内计算(in-memory computing)是在存储单元的物理内部完成运算——在 SRAM 位线上直接做电荷累加、在 RRAM 交叉阵列里让电流自然汇流。这才叫“把档案室搬进水闸、让水闸自己算账”。

为何常见:行业里“存算一体”这个词被营销物料泛化使用,常把封装级集成也归入其中,混淆了“近”与“内”的本质区别。

误区反正都是在存储阵列里做模拟计算,SRAM 和 RRAM 的区别不就是断电丢不丢数据吗?

正解两者计算机制差异很大:SRAM 是易失性存储,权重以位/电压形式存在 6T 单元中,靠电荷共享或位线电流实现累加;RRAM 是非易失器件,权重直接映射为可编程电导值,单器件即可表达多比特权重。就像旋钮闸门与记忆合金闸门,虽然都“控制水流”,但内部结构和操作方式完全不同。

为何常见:从应用层看两者都做矩阵乘累加,器件物理层的巨大差异被掩盖了。

误区RRAM 既然叫“模拟器件”,它的电阻应该想设多少就设多少,精度无限高。

正解RRAM 电导的调节本质是导电细丝的形成与断裂,带有随机性,实际可可靠分辨的状态通常只有几个比特(如 2~8 bit),还存在写入噪声、漂移和耐久性限制。正因如此才需要校准、冗余映射和混合精度等技术来“打补丁”。

为何常见:“模拟”二字容易让人误以为连续就等于无限精确,忽视了物理器件的噪声与离散化本质。

误区模拟计算误差主要是 ADC 量化造成的,那把 ADC 位数加高不就行了?

正解ADC 的功耗和面积随位数近似指数增长,往往是模拟存内计算系统的能耗大头(对应 E_ADC)。过高的 ADC 会把模拟计算省下的能量又吃回去,所以要在任务精度与能效之间取平衡,甚至刻意用低比特 ADC 配合算法重训练来补偿。

为何常见:量化误差公式 Δ = V_fs / 2^N 直观上“位数越高误差越小”,让人容易忽略位数增长带来的巨大成本约束。

面试题

Q1. 模拟计算与数字计算最本质的区别是什么?

单选题 · easy

  • A.模拟计算使用连续的物理量表达数值← 正确答案
  • B.模拟计算的耗电量一定更小
  • C.模拟计算不需要任何能量就能工作
  • D.模拟计算只能处理音频信号

答案:A。模拟计算直接用电压、电流等连续物理量表达数值,运算发生在物理规律中;数字计算用离散的 0/1 逐位处理。B、C、D 都是对模拟计算的过度或错误推断,就像“水管”一定比“水桶”省电一样不成立。

Q2. “冯·诺依曼瓶颈”指的是什么?

单选题 · easy

  • A.存储器与处理器之间搬运数据的开销← 正确答案
  • B.处理器发热导致性能大幅下降
  • C.存储器容量不够用导致系统卡顿
  • D.网络传输数据时延过高影响体验

答案:A。冯·诺依曼架构中,数据要在存储器和计算单元之间来回搬运,搬运的速度和能耗成为系统瓶颈,正如水城伙计在档案室与闸门之间来回跑腿。发热、容量、网络都属于不同层面的问题。

Q3. 存内计算(in-memory computing)的核心思想是什么?

单选题 · easy

  • A.把计算单元与存储器封装在同一基板
  • B.在存储单元内部直接完成运算任务← 正确答案
  • C.用缓存替代主存减少搬数据开销
  • D.把全部数据预先复制到处理器缓存

答案:B。存内计算的精髓是让存储器件本身参与运算,在物理层完成计算,如同把配水手册刻在水闸上。A 是“近存计算”,C、D 仍是传统架构的缓存优化,都没有让“存储即计算”。

Q4. 在 RRAM 交叉阵列中,权重通常映射为什么物理量?

单选题 · mid

  • A.器件的电导值← 正确答案
  • B.器件的电容值
  • C.器件的电感值
  • D.器件的温度值

答案:A。RRAM 的电导 G 可被编程为不同阻值档位,电流 I = G·V 直接完成乘法,所以电导是权重的天然载体。电容用于 SRAM 电荷域方案,电感与温度与权重映射无关。

Q5. SRAM 存内计算单元最常用的结构是什么?

单选题 · mid

  • A.6T 单元(两个交叉耦合反相器)← 正确答案
  • B.1T1C 单元(一个晶体管加电容)
  • C.浮栅晶体管单元(类似闪存工艺)
  • D.铁电电容单元(利用极化翻转)

答案:A。6T 单元由两个交叉耦合反相器互锁,是 SRAM 的标准结构,像一对咬合的齿轮记住 0/1。1T1C 是 DRAM、浮栅是闪存、铁电是 FeFET 的典型结构,都不属于 SRAM。

Q6. N 位 ADC 的量化步长公式是什么?

单选题 · mid

  • A.Δ = V_fs 除以 2 的 N 次方← 正确答案
  • B.Δ = V_fs 乘以 2 的 N 次方
  • C.Δ = 2 的 N 次方除以 V_fs
  • D.Δ = V_fs 加上 2 的 N 次方

答案:A。满量程电压被均分为 2^N 个台阶,每个台阶高度就是步长 Δ = V_fs / 2^N。位数越多台阶越细,如同把一米的尺子分成更多小格;其余选项的运算关系均不正确。

Q7. 位切片混合精度中,一个权重按 W = Σ 2^{-k} W^{(k)} 拆分,其含义是什么?

单选题 · hard

  • A.按二进制位拆成位平面再加权求和← 正确答案
  • B.把权重随机分给多个计算单元
  • C.用多个 ADC 并行读出同一结果
  • D.将模拟信号重复采样后再合并

答案:A。位切片把高精度权重拆成 B 个位平面,每层仅含少量比特,按 2^{-k} 加权合并后还原出完整权重,像把厚水板拆成多层薄板分别搬运再叠回。B、C、D 描述的分别是随机映射、并行读出与过采样,与位切片无关。

Q8. 下列哪些属于模拟存内计算的典型误差来源?

多选题 · mid

  • A.器件写入噪声与电导漂移← 正确答案
  • B.ADC 量化带来的舍入误差← 正确答案
  • C.工艺偏差导致的单元失配← 正确答案
  • D.数据在硬盘中的长期存储

答案:ABC。模拟链路中,RRAM 写噪声与漂移、ADC 读数舍入、制造工艺偏差都会污染计算结果,如同水闸淤积、尺子刻度粗、闸门出厂尺寸不一。硬盘存储属于数字持久化环节,与模拟计算误差无直接关系。

Q9. 关于模拟存内计算系统的能耗与精度,下列哪些说法正确?

多选题 · hard

  • A.ADC 功耗随位数近似指数增长← 正确答案
  • B.总能耗可拆分为阵列与转换开销← 正确答案
  • C.模拟乘累加阵列能耗通常极低← 正确答案
  • D.提高 ADC 位数一定降低总能耗

答案:ABC。总能耗 E_total = E_MVM + E_DAC + E_ADC,阵列运算极省能,而 ADC 功耗随位数近似指数上升,所以“无脑加位数”会把省下的能量吃回去,D 的说法不成立。转换环节常成为新的能效瓶颈。

Q10. 下列哪些属于存内计算的主流应用场景?

多选题 · mid

  • A.边缘端低功耗神经网络推理← 正确答案
  • B.大规模推荐系统的向量召回← 正确答案
  • C.数据库日志的审计与归档
  • D.工业视觉的实时缺陷检测← 正确答案

答案:ABD。神经网络推理、推荐向量召回、工业视觉检测都以矩阵乘累加为核心且对能效敏感,是存内计算的天然舞台。数据库日志归档是纯存储型任务,不涉及大量就地计算,收益甚微。