news 2026/9/7 10:19:06

NPU架构核心解析:从乘加阵列到数据流,看懂AI加速引擎

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
NPU架构核心解析:从乘加阵列到数据流,看懂AI加速引擎

1. 先给答案:NPU架构的一句话概括

我做了这么久芯片相关的开发,被问得最多的一个问题就是:NPU到底是什么?听起来很玄,各家厂商宣传得神乎其神,什么“AI算力怪兽”“神经网络加速引擎”,好像离了它手机电脑就转不动似的。但说穿了,NPU的架构内核用一句话就能讲明白——

NPU就是:把“乘加运算”堆成阵列,把“数据存储”搬到计算单元隔壁,再把“搬运数据”这件事极度简化,最终让数据尽量不动、计算尽量并行、每一焦耳功耗都花在矩阵运算上。

话听起来简单,但这背后其实藏了一整套设计哲学。这条思路回答了三个问题:算力从哪里来?瓶颈在哪里?功耗花在了哪里?把这三个问题想通了,NPU的原理、架构、甚至选型,基本都清楚了。这篇文章我就沿着这句话拆开揉碎讲,适合刚接触NPU的嵌入式工程师、做端侧AI部署的开发者,也适合想补硬件背景的算法同学。

先说个容易被忽略的事实:NPU不是一个全新的概念,它的本质是专用集成电路(ASIC)的一种,只是为神经网络算子量身定做了计算通路。但这个“量身定做”的度,决定了各家NPU的架构差异。理解了架构,再看Intel NPU开发、手机SoC里塞的NPU、以及各种AI加速卡,就不会被参数表和宣传话术绕晕了。

2. 从通用到专用:为什么CPU干不了这活儿,NPU才够用

2.1 神经网络的计算特征和CPU的“不匹配”

要理解NPU为什么存在,得先看神经网络计算到底长什么样。以卷积神经网络(CNN)或者Transformer这类主流模型为例,计算量的大头无非是卷积运算和矩阵乘法。这些东西拆到底层,全是一堆乘加操作。听起来CPU也能算,对吧?没错,CPU确实能算,但效率低得离谱。

问题出在三个层面。第一,神经网络的计算并行度极高。一个卷积层里,成百上千个输出通道之间的计算互不依赖,理论上可以同时进行。CPU虽然也有多核和SIMD指令集,但通用处理器的设计目标是处理各种不可预测的任务流,它的控制逻辑、分支预测、乱序执行等电路占了大量芯片面积和功耗。你让一个全能运动员去干流水线工人的重复活儿,能干,但每个零件(焦耳)的产出效率太低。

第二,数据搬运的代价远超计算本身。学过体系结构的朋友都知道“存储墙”理论:从内存拿一个数据的时间,可以执行几十上百次算术运算。神经网络推理时,权重和激活值的数据量非常大,如果每个计算步骤都要从外部内存取数,计算单元大部分时间都在空转等待,算力利用率低得吓人。

第三,神经网络的容错特性让“算得快够用就行”成为可能。网络的最终输出来自大量计算的统计结果,对单个数值的微小误差并不敏感。这就给了NPU一个巨大空间——用低精度计算(INT8、INT4甚至更低)换取更高的吞吐量。而CPU作为通用处理器,数值精度、异常处理这些都得面面俱到,这些“保险措施”在AI推理场景里反而成了累赘。

2.2 算力利用率的差距,比纸面性能更真实

纸面算力数字很唬人。有些CPU标称多少GOPS(每秒十亿次操作),看起来不低,但跑真实网络模型时,实际有效算力可能只有理论值的5%到15%。原因就是上面说的:数据喂不饱、并行掏不空、精度用不上。

NPU的思路完全不同。它不是把算力堆到通用流水线里,而是直接在芯片上铺开一个“算力矩阵”——成千上万个乘加单元排成阵列,每个周期做同样的事但处理不同数据。配合精心设计的数据流路径,尽量让每个计算单元从最近的存储里拿数据,不经过远距离的外部内存。这样一来,理论算力和实际算力的差距可以拉到50%以上,甚至在设计良好的情况下逼近70%到80%。

我拿个实际感受举例。某型号CPU在跑MobileNet这类轻量网络时,耗电量或许能压住,但延迟明显偏高;而一颗算力数字只有CPU几分之一的NPU,跑同样的模型,延迟能低一到两个数量级,而且功耗还更小。原因就一句话:专用架构把每一分钱(功耗)都花在了刀刃(矩阵计算)上。CPU那把刀太大太全,切小菜反而费劲。

3. 拆开NPU的核心骨架:计算阵列、片上存储、数据流

3.1 乘加阵列:以“空间换时间”的算力引擎

NPU最核心的区域,就是那一大片乘加单元阵列,业界常叫MAC阵列(Multiply-Accumulate Array)。一个MAC单元做的事情很纯粹:做一次乘法,把结果累加到之前的结果上,也就是result += a * b。这是神经网络最底层的操作。这个阵列怎么组织、怎么喂数据,直接决定了NPU的性能上限。

最常见的设计有两种。一种是脉动阵列(Systolic Array),Google的TPU就是这种架构的代表。它的特点是数据像血液一样在相邻的计算单元之间“流动”,每个单元只处理从邻居传来的数据,然后把手里的乘加结果传给下一个单元。这样做的好处是数据复用率极高,权重存在片上寄存器里重复使用,几乎不用反复从内存读取。但代价是控制逻辑复杂,数据要按严格的节拍灌入阵列,开发编译器时非常头疼。

另一种是二维网格阵列(2D Grid/Simd Array),市面上很多边缘端NPU采用这种设计,比如瑞芯微、酷睿的IP方案里常见的做法。它本质上是把一个巨大的SIMD单元平铺开,所有MAC单元在同一个时钟周期里执行相同的操作,只是处理各自的数据块。相比脉动阵列,它更容易编程,编译器实现相对简单,灵活性稍好,但对片上带宽的要求更高,因为数据要同时广播到所有单元。

不管哪种结构,选型逻辑都是同一套:在“计算密集度”和“数据复用率”之间找平衡。这里我补充一句,对于做应用的开发者,这些阵列细节不需要背,但最好有个概念——因为后面分析编译器为什么这么难用、为什么有些网络的算子跑不起来时,根子都在这个阵列组织方式上。

3.2 片上存储:数据“跨一步”就能拿到

计算阵列只是引擎,让引擎跑起来还得有燃料,燃料就是数据。神经网络推理涉及的数据有两类:权重和张量(中间激活值)。如果每次计算都从外部DDR取数据,功耗和延迟都会爆炸。所以NPU内部一定设计了大容量的片上存储,通常叫SRAM或者统一缓冲区(Unified Buffer)。

这就像你在厨房做饭,锅(计算阵列)旁边的台面上(片上存储)提前摆好了所有食材和调料,而不是每次炒菜都去楼下超市现买(外部内存)。NPU架构师在设计缓存容量时,要精算“在一个网络层内,最多能有多少数据待在片上”和“数据从哪里来、算完去哪里”这两个问题。容量太大,芯片面积和成本飙升;容量太小,数据搬不进搬不出,算力再强也是空转。

实际开发中,片上存储的大小直接影响一个网络能不能完整跑完。有些大模型,或者分辨率很高的输入图,一张中间特征图就得几十甚至上百MB,远超出片上SRAM容量。这时候NPU得把网络“切”成一段段执行,每段算完把结果导回DDR,再加载下一段。这个切分过程叫“分层调度”或“tiling”,是NPU编译器处理的核心任务之一。后面聊避坑的时候我还会再提。

3.3 数据流控制:用极简控制逻辑换取更多算力面积

CPU为什么面积大?因为它有复杂的指令解码、乱序执行、分支预测、高速缓存一致性协议等逻辑,目的都是为了应对不可预知的指令流。但NPU应用场景很明确:反复跑神经网络推理,计算路径在编译阶段就固定了。这意味着NPU完全可以把大量控制电路砍掉,把省下来的芯片面积和功耗让给算术单元。

数据流控制的简化体现在几个方面。指令集极其精简,常见NPU只有有限的几十条指令,主要就是“加载权重”“加载数据”“执行矩阵乘”“执行激活函数”“写回结果”。没有复杂的分支和跳转,代码基本是线性执行。内存地址访问模式高度固定,编译器会提前把数据和权重的摆放位置计算好,NPU运行时直接按预定模式取数,不需要像CPU那样依赖复杂的缓存替换策略。

所以你看NPU的结构图,往往是“一块巨大的计算阵列 + 几块SRAM + 一条简单的控制流水线”,没有CPU那种密密麻麻的控制逻辑块,也没有GPU那套复杂的线程调度器和渲染管线。简洁带来的直接好处是单位面积上的有效算力高,能效比优秀,上游厂商拿同样的功耗预算能塞更多MAC单元。

4. 和CPU、GPU、DSP放在同一张桌上:各自的位置在哪

4.1 一张表看懂四类处理器的分工

很多初学者会问:GPU不是也在做并行计算吗?DSP也能跑AI,为什么要再搞一个NPU?问得好。我在下面这张表里梳理了四类处理器的关键差异,看完就明白了。

类型并行方式擅长场景能效比灵活性编程难度
CPU少量核心+指令级并行通用计算、控制流、系统调度极高
GPU上千个核心+SIMT大规模并行浮点运算、图像/通用计算中高
DSP专用向量指令+VLIW音频、信号处理、简单AI中高
NPUMAC阵列+数据流控制定点神经网络推理最高取决于工具链

CPU是“全能杂工”,什么活都能接,但做什么都只能七十分。GPU是“重火力支援”,适合那种成千上万独立任务一起上的场面,比如3D渲染和CUDA生态下的通用计算。DSP更像“固定流水的熟练工”,处理信号流很拿手。而NPU是“专项工种”,只会做神经网络相关的乘加累加,但做得极致省电极致快。

4.2 GPU和NPU:不是替代关系,是互补关系

GPU在AI训练阶段几乎是垄断地位,因为训练需要高精度浮点、需要处理复杂的反向传播,还要应付各种动态shape,这些恰好是GPU的强项。但到了推理阶段,特别是端侧和边缘场景,NPU的优势就出来了:功耗低、延迟稳定、吞吐量高、无需巨大的散热系统。

拿自动驾驶举例:训练一个感知模型可以放在云端用GPU集群跑几天,但车上的推理必须用低功耗的NPU,因为车内供电和散热条件有限,还要保证每一帧画面都稳定在几十毫秒内完成推理。这就是NPU不可替代的边界——在功耗、成本和实时性都有严格约束的场景里,通用处理器完全打不过专用加速器。

不过也别指望NPU取代CPU,更别指望CPU“免费”帮你把NPU的活抢过来。实际系统里两者是协同的:CPU负责调度整个应用、处理传感器数据、跑非AI逻辑,遇到神经网络算子就把数据交给NPU算完,再拿回来做后续处理。这个协同过程就是“异构计算”,后面章节我会具体讲开发中怎么处理这种协同。

5. 别被TOPS忽悠了:NPU关键指标的真相与选型思路

5.1 TOPS到底是什么,怎么算出来的

NPU厂商最喜欢宣传一个参数:TOPS,意思是每秒万亿次操作。听起来数字越大越强,但这里面的水很深。先看它怎么来的。假设你的MAC阵列出厂做成256个乘加单元,每个单元一个周期做一次乘加,一次乘加通常算作两次操作(一次乘法+一次加法),芯片主频1GHz,那么它的理论算力就是:

256(MAC单元数)× 2(每周期操作数)× 1GHz(频率) = 512 GOPS = 0.512 TOPS

看到问题了吗?这个公式里没有任何真实网络模型的因素。它只是硬件的极限吞吐能力,实际跑网络时,因为数据搬运、层间切分、算子支持度等因素,真实表现可能只有理论值的30%到60%。所以两个TOPS相同的NPU,跑同一个模型成绩可能差一倍,完全不奇怪。

选型时更值得看的,是官方或者社区里对目标网络(比如ResNet50、MobileNet、YOLO系列、LLM)的真实跑分数据,以及对应的功耗数字。有时候一颗4 TOPS的NPU能用低得多的功耗跑赢8 TOPS的竞品,因为前者的数据流设计更匹配你的模型形态。算力不等于端到端性能,这个认知相当重要。

5.2 内存带宽和数据精度:两个更容易被忽略的瓶颈

芯片算力再高,数据送不进来也是白搭。NPU的性能上限经常被内存带宽锁死,这个现象在深度学习领域叫“memory-bound”。打个比方:算力是一台每小时能处理一万个包裹的分拣机,但如果传送带每小时只送来五千个包裹,分拣机再快也只能等料。

内存带宽取决于DDR和片上SRAM之间的传输能力。大模型(比如几B参数级别的LLM)推一次,光是把权重从DDR搬进NPU内部就需要几十毫秒,算力阵再快也在干等。这也是为什么很多NPU方案开始引入大容量片上SRAM甚至HBM,就是在提升“传送带”的速度。

数据精度同理。同一颗NPU,跑FP16的算力可能是INT8的一半,跑INT4又是INT8的两倍。量化是NPU开发里几乎绕不开的一环。如果你把FP32模型直接丢给NPU,大概率跑不了,或者性能难看。所以看NPU规格时,要留意不同精度下的TOPS分别是多少,以及编译器对INT8/INT4的支持度,这些直接决定你能跑什么体量的模型,需要多少量化工作量。

6. 主流NPU方案速览:Intel NPU、手机SoC NPU、端侧NPU都在做什么

6.1 Intel NPU:从云端老玩家到端侧的新动作

热词里出现了“Intel NPU开发”,这个趋势值得聊。Intel在云端的AI加速早已有布局,比如Habana Labs的Gaudi系列,但在PC端和边缘端的NPU布局是近年才开始发力的,代表性产品就是集成在酷睿Ultra系列处理器里的NPU单元。

它主打低功耗下的持续性AI负载,比如视频会议背景模糊、眼神矫正、语音降噪、本地LLM推理等。Intel的策略是让NPU长期“在岗”,处理那些CPU和GPU搞得定但功耗不划算的任务。Intel OpenVINO工具链在这个过程中起到了非常关键的桥接作用——模型可以经由ONNX等格式导入,OpenVINO把高层模型转化为NPU可执行的IR中间表示,并调度到CPU/GPU/NPU三个计算单元上协同工作。

实操层面,Intel NPU开发流程大概是:训练好模型(PyTorch/TensorFlow)→ 导出ONNX → OpenVINO模型转换器转换并量化 → 编写推理代码,指定使用“NPU”设备 → 部署测试。对开发者来说,最需要注意的是NPU单元有着明确的“内存访问共享”特性,它没有独立的显存但共享系统带宽。这意味着如果在NPU上跑大数据量的模型,会和CPU抢内存带宽,调度不当反而拖慢整个系统。

6.2 手机SoC NPU和端侧NPU:把AI放进你的口袋

手机SoC里的NPU,典型如苹果的Neural Engine、高通Hexagon、联发科APU,和Intel NPU承担类似的职责:在拍照场景做语义分割和夜景增强、在语音助手场景做唤醒词识别、在AR场景做姿态估计。它们的架构逻辑也是简化到极致的MAC阵列加数据流控制,但设计约束更严格——每毫瓦功耗都要精打细算。

端侧NPU更极端,比如各类物联网芯片里的NPU IP。这类方案算力通常在0.5到4 TOPS之间,主打超低功耗,跑一些轻量级模型比如唤醒词、人体检测、口罩识别。开发这类NPU时,工具链成熟度是选型第一原则。有些芯片的NPU算力纸面上很好看,但编译器只支持极少数算子,稍微复杂一些的网络结构就跑不起来,只能手工替换算子甚至放弃某些层,项目进度很容易被拖死。

我的经验是:选NPU方案,先拿目标模型在芯片厂家的SDK里跑一遍,确认算子覆盖率和量化工具链路通顺,再考虑性能参数。跑不通的算力等于零,这个教训是真金白银换来的。

7. NPU开发避坑实录:编译器、量化、数据搬运那些事

7.1 数据布局:一个看似不起眼却能拖慢一倍的问题

NPU对输入数据的布局比CPU敏感得多。CPU跑连续内存上的数据块,随便怎么排,无非快慢问题;NPU通常要求特定维度的对齐,比如NHWC还是NCHW,通道数C是否对齐到16或32的整数倍,这对MAC阵列的访问效率影响巨大。

我踩过这样一个坑:把一个PyTorch训练好的分割模型迁移到某款端侧NPU上,前置处理是OpenCV读图,输出的是HWC排列的BGR图像,而NPU工具链默认期望NCHW,并且通道需要对齐。我一开始直接在预处理阶段做了逐像素转换,虽然结果正确,但推理总延迟比预期多了40%。排查了半天发现,问题根本不出在推理本身,而是预处理的数据布局转换耗了大量时间。后来用NEON指令重写了转置逻辑,又把图像填充到对齐的通道数,延迟立刻降回来。

给新手的建议很简单:拿到NPU工具链的第一天,先看它要求的输入张量布局是什么。是NHWC?NCHW?通道对齐到几?这些信息往往藏在工具链文档的“推荐配置”里,但很多人不看,直接拿OpenCV的数据硬塞,出了性能问题还得不到正确方向。

7.2 量化不是无脑转INT8,而是和数据分布博弈

几乎所有端侧NPU都支持INT8量化,高端的还支持INT4。很多同学把模型转成INT8之后,精度掉得厉害,就一口咬定“NPU不行”。但真实原因往往是量化预处理没做好。

量化本质上是把浮点数值范围映射到整数范围。如果你的权重和激活值分布比较均匀,这个过程几乎无损耗;但如果数据分布有长尾、有明显异常点,量化就会放大误差。业界通行做法是“校准”——用一小批有代表性的数据跑一遍浮点模型,统计各层激活值的分布,找到最优的缩放系数和零点,再进行量化。

实操细节上,有几个容易被忽略的坑。每个层的缩放系数可能不同,校准集不能太小,几百张图是最低限度,太少会导致统计失真。如果目标浮点模型已经在训练时用过了各种归一化层,量化之后发现BN层效果“变了味”,可以提前把BN层“折叠”进前面的卷积层,让量化伴侣更稳定。还有,INT4量化虽然能实打实把吞吐翻倍,但精度损失往往不可控,除非是2B参数以上的大模型自带冗余,否则建议从INT8起步。

7.3 闲下来的NPU也很重要:底层算力调度是一门取舍

芯片上往往有CPU、GPU、NPU三种可用的计算单元,怎么分配任务不是简单的“NPU最大优先”。NPU虽快,但它能适用的算子有限,尤其在混合模型里如果有LSTM、动态控制流这类“不规整”结构,NPU编译器会退化成在CPU上执行这些算子,导致频繁地在CPU和NPU之间来回切换,开销巨大,最终端到端延迟反而不如纯CPU跑。

我在一个语音识别模型中遇到过一次这样的情况:模型主体是CNN计算,但前后有VAD(语音活动检测)和特征后处理,全部是常规Python代码。最初我把整个流程都交给NPU调度,看似“硬件加速”,实际上每次推理都要在高速缓存和DDR之间拷贝多次数据,延迟翻倍。后来调整策略:特征提取在CPU完成,CNN推理进NPU,后处理再回到CPU,三段流水线化执行,总延迟缩短了60%。NPU适合的是“大块计算”,把它当通用处理器用是在浪费它,也在给自己挖坑。

8. 最后说说我对NPU架构发展趋势的真实体感

聊到最后,我特别想分享一个观察:NPU架构的演进远没有结束,而且正在变得越来越“软硬协同”。早期NPU设计比较死板,编译器只是一种“翻译官”,把模型翻译成指令就算完事。现在的新方案已经开始反过来了——编译器参与架构设计,工具链和硬件一起改良。比如不少NPU工具链开始支持“自动搜索最优切分策略”(Auto-tiling),编译器会根据模型结构和片上存储容量,自动决定怎么切分数据、怎么编排流水线,不再要求开发者手工调参。这对应用开发者的门槛正在降低,是好迹象。

另一个趋势是“存算一体”和“近存计算”。前面反复提到带宽瓶颈是NPU设计的大敌,所以架构师们开始把更多存储单元搬到计算阵列旁边,甚至直接做存内计算。这个方向如果成熟,能在端侧解锁更大的模型潜力,值得持续关注。虽然这些技术还处在前沿阶段,但方向已经比较明确了。

我自己的经验是:不管NPU架构怎么变,那句老话始终成立——先把数据流想清楚,再谈算力。做应用的人,不要被TOPS数字牵着走,多关注工具链成熟度、算子覆盖率和数据搬运的开销。这些才是决定一个AI项目能否落地的真正变量。希望这篇文章能帮你在NPU的迷雾中拨开一角,下次再有人问NPU是什么,你也可以用一句话回他:让数据尽量不动,让计算尽量并行,让每一焦耳都花在矩阵上。

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

容器镜像优化实战:解决Docker镜像体积、构建效率与安全问题

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 10:16:17

CEF控件嵌入桌面程序:从版本选型到双向通信的完整实践

简介:这是一份面向MFC桌面开发者的CEF浏览器控件集成示例工程,解决在传统Windows程序中嵌入Chromium内核、实现现代网页展示与交互的常见需求。资源以完整项目形式呈现,共450个文件、约167MB,h头文件用于接口声明,cc/c…

作者头像 李华
网站建设 2026/9/7 10:12:22

MCU选型先核对外设接口:以RX66T为例的实用指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华
网站建设 2026/9/7 10:11:20

单片机毕设项目:基于 STM32/51 单片机与 GSM 模块的体征异常远程提醒装置 基于 STM32/51 单片机的体征数据本地显示与异常报警系统实现(024106)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️…

作者头像 李华
网站建设 2026/9/7 10:10:59

C# WinForms ListView自绘按钮列跨平台实现与命中测试详解

简介:面向C# Mono开发者的ListView带按钮事件完整实例,覆盖Windows窗体与Android移动端两类应用场景,解决数据列表展示与行内按钮交互的常见需求。实例项目演示了从ListView初始化、多列标题设置、Item子控件添加,到Click事件绑定…

作者头像 李华
网站建设 2026/9/7 10:10:54

AMD与AI巨头认股权证交易背后的技术合作与算力方案评估

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

作者头像 李华