lowpower_ai

第11章:模拟存内计算架构

模拟存内计算(Analog In-Memory Computing)通过在存储器件中直接执行模拟域的矩阵运算,从根本上突破了冯诺依曼架构的存储墙限制。本章深入探讨基于新型存储器的模拟计算原理、电路实现、系统集成挑战以及工业界的最新进展。我们将重点分析交叉开关阵列架构、多值存储技术、混合信号接口设计以及噪声容忍机制,为设计高能效AI加速器提供理论基础和实践指导。

11.1 交叉开关阵列基础

11.1.1 基本原理与欧姆定律计算

交叉开关阵列(Crossbar Array)是模拟存内计算的核心结构,利用欧姆定律和基尔霍夫电流定律在物理层面实现矩阵向量乘法(MVM)。这种架构的革命性在于它将存储和计算功能融合在同一个物理结构中,从根本上消除了数据搬移的能耗开销。

基本计算原理:

      V₁   V₂   V₃   V₄
       │    │    │    │
    ───┼────┼────┼────┼───
       ●    ●    ●    ●   G₁ⱼ
    ───┼────┼────┼────┼───
       ●    ●    ●    ●   G₂ⱼ
    ───┼────┼────┼────┼───
       ●    ●    ●    ●   G₃ⱼ
    ───┼────┼────┼────┼───
       │    │    │    │
       I₁   I₂   I₃   I₄

从物理角度看,这个计算过程是瞬时完成的,不需要时钟周期。每个交叉点的电流贡献为 $I_{ij} = V_i \cdot G_{ij}$,根据基尔霍夫电流定律,位线上的总电流自然完成了累加操作。这种并行计算能力使得一个 $N \times M$ 的阵列可以在单个时间步内完成 $N \times M$ 次乘累加运算。

能耗分析: 传统数字计算的矩阵向量乘法能耗主要来自三个部分:

  1. 数据读取:$E_{read} = N \times M \times E_{SRAM_access}$
  2. MAC运算:$E_{MAC} = N \times M \times E_{multiply_add}$
  3. 数据写回:$E_{write} = M \times E_{SRAM_write}$

而在交叉开关阵列中: \(E_{crossbar} = N \times E_{DAC} + M \times E_{ADC} + E_{static}\)

当 $N, M » 1$ 时,每次运算的平均能耗显著降低,典型情况下可实现10-100倍的能效提升。

11.1.2 阵列结构与拓扑

阵列拓扑结构的选择直接影响存内计算系统的密度、精度和可靠性。不同的结构在面积效率、计算精度和设计复杂度之间提供了不同的权衡点。

1T1R结构:每个存储单元包含一个晶体管和一个电阻器件

晶体管的作用不仅是选择器,还充当电流限制器,防止编程时的过电流损坏。其栅极电压可以精确控制通过电阻器件的电流: \(I_{cell} = \beta (V_{GS} - V_{th})^2 \cdot (1 + \lambda V_{DS})\)

无源阵列(Passive Array)

Sneak path问题的根源在于未选中单元形成的并联电流路径。对于一个 $N \times N$ 阵列,最坏情况下的sneak path电流可达: \(I_{sneak} \approx \frac{(N-1)^2 \cdot V_{read}}{R_{off}}\)

解决方案包括:

  1. 集成选择器(1S1R):如OTS(Ovonic Threshold Switch)
  2. 读取方案优化:V/2偏置方案,降低sneak current
  3. 互补电阻开关(CRS):两个反向串联的忆阻器

分块架构(Tiled Architecture)

┌─────────┐ ┌─────────┐ ┌─────────┐
│  Tile   │ │  Tile   │ │  Tile   │
│  128×128│ │  128×128│ │  128×128│
└─────────┘ └─────────┘ └─────────┘
     │           │           │
  ┌──┴───────────┴───────────┴──┐
  │    Global Interconnect       │
  └──────────────────────────────┘

分块设计的优势:

  1. 局部性利用:相邻tile间的数据传输延迟低
  2. 故障隔离:单个tile失效不影响整体功能
  3. 功耗管理:可以选择性地激活需要的tile
  4. 良率提升:小阵列的良率指数级高于大阵列

最优tile大小的确定需要考虑:

11.1.3 电流累加与KCL实现

基尔霍夫电流定律(KCL)自然实现了加法运算,这是模拟存内计算最优雅的特性之一:

\[I_{out} = \sum_{i=1}^{N} V_i \cdot G_i = \sum_{i=1}^{N} I_i\]

电流域累加的优势:

精度考虑: 电流累加的精度受多个因素影响:

  1. 线电阻影响:导线电阻导致的电压降会影响累加精度 \(I_{actual} = I_{ideal} \cdot (1 - \frac{R_{line} \cdot I_{total}}{V_{applied}})\)

  2. 寄生电容:大规模阵列中的寄生电容会限制工作频率 \(f_{max} = \frac{1}{2\pi R_{eq}C_{parasitic}}\)

  3. 热噪声:Johnson-Nyquist噪声在电流累加中会叠加 \(\sigma_{I,total} = \sqrt{\sum_{i=1}^{N} 4k_BT\cdot G_i \cdot \Delta f}\)

优化技术

11.1.4 差分计算与符号表示

神经网络中的权重通常包含正负值,而物理电导只能为正。处理负权重需要特殊的编码策略:

双列差分编码

这种方法的优势是保持了计算的线性,但代价是需要双倍的硬件资源。差分结构还带来额外好处:

  1. 共模抑制:环境噪声同时影响两列,差分后被消除
  2. 动态范围扩展:权重范围从$[0, G_{max}]$扩展到$[-G_{max}, G_{max}]$
  3. 温度补偿:温度漂移在两列中相似,差分后大幅降低

偏置编码

偏置方法的特点:

混合编码策略: 实际系统常采用混合策略,根据层的特点选择编码方式:

11.2 ReRAM/PCM的模拟计算

11.2.1 ReRAM物理机制与电导调制

阻变存储器(ReRAM)通过导电细丝的形成与断裂实现电阻切换,这种机制为模拟计算提供了丰富的电导调制能力。理解其物理机制对于优化器件性能和提高系统可靠性至关重要。

SET过程(低阻态形成): 导电细丝的生长遵循离子迁移动力学: \(G_{LRS} = G_0 \cdot exp(-\frac{t_{gap}}{t_0})\)

其中$t_{gap}$是细丝间隙厚度,$t_0$是特征长度(约1-2nm)。

SET过程的微观机制:

  1. 电场驱动:强电场(>10⁷ V/cm)使金属离子(如Cu²⁺、Ag⁺)或氧空位移动
  2. 焦耳热辅助:局部温升加速离子迁移,温度可达400-600K
  3. 细丝生长:离子在阴极还原并沉积,形成导电通道

电流-电压特性: \(I = I_0 \cdot sinh(\frac{qV}{nk_BT}) \cdot exp(-\frac{E_a - qV/2}{k_BT})\)

RESET过程(高阻态恢复): 热驱动的细丝断裂,遵循Arrhenius方程: \(\tau_{reset} = \tau_0 \cdot exp(\frac{E_a}{k_B T})\)

RESET的关键参数:

多级电导调制: 实现多值存储的三种主要方法:

  1. 脉冲幅度调制(PAM)
    • 控制SET电压:$V_{SET} \in [V_{th}, V_{max}]$
    • 电导与电压关系:$G \propto (V_{SET} - V_{th})^{\alpha}$,$\alpha \approx 1.5-2$
    • 优点:调制范围大;缺点:非线性强
  2. 脉冲宽度调制(PWM)
    • 控制脉冲持续时间:$t_{pulse} \in [10ns, 1\mu s]$
    • 电导演化:$G(t) = G_{init} + \Delta G \cdot (1 - exp(-t/\tau))$
    • 优点:线性度好;缺点:速度慢
  3. 验证-编程循环(Program-Verify)
    • 迭代优化:施加脉冲→读取→比较→调整
    • 收敛速度:$ G_{n+1} - G_{target} < \gamma G_n - G_{target} $,$\gamma < 1$
    • 优点:精度高;缺点:时间开销大

材料体系与性能: | 材料体系 | ON/OFF比 | 耐久性 | 保持时间 | 多值能力 | |———|———-|——–|———-|———-| | HfO₂/TaO₂ | 10²-10³ | 10⁶-10⁸ | >10年 | 4-8级 | | WO₃ | 10³-10⁴ | 10⁵-10⁷ | >10年 | 8-16级 | | AgInSbTe | 10²-10³ | 10⁸-10⁹ | >10年 | 连续 |

11.2.2 PCM相变动力学

相变存储器(PCM)利用材料在晶态和非晶态之间的转换:

结晶动力学(SET): \(R(t) = R_{amorphous} \cdot exp(-\frac{t}{\tau_c})\)

结晶时间常数: \(\tau_c = \tau_0 \cdot exp(\frac{E_{c}}{k_B T})\)

熔融淬火(RESET)

多级存储的实现

  1. 部分结晶:控制结晶体积分数
  2. 迭代编程:
    while |G_target - G_measured| > ε:
        apply_pulse(amplitude, width)
        G_measured = read_conductance()
        adjust_pulse_parameters()
    

11.2.3 器件非理想特性

电导漂移(Conductance Drift): PCM的时间依赖性: \(G(t) = G(t_0) \cdot (\frac{t}{t_0})^{-\nu}\)

漂移系数$\nu \approx 0.06-0.1$

循环耐久性(Endurance)

器件间差异(Variability)

11.3 权重映射与多比特存储

11.3.1 权重量化与映射策略

将神经网络权重映射到物理电导的关键挑战:

线性映射: \(G = G_{min} + \frac{W - W_{min}}{W_{max} - W_{min}} \cdot (G_{max} - G_{min})\)

非线性补偿: 考虑器件的非线性I-V特性: \(I = G \cdot V \cdot (1 + \beta V^2)\)

需要预失真补偿: \(G_{programmed} = \frac{G_{target}}{1 + \beta V_{op}^2}\)

11.3.2 多单元组合技术

位切片(Bit-Slicing)架构

MSB Array  LSB Array
  ┌───┐      ┌───┐
  │ 4x│      │ 1x│
  └─┬─┘      └─┬─┘
    │          │
    └────┬─────┘
         │
    ┌────┴────┐
    │   ADC   │
    └─────────┘

输出重构: \(Y = 4 \cdot Y_{MSB} + Y_{LSB}\)

并行单元(Parallel Cells)

11.3.3 编程算法与优化

闭环迭代编程

def iterative_programming(target_G, device):
    G_current = device.read()
    tolerance = 0.01 * target_G
    max_iterations = 100
    
    for i in range(max_iterations):
        error = target_G - G_current
        if abs(error) < tolerance:
            return True
            
        pulse = calculate_pulse(error, i)
        device.apply_pulse(pulse)
        G_current = device.read()
        
    return False

写入验证优化

  1. 粗编程:快速接近目标值
  2. 精编程:精确调整
  3. 验证读取:确认最终值

11.3.4 在线训练与更新

梯度累积更新: \(\Delta G = \eta \cdot \sum_{batch} \frac{\partial L}{\partial W}\)

随机权重更新

11.4 ADC/DAC的功耗优化

11.4.1 ADC架构选择

逐次逼近型(SAR)ADC

流水线型ADC

积分型ADC

功耗对比(8位,1MS/s): | ADC类型 | 功耗(μW) | 面积(μm²) | FoM(fJ/step) | |———|———-|———–|————–| | SAR | 10-50 | 500-1000 | 10-50 | | Pipeline| 100-500 | 2000-5000 | 50-200 | | Slope | 5-20 | 200-500 | 20-100 |

11.4.2 分辨率与能效权衡

ADC功耗与分辨率的关系: \(P_{ADC} \propto 2^{2N} \cdot f_s\)

其中N是位数,$f_s$是采样率。

动态精度调整

11.4.3 共享与复用策略

列共享ADC

Column[0] Column[1] Column[2] Column[3]
    │         │         │         │
    └────┬────┴────┬────┴────┬────┘
         │         │         │
      MUX 4:1   MUX 4:1   MUX 4:1
         │         │         │
       ADC₀      ADC₁      ADC₂

共享比例优化: \(N_{share} = \sqrt{\frac{T_{compute}}{T_{convert}}}\)

时分复用(TDM)

11.4.4 DAC设计优化

电流舵DAC(Current-Steering)

    Iref
     │
   ┌─┴─┐
   │CSS│  Current Source Array
   ├───┤  ┌───┬───┬───┬───┐
B₃ │   ├──┤8I │4I │2I │ I │
B₂ │   │  └───┴───┴───┴───┘
B₁ │   │        │
B₀ │   │      Iout
   └───┘

功耗模型: \(P_{DAC} = N \cdot I_{LSB} \cdot V_{DD}\)

电荷重分配DAC

分段式DAC架构

11.5 噪声、漂移与校准

11.5.1 噪声源分析

热噪声(Thermal Noise): \(v_n^2 = 4k_B T R \Delta f\)

对于ReRAM器件(R=100kΩ,BW=1MHz): \(v_{n,rms} = \sqrt{4 \times 1.38 \times 10^{-23} \times 300 \times 10^5 \times 10^6} \approx 40\mu V\)

散粒噪声(Shot Noise): \(i_n^2 = 2qI\Delta f\)

1/f噪声(Flicker Noise): \(S_v(f) = \frac{K_f}{f^\alpha}\)

其中α≈1,$K_f$依赖于器件材料和工艺。

随机电报噪声(RTN)

11.5.2 电导漂移补偿

漂移模型与预测

PCM漂移的幂律模型: \(G(t) = G_0 \cdot (t/t_0)^{-\nu}\)

补偿策略:

  1. 全局补偿: \(W_{compensated} = W_{original} \cdot (t/t_0)^{\nu}\)

  2. 分层补偿
    • 不同层使用不同的漂移系数
    • 基于层的激活频率调整
  3. 周期性刷新
    if time_since_program > T_refresh:
        G_target = read_original_target()
        reprogram_device(G_target)
    

11.5.3 校准技术

离线校准

  1. 增益/偏置校正: \(Y_{corrected} = \alpha \cdot Y_{measured} + \beta\)

    通过已知输入-输出对确定α和β。

  2. 非线性校正: 使用查找表(LUT)或多项式拟合: \(Y_{corrected} = \sum_{k=0}^{n} a_k \cdot Y_{measured}^k\)

在线自适应校准

  1. 参考列方法
    Regular Columns  Reference
    ┌───┬───┬───┐   ┌───┐
    │   │   │   │   │REF│
    └───┴───┴───┘   └───┘
         │              │
    Compare & Calibrate
    
  2. 批归一化(BN)适应: \(Y_{norm} = \gamma \cdot \frac{Y - \mu}{\sqrt{\sigma^2 + \epsilon}} + \beta\)

    BN参数可补偿器件变化。

11.5.4 容错设计

冗余与投票机制

错误检测与纠正

  1. 奇偶校验位
  2. 汉明码
  3. 权重校验和

鲁棒性训练

# 训练时注入噪声
def noise_aware_training(model, noise_model):
    for epoch in range(epochs):
        weights = model.get_weights()
        noisy_weights = noise_model(weights)
        model.set_weights(noisy_weights)
        loss = compute_loss(model, data)
        gradients = compute_gradients(loss)
        update_weights(gradients)

11.6 工业界案例:IBM相变存储计算与Analog Inference

11.6.1 IBM PCM计算芯片

IBM Research在2018-2022年间开发的PCM模拟AI芯片:

芯片规格

关键创新

  1. 投影PCM单元
    • 加热器与相变材料分离
    • 降低RESET电流50%
    • 提高耐久性10倍
  2. 漂移补偿电路
    • 片上温度传感器
    • 实时漂移预测
    • 准确度损失<1%
  3. 混合精度架构
    • 第一层:数字计算(高精度)
    • 中间层:PCM模拟计算
    • 最后层:数字计算(分类)

11.6.2 Analog Inference加速器

系统架构

┌─────────────────────────────┐
│    Digital Controller        │
├─────────────────────────────┤
│  Input   │      │   Output  │
│  Buffer  │ PCM  │   Buffer  │
│          │Array │           │
├──────────┼──────┼───────────┤
│   DAC    │      │    ADC    │
│  Array   │      │   Array   │
└─────────────────────────────┘

性能指标

软件栈

  1. 量化感知训练
    • PCM噪声模型集成
    • 漂移感知优化
  2. 映射编译器
    • 权重分块策略
    • 流水线调度
    • 功耗优化布局

11.6.3 实际部署挑战

温度依赖性

良率管理

系统集成

class PCMAccelerator:
    def __init__(self):
        self.calibration_data = load_calibration()
        self.defect_map = load_defect_map()
        
    def inference(self, input_data):
        # 预处理
        data = preprocess(input_data)
        
        # 温度补偿
        temp = read_temperature()
        compensation = self.get_compensation(temp)
        
        # 执行计算
        result = self.execute_on_pcm(data, compensation)
        
        # 后处理
        return postprocess(result)

11.7 高级话题:IR Drop补偿与阵列分割

11.7.1 IR Drop分析与建模

大规模阵列中的电压降问题:

线电阻模型

  R_line   R_line   R_line
●────────●────────●────────●
│        │        │        │
G₁       G₂       G₃       G₄
│        │        │        │
●────────●────────●────────●
  R_line   R_line   R_line

电压分布: \(V_{i,j} = V_{applied} - I_{total} \cdot R_{path}(i,j)\)

其中: \(R_{path}(i,j) = R_{line} \cdot (i + j)\)

影响分析

11.7.2 补偿技术

预失真补偿: \(V_{compensated}(i,j) = V_{ideal} + \Delta V_{IR}(i,j)\)

分段驱动

    Segment 1    Segment 2
   ┌─────────┐  ┌─────────┐
───┤ Driver  ├──┤ Driver  ├───
   └─────────┘  └─────────┘

自适应偏置

11.7.3 阵列分割策略

层次化分割

             Global Router
                  │
      ┌───────────┼───────────┐
      │           │           │
   Tile₀₀      Tile₀₁      Tile₀₂
   128×128    128×128     128×128
      │           │           │
   Local       Local       Local
   Buffer      Buffer      Buffer

分割准则

  1. IR drop限制:$\Delta V < 0.05V_{DD}$
  2. RC延迟约束:$\tau < T_{cycle}/10$
  3. 功耗密度:$P_{density} < P_{thermal_limit}$

优化目标函数: \(min\{A_{total} + \alpha \cdot P_{routing} + \beta \cdot L_{latency}\}\)

11.7.4 3D集成与垂直互连

单片3D集成

热管理考虑: \(T_{junction} = T_{ambient} + P_{total} \cdot R_{thermal}\)

散热路径优化: