NPU架构详解:从MAC阵列到TOPS,揭示AI芯片算力背后的真相

📅 发布时间:2026/9/10 1:28:38
NPU架构详解:从MAC阵列到TOPS,揭示AI芯片算力背后的真相
干这行时间长了经常有人问我NPU到底是个啥和CPU、GPU有啥区别。我一般会丢一句话过去然后对方就懂了。这句话是把神经网络里的乘加运算从“一条流水线上一个接一个地做”变成“一万个小工同时一人算一个”然后把数据传搬运的次数压到最低。这话听起来糙但NPU芯片架构从DSP时代的简单阵列到如今动不动几百T算力的大芯片核心逻辑真没变过。今天这篇我就把这句话掰开揉碎了讲顺带把怎么看一份NPU芯片架构图、怎么读懂TOPS、DRAM带宽这些枯燥参数背后的门道给你捋一遍。这期内容适合三类人准备选型AI芯片的工程师、做算法推理优化但没碰过硬件的同学、纯粹想搞明白“手机发布会吹的NPU到底多厉害”的硬件爱好者。1. 先说透这句话NPU到底在干什么活1.1 从算一道乘法说起你先别管NPU这个名字听起来多高大上它干的活本质上是把一个超大的“从头到尾重复算乘法再累加”的过程做成硬件电路。拿最基础的卷积来说一个3×3的卷积核在输入特征图上滑动每次滑到一个位置要把3×3总共9个数和卷积核上9个数分别相乘加起来这算一个输出点。一张224×224的图用64个3×3卷积核去卷积理论上要算224×224×64×9次乘法和差不多同样次数的加法——这是大概2896万次乘加操作这还只算了一层。ResNet-50这种网络有50层按输入张量尺寸算下来跑一张图的运算量在7.7G FLOPs附近也就是77亿次浮点运算。这种算法天生就是“重复重复再重复、积木式堆叠”的结构用硬件工程师的话讲具有高度的并行性和规律性。CPU不走这条路它是个全能管家得随时响应各种指令所以核心都做得特别大要处理分支预测、乱序执行、缓存一致性这些复杂逻辑一个核心同时算得了的乘法非常有限。GPU比CPU强很多本质上是堆了上千个较小的计算核心走的是SIMT单指令多线程路线但这套体系仍然要兼顾图形渲染、通用计算这类复杂场景存在大量控制开销。NPU的思路完全是另一个方向它把密密麻麻的乘累加器MAC按阵列排开没有复杂的控制逻辑没有大缓存来救场整个芯片就是一块超大的造乘法机。拿最直白的数据说话——一个普通CPU核心一两个周期能做一次乘加4核心8核心分摊下来每秒做几十G次乘加顶天了。而一个中端AI芯片的NPU动辄几百OPS也就是每秒几十万亿次运算。这中间差了三个数量级不是靠某个参数优化出来的就是靠“百万计算单元同刻开工”的物理堆叠堆出来的。1.2 那“一句话”剩下的半句是什么并行只是一半剩下的关键是数据搬运。很多外行看NPU只盯着算力其实AI芯片设计中最坑的就是数据搬家。刚说一张图的运算量要77亿次浮点计算你可能觉得“算”是瓶颈其实真正拖慢系统的是“搬”数据——把输入图像、权重、中间特征图从内存里一趟趟送到计算单元那儿。大模型训练时性能参数里经常能看见“计算量太大、显存不够、通信开销爆炸”这些词本质就是搬运量太大。NPU的两招正好对应这句话的另一半 一是大量采用片上存储SRAM把要用的参数、特征图直接放在计算单元隔壁俗称“用空间换距离” 二是在数据流上做文章让计算单元从片上存储取数算完结果仍留在片上中间不经过外部DRAM这就叫数据复用。这两件事做得好不好直接决定一颗NPU的实际利用率——你再多的算力如果数据搬不过来那也是干瞪眼。我自己调过一颗NPU峰值算力写得挺好看但实际推理时只能跑到40%多的利用率。后来一分析算法里反复访问了外部DRAM取权重片上SRAM没接住整颗芯片的算力全浪费在等待数据上了。这个坑几乎是所有初上手做AI芯片适配的人都会踩的。2. 架构拆解为什么CPU、GPU都不是最终答案2.1 CPU的“全能”反而成了负担你得先明白CPU是一套为了应付“什么都可能发生”而设计的架构。它有分支预测器、有乱序执行窗口、有大而全的多级缓存这些电路都是为了让你跑的操作系统、办公软件、数据库这类“乱序、无法预测、依赖分支”的程序更顺畅。但顺滑是有代价的——芯片面积和功耗是固定的花在控制逻辑上的晶体管多了留给算数的就少了。你在芯片图上看到的CPU核心真正用来做浮点乘加的单元只占晶体管面积的很小一部分。跑到神经网络这种“结构极其规律、几乎不需要分支判断”的算法时CPU那套复杂的控制电路基本全员闲置纯属浪费电价。这就像你雇了一个资深大厨去给一百桌客人切同一高度、同一尺寸的胡萝卜丁他再专业也顶不过十来个帮厨一人拿把刀同时开工。2.2 GPU并行了你但还不够“偏科”GPU的设计初衷是图形渲染后来的通用计算GPGPU是“兼职”。它的基本模型叫SIMT同一时刻几十上百个线程执行同一行代码但数据各不相同。这已经和神经网络的思路很接近了所以英伟达的GPU能称霸AI训练市场本质上是因为它能在“通用可编程”和“大规模并行”之间找到一个很好用的平衡点。但GPU的问题在于它仍然是“程序驱动”的体系要在里面跑卷积你得先写kernel、开线程块、做同步每一步都有调度开销。而且GPU最小的调度单元是warp——通常32个线程即便你只需要算4个数它也得按32个线程的槽位把任务安排上有空转的线程在划水。GPU架构里还有纹理单元、光栅化单元这些做图形才用得上的家伙占了大量面积。NPU把这些统统砍掉不要分支不要多线程调度不要图形专用模块。它自己就是一块专门为“逐元素乘加、小窗口滑行、数据批量进出”设计的逻辑控制逻辑只剩很轻量的一层。更重要的一点是NPU把数据流也优化了计算单元之间的数据流动路径、存储层次都是根据神经网络访存模式提前布线好的而不是像GPU那样依赖通用缓存和共享内存的临时调度。这是一个本质区别NPU是“以数据流动为中心”设计的架构而CPU/GPU是“以指令执行为中心”设计的架构。2.3 NPU的三个立身之本把架构拉高了看NPU的设计语言就三件事大规模乘累加阵列MAC Array用来做最耗时的卷积和矩阵乘法数据调度与片上存储层次用来最大化数据复用、减少搬运专用指令集与加速器协同用来让边缘检测、池化、激活函数这些算子也能高效执行同时保留一定的可编程性。这三件事对应到具体芯片上就是你在架构图里经常看到的“卷积核阵列 / NNA / AI Core”、那些一块一块的SRAM buffer以及配套的DMA引擎、指令解码器。你再看任何一颗NPU的架构图只要找到这三块基本上就把大局看明白了。3. 手把手看懂一块NPU芯片架构图3.1 先找“金矿”计算阵列在哪拿一张典型的AI芯片内核框图来看第一件事找那种密密麻麻画成方块矩阵的区域那基本就是MAC阵列业内也常叫“脉动阵列”或者“NN Core”。这个阵列的规格直接决定算力上限。以英伟达的Volta架构为例一个Tensor Core每个周期可以执行4×4的矩阵乘加到了A100上这个矩阵扩展到4×8甚至更多。国内一些AI加速芯片像BR100系列这类面向数据中心训推一体场景的大芯片动辄放几千甚至上万个MAC单元这就是“算力底气”。MAC阵列通常还分成多个小阵列每个小阵列配自己的本地SRAM这叫做“计算岛”compute tile或者“核心”core。芯片上不止一个核心比如一颗芯片有几十个AI Core每个Core内部又有若干排列的PE处理单元。读图时你可以简单记一个公式算力TOPS≈ PE数量 × 主频 × 2因为MAC一次做乘和加两件事。我拿一个28nm工艺时代的小芯片算给你看如果一个PE阵列里有512个MAC主频1GHz那这颗芯片的峰值算力就是 512×2×1GHz 1024 GOPS ≈ 1 TOPS。如果同样的主频MAC总数做到8192个那就是16 TOPS。今天手机旗舰芯片的NPU动不动宣称30 TOPS、50 TOPS你反推一下就知道了里面的MAC阵列规模得多大主频大概在什么量级。3.2 再看“货仓”SRAM和缓冲块找完金矿之后第二件事是看计算阵列周围那些方块存储区颜色通常和计算阵列不同。那是片上SRAM也叫“缓冲区”或“片上内存”作用是把要算的输入特征图、权重先搬进来让计算单元就近取用。读图时要注意区分SRAM总量和层次有些芯片是把一整片SRAM挂在阵列边上这叫共享缓存有些是每个计算岛私有一块SRAM这叫私有缓存或者局部buffer。后者更有利于减少访问冲突前者实现共享更容易。设计取舍的底层逻辑是数据用一次就扔的放远点没所谓要反复复用的权重必须放在最贴近计算单元的地方。我自己做性能优化时一份权重如果能在片上SRAM完整驻留那层卷积的耗时能比从DRAM加载时快三倍以上。这个经验放哪颗NPU上都成立。3.3 三看“血管”片上网络和DMA最后一步找连接这些计算岛、SRAM、以及外部接口的那一捆捆连线。这就是片上网络NoC和数据搬运引擎DMA。读图时注意看有没有环形Ring、网格Mesh或者交叉开关Crossbar这些常见的NoC拓扑。这些“血管”决定了一件很重要的事数据在不同计算岛之间能不能高效“串门”。大模型训练需要做张量并行权重切到多颗芯片、多个计算岛上每算完一层就要做一次AllReduce所有计算结果求平均再分发给所有卡如果NoC带宽不够通信时间就会比计算时间还长整个训练的效率直接瘫痪。这也是为什么很多高端AI芯片会在片内放专用的高速互连接口如英伟达的NVLink国产高端芯片也有类似的高速片间互联技术。BR100系列这种面向大规模集群的芯片把片间互联带宽和NoC设计看得极重因为数据中心场景下单卡算力再高连不成网也是废铁。4. 参数背后的门道TOPS、内存带宽、功耗怎么读4.1 TOPS、主频和MAC数量怎么互相换算芯片标称算力是最容易把人绕晕的地方因为厂商喜欢“文字游戏”。看参数学历时你至少要知道这几个口径的区别参数口径含义典型陷阱TOPSFP16半精度浮点算力别拿去跟INT8算力比要同精度对比TOPSINT8整数8位算力有的厂商会把MAC算成“一次运行两个INT8操作”数值翻倍报稀疏算力激活值/权重稀疏时才能达到实际数据不稀疏时性能大打折扣稠密算力无稀疏支持时的实际算力与稀疏算力差距可达2-4倍我给你一个自查方法已知一颗芯片的MAC总数为M主频为fGHz那理论稠密TOPS M × f × 2因为乘加一起算再除以1000。如果某个型号标称的TOPS明显大于这个数要么是它用了非常激进的稀疏优化要么是“营销算力”里有水分。咱们做技术选型的时候直接找“稠密INT8算力”那一栏这个数字最能反映真实水平。4.2 内存带宽决定你的“枪支”够不够弹药光有算力不够你还得有数据喂。我见过太多人盯着TOPS下单硬件到手跑模型才发现坑不在算力而在内存带宽。业界有个粗略的比例实现高效计算MAC阵列每做一次运算大约需要从存储里读入1到4字节数据。1个TOPS意味着每秒钟要读写1万亿字节到4万亿字节也就是1-4 TB/s的数据。你看看市面上大部分芯片的DRAM带宽很多才100-200 GB/s也就是说如果数据没有在片上复用好再强的算力也只能顶着一个很小的利用率跑。这背后就是“存储墙”问题。具体到CPU/GPU/NPU通用场景下解决方案无非三板斧 一是增大片上SRAM容量靠复用提高命中率 二是用高带宽内存HBM替代普通DDR带宽从几十GB/s提到几百GB/s甚至上TB/s 三是存算一体架构把存储和计算揉在一起直接从物理上消灭搬运过程。你看BR100系列这类高端芯片几乎都会堆HBM因为数据中心推理、训练场景需要大容量的高带宽片上池HBM就是把“数据搬运瓶颈”尽量往后推的关键。4.3 功耗与散热算力是有价格的很多非硬件背景的同学容易忽略功耗但算力从来不是白来的。一颗能跑几百TOPS的AI芯片整卡功耗基本在几百瓦的量级。你在架构图里看到的计算阵列密密麻麻没事它们在满载时是把电流当水喝的。数据中心场景下功耗直接决定你每台服务器能插几块卡、机柜功率怎么分配、制冷系统要不要加码。真到做算力集群的阶段N1冗余电源、液冷散热、能耗比审核每一层都要算钱。所以看参数时别只看峰值TOPS看“每瓦TOPS”更实在。一个经验是同工艺世代下如果你发现某颗芯片的TOPS标得极高但功耗只有同类的一半多半是标称值存在精度打折或稀疏水分别高兴太早。5. 大芯片的进阶视角BR100这类芯片的架构语言5.1 Chiplet不做一颗“巨无霸”而是“拼乐高”芯片设计做到高算力之后会碰到两个大问题一是单颗芯片面积太大良率上不去成本爆炸二是光刻机能够暴露的掩膜面积有上限尺寸到头了。业界主流的解法是Chiplet芯粒技术把一颗大芯片拆成多颗小芯粒分别流片再封装在一起。这就像你没法一次做出一张巨大的桌子就分做四条桌腿和一个桌面最后拼装。BR100系列这类面向数据中心的芯片用的就是这个思路把负责计算的计算芯粒、负责带宽的存储芯粒、负责IO的接口芯粒分开设计然后集成封装。一个很直观的好处是你想升级IO带宽只需要替换接口芯粒不用重新流片整颗芯片计算芯粒出了问题也能按小片子排查成本可控得多。5.2 片间互联NPU离开单卡就开始考验网络单颗芯片算力再猛跑千亿参数大模型也撑不住。原因是权重加优化器状态加起来动辄几百GB单卡显存根本塞不下。于是你得把模型切到几十甚至上百颗芯片上让它们协同干活这就要靠片间高速互联。BR100系列这类高端AI芯片的架构图上你会看到专门的“互联单元”带宽能到几百GB/s甚至更高。它们存在的意义就是让多卡并行切分时同步梯度和权重的通信时间尽量缩到最短。大模型训练的扩展性指标比如千卡集群利用率很大程度上就取决于这个互联带宽够不够硬。如果互联效率低卡的张数翻倍训练速度却只提升了10%那这笔硬件采购就是血亏。5.3 编译器把算法翻译成硬件的“灵魂”前面说的都是硬件但我必须提醒你芯片的“灵魂”其实是编译器。架构图画得再好看没有一套好的软件栈把PyTorch模型转换成能在NPU上高效运行的指令那芯片就是块昂贵的砖头。现在的NPU编译器普遍走这样一条路拿到计算图之后做算子融合、内存规划、循环分块、数据布局转换这些Pass最后把中间表示翻译成硬件指令。好的编译器能做到和手写汇编差不多的效率差的编译器可能让性能掉一半以上。我遇到过很多次类似的事情同一颗NPU换了新版本编译器之后推理耗时有明显下降这不是芯片变了是软件的调度能力变强了。所以选芯片时要多看它的编译器成熟度、支持的主流通用框架版本、以及社区活跃度这方面的软实力往往比纸面算力更重要。6. 实测经验NPU性能调试与常见问题排查6.1 利用率上不去先查这三样做NPU适配时间久了你会发现性能问题大概率出在三个地方第一数据布局不对。神经网络张量有NCHW、NHWC、NC1HWCO这些排法NPU的MAC阵列天生对某种布局高效对另一种布局低效。举个例子如果一个硬件单元的向量化宽度是16你把通道数设计成17就会多出一次带边界处理的计算性能直接打折。排查方法很简单跑几个不同数据布局的基准测试对比差异你就明白了。第二小算子太多。某些NPU对单个算子的启动开销不小如果你的网络里有一堆几百微秒级的细碎算子比如逐元素加、激活、缩放那启动开销会远超计算时间。解决办法是算子融合把很多小操作合并成一个大的融合算子常见融合手段包括ConvBNReLU三合一。第三访存与计算重叠不足。理想情况下计算单元算这一块数据的时候DMA已经在把下一块数据预取过来了。但很多初版代码是“等数据到齐再算算完再搬下一块”流水线没有重叠性能当然上不去。排查方法是看profiler里的计算时间和数据搬运等待时长如果等待时间占比很高优先优化预取调度。6.2 量化和剪枝是性价比最高的加速手段你有再大的MAC阵列算法是FP32稠密模型那也是杀鸡用牛刀。工程上最立竿见影的一招是做INT8量化把模型权重从FP32压成INT8很多NPU的INT8算力是FP16的两倍运算量直接减半访存带宽压力也小了四倍每个数从4字节变1字节。跑起来之后你会惊喜地发现端侧推理速度提升非常明显。但量化也不是无脑压要注意敏感层有些层对精度极其敏感压成INT8后精度掉得离谱这时要保留FP16计算通道做混合精度还要做校准拿少量有代表性的数据统计激活值的分布定好量化零点/缩放因子这块做不好会出现严重的精度劣化。剪枝则是把接近0的权重直接干掉配合稀疏加速硬件能再拉一波性能但稀疏率没达到一定程度时普通稠密硬件收益很小。6.3 现场排查速查表最后把实战中碰到频率最高的问题整理成一个速查表方便你按图索骥。现象优先排查方向常用手段推理用时远大于模型理论计算量数据搬运是否阻塞计算看profiler的访存等待占比调预取深度和缓冲区多卡训练扩展效率差片间通信是否成为瓶颈检查AllReduce通信占比考虑梯度压缩算子耗时波动大存储bank冲突或调度冲突调整数据对齐方式让访问地址均匀分布INT8量化后精度大幅劣化校准集不准或敏感层处理不当换校准数据敏感层走混合精度编译器生成的代码效率低算子未融合或循环分块不当更新编译器版本手动改写热点算子写到这里我突然想起来当初我第一颗NPU调完看着Dashboard上满满的算力利用率真的有一种跟老伙计击掌的兴奋感。芯片架构这东西看起来高深但归根结底没有跳离那句大白话。如果你把“并行计算、数据复用、片上做存储、互联解决通信”这几个词刻在脑子里再拿任何一份AI芯片框图翻一翻基本都能看个七七八八。真要上手做一款产品还是得拿着一块开发板跑几个模型调几个典型算子踩过坑才算真正入门。