news 2026/10/13 15:02:25

NPU是什么?从体系结构视角看懂AI芯片的领域专用架构

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NPU是什么?从体系结构视角看懂AI芯片的领域专用架构

你是不是也遇到过这种时刻:抱着《计算机体系结构》啃完了流水线、缓存、虚拟内存,觉得自己总算摸清了计算机的底细,结果一翻手机芯片的规格表,CPU、GPU、NPU三个词并排躺着,你发现除了CPU,剩下俩只能算“认识字”。尤其NPU,课本里几乎没有,但现在的手机、服务器、汽车芯片里全在提。这东西到底是啥?它凭什么能在AI时代和CPU平起平坐?这篇就聊聊NPU,尽量不带废话,把体系结构视角下NPU的核心逻辑讲清楚。

这篇内容适合几类人:正在学体系结构但被“领域专用架构”搞晕的学生,想搞懂AI芯片为什么不能只用CPU/GPU的开发者,以及准备入手端侧推理、模型部署方向,需要快速建立NPU知识框架的工程师。我会从“为什么需要NPU”开始,一路拆到它的硬件构成、指令集、软件栈,最后聊聊怎么看性能指标和那些容易踩的坑,尽量让你看完能有个整体坐标。

1. 先搞清楚:体系结构里为什么突然多出一个NPU?

1.1 CPU的“通用”代价

CPU的设计目标从来都不是“算得快”,而是“什么都跑得动”。为了实现这个目标,CPU把大量晶体管花在了控制逻辑上:分支预测、乱序执行、寄存器重命名、多级缓存、TLB……这些硬件在跑操作系统、数据库、普通应用时非常有用,因为这类程序充满了分支、跳转、随机访问和不可预测的依赖。

但神经网络计算是另一种脾气。一个卷积层,说到底就是一堆乘加操作,循环边界是确定的,数据访问是规律的,没有复杂的分支,也不需要猜未来要执行哪条指令。你要是让CPU去跑一个卷积,它会把整整四层流水线、预测器、缓存系统都“空转”着陪跑,大部分晶体管根本没在干正事。曾经有人用高端CPU算一个图像分类模型的推理,功耗拉满,但利用率惨不忍睹,问题不在主频,而在架构根本不匹配。

1.2 GPU的妥协

GPU比CPU强很多,因为它走了另一个极端:堆大量简单ALU,用SIMT(单指令多线程)的方式并行执行。图形渲染天然是“一堆像素各算各的”,GPU的调度模型正好契合。神经网络也吃并行,所以GPU在AI训练时代几乎成了标配。

但GPU也有它的妥协。每个线程仍然需要独立的寄存器、调度器和线程状态,控制开销还在;GPU的极其灵活的通用并行能力,也意味着它要为“任意并行程序”做准备,而这些准备在神经网络这种高度规则的载荷里属于冗余。GPU追求高精度浮点性能,而神经网络推理对精度的要求没那么苛刻,这是GPU“浪费”的第二个地方。最重要的是,GPU的功耗密度太高,你要在手机、耳机、摄像头里放一个GPU来专门跑神经网络,散热和电池都吃不消。

1.3 NPU的本质:领域专用架构

这就是NPU出现的根本逻辑:与其用一套通用的硬件去适配所有计算,不如为神经网络这个固定领域,专门设计一种“极度偏科”的处理器。体系结构里管这叫DSA(Domain-Specific Architecture,领域专用架构),NPU就是DSA里最典型的代表。

NPU不做分支预测,因为神经网络不需要;NPU不做复杂的乱序执行,因为计算顺序是编译期就能定好的;NPU把几乎所有的面积和功耗都砸在乘法器和片上存储上,因为神经网络最核心的操作就是乘加,最贵的开销就是数制搬运。你可以这么理解:CPU是个全能选手,跑马拉松、游泳、自行车都会,但单项都不是最快;NPU是个只练举重的选手,你让他去跑步他不行,但如果比赛项目只有举重,他能把全能选手按在地上摩擦。神经网络推理这个场景,就是典型的“只考举重”。

2. NPU的三大命根子:数据复用、片上存储、低精度

2.1 数据复用:减少搬运才是硬道理

学体系结构最容易被忽略的一个现实是:计算早就不贵了,搬数据才贵。芯片内部做一次乘加可能只要几个皮秒,但从DRAM里读一个数据,要经过总线、控制器、多级缓存,耗时是计算的上百倍。神经网络模型动辄几MB到几百MB,如果每次计算都去内存里取数,算力再高也白搭。

NPU解决这个问题的核心思想是数据复用。拿卷积举例:一个3x3的卷积核会在输入特征图上滑动,同一个权重会被反复用来和不同位置的输入做乘加;同一份输入数据,也会被不同的卷积核反复读取。这种“一数多用”的特性,给NPU提供了巨大的优化空间。我记得有篇文章算过账:一个典型卷积层,如果设计好数据流,片上数据复用能把对外内存访问量降低几十倍。没有这个前提,NPU的“高算力”就是空中楼阁。

所以你看NPU设计时,最难的不是放多少个乘法器,而是怎么设计数据流,让每个从DRAM搬到片上来的数据,能被尽可能多地使用。这就像你做饭,去一趟超市买一车菜,如果只做一道菜就浪费了;厉害的大厨会规划好,这一车的菜能连续出好几道,减少反复跑超市的时间。NPU里的“超市”就是DRAM,“大厨”就是数据流调度器。

2.2 片上存储:SRAM即一切

既然数据复用这么重要,那空间放不下也一样白搭。NPU芯片里最贵的面积,往往不是计算单元,而是片上SRAM(静态随机存储器)。SRAM比DRAM快得多,带宽也大得多,能直接喂饱计算阵列。所以NPU内部通常是一个存储层级:最底层是DRAM(主内存),往上是较大的片上SRAM(用来暂存特征图分块和权重的tile),最靠近乘法器的是一小堆寄存器/累加器。

这里有个关键设计点:NPU不会一次性把整张特征图和所有权重塞进SRAM,因为塞不下。它采用的是循环分块(loop tiling)策略,把大矩阵切成一个个小块,依次搬入片上,算完一块再搬下一块。块的大小怎么定,搬入的时机怎么选,这就是编译器干的重活。整体来说,NPU性能好不好,一半看硬件阵列多大,另一半看片上存储能不能让阵列时刻处于“有活可干”的状态。我测试过不同NPU,最大的差距往往不是峰值算力,而是片上SRAM的容量和调度策略,SRAM小的芯片,碰到大模型会频繁“断粮”,利用率直线下跌。

2.3 低精度:8位够不够用?

NPU普遍支持低精度运算,int8(8位整数)是最常见的推理精度,很多端侧NPU甚至开始支持int4。为什么敢用低精度?因为神经网络在训练完成之后,权重和激活值的分布相对稳定,对噪声有很强的容忍度。把float32的权重量化到int8,大多数任务精度损失可以控制在1%以内。但硬件收益非常巨大:int8乘法器的面积大概只有fp32的几分之一,速度更快,功耗更低,同样面积你能塞下更多的计算单元。

这背后对应着体系结构里的经典权衡:用精度换性能和功耗。做训练时,因为要反向传播、要精确梯度,需要fp32甚至fp16;做推理时,前向计算对误差不敏感,int8足够了。量化方法一般有两种:训练后量化(PTQ)和量化感知训练(QAT)。PTQ是把训练好的模型直接转成int8,省事但可能有点精度损失;QAT是在训练过程中就模拟量化误差,让网络适应低精度,精度更高但要重训模型。实际项目里我通常先试PTQ,精度不达标再上QAT,省时间。

这里还有一个容易忽略的细节:很多NPU标称的TOPS算力是基于int8算的,换成fp16,这个数字可能直接腰斩,理解精度和算力的挂钩关系,是看懂NPU规格表的第一步。

3. 拆开NPU:核心硬件模块与数据流

3.1 脉动阵列:一个格子只算一招

聊NPU硬件,不得不提脉动阵列(Systolic Array)。简单说,它是一个二维的MAC(乘加)单元网格,数据在相邻的单元之间按节奏流动,每个单元只做一次乘加,然后把结果传给下一个。这设计妙在哪?妙在“没有多余动作”。每个乘法器不需要从复杂的寄存器堆里取数,数据会从阵列边缘流入,像流水线一样流过去,中间单元只需要专注算。

脉动阵列有不同的数据流组织方式,常见的有权重固定(weight stationary)、输入固定(input stationary)、输出固定(output stationary)。什么意思?权重固定是指权重提前加载到各个单元里不动,输入数据流经阵列,每个单元拿着自己存的权重和流过的输入做乘加,适合卷积这种权重复用的场景;输入固定则是把输入留在片上反复使用,权重流过去,适合某些全连接场景。不同厂商的NPU风格差异,很大程度就是选了不同的数据流策略。

我早期看脉动阵列时总觉得复杂,后来想通了一个类比:它像一条流水线上的工人,每个人只拧一个螺丝,零部件从左传到右,最后出来一个完整产品。每个工人不需要知道整个产品长什么样,只需要等着零件到手,熟练拧一下,传给下一个人。这种“颗粒度极细”的并行,是传统CPU完全无法做到的。

3.2 激活函数、池化与归一化单元

脉动阵列算完的结果是线性累加和,但神经网络必须要有非线性,否则层数再多也等价于一层线性变换。所以NPU里必须有激活函数单元,比如ReLU(整流线性单元)、Sigmoid等。这部分一般挂在MAC阵列后面,作为流水线的一站。池化层用来降采样,也是固定模式操作,NPU可以用专门逻辑或复用MAC阵列来做。

还有一个值得注意的细节:推理阶段,批量归一化(BatchNorm)通常会被“折叠”进卷积的权重和偏置里。折叠之后,推理时不再需要单独算归一化,卷积层直接输出结果。这个优化是编译器干的,但硬件设计时也会预留支持,比如允许权重和偏置做特殊处理。这种“软硬件协同”的例子在NPU里到处都是,你要是不了解折叠机制,可能还以为NPU缺了某个功能模块。

3.3 控制与调度:NPU也有“程序计数器”吗?

NPU的控制逻辑很简单,不像CPU有复杂指令流水线。绝大多数NPU的工作方式是“任务描述符”(task descriptor)驱动:主机CPU把网络每一层的计算任务,打包成一个描述符,里面包含输入地址、权重地址、输出地址、数据形状、步长、操作类型等参数,写进NPU的命令队列或者寄存器。NPU拿到描述符后,自主完成数据搬运、计算、写回,完成后通过中断或者状态位告诉主机。

我拿一个实际例子说明。部署一个图像分类模型时,你会看到系统里有几百个这样的任务描述符:第一层卷积一个描述符,ReLU可能也被融合进卷积了,第二层卷积又一个描述符……主机CPU只需要把这一串描述符按顺序提交给NPU,然后就可以干别的去了,NPU会异步地执行完整个网络。这个过程完美映射了体系结构里的“异步”和“DMA”概念,也解释了为什么NPU运行AI任务时CPU占用率可以很低。

4. NPU指令集与软件栈:它到底是怎么被“编程”的?

4.1 从指令集看NPU:它根本不是“通用处理器”

很多刚接触NPU的人会问:NPU跑的是什么指令集?能不能写个C程序直接编译上去跑?答案是:不能,也没必要。

NPU的“指令”更像配置参数,而不是传统意义上的指令。比如“把输入地址0x1000的数据,按3x3卷积核处理,输出到0x2000”,这是一个任务,不是一条RISC风格的指令。有些NPU设计会引入类似RISC的指令风格,用于控制流和同步,但核心计算能力仍然靠特定算子的硬件执行单元实现。你可以把NPU理解成一个“专用加速器”,它只能执行神经网络这个领域内的操作,不能跑操作系统,不能执行任意程序。

这也带出一个实用建议:选型NPU时,不要只看算力,要看它“支持哪些算子”。有的NPU对标准卷积优化得很好,但碰到转置卷积、动态形状、循环依赖的算子,可能直接退回CPU慢速执行,部署时踩坑。

4.2 编译器的真功夫:图优化、内存规划和算力映射

NPU软件栈的核心是编译器。以某个常见开源深度学习框架为例,流程大概是:模型(比如一个导出的计算图)输入到NPU编译器,编译器先做算子融合,把卷积、ReLU、批归一化合并成一个融合算子;然后做内存规划,分析每个张量的生命周期,尽量复用片上缓冲区;最后把每个算子映射成NPU任务描述符,并生成调度顺序。

算子融合带来的收益非常大。举个例子:一个卷积层后面跟ReLU,如果不融合,卷积的输出要完整写到DRAM,ReLU再把它读出来,一来一回两块内存带宽;融合后,卷积单元算出一个像素,ReLU立刻处理,结果直接留在片上,甚至可以直接作为下一层的输入。原始网络有100个算子,融合之后可能变成50个任务,中间数据搬运量减少一大半。下面是一段伪代码,能帮你直观理解tile搬移加计算的过程:

# NPU编译器生成的核心调度逻辑(伪代码) for tile in plan.tiles: # 把输入特征图的一个分块从DRAM搬到片上SRAM dma_load(input_addr=tile.input_addr, sram_buffer=input_sram[tile.buffer_id]) # 把对应的权重分块搬到片上SRAM dma_load(weight_addr=tile.weight_addr, sram_buffer=weight_sram[tile.buffer_id]) # 用MAC阵列计算,数据流直接在片上完成 compute(engine_id=tile.engine_id, input_buffer=input_sram[tile.buffer_id], weight_buffer=weight_sram[tile.buffer_id], output_buffer=output_sram[tile.buffer_id]) # 结果写回DRAM dma_store(output_sram[tile.buffer_id], output_addr=tile.output_addr)

这段逻辑看着简单,实际编译器要考虑的东西多得多:哪个tile先算能最大化复用已经搬进来的数据?SRAM分给输入还是权重?多核NPU怎么分工?这些优化直接决定NPU能不能跑出接近峰值的水准。我自己调试性能时,最常做的事就是看编译器生成的“内存分配报告”和“任务时间表”,那里面的门道比硬件框图要深得多。

5. 整个系统视角:NPU在主板上是怎么工作的?

5.1 异构架构:CPU、GPU、NPU怎么分工?

真实的SoC(片上系统)里,CPU、GPU、NPU不是各干各的,而是协同工作。CPU负责控制流和任务调度,GPU负责图形或部分并行计算,NPU专职神经网络推理。它们共享一块DRAM,通过总线互连。运行一个AI应用时,CPU先把图片数据准备好,在内存里布局好,然后通知NPU开始处理;NPU算完,CPU再接过结果去做后续的逻辑判断。

这中间涉及一个体系结构老话题:缓存一致性。NPU有自己的片上SRAM,但主机CPU和NPU共享DRAM时,谁改动数据、谁看到最新数据,需要明确规则。有的NPU设计直接不走CPU缓存,要求主机在提交任务前显式flush缓存;有的则参与系统一致性协议,硬件帮你搞定。前一种软件上容易踩坑,我碰到过“NPU老是读到旧数据”的问题,最后就是漏了缓存同步。

5.2 藏在背后的最大瓶颈:内存带宽

很多人看NPU性能只盯TOPS,实际上大多数真实场景的瓶颈是内存带宽。一个100 TOPS的int8 NPU,工作频率按1GHz算,意味着每个周期要执行约10万次int8乘加。如果每次乘加都要从DRAM读一个输入和一个权重,每个周期要读200KB,这远超任何DRAM的带宽能力。所以NPU必须靠数据复用把实际访存需求降下来,但即便如此,像全连接层这种“权重巨大、复用有限”的算子,仍然会牢牢卡在带宽上。

怎么判断一个模型在NPU上是算力受限还是带宽受限?有个简单的估算方法:算一下模型的总计算量(MACs)和总内存访问量(bytes),用计算量除以带宽峰值,和用计算量除以算力峰值,哪个大,哪个就是瓶颈。端侧部署时,很多模型是带宽受限的,优化手段重点就放在模型压缩、算子融合、减少中间张量上。工程师如果能建立“算力-带宽-存储容量”这三个维度的性能心智模型,调试NPU时会顺手很多。

6. 怎么看懂NPU性能指标?别被算力数字骗了

6.1 TOPS到底怎么算的?

TOPS是Tera Operations Per Second,即每秒万亿次操作。但这里有个容易混淆的点:一次MAC(乘加)通常被算作2次操作,因为乘法和加法是两件事。所以一个拥有M个MAC单元、主频为F的NPU,理论峰值算力 = 2 × M × F(单位视M和F的量级调整)。很多厂商宣传时的“AI算力XX TOPS”,默认都是int8精度,并且按2次操作计算。如果你把这个数当成fp32算力,会大错特错。

看规格表时,我一般建议盯着三栏:精度(int8还是fp16)、算力(TOPS)、内存带宽(GB/s)。光看一个TOPS没有任何意义。最新的一些经验是,端侧中高端NPU普遍在10-30 TOPS区间,云端的卡级别NPU能到几百上千TOPS,但后者功耗和散热要求完全不是一个量级。

6.2 实际性能:为什么利用率只有一半?

理论峰值是理想情况,实际跑模型利用率通常只有30%-50%,常见的蚕食因素有三个:一是数据搬运开销,哪怕有缓存,DRAM的延迟和带宽限制依旧存在;二是算子映射效率,有些算子硬件支持不好,编译器生成的调度效率低;三是小算子调度开销,比如一个很小的激活函数或reshape算子,如果单独成为一个任务,任务提交和同步的固定开销会占大头。

所以评估NPU,最靠谱的方法是端到端跑真实模型,用延迟和吞吐说话,而不是信规格表。同一款NPU,跑MobileNet和跑ResNet的“实际表现/理论峰值”比例完全不同;跑单帧和跑连续帧流也完全不同。我个人现在评测NPU,一定是拿自己业务里最典型的三五个模型,固定输入尺寸、固定精度、固定batch,跑出来的数据才有参考价值。

7. 常见问题与经验总结:这些坑我帮你踩过了

7.1 关于NPU的四个常见误区

先给你列一个我平时回答咨询时反复纠正的误区速查表:

误区实际情况
算力高=性能好带宽、缓存、算子支持和编译器都会拖后腿
NPU什么模型都能跑算子支持有限,复杂控制流效率极低
int8一定掉精度大多数任务量化损失很小,QAT之后几乎无损
NPU会取代CPU异构架构里两者是协作关系,各干各的

这四个误区我都在真实项目里见过。有一回优化一个检测模型,厂商说NPU算力特高,结果一跑发现在一个动态形状的算子上直接退回CPU执行,整个延迟翻了三倍。还有一次,模型量化后精度掉了2个点,我们没细想就全盘改用QAT重训,成本很高,后来才发现只是某个激活层没有做量化敏感处理,补上就好了。多试、多测、多看编译器日志,比迷信任何宣传都管用。

7.2 给新人的学习建议:从软件栈切入,别一上来啃RTL

如果你想把NPU学明白,我给的建议是先别急着看寄存器传输级(RTL)代码,而是从软件栈切入。大致的顺序是:先在一个成熟的深度学习框架里,把一个模型部署到某个NPU上跑通,感受整个工具链流程;再去看编译器生成的任务日志,理解模型被切成了多少个算子、内存是怎么规划的;然后回头研究NPU的架构文档,重点看脉动阵列的尺寸、SRAM容量、数据流方向;最后才考虑写个小算子,比如手写一个3x3卷积的映射代码,在模拟器上跑一跑。

这种倒着学的方式,能让你在短时间内建立“模型—算子—硬件”三层映射的心智模型,而不是陷在晶体管细节里出不来。我在学习早期犯过一个错误:拿了一堆RTL代码盯着看,越看越糊涂,后来发现只要先把“数据从哪来、到哪去、在哪计算”这三件事理清楚,NPU的大局就明白了。

7.3 最后分享一个实用技巧:怎么快速估算一个模型在NPU上会不会快?

拿到一个模型,先别急着部署,花十分钟在纸上做一个估算。第一步,统计模型总MACs,很多框架工具能直接输出;第二步,估算模型权重总大小和最大中间特征图大小;第三步,看看目标NPU的算力、带宽和片上SRAM容量;第四步,算算推理一遍需要多少次数据搬运,是否超过片上容量,是否会被带宽卡住。这套方法虽然粗糙,但能让你在动手前就对方案的可行性有个判断,避免盲目调优。我自己每次换NPU平台,都会先拿这套估算过一遍,再决定要不要投入时间做深度适配。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/13 15:02:24

C#二次开发VisionPro:从源码解析到通用检测框架实战

VisionPro 在国内机器视觉圈子里,讨论度一直很高,尤其做 3C、锂电、汽车零部件这些行业的朋友,几乎绕不开它。但很多人对它的理解停留在 QuickBuild 拖拽工具块出流程这一步,真正把 C# 和 VP9.0 结合起来做通用检测框架&#xff0…

作者头像 李华
网站建设 2026/10/13 15:00:08

KeyStone_SRIO调试包:C6678多核DSP的SRIO物理层快速验证方案

简介:本资源是面向嵌入式DSP开发者的TMS320C6678多核处理器SRIO(Serial RapidIO)高速通信完整工程实现,适用于雷达、软件无线电、高速数据采集等对低延迟与高吞吐互联有严苛要求的实时信号处理场景,适合具备C6000系列基…

作者头像 李华
网站建设 2026/10/13 14:59:49

RepMet解析:少样本目标检测中的度量学习与多代表表示

这篇《RepMet》(Representative-based Metric Learning,基于代表学习的度量模型),我第一遍是冲着“少样本目标检测”去读的,读完发现它其实是先用少样本分类把度量空间讲清楚,再把同一个思路顺延到检测上。…

作者头像 李华
网站建设 2026/10/13 14:57:34

数据库压缩包导入实战:从安全解压到MySQL/PostgreSQL恢复

简介:面向重庆大学数据库课程学习者与备考学生,整合了理论复习、实验操作与考试演练所需的完整学习资料,覆盖数据库基础、关系模型、SQL、查询优化及事务处理等核心内容。资源包共185个文件,约210.48MB,以png课件截图、…

作者头像 李华
网站建设 2026/10/13 14:57:30

MBA论文降AI率工具实测:9款软件红黑榜与三遍法处理流程

MBA论文初稿交出去之前,最先被卡住的地方往往不是查重率,而是AIGC检测的标红比例。这两年我帮朋友做过论文语言层面的复检,发现大家手上的降AI率工具五花八门,可同一个段落,有的工具能一次性把标红压下去,有…

作者头像 李华