NPU架构概览:从宏观到微观,一次讲透
各位同学,今天咱们来聊聊NPU的宏观架构。说实话,我第一次接触NPU设计时,也被各种术语搞得晕头转向。什么脉动阵列、数据流架构,听着就头大。但别担心,我会用最直白的方式,把这些概念掰开揉碎了讲给你听。
一、NPU的三大核心单元
一个NPU芯片,说白了就是三个部分:计算单元、存储单元、控制单元。我习惯把它们比作一个工厂——计算单元是工人,存储单元是仓库,控制单元就是厂长。
1. 计算单元(Compute Unit)
这是NPU的心脏。跟CPU不同,NPU的计算单元专门为矩阵运算优化。我见过很多新手问:“为什么不用CPU的ALU?” 你想想看,CPU的ALU一次只能处理几个数,而NPU一次要处理几百上千个数。这就是本质区别。
典型的计算单元包括:
- MAC阵列:乘加运算器,这是最核心的部件
- 累加器:把多次乘加结果累加起来
- 激活函数单元:ReLU、Sigmoid等
我踩过的坑:曾经在设计第一版NPU时,我把MAC阵列做得太大,结果功耗直接爆表。后来才明白,计算单元的规模要和存储带宽匹配,否则就是“大马拉小车”。
2. 存储单元(Memory Unit)
存储单元是NPU的命门。我常说一句话:“NPU的性能,一半看计算,一半看存储。” 为什么?因为数据搬来搬去的时间,往往比计算本身还长。
典型的存储层次:
- 片上SRAM:速度最快,但容量有限(几MB到几十MB)
- 寄存器文件:紧贴计算单元,用于临时数据
- 外部DRAM:容量大,但延迟高
我的建议:设计时一定要算好“数据复用率”。如果数据只被用一次就扔掉,那存储带宽再大也白搭。
3. 控制单元(Control Unit)
控制单元负责调度一切。它告诉计算单元该算哪块数据,告诉存储单元该搬哪块数据。我个人习惯用指令驱动的方式,而不是硬连线控制——这样灵活性更高。
二、数据流架构:行、列、脉动阵列
数据流架构,说白了就是数据怎么在计算单元之间流动。我见过三种主流方式,每种都有它的脾气。
1. 行数据流(Row-Stationary)
数据按行流动。比如一个矩阵乘法,第一行数据进来,算完再进第二行。这种架构的优点是控制简单,但缺点是数据复用率不高。
2. 列数据流(Column-Stationary)
数据按列流动。权重数据固定在一个位置,输入数据流过来。我在做卷积加速器时特别喜欢用这种——因为卷积核的权重可以一直待在原地,不用来回搬。
3. 脉动阵列(Systolic Array)
这是Google TPU的看家本领。数据像心跳一样,有节奏地在阵列中流动。每个计算单元只做一件事:把数据传给邻居,同时算自己的。
举个例子:假设你有一个4x4的脉动阵列。数据从左边流进来,权重从上面流进来。每个节点做一次乘加,然后把结果传给右边的节点。最终,右下角的节点输出最终结果。整个过程就像流水线一样,效率极高。
我当年第一次看到脉动阵列时,觉得这设计太巧妙了。但后来发现,它也有缺点——对数据依赖很敏感。如果某个节点卡住了,整个阵列都得等着。
三、典型NPU产品分析
光说不练假把式。咱们来看看市面上几款典型的NPU产品,看看它们是怎么设计的。
1. Google TPU(张量处理单元)
TPU是Google为深度学习量身定做的。它的核心是一个256x256的脉动阵列,专门做矩阵乘法。我记得第一次看到TPU的论文时,被它的性能吓了一跳——比当时的GPU快了一个数量级。
TPU的特点:
- 脉动阵列:256x256 MAC,一次处理65536个乘加
- 大容量片上存储:24MB SRAM,减少DRAM访问
- 量化计算:支持INT8,降低功耗
注意:TPU的脉动阵列虽然快,但只适合矩阵乘法。如果你的模型里有大量非矩阵运算(比如稀疏操作),TPU的效率会大打折扣。
2. 华为达芬奇架构
达芬奇架构是华为自研的NPU,用在昇腾系列芯片上。它的设计思路跟TPU不太一样——采用了3D Cube结构。
达芬奇的特点:
- 3D Cube:一个16x16x16的立方体,一次处理4096个乘加
- 灵活的数据流:支持多种数据复用模式
- AI Core:每个核心包含Cube、Vector、Scalar三个单元
我研究过达芬奇的指令集,发现它在灵活性上做得很好。比如,你可以用一条指令完成一个3D Cube的矩阵乘法,也可以用多条指令组合出更复杂的运算。
3. 其他NPU产品
| 产品 | 核心架构 | 特点 |
|---|---|---|
| Apple Neural Engine | SIMD阵列 | 低功耗,适合移动端 |
| NVIDIA Tensor Core | 混合精度矩阵 | 支持FP16/INT8混合 |
| Intel NNP | 脉动阵列 | 针对推理优化 |
我的经验:选NPU架构时,一定要看你的应用场景。如果是云端训练,TPU的脉动阵列很合适;如果是边缘推理,达芬奇的灵活性更好;如果是手机端,Apple的SIMD阵列功耗最低。
四、总结
好了,今天的内容就到这里。咱们从NPU的三大核心单元讲起,聊了计算、存储、控制各自的作用。然后深入数据流架构,分析了行、列、脉动阵列的优缺点。最后看了几款典型产品,了解了它们的设计思路。
记住一句话:没有最好的架构,只有最合适的架构。设计NPU时,一定要从实际需求出发,别盲目追求高大上的技术。
下次课,咱们会深入指令集设计,聊聊怎么给NPU写“程序”。到时候见!