2. NPU基础概念
NPU(Neural Processing Unit,神经网络处理单元)并非一个单一功能的加速器,而是一个面向特定计算模式(如矩阵乘加、卷积、激活、池化)进行深度优化的完整微系统。理解NPU的硬件基础,关键在于把握其“数据流驱动计算”的本质:与CPU的“指令流驱动”或GPU的“SIMT(单指令多线程)调度”不同,NPU通过精心设计的片上存储层次和计算阵列排列,让数据在计算单元间高效流动,从而最大化算力利用率。本章将系统拆解NPU的总体架构视图、三大核心组件(计算单元、存储系统、控制单元)的职责边界,并结合实际芯片案例(以通用AI加速IP为例)说明各模块如何协同工作。
2.1 NPU总体架构:从宏观到微观的分层视图
NPU的总体架构设计遵循“算力-带宽-容量”三角平衡原则。宏观上,NPU作为SoC(片上系统)中的一个加速器IP,通过标准总线(如AXI、NoC)与CPU、GPU、DMA控制器以及片外DDR互联。微观上,NPU内部可划分为三个主域:控制平面(负责指令解析与调度)、数据平面(负责计算与数据搬运)、存储平面(负责数据暂存与重用)。这种分层设计使得NPU能够独立于主CPU进行异步计算,仅通过中断或状态寄存器进行轻量级同步。
从数据流视角看,NPU执行一次卷积运算的典型路径为:输入特征图(IFMap)从片外DDR经DMA搬运至片上激活Buffer,权重(Weight)预加载至权重Buffer,计算单元从两个Buffer中读取数据执行乘加运算,中间结果暂存于累加器,经激活函数处理后写回输出Buffer,最终由DMA搬回DDR。这一过程体现了NPU架构的核心设计哲学——数据重用:通过片上Buffer的容量设计,尽可能减少对片外DDR的访问次数,因为片外访问的能耗和延迟通常是片上SRAM的数十倍。
2.2 核心组件一:计算单元(Compute Unit)
计算单元是NPU的“发动机”,其设计直接决定了芯片的峰值算力与能效比。现代NPU计算单元通常包含三类子单元:MAC阵列(乘加运算)、向量单元(逐元素运算)、标量单元(控制流运算)。
2.2.1 MAC阵列:NPU的算力基石
MAC阵列由大量乘加器(Multiplier-Accumulator)按二维网格排列组成。每个MAC单元在单个时钟周期内执行一次 a × b + c 运算。阵列的规模通常以 M × N 表示,例如16×16阵列包含256个MAC。MAC阵列的输入数据宽度(如INT8、FP16、BF16)决定了单次运算的精度与功耗。实际芯片中,MAC阵列通常采用脉动阵列(Systolic Array)或近存计算(Near-Memory Computing)结构,以减少数据搬运距离。
| MAC阵列类型 | 数据流方式 | 优势 | 劣势 | 典型应用 |
|---|---|---|---|---|
| 脉动阵列(Systolic) | 数据在PE间逐周期传递 | 高数据重用、低寄存器压力 | 控制复杂、对稀疏计算不友好 | Google TPU、寒武纪MLU |
| 广播式(Broadcast) | 同一数据广播至所有PE | 控制简单、适合小尺寸卷积 | 带宽需求高、扩展性受限 | 部分边缘NPU |
| 近存计算(Near-Memory) | 计算单元嵌入存储阵列 | 极低数据搬运功耗 | 工艺复杂、容量受限 | 存内计算原型芯片 |
2.2.2 向量与标量单元:补齐非矩阵运算
MAC阵列擅长矩阵乘加,但神经网络中还存在大量非矩阵运算:激活函数(ReLU、Sigmoid)、归一化(BatchNorm)、池化(MaxPool)、元素级加乘等。向量单元(Vector Unit)以SIMD(单指令多数据)方式处理这些逐元素运算,通常支持128位或256位宽度的并行处理。标量单元(Scalar Unit)则负责地址计算、循环计数、分支跳转等控制密集型操作,避免占用MAC阵列资源。
2.3 核心组件二:存储系统(Memory System)
存储系统是NPU的“血液”,决定了数据能否及时送达计算单元。NPU存储系统采用层次化结构:寄存器文件(RF)→ 片上SRAM(Scratchpad)→ 片外DDR。与CPU的Cache不同,NPU的片上SRAM通常由软件(编译器或驱动)显式管理,而非硬件自动缓存,这称为软件管理片上存储(Software-Managed On-chip Memory)。
2.3.1 片上SRAM的分区设计
片上SRAM通常被划分为多个逻辑区域:权重Buffer(存储量化后的权重)、激活Buffer(存储输入特征图与中间结果)、累加器Buffer(存储MAC阵列的中间累加结果,通常位宽更高,如INT32)。分区设计的核心目的是避免不同数据类型的访问冲突,并支持多Bank并行访问。例如,一个256KB的SRAM可划分为8个Bank,每个Bank 32KB,支持同时读取权重和激活数据。
2.3.2 数据搬运引擎(DMA)
DMA(Direct Memory Access)引擎是存储系统的“搬运工”,负责在片外DDR与片上SRAM之间、以及片上不同Buffer之间传输数据。高性能NPU通常配备多个DMA通道,支持二维/三维DMA(如从DDR中按Tile尺寸搬运子矩阵),并支持异步传输(计算与搬运重叠)。DMA的调度由控制单元或专用硬件调度器完成,以减少CPU干预。
2.4 核心组件三:控制单元(Control Unit)
控制单元是NPU的“大脑”,负责指令的取指、译码、发射和同步。与CPU的复杂乱序执行不同,NPU控制单元通常采用静态调度(Static Scheduling)或VLIW(超长指令字)风格,指令由编译器预先编排,硬件按序执行。这种设计牺牲了灵活性,但大幅降低了硬件复杂度与功耗。
2.4.1 指令集架构(ISA)特征
NPU的指令集通常包含以下几类:计算指令(如MAC阵列运算、向量运算)、搬运指令(如DMA加载/存储)、同步指令(如栅栏Barrier、等待事件)、控制指令(如跳转、循环)。指令格式通常采用长指令字(如256位或512位),一条指令可同时描述多个并行操作,例如“从Buffer A读取数据、执行MAC运算、将结果写回Buffer C”。
2.4.2 同步机制与流水线
NPU内部存在多条并行流水线(计算流水线、DMA流水线、向量流水线),它们之间需要同步机制保证数据依赖正确。常见同步方式包括:硬件栅栏(Barrier,等待所有流水线到达某点)、信号量(Semaphore,用于生产者-消费者模型)、事件标志(Event Flag,用于异步通知)。控制单元还负责管理中断,当任务完成或出错时向主机CPU发送中断信号。
// 典型NPU指令序列(伪代码,展示控制流与数据流协同)
// 1. 配置DMA:从DDR地址0x8000_0000搬运64KB权重到片上权重Buffer
DMA_LOAD(dst=WEIGHT_BUF, src=0x8000_0000, size=64KB, channel=0);
// 2. 配置DMA:从DDR地址0x9000_0000搬运128KB输入特征图到激活Buffer
DMA_LOAD(dst=ACT_BUF, src=0x9000_0000, size=128KB, channel=1);
// 3. 等待两个DMA完成(同步点)
WAIT_BARRIER(barrier_id=0, wait_for={DMA0, DMA1});
// 4. 执行MAC阵列运算:从权重Buffer和激活Buffer读取,结果写入累加器
MAC_ARRAY_OP(weight_addr=WEIGHT_BUF[0], act_addr=ACT_BUF[0],
acc_addr=ACC_BUF[0], m=16, n=16, k=64);
// 5. 执行向量运算:对累加器结果应用ReLU激活
VECTOR_OP(op=RELU, src=ACC_BUF[0], dst=ACT_BUF[0], size=256);
// 6. 将结果写回DDR
DMA_STORE(dst=0xA000_0000, src=ACT_BUF[0], size=16KB, channel=2);
// 7. 通知主机任务完成
SEND_INTERRUPT(irq_id=5);
2.5 案例拆解:边缘AI芯片的架构权衡
为加深理解,我们以一个面向智能摄像头的边缘NPU设计为例,分析其架构决策过程。
背景与约束:某安防厂商需要设计一款用于实时目标检测(YOLOv5s)的NPU,功耗预算3W,芯片面积受限,需集成在已有SoC中。目标帧率30FPS,输入分辨率1280×720,INT8精度。
初始指标计算:YOLOv5s的INT8计算量约16.5 GMACs(即33 GOPS)。考虑30FPS,所需算力约1 TOPS(INT8)。但实际运行中还需考虑预处理、后处理等开销,故目标峰值算力定为2 TOPS。
架构决策过程:
- MAC阵列规模:2 TOPS @ 1GHz 需要 2000 个MAC(2×10^12 / 10^9 / 2 = 1000,考虑双发射则500个MAC)。实际选择16×64=1024个MAC,工作频率800MHz,峰值算力1.64 TOPS,留有余量。
- 片上存储容量:YOLOv5s的权重约14MB(INT8),但可分层加载。设计256KB权重Buffer + 512KB激活Buffer + 128KB累加器Buffer,共896KB SRAM。通过Tile切分,将每层计算划分为多个子块,确保数据在片上完成重用。
- DMA带宽:片外DDR4-3200理论带宽25.6GB/s,实际可用约60%(15GB/s)。计算所需数据供给带宽:每帧需读取权重14MB+输入1.3MB+写回输出0.5MB,共约16MB,30FPS下需480MB/s,远低于可用带宽,DMA不是瓶颈。
- 控制单元设计:采用两级流水线:一级负责DMA调度,一级负责计算调度。使用硬件栅栏同步,避免软件同步开销。
结果与复盘:实际测试中,该NPU在YOLOv5s上达到28FPS,接近目标。性能瓶颈出现在激活Buffer容量不足,导致部分层需要多次DMA搬运。通过调整Tile切分策略(将空间维度切分更细),将激活Buffer利用率从70%提升至92%,最终达到31FPS。复盘经验:片上存储容量往往比峰值算力更影响实际性能,架构设计初期应优先评估存储带宽与容量需求。
2.6 常见误区与设计复盘
在NPU硬件架构的学习与设计中,以下误区值得特别注意:
- 误区一:只关注TOPS,忽略有效算力。TOPS是峰值理论值,实际有效算力受数据供给、存储容量、控制开销影响,通常只有峰值的30%-60%。
- 误区二:将NPU存储等同于Cache。NPU的片上SRAM是软件管理的,需要编译器或驱动显式控制数据生命周期,不能依赖硬件自动缓存。
- 误区三:忽视控制单元的同步开销。频繁的栅栏同步会导致流水线停顿,尤其在细粒度任务中。应尽量增大任务粒度,减少同步次数。
- 误区四:MAC阵列越大越好。阵列规模增大意味着功耗和面积上升,且需要更高的数据供给带宽。若带宽不足,大阵列反而因空转浪费功耗。