3. NPU体系结构总览
NPU(Neural Processing Unit)并非通用处理器的简单加速扩展,而是针对神经网络计算中“高并行、高复用、高吞吐”特征而设计的专用处理器。理解NPU的体系结构,核心在于把握四个维度:计算单元(如何做乘加)、存储层次(数据放哪里)、控制流(指令如何驱动)、数据通路(数据如何流动)。本章以Arm Ethos-U系列与自研NPU为参照,建立宏观架构视图,为后续深入各子模块打下基础。
3.1 计算单元:MAC阵列与向量单元的协同设计
核心原理
NPU的计算能力主要来自乘加(MAC)阵列。一个典型的MAC单元执行 D = A × B + C 操作,其中A为激活值,B为权重,C为累加值。Ethos-U55采用8×8的MAC阵列(共64个MAC),而自研NPU通常配置为16×16甚至32×32的脉动阵列(Systolic Array)。MAC阵列擅长矩阵乘法,但处理逐元素操作(如Add、ReLU、Pooling)时效率低下,因此需要向量处理单元(Vector Unit)作为补充。向量单元通常包含4~16个并行ALU,支持SIMD(单指令多数据)操作,能够在一个周期内处理多个数据元素。
判断方法
评估计算单元性能时,不能只看MAC数量,还需关注:
- 数据位宽:Ethos-U支持INT8/INT16,自研NPU可能增加BF16/FP16支持。位宽越大,单次计算精度越高,但吞吐量下降。
- 累加器精度:32bit累加器是标配,防止INT8乘法累加时溢出。部分NPU采用40bit累加器以支持更大动态范围。
- 利用率:实际有效MAC数 = 理论MAC数 × 利用率。利用率受数据供给、控制流开销影响,通常优化目标为≥80%。
案例拆解:卷积层映射
以3×3卷积、输入通道64、输出通道64、特征图32×32为例:
- 将卷积核展开为矩阵:权重矩阵维度 [64, 576](3×3×64),输入矩阵维度 [576, 1024](32×32=1024个位置)。
- MAC阵列按16×16分块计算,每次处理16个输出通道和16个空间位置。
- 向量单元负责ReLU激活和MaxPool下采样。
该映射方式下,MAC阵列利用率可达92%,但需要DMA提前将权重和输入数据搬运至局部SRAM。
3.2 存储层次:从寄存器到主存的四级结构
核心原理
NPU的存储层次设计目标是最小化数据搬运延迟。典型结构分为四级:
| 层级 | 容量 | 延迟 | 用途 |
|---|---|---|---|
| 寄存器/累加器 | KB级 | 0~1周期 | 中间计算结果暂存 |
| 局部SRAM | 128KB~2MB | 2~4周期 | 激活值、权重、中间特征图 |
| 主存接口 | GB级(DDR) | 100~200周期 | 模型参数、大数据块 |
| 外部存储 | TB级(Flash) | ms级 | 模型持久化存储 |
Ethos-U55的SRAM容量为128KB~512KB,自研NPU通常配置1MB以上。SRAM采用多Bank设计(如8个Bank),支持多端口并行访问,提高带宽。
操作流程:Double Buffer机制
// 伪代码:DMA双缓冲加载
while (layer_idx < total_layers) {
// 预加载下一层权重到Buffer B
DMA_Load(weights[layer_idx+1], Buffer_B);
// 当前层使用Buffer A计算
Compute(Buffer_A, input, output);
// 交换Buffer A/B
Swap(Buffer_A, Buffer_B);
}
双缓冲(Ping-pong)技术通过交替使用两个SRAM区域,隐藏DMA加载延迟,使计算单元持续工作。
常见误区
3.3 控制流:指令驱动与事件驱动混合模式
核心原理
NPU控制流设计需平衡灵活性与效率。纯硬件状态机(FSM)效率高但灵活性差;纯通用处理器(如RISC-V核)灵活但开销大。主流方案是混合控制:
- 标量指令流:由小型控制器(如Cortex-M核或专用微码引擎)执行循环、跳转、分支等控制指令。
- 数据并行指令:通过VLIW(超长指令字)或SIMD指令驱动MAC阵列和向量单元。
- 事件驱动:DMA完成、计算完成、错误发生等事件触发中断或状态切换。
判断方法
检查控制流设计是否合理,可关注:
- 指令发射宽度:VLIW指令通常包含2~4个子操作(如MAC、Load、Store、ALU),需确保子操作无数据依赖。
- 循环开销:硬件循环(Loop)指令可减少循环计数和跳转开销,Ethos-U支持嵌套循环。
- 同步机制:计算单元与DMA之间需有同步信号(如Semaphore),防止数据竞争。
案例拆解:多算子流水线
假设一个推理任务包含Conv → ReLU → Pool → FC四个算子。控制流设计如下:
- 标量核配置各算子参数(输入地址、输出地址、维度)。
- DMA加载Conv权重,启动Conv计算。
- Conv完成后触发事件,自动启动ReLU(无需标量干预)。
- ReLU完成后启动Pool,Pool完成后启动FC。
该流水线将标量核干预次数从4次降为1次,控制开销减少75%。
3.4 数据通路:总线矩阵与数据流优化
核心原理
数据通路决定了数据在计算单元、存储层次和外部接口之间的传输路径。典型NPU采用多层总线矩阵:
- AXI/AHB总线:连接主存接口、DMA、配置寄存器,位宽64~128bit。
- 内部数据总线:连接SRAM Bank与MAC阵列,位宽256~512bit,支持多Bank并行访问。
- 广播/收集网络:将同一份激活值广播到多个MAC单元,或将多个部分和收集累加。
操作流程:数据流优化策略
// 数据流优化示例:权重驻留
for (int oc_block = 0; oc_block < num_oc; oc_block += 16) {
// 将16个输出通道的权重加载到SRAM并驻留
LoadWeights(oc_block, SRAM);
for (int ic_block = 0; ic_block < num_ic; ic_block += 16) {
// 流式加载输入块
LoadInput(ic_block, SRAM);
// 计算部分和
MAC_Compute(oc_block, ic_block);
}
}
权重驻留(Weight Stationary)策略将权重固定在SRAM中,输入数据流式加载,适合权重大于激活值的场景(如全连接层)。
常见误区与排障
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 计算单元利用率低 | 数据通路带宽不足 | 检查SRAM端口冲突、总线仲裁延迟 |
| DMA传输超时 | 总线优先级配置错误 | 检查AXI QoS设置、仲裁策略 |
| 数据错位 | 广播/收集网络同步失败 | 检查Valid/Ready握手信号时序 |
3.5 典型NPU宏观架构对比与设计要点
核心原理
将上述四要素整合,可得到典型NPU宏观架构。以Ethos-U55为例:其计算单元包含64个MAC和向量单元,存储层次为128KB SRAM,控制流采用微码引擎,数据通路为AHB/AXI总线。自研NPU通常在此基础上扩展:增加MAC数量至256~1024个,SRAM提升至1~4MB,引入NoC(片上网络)替代传统总线。
对比分析
| 维度 | Ethos-U55 | 自研NPU(典型) |
|---|---|---|
| MAC数量 | 64 | 256~1024 |
| SRAM容量 | 128KB | 1~4MB |
| 数据位宽 | INT8/INT16 | INT8/INT16/BF16 |
| 控制方式 | 微码+标量 | VLIW+事件驱动 |
| 总线接口 | AHB/AXI | AXI/NoC |
| 典型场景 | MCU级AI | 边缘计算/自动驾驶 |
设计决策要点
- 算力需求:先确定目标MAC数(如1TOPS@INT8),再反推MAC阵列规模和时钟频率。
- 存储带宽:SRAM总带宽 = MAC数 × 2(激活+权重)× 数据位宽 × 时钟频率。若带宽不足,需增加Bank数或提高位宽。
- 控制复杂度:算子种类越多,控制流越复杂。建议先支持Conv/FC/Pool/ReLU,再扩展其他算子。
- 功耗预算:MAC阵列功耗占比通常超过60%,可通过电压频率调节(DVFS)优化。