2. NPU基础概念
在开始定制化NVDLA(NVIDIA Deep Learning Accelerator)之前,我们必须先建立对NPU(Neural Processing Unit,神经网络处理器)的底层认知。NPU并非一个模糊的“AI芯片”代名词,而是一种针对神经网络计算中乘加运算密集、并行度高、数据复用性强的特点,在架构层面做了专门优化的处理器。理解其工作原理、与CPU/GPU的本质差异以及典型架构组成,是后续进行NVDLA寄存器配置、总线接口修改、存储带宽调优和算子定制的前提。本章将围绕这三个核心问题展开,为后续的工程实践打下坚实的理论基础。
上图从宏观层面展示了NPU的三大核心议题。接下来,我们将逐一深入剖析,从计算本质到架构细节,再到与CPU/GPU的对比,最后落到NVDLA的具体实现上。
2.1 神经网络处理器的工作原理
NPU的工作原理可以概括为“数据流驱动的专用计算引擎”。与CPU的“指令流驱动”不同,NPU的核心逻辑是围绕神经网络层(如卷积、全连接、激活、池化)的固定数据流模式设计的。其最底层的计算单元是乘加器(MAC),一个MAC单元执行一次 y = a * w + b 操作。一个典型的NPU包含成百上千个MAC单元,排列成二维阵列(PE Array),以实现极高的并行度。
其工作流程通常遵循以下步骤:
- 数据加载:通过DMA(Direct Memory Access)控制器,将输入特征图(Input Feature Map, IFMAP)和权重(Weight)从外部DRAM搬运到片上SRAM(或寄存器文件)。
- 计算调度:控制逻辑(通常是一个简单的微控制器或状态机)解析神经网络描述文件(如Caffe/TensorFlow的模型),生成计算指令序列,控制数据在PE阵列中的流动方向。
- 并行计算:PE阵列按照特定的数据复用模式(如行固定、输出固定、权重固定)对输入数据和权重进行乘加运算,中间结果暂存在片上。
- 后处理:将计算结果通过激活函数(如ReLU)、池化(Pooling)或归一化(Normalization)单元处理后,写回片上Buffer。
- 数据写回:将最终输出特征图(Output Feature Map, OFMAP)通过DMA写回外部DRAM,完成一层计算。
2.2 与GPU/CPU的差异:设计哲学的对立
要理解NPU的定位,必须将其置于CPU和GPU的坐标系中。CPU是“任务管理器”,擅长复杂逻辑控制和低延迟响应;GPU是“并行计算器”,擅长大规模吞吐但牺牲了单任务延迟;而NPU则是“专用加速器”,在特定领域(神经网络推理/训练)追求极致的能效比和单位面积算力。
| 维度 | CPU | GPU | NPU |
|---|---|---|---|
| 设计目标 | 低延迟、复杂控制流 | 高吞吐、图形/通用并行 | 高能效、固定神经网络算子 |
| 核心计算单元 | ALU(算术逻辑单元) | Streaming Multiprocessor (SM) 内的CUDA Core | MAC阵列(乘加器) |
| 存储层次 | 多级Cache(L1/L2/L3) | 大容量显存 + L2 Cache + 共享内存 | 片上SRAM + 寄存器文件(容量小但带宽极高) |
| 数据流模式 | 指令流驱动,数据从寄存器/内存加载 | SIMT(单指令多线程),线程调度 | 数据流驱动,硬件控制数据在PE间流动 |
| 指令集 | 复杂指令集(x86/ARM) | 相对简单的SIMD指令 | 专用指令(如CONV、POOL、ACT) |
| 典型能效 | ~1-10 TOPS/W | ~0.1-1 TOPS/W | ~2-20 TOPS/W(NVDLA约1-3 TOPS/W) |
| 适用场景 | 操作系统、逻辑控制 | 图形渲染、科学计算、AI训练 | 边缘推理、嵌入式AI、特定云端推理 |
从上表可以看出,NPU牺牲了通用性换取了能效。它无法运行操作系统,也无法处理分支密集的算法,但在执行卷积、全连接等矩阵运算时,其效率是CPU的数十倍,是GPU的3-5倍(在相同制程和功耗下)。
2.3 典型架构组成:以NVDLA为例
一个典型的NPU架构由五大核心组件构成。NVDLA作为开源的硬件IP,其架构完美体现了这些组件。理解这些模块的职责和交互,是定制化设计的第一步。
- 计算引擎(Compute Engine):这是NPU的心脏。NVDLA包含一个卷积引擎(Convolution Core),内部由多个MAC单元组成的二维阵列。该阵列支持多种数据流模式(如输出固定、权重固定),以适应不同尺寸的卷积核。此外,还有单数据处理器(Single Data Processor),负责处理激活、池化、归一化等逐元素操作。
- 片上存储系统(On-chip Memory):NVDLA拥有多层片上Buffer。包括用于缓存输入特征图的Input Buffer、用于缓存权重的Weight Buffer,以及用于暂存输出结果的Output Buffer。这些Buffer通常采用SRAM实现,具有极高的读写带宽,是数据复用的物理基础。
- 数据调度与控制(Data Scheduler & Control):NVDLA包含一个DMA引擎,负责在外部DRAM和片上Buffer之间搬运数据。同时,一个配置寄存器组(CSB Slave)接收来自CPU的配置命令,将神经网络层的参数(如卷积核大小、步长、通道数)解析为内部的控制信号。
- 数据通路(Data Path):连接上述组件的总线结构。NVDLA内部采用高带宽的AXI总线(用于数据搬运)和相对低速的CSB总线(用于寄存器配置)。数据通路的设计决定了数据能否无阻塞地在计算单元和存储单元之间流动。
- 可配置性(Configurability):NVDLA通过寄存器配置支持不同的精度(如INT8、INT16、FP16),以及不同的卷积模式(直接卷积、隐式GEMM)。这种可配置性是定制化设计的基础,我们可以通过修改RTL代码来扩展其支持的数据类型或算子。
2.4 案例拆解:一个卷积层的硬件执行过程
为了将抽象的原理具象化,我们以NVDLA执行一个 3x3x64 卷积(输入特征图尺寸 112x112x64,输出 112x112x128)为例,拆解其硬件执行流程。这个案例能帮助你理解数据是如何在NPU内部流动的。
背景与约束:假设NVDLA的MAC阵列大小为 16x16(即一次可并行计算16个输出通道的16个像素),片上输入Buffer容量为 256KB,权重Buffer容量为 128KB。外部DRAM带宽为 128-bit @ 800MHz。
执行步骤分析:
- 权重预加载:CPU通过CSB总线配置寄存器,告知NVDLA权重在DRAM中的地址和大小。DMA引擎将
3x3x64x128的权重(约288KB)分批次搬运到权重Buffer。由于权重Buffer只有128KB,需要分3次搬运。 - 输入数据分块(Tiling):由于输入特征图较大(
112x112x64,约800KB),无法一次性放入输入Buffer。NVDLA的硬件调度器会将输入特征图在空间维度上切分为多个Tile(例如16x16x64的块),每个Tile约256KB,刚好填满输入Buffer。 - 计算与流水线:对于每个Tile,MAC阵列开始计算。计算过程采用输出固定(Output Stationary)数据流:每个MAC单元负责计算一个输出像素的累加和。在计算当前Tile的同时,DMA引擎预取下一个Tile的数据到输入Buffer的另一个分区(双缓冲机制),实现计算与数据传输的重叠。
- 后处理与写回:当MAC阵列完成一个输出通道的累加后,结果被送入单数据处理器,执行ReLU激活函数。激活后的数据暂存在输出Buffer,当输出Buffer积累到一定量后,DMA将其写回DRAM。
| 步骤 | 数据操作 | 耗时估算(周期) | 瓶颈分析 |
|---|---|---|---|
| 1. 权重加载 | 288KB / 128-bit @800MHz | ~22,500 | 权重Buffer容量限制,需多次搬运 |
| 2. 输入Tile加载 | 256KB / 128-bit @800MHz | ~20,000 | DRAM带宽利用率需接近100% |
| 3. MAC计算 | 16x16 MACs * 3x3 * 64 | ~5,760 | 计算单元利用率取决于数据复用 |
| 4. 激活+写回 | 输出 16x16x128 | ~2,000 | 与步骤3流水线重叠 |
结果与复盘:通过上述分析可见,数据搬运时间远大于计算时间。因此,NVDLA的性能瓶颈通常不在MAC阵列,而在DRAM带宽和片上Buffer容量。定制化设计时,如果发现MAC利用率低于50%,应优先考虑优化数据复用策略(如增大Tile尺寸)或增加片上Buffer容量,而不是盲目提高MAC频率。
2.5 总结与设计启示
本章从原理、对比和架构三个维度剖析了NPU。核心要点如下:
- NPU的本质是数据流驱动的专用计算引擎,其高能效来源于对数据复用的极致挖掘。
- 与CPU/GPU相比,NPU牺牲了通用性,换取了在神经网络推理场景下的能效比和单位面积算力优势。
- 典型NPU架构由MAC阵列、片上存储、DMA/控制、数据通路四大部分组成。NVDLA的模块化设计使得我们可以针对特定场景进行定制。
- 在定制化设计中,性能分析必须从数据流入手,识别瓶颈是计算单元还是数据搬运,再决定修改方向。