2. AI加速器基础
神经网络加速器(NPU)的本质,是将深度学习算法中反复出现的计算模式,映射到为高吞吐、低功耗而优化的专用硬件上。要理解Andes NPU IP核的设计取舍,首先必须回到AI计算的“原点”——即神经网络到底在算什么、数据如何流动、并行性从何而来。本章从计算范式、核心算子、数据流架构三个维度,建立AI加速器设计的底层思维框架,为后续IP核微架构、存储层次与指令集设计奠定基础。
2.1 神经网络计算范式:从算法到硬件的抽象
神经网络推理过程可抽象为张量(Tensor)的流动与变换。一个典型的卷积层,输入为形状 [N, C_in, H_in, W_in] 的四维张量,经过与权重 [C_out, C_in, K_h, K_w] 的卷积运算,输出 [N, C_out, H_out, W_out]。从硬件视角看,这并非单一运算,而是由三个基本计算原语构成:乘加(MAC)、累加(ACC)和非线性映射(Activation)。MAC操作构成计算密度最高的部分,也是NPU中PE(Processing Element)阵列的核心。
理解计算范式时,需要区分计算形状与计算语义。计算形状指张量的维度与遍历顺序,计算语义指具体算子(如卷积、池化、全连接)。硬件设计通常只关心前者——因为卷积、矩阵乘、甚至全连接在硬件层面都可以统一为乘加矩阵运算。例如,卷积通过im2col变换可转为矩阵乘,全连接本质是矩阵乘,注意力机制中的QK^T也是矩阵乘。因此,NPU的MAC阵列设计往往以矩阵乘为基准,再通过数据重排支持卷积。
2.2 卷积与矩阵运算的硬件映射
卷积运算在硬件上有三种主流映射策略:直接卷积、im2col+GEMM和Winograd变换。直接卷积保持原始数据布局,每个PE负责一个输出像素的累加,但权重和激活的复用模式复杂;im2col将输入展开为矩阵,利用成熟的GEMM优化,但会引入数据冗余(通常3~4倍);Winograd通过变换减少乘法次数,但增加加法开销和数值精度问题。
对于Andes NPU IP核设计,选择映射策略需考虑以下因素:
- MAC阵列规模:16x16、32x32还是更大?阵列越大,单次运算吞吐越高,但数据供给压力也越大。
- 片上存储层次:权重和激活分别驻留在哪一级存储?寄存器文件、局部SRAM还是共享SRAM?
- 数据位宽:FP16、INT8还是混合精度?位宽影响MAC单元面积和功耗,也影响数据搬运带宽。
- 稀疏性支持:是否支持权重或激活的稀疏跳过?这需要额外的索引逻辑,但可显著提升实际算力。
| 映射方式 | 乘法次数 | 加法次数 | 数据冗余 | 硬件复杂度 | 适用场景 |
|---|---|---|---|---|---|
| 直接卷积 | K_h×K_w×C_in×C_out | 同左 | 无 | 中 | 小卷积核(3x3) |
| im2col+GEMM | 同左 | 同左 | 3~4倍 | 低(复用GEMM) | 全连接、1x1卷积 |
| Winograd F(2x2,3x3) | 2.25倍减少 | 增加约2倍 | 无 | 高(变换单元) | 大通道数CNN |
2.3 数据流与并行性:从循环分块到硬件调度
数据流(Dataflow)决定了数据在PE阵列中的移动方向和驻留位置。三种经典数据流——权重固定、激活固定、输出固定——各有优劣。权重固定适合权重复用率高的场景(如全连接层),激活固定适合激活数据量大的场景(如早期卷积层),输出固定则能减少部分和搬运。实际NPU常采用混合数据流,根据层特征动态切换。
并行性提取是另一个关键维度。NPU中的并行性来自四个层次:
- Batch并行:不同输入样本同时处理,适合推理批量场景。
- 通道并行:输入/输出通道拆分到不同PE组,是CNN最常用的并行方式。
- 空间并行:同一特征图的不同位置并行计算,适合大分辨率输入。
- 算子级流水:不同层之间流水执行,隐藏数据搬运延迟。
设计数据流时,需要同时考虑循环分块(Loop Tiling)和循环顺序(Loop Ordering)。例如,将输出通道C_out分块为Tile大小,将输入通道C_in分块为Block大小,再决定先遍历哪个维度。不同的分块和顺序直接影响数据复用距离和片上存储容量需求。
2.4 案例拆解:ResNet-50在NPU上的数据流优化
以ResNet-50第一层卷积为例(输入224x224x3,卷积核7x7x3x64,stride=2),分析数据流设计过程。
初始参数:输入特征图约150KB(FP16),权重约9KB,输出特征图约200KB。若采用32x32 MAC阵列,单周期可完成1024次MAC。该层总MAC数为7×7×3×64×112×112≈1.18亿次,约需11.5万周期。
瓶颈分析:若权重固定数据流,权重9KB可完全驻留片上,但激活数据需从DRAM反复读取。输入激活150KB,若片上SRAM仅256KB,可容纳全部输入,但输出200KB无法同时驻留,需分块输出。
优化方案:采用输出固定数据流,将输出通道64拆为2个Tile(每个32通道),输出空间112x112拆为4个Block(每个56x56)。每个Block计算时,输入激活仅需对应区域的3x56x56x3≈28KB,权重9KB,输出部分和32x56x56≈100KB,总计约137KB,可完全驻留256KB SRAM。
结果对比:优化前DRAM访问量约1.18亿×4B×2(读写)≈944MB;优化后DRAM访问量降至输入读取150KB×4次Block+输出写回200KB≈800KB,降低超过1000倍。代价是控制逻辑复杂度增加,需要地址生成器和调度器支持分块遍历。
复盘经验:数据流优化的核心是最大化数据复用距离,即数据从DRAM加载后,在片上被重复使用的次数。输出固定数据流通过让部分和在PE内累加完成,显著减少了中间结果的DRAM往返。但该策略对PE内累加器位宽有要求(防止溢出),且对激活函数的位置有约束(需在累加完成后执行)。
2.5 总结与设计要点
本章建立了AI加速器设计的三个核心视角:计算范式决定了硬件支持哪些算子及如何统一;数据流决定了数据在PE阵列中的移动策略,直接影响功耗和性能;并行性决定了如何将算法中的并行度映射到硬件资源上。Andes NPU IP核设计时,应优先明确目标应用场景(边缘推理、训练还是多任务),再据此选择MAC阵列规模、数据流类型和存储层次。
关键设计决策清单:
- 确定MAC阵列维度(行×列),并确保SRAM带宽满足每周期数据供给。
- 选择主数据流类型(建议支持至少两种,通过配置切换)。
- 设计循环分块策略,使片上存储容纳单个Tile的全部数据。
- 评估Winograd或FFT等变换是否值得引入(需权衡精度与面积)。
- 为稀疏性预留支持接口,即使第一版不实现,也要在数据路径上留出旁路。