3、NPU硬件架构入门:NPU的核心组件(MAC阵列、Buffer、控制器)、数据流架构

各位同学,欢迎来到第三章。

前两章我们聊了NPU是什么,以及它和CPU、GPU的区别。今天,咱们直接掀开NPU的“引擎盖”,看看里面到底长什么样。

说实话,我第一次拆开NPU的架构图时,感觉就像在看一张复杂的城市交通图。但别怕,核心组件其实就三样:MAC阵列、Buffer、控制器。搞懂这三样,你就抓住了NPU的命脉。

3.1 核心组件一:MAC阵列——算力的“心脏”

MAC阵列,全称是乘累加阵列。说白了,它就是NPU里干苦力的地方。

你想想看,神经网络里最频繁的操作是什么?是卷积,是全连接。这些操作的本质,就是一堆乘法加一堆加法。MAC阵列就是专门干这个的。

核心概念:一个MAC单元,一次完成一个乘法和一个加法。成千上万个MAC单元排成阵列,就能并行处理海量数据。

我在项目中遇到过一个问题:芯片的MAC利用率死活上不去。后来发现,是数据喂得太慢了,MAC单元一直在“等米下锅”。所以,光有强大的MAC阵列不够,还得有高效的“后勤保障”。

MAC阵列的常见形态有两种:

  • 脉动阵列(Systolic Array):数据像流水一样,在阵列里“脉动”传递。Google的TPU就是用的这种。优点是数据复用率高,功耗低。
  • 树形结构(Tree Structure):用加法树把多个乘法结果累加起来。优点是灵活性高,适合不规则的计算。

个人经验:我个人习惯在项目初期,先根据算力需求估算MAC阵列的大小。比如,目标算力是1TOPS,那至少需要512个MAC单元(假设1GHz频率)。这个估算能帮你快速判断架构是否可行。

3.2 核心组件二:Buffer——数据的“粮仓”

Buffer,就是NPU里的缓存。但它和CPU的Cache不太一样。

CPU的Cache,讲究的是“快”,但容量小。NPU的Buffer,讲究的是“大”和“带宽高”。因为NPU处理的是海量的权重和特征图,Buffer小了,MAC阵列就得饿肚子。

Buffer通常分为几级:

  • Global Buffer(全局Buffer):容量最大,通常几百KB到几MB。它和片外DRAM打交道,负责把数据搬进来、搬出去。
  • Local Buffer(本地Buffer):离MAC阵列最近,容量小但速度极快。它负责给MAC阵列“喂数据”。

避坑指南:我曾经在一个项目里,把Global Buffer设计得太大,结果芯片面积超标,成本飙升。后来学乖了:Buffer的大小,要刚好能“掩盖”数据搬运的延迟。不是越大越好,够用就行。

Buffer的带宽,决定了数据搬运的速度。举个例子:

假设MAC阵列需要每秒处理1G个数据。
如果Buffer带宽只有500MB/s,那MAC阵列有一半时间在空转。
所以,Buffer带宽必须大于等于MAC阵列的消耗速度。

3.3 核心组件三:控制器——算力的“大脑”

控制器,负责指挥一切。它告诉MAC阵列:该算哪一层了;告诉Buffer:该搬哪块数据了。

控制器的设计,直接决定了NPU的灵活性和效率。

控制器的核心任务:

  1. 指令解析:把上层软件发来的指令,翻译成硬件能懂的微操作。
  2. 数据流调度:决定数据从哪来、到哪去、什么时候开始搬。
  3. 同步控制:确保MAC阵列、Buffer、外部接口之间步调一致。

嗯,这里要注意:控制器的设计,很容易成为瓶颈。如果控制器太复杂,指令解析慢,整个NPU的性能都会被拖累。我见过一些NPU,MAC阵列利用率低,问题就出在控制器上——它太“笨”了,调度不过来。

3.4 数据流架构——数据怎么“流”起来

有了MAC阵列、Buffer、控制器,它们之间怎么配合?这就涉及到数据流架构了。

数据流架构,说白了就是数据在NPU内部的流动方式。不同的流动方式,决定了不同的性能、功耗和面积。

常见的三种数据流:

  • 权重固定(Weight Stationary):权重数据留在MAC阵列里不动,输入数据流进来。适合权重复用度高的场景,比如全连接层。
  • 输入固定(Input Stationary):输入数据留在MAC阵列里,权重数据流进来。适合输入复用度高的场景,比如某些卷积层。
  • 输出固定(Output Stationary):部分结果留在MAC阵列里,不断累加。适合需要大量累加的场景,比如深度卷积。

你可能会问:哪种最好?其实没有绝对的好坏。我个人的经验是:根据你的目标应用来选。如果主要跑图像分类,权重固定可能更合适;如果跑目标检测,输入固定可能更好。

下面这张图,展示了NPU内部的核心数据流:

NPU核心数据流架构图 片外DRAM 权重/输入/输出 DMA搬运 Global Buffer 全局缓存(大容量) 数据分发 Local Buffer 本地缓存(高速) 喂数据 MAC阵列 乘累加计算 (算力核心) 结果写回 输出Buffer 结果回传 控制器 指令解析 & 调度 图例: 存储 计算 控制 控制信号 数据流

从这张图里,你能看到数据是怎么从片外DRAM,一层层流到MAC阵列,算完后再流回去的。控制器就像交通警察,指挥着这一切有序进行。

总结一下:NPU的硬件架构,核心就是MAC阵列(算力)、Buffer(存储)、控制器(调度)这三板斧。数据流架构决定了它们怎么配合。搞懂这些,你就掌握了NPU硬件设计的“内功心法”。

好了,这一章就到这里。记住,纸上得来终觉浅。有机会的话,建议你找个NPU的模拟器,亲手跑几个算子,看看数据是怎么流动的。那感觉,比看一百张架构图都管用。

可可精品资料库