3、NPU硬件架构详解:NPU内部结构、存储层次与数据通路

NPU(神经网络处理单元)之所以能在功耗受限的终端设备上高效运行深度神经网络,其根本原因在于其硬件架构针对神经网络计算的核心模式——大量并行乘加运算、数据复用和流水线处理——进行了专门设计。与CPU追求通用计算和复杂控制逻辑不同,NPU将芯片面积和功耗预算集中投入到计算阵列、片上存储和专用数据通路上。本章将深入拆解NPU的内部结构,重点分析矩阵单元、向量单元、标量单元的分工协作,并详细阐述其存储层次与数据流动机制,帮助学员建立从硬件底层理解NPU性能特征的能力。

NPU 内部硬件架构与数据通路总览 外部接口 AXI / AHB / NoC DDR / PCIe / MIPI 中断 / 电源管理 存储层次 L2 SRAM (共享) L1 SRAM (私有) 寄存器堆 / 双缓冲 计算核心(PE 阵列) 矩阵单元 (MAC阵列) 16x16 / 32x32 PE INT8 / FP16 向量单元 (SIMD) 激活 / 池化 / 归一化 逐元素运算 标量单元 (控制/地址生成) 指令译码 / 循环控制 / 地址计算 / 立即数 数据通路 输入总线 (IFMAP) 权重总线 (FILTER) 输出总线 (OFMAP) 控制单元 指令缓存 (I-Cache) 微码 / 状态机 同步 / 流水线控制 DMA 数据 指令 输出写回 关键设计要点 • 矩阵单元负责卷积/全连接的核心乘加运算,采用脉动阵列或权重固定/输入固定数据流 • 向量单元处理激活函数(ReLU/Sigmoid)、池化、BatchNorm等逐元素或窗口运算 • 标量单元执行控制流指令,管理循环、地址生成和同步,类似CPU中的控制核心 • 存储层次采用多级SRAM设计,L1紧贴计算单元,L2作为片上共享缓存,减少DDR访问 • 数据通路支持双缓冲(Double Buffering)机制,隐藏数据加载延迟,提升流水线效率 • 外部接口通过DMA与DDR交互,支持多通道并行传输,带宽设计需匹配计算峰值 • 控制单元与计算单元解耦,支持指令级流水线和多核扩展

3.1 核心计算单元:矩阵、向量与标量的分工

3.1.1 矩阵单元(Matrix Unit)——算力的基石

矩阵单元是NPU中最核心、面积占比最大的计算资源,专门用于执行卷积运算和全连接层中的矩阵乘法。其基本组成是乘加器阵列(MAC Array),例如常见的16×16或32×32的PE(Processing Element)网格。每个PE内部包含一个乘法器和一个累加器,能够在单个时钟周期内完成一次乘加操作。以32×32阵列为例,理论上每个周期可完成1024次乘加运算,在1GHz主频下可提供约2 TOPS的INT8算力。

矩阵单元的设计关键在于数据流组织方式。主流方案包括:

  • 权重固定(Weight Stationary):权重数据预先加载到PE寄存器中,输入特征图数据在阵列中流动。适用于权重复用率高的卷积层。
  • 输入固定(Input Stationary):输入数据驻留在PE中,权重数据流动。适用于输入特征图复用率高的场景。
  • 输出固定(Output Stationary):部分和(Partial Sum)在PE间传递,减少中间结果的写回次数。

实际芯片设计中,通常采用混合数据流策略,根据网络层的特征动态调整。例如,华为达芬奇架构中的Cube单元采用三维立方体结构,在空间维度上同时复用输入和权重,显著提高了数据利用率。

工程经验:在评估NPU矩阵单元性能时,不能只看峰值TOPS,还要关注实际利用率。利用率受限于数据加载带宽、片上存储容量和算子形状匹配度。例如,当卷积核尺寸为1×1时,矩阵单元利用率最高;而3×3卷积若未做Im2Col变换,可能导致PE闲置。

3.1.2 向量单元(Vector Unit)——灵活的后处理引擎

向量单元采用SIMD(单指令多数据)架构,包含多个并行的ALU(算术逻辑单元),能够对一组数据同时执行相同操作。其典型应用包括:

  • 激活函数计算:ReLU、Leaky ReLU、Sigmoid、Tanh等
  • 池化操作:最大池化、平均池化
  • 归一化:BatchNorm、LayerNorm
  • 逐元素运算:加法、乘法、缩放
  • 数据格式转换:INT8到FP16的转换

向量单元通常拥有独立的寄存器文件和累加器,支持流水线操作。其位宽设计一般为128位或256位,可同时处理16个INT8数据或8个FP16数据。在典型推理流程中,矩阵单元完成卷积后,结果会直接送入向量单元进行激活和归一化,形成紧密的流水线衔接。

3.1.3 标量单元(Scalar Unit)——控制与寻址的中枢

标量单元类似于CPU中的控制核心,负责指令译码、循环控制、地址生成和同步管理。它执行标量指令,管理整个NPU的运行流程。具体功能包括:

  1. 指令获取与译码:从指令缓存中读取NPU指令,解析操作码和操作数。
  2. 地址计算:生成矩阵单元和向量单元所需的数据地址,支持多维数组索引。
  3. 循环控制:管理卷积运算中的嵌套循环(如输出通道循环、输入通道循环、空间位置循环)。
  4. 同步与调度:协调矩阵单元、向量单元和DMA之间的数据依赖关系,避免数据冲突。

标量单元的性能直接影响NPU的调度效率。若标量单元处理速度过慢,即使计算单元算力充足,也会因指令下发延迟导致流水线停顿。因此,现代NPU通常采用多级指令流水线,并支持指令预取和分支预测。

单元类型核心功能典型操作数据位宽性能指标
矩阵单元矩阵乘法/卷积MAC运算INT8/FP16TOPS
向量单元逐元素/窗口运算激活/池化/归一化128/256位GOPS
标量单元控制/寻址指令译码/地址计算32位MIPS

3.2 存储层次设计:从寄存器到DDR的层级协同

NPU的存储系统设计遵循“数据就近计算”原则,通过多级缓存减少对片外DDR的访问次数。典型的存储层次从上到下包括:寄存器堆(Register File)、L1缓存(私有)、L2缓存(共享)、片外DDR。

3.2.1 寄存器堆与L1缓存

寄存器堆位于计算单元内部,访问延迟为1个时钟周期,容量最小(通常几十KB)。L1缓存为每个计算单元私有,容量在几百KB到几MB之间,访问延迟约2-4个时钟周期。L1缓存通常采用多Bank设计,支持多端口并行访问,以满足矩阵单元和向量单元同时读写的数据带宽需求。

关键设计是双缓冲(Double Buffering)机制:将L1缓存划分为两个区域,一个区域用于当前计算,另一个区域用于预加载下一批数据。这样,数据加载与计算可以重叠执行,有效隐藏DMA传输延迟。

3.2.2 L2共享缓存

L2缓存为所有计算单元共享,容量通常在2MB到16MB之间,访问延迟约10-20个时钟周期。L2缓存的主要作用是:

  • 存储中间特征图(IFMAP/OFMAP),避免频繁写回DDR
  • 缓存权重数据,支持多核复用
  • 作为DMA传输的,实现数据聚合和分发

L2缓存的管理策略直接影响NPU性能。常见的替换策略包括LRU(最近最少使用)和流式检测。对于卷积网络,权重数据具有极高的时间局部性,应优先保留在L2中。

3.2.3 片外DDR与带宽优化

当数据量超过L2容量时,必须访问片外DDR。DDR带宽是NPU系统的主要瓶颈之一。以处理1080p视频帧为例,单帧特征图可能达到几十MB,若每个像素需要多次读写,DDR带宽压力巨大。优化手段包括:

  • 数据压缩:对稀疏权重和激活值进行压缩编码,减少传输量。
  • DMA批量传输:将多个小数据块合并为一次大块传输,提高总线利用率。
  • 多通道并行:使用多个DDR通道或HBM(高带宽内存)提升峰值带宽。
风险提示:L2缓存容量并非越大越好。增大L2会带来更高的访问延迟和更大的芯片面积。设计时需根据目标应用场景(如边缘端还是云端)权衡容量与延迟。例如,边缘端NPU的L2通常控制在2-4MB,而云端NPU可达32MB以上。

3.3 数据通路:数据如何高效流动

数据通路定义了数据从DDR到计算单元再到DDR的完整路径。一个高效的NPU数据通路需要解决三个核心问题:数据如何进入、数据如何在计算单元间流转、结果如何输出。

3.3.1 输入数据通路

输入数据通路负责将输入特征图和权重从DDR加载到L2/L1。典型流程为:

  1. CPU或NPU控制单元配置DMA描述符,指定源地址、目的地址和传输长度。
  2. DMA控制器从DDR读取数据,通过AXI总线传输到L2缓存。
  3. 数据在L2中暂存,然后按需分发到各计算单元的L1缓存。

为了匹配矩阵单元的并行计算需求,输入数据通常需要按照特定格式排列。例如,NCHW格式需要转换为NHWC或自定义的NC1HWCo格式,以提高连续读取效率。

3.3.2 计算单元间数据流转

矩阵单元计算完成后,部分和结果需要传递给向量单元进行后续处理。这一过程通过片上总线或直接直连实现。部分和的数据量通常小于输入特征图,但仍需高效传输。设计上,矩阵单元的输出寄存器可以直接映射到向量单元的输入寄存器,减少中间存储开销。

3.3.3 输出数据通路

向量单元处理完的结果,经过量化或格式转换后,写回L2缓存。若该结果作为下一层的输入,则留在L2中继续使用;若为最终输出,则通过DMA写回DDR。输出数据通路同样需要支持双缓冲,避免计算单元等待写回完成。

调优建议:在分析NPU性能瓶颈时,使用性能计数器监测以下指标:L1/L2命中率、DMA传输等待周期、矩阵单元利用率、向量单元利用率。若矩阵单元利用率低于50%,优先检查数据加载是否成为瓶颈;若向量单元利用率低,则检查算子是否过度碎片化。

3.4 案例拆解:以MobileNetV2为例分析数据流

MobileNetV2是边缘端NPU的典型基准网络,其核心是深度可分离卷积(Depthwise Separable Convolution)。我们以第一个深度卷积层(3×3,输入通道32,输出通道32)为例,分析NPU数据流。

初始条件:输入特征图尺寸为112×112×32,权重尺寸为3×3×32。假设NPU的矩阵单元为16×16 MAC阵列,L1缓存容量为256KB,L2缓存容量为2MB。

分析过程:

  1. 数据加载:输入特征图大小为112×112×32×1字节(INT8)= 401KB,超过L1容量,需分块加载。权重大小为3×3×32=288字节,可一次性加载。
  2. 分块策略:将输入特征图按空间位置分块,每块大小为56×56×32=100KB,分两次加载到L1。
  3. 计算过程:矩阵单元按输出通道并行计算,每个PE处理一个输出通道的3×3卷积。由于深度卷积的每个通道独立计算,矩阵单元的利用率较低(仅使用32个PE中的16个)。
  4. 向量单元处理:卷积结果送入向量单元执行ReLU6激活和BatchNorm融合计算。
  5. 输出写回:处理后的特征图写回L2,作为下一层(逐点卷积)的输入。

结果对比:通过分块和双缓冲,DDR访问次数从理论上的多次读写减少为每层仅2次(一次读输入,一次写输出)。实测性能达到理论峰值的68%,主要损耗来自深度卷积的PE利用率不足。

复盘经验:对于深度卷积层,可考虑使用向量单元直接计算,而非依赖矩阵单元。部分NPU架构(如高通Hexagon)专门设计了深度卷积加速器,避免矩阵单元的资源浪费。

3.5 常见误区与设计总结

在NPU硬件架构设计中,存在以下常见误区:

  • 误区一:盲目追求高TOPS。峰值算力高不代表实际性能高,需关注算力与带宽的匹配度。若DDR带宽不足,高算力只会导致计算单元空转。
  • 误区二:忽视标量单元性能。标量单元是调度核心,若其处理速度跟不上计算单元,会导致指令饥饿。建议标量单元性能至少达到矩阵单元指令消耗率的2倍。
  • 误区三:L2缓存容量越大越好。大容量L2带来高延迟和面积开销,应根据应用场景选择。对于实时视频处理,2-4MB足够;对于大模型推理,需8MB以上。
  • 误区四:忽略数据格式转换开销。NCHW与NHWC格式转换、INT8与FP16转换都会消耗额外周期,应在网络编译阶段提前规划。

总结而言,NPU硬件架构的核心设计哲学是“以数据为中心”。矩阵单元、向量单元、标量单元的分工协作,存储层次的精心设计,以及数据通路的优化,共同决定了NPU的实际性能。理解这些底层机制,对于后续进行算子优化、网络部署和性能调优至关重要。在实际项目中,建议通过RTL仿真或芯片验证平台,结合性能计数器,逐步建立硬件行为模型,从而更精准地指导软件层面的优化策略。