嵌入式AI芯片架构(CPU、GPU、NPU、DSP)与算子执行原理

嵌入式AI系统与云端AI最大的差异在于资源边界:功耗、内存带宽、片上存储、实时性约束都极为苛刻。要在这样的环境中高效运行神经网络算子,首先必须理解异构SoC中各类计算单元的分工逻辑与硬件执行模型。CPU擅长复杂控制流与标量运算,GPU擅长大规模并行浮点吞吐,NPU以数据流驱动方式为卷积和矩阵乘法定制了专用数据通路,DSP则在信号处理类算子上具备独特的SIMD与定点加速能力。算子移植的本质,就是把算法逻辑映射到目标硬件的指令集、数据通路和存储层次上,使计算模式与硬件结构对齐。

嵌入式AI异构SoC算子执行架构 DDR / LPDDR 权重/激活/中间结果 带宽: 16~64GB/s AXI/NoC 片上SRAM TCM / L2 Scratchpad 容量: 1~8MB CPU 核心 ARM Cortex-A/M / RISC-V 标量运算 · 控制流 · 调度 NEON/SIMD 扩展 负责算子分发与同步 GPU Mali / Adreno / PowerVR SIMT 大规模并行 浮点吞吐高 · 通用计算 适合卷积/矩阵乘 NPU 专用AI加速器 脉动阵列/数据流引擎 INT8/INT16 定点 算子硬化为指令 DSP Tensilica / C66x VLIW + SIMD FFT/滤波/信号处理 低功耗定点运算 CPU 通过驱动/固件下发算子指令到 NPU/DSP/GPU 数据加载 数据加载 数据加载 数据加载 算子执行路径:CPU 解析算子图 → 选择最优执行单元 → 数据经 DMA 从 DDR 载入 SRAM → 计算单元执行 → 结果写回 SRAM → DMA 回传 DDR

上图展示了嵌入式AI SoC中典型的异构计算架构。CPU作为主控,负责算子图的解析、任务调度和同步;GPU、NPU、DSP作为从设备,通过内部总线与片上SRAM交互。理解这张图的关键在于:数据搬运的代价往往高于计算本身。在嵌入式平台上,一个算子的执行时间由三部分构成——数据加载时间、计算时间、数据写回时间,而DMA(Direct Memory Access)和片上存储的合理使用,往往比提升计算单元频率更能带来整体性能收益。

核心原理:四种计算单元的硬件执行模型

CPU采用冯·诺依曼架构,指令串行取指、译码、执行,依赖多级Cache隐藏内存延迟。在AI推理中,CPU通常不直接参与大规模矩阵运算,而是承担算子调度、内存分配、同步控制等"指挥"角色。其SIMD扩展(如ARM NEON)可执行128位向量运算,适合处理小批量、非规则形状的算子,例如Reshape、Concat、Slice等数据搬运类算子。

GPU采用SIMT(Single Instruction Multiple Threads)模型,以线程束(Warp/Wavefront)为单位执行。每个线程执行相同指令但处理不同数据,通过大量线程切换隐藏内存延迟。嵌入式GPU(如Mali、Adreno)的浮点吞吐量可达数百GFLOPS,但功耗也随之上升。GPU适合计算密度高、并行度大的算子,如3x3卷积、全连接层,但需要将数据组织为四通道向量(float4/half4)以充分利用访存带宽。

NPU是专为神经网络设计的ASIC,其核心是脉动阵列(Systolic Array)或类数据流引擎。以脉动阵列为例,权重预先加载到处理单元(PE)的寄存器中,激活数据从左向右流动,部分和在PE间垂直累加。这种结构使得乘累加(MAC)操作无需反复从寄存器堆读取操作数,能效比可达GPU的10倍以上。NPU通常只支持有限的算子集合(Conv2D、DepthwiseConv、MatMul、Add、ReLU等),且对数据布局有严格要求(如NHWC或NC1HW2)。

DSP采用VLIW(Very Long Instruction Word)架构,编译器在编译期将多条无依赖的指令打包到一个长指令字中,由硬件并行执行。DSP的MAC单元支持单周期乘累加,且具备专用的地址生成器,适合FFT、FIR滤波、矩阵转置等信号处理类算子。在AI推理中,DSP常被用于处理预处理算子(如图像缩放、色彩空间转换)或量化相关的定点运算。

判断方法:如何为算子选择最优执行单元

算子移植的第一步不是写代码,而是做硬件映射决策。以下判断流程可帮助开发者快速决策:

  1. 算子类型识别:将算子分为计算密集型(Conv、MatMul)、访存密集型(Concat、Slice、Transpose)、控制密集型(NMS、TopK)三类。
  2. 数据精度匹配:若模型已量化至INT8,优先考虑NPU;若需FP16精度且GPU支持,则GPU更合适;若算子涉及复数运算或FFT,DSP是首选。
  3. 数据布局检查:NPU通常要求特定的数据排布(如CHW→NC1HW2),若频繁转换布局,需评估转换开销是否超过计算收益。
  4. 实时性约束:对于需要严格确定性的场景(如自动驾驶控制),CPU+NPU的同步模式比GPU的异步调度更可控。
  5. 功耗预算:在电池供电设备上,NPU的每瓦性能远高于GPU,应优先将高频算子迁移至NPU。
算子类型推荐单元关键考量典型算子
3x3卷积(INT8)NPU数据布局、量化参数Conv2D, DepthwiseConv
全连接(FP16)GPU矩阵分块、向量化MatMul, Gemm
图像预处理DSPSIMD宽度、地址对齐Resize, ColorConvert
张量拼接/切片CPU内存拷贝优化Concat, Slice, StrideSlice
归一化/激活NPU/GPU融合算子支持BatchNorm, ReLU, Sigmoid
动态形状算子CPU运行时Shape推断NonMaxSuppression, TopK

案例拆解:YOLOv5s在嵌入式平台上的算子映射

以YOLOv5s模型(约7.2M参数,16.4GFLOPs)在瑞芯微RK3588平台(四核Cortex-A76 + Mali-G610 GPU + 6TOPS NPU)上的部署为例,展示算子执行原理的实际应用。

初始现象:直接使用ONNX Runtime GPU EP推理,FP16精度下耗时约45ms/帧,功耗约6.5W,无法满足30FPS实时要求。

分析过程:通过profiling工具发现,耗时分布为:Conv2d算子占62%,Upsample占8%,Concat占12%,其余算子占18%。GPU利用率仅35%,瓶颈在于小卷积核(1x1、3x3)的启动开销和内存带宽限制。

优化操作:

  1. 将全部Conv2d算子(共60个)迁移至NPU执行,使用RKNN-Toolkit进行量化校准,INT8精度下mAP下降仅0.8%。
  2. 将Upsample和Concat算子保留在CPU执行,利用NEON优化内存拷贝,避免NPU与CPU间的频繁数据回传。
  3. 将检测头的Sigmoid和Add算子融合到NPU的激活函数单元中,减少一次数据往返。

结果对比:优化后推理耗时降至18ms/帧(55FPS),功耗降至3.2W,能效比提升约4.7倍。代价是NPU的SRAM占用达到85%,需仔细管理权重驻留策略,避免频繁换入换出。

复盘经验:异构计算的核心不是"把所有算子都放到NPU",而是找到每个算子的最优执行位置,并尽量减少跨单元的数据搬运。NPU擅长计算,但访存密集型算子留在CPU反而更高效。

关键经验:算子执行时间 = 数据加载时间 + 计算时间 + 数据写回时间。在嵌入式平台上,数据加载时间常占总耗时的40%~60%。因此,算子融合(Fusion)和内存复用(Memory Reuse)往往比优化计算本身更能带来收益。例如,将Conv+BN+ReLU融合为一个算子,可减少两次中间结果的写回和读取。

常见误区与总结复盘

误区一:认为NPU是万能的。NPU的指令集是固定的,不支持动态Shape、不支持复杂控制流。若模型包含NonMaxSuppression、Sort等算子,强行移植到NPU会导致大量CPU回退,性能反而下降。

误区二:忽略数据布局转换开销。NPU通常要求NHWC布局且通道数对齐到16的倍数。若模型原始为NCHW布局,每次推理都需要进行布局转换,转换耗时可能占整体推理的15%以上。正确做法是在模型转换阶段就固定布局,并在网络入口处一次性完成转换。

误区三:只关注计算单元,忽视DMA与存储带宽。当NPU的MAC利用率达到70%以上时,性能瓶颈往往转移到DDR带宽。此时应优先考虑权重压缩(稀疏化、聚类量化)或增加片上缓存命中率,而非继续优化计算指令。

误区四:精度与性能的权衡过于粗放。INT8量化并非所有层都适用。对于检测头的回归分支,量化敏感度较高,可保留FP16;而Backbone的特征提取层对量化不敏感,可放心使用INT8。混合精度量化通常能在精度损失小于0.3%的情况下获得接近全INT8的性能。

风险提示:在嵌入式平台上调试异构算子时,务必使用硬件性能计数器(Performance Counter)而非仅依赖软件计时器。硬件计数器可精确测量MAC利用率、总线占用率、Cache命中率等关键指标,帮助定位真实瓶颈。另外,不同厂商的NPU SDK(如RKNN、NNAPI、TFLite Delegates)对算子支持范围差异较大,移植前务必查阅目标平台的算子支持列表。