2、嵌入式AI硬件基础:ARM Cortex-M系列、RISC-V架构、NPU与DSP加速器、内存与带宽限制
做嵌入式AI编译器,说白了你得先懂硬件。你想想看,编译器就是个翻译官,它得把AI模型翻译成硬件能跑的语言。不懂硬件,你翻译出来的东西要么跑不动,要么跑得慢。我这些年踩过的坑,十有八九都是因为对硬件理解不够深。
这一章,咱们就把嵌入式AI的硬件底牌翻出来看看。ARM Cortex-M、RISC-V、NPU、DSP,还有那个让人头疼的内存带宽——一个一个说清楚。
2.1 ARM Cortex-M系列:MCU里的老大哥
ARM Cortex-M系列,做嵌入式的没人不知道。从M0到M7,再到最新的M85,性能跨度很大。我个人习惯把它们分成三类:
- M0/M0+/M23:超低功耗,适合传感器节点、IoT设备。主频几十MHz,没有浮点单元,跑不了复杂AI。
- M3/M4/M33:主流选择。M4带FPU(浮点运算单元),可以做些轻量级AI推理,比如关键词唤醒、手势识别。
- M7/M85:高性能MCU。M7有双精度FPU和SIMD指令,M85更是加入了Helium向量扩展,AI算力直接翻倍。
关键点:Cortex-M系列没有MMU(内存管理单元),跑不了Linux。这意味着你的AI编译器必须生成裸机或RTOS上能跑的代码。我在项目中遇到过有人想直接在M4上跑TensorFlow Lite Micro,结果内存爆了——嗯,选型时就得想清楚。
指令集方面,Cortex-M用的是ARMv7-M或ARMv8-M架构。M4支持SIMD指令(SADD16、UMAAL等),可以一次处理多个16位数据。M85的Helium扩展更猛,能处理128位向量,对标ARM Cortex-A系列的NEON。说白了,算力越强,编译器能做的优化就越多。
2.2 RISC-V架构:开源新势力
RISC-V这几年火得不行。为什么?因为它开源、灵活、没有授权费。你想想看,ARM用一次交一次钱,RISC-V你可以随便改。我有个朋友做AI芯片创业,直接买RISC-V核自己加自定义指令,成本低了一大截。
嵌入式AI常用的RISC-V核有:
- RV32IMC:基础组合,I是整数指令,M是乘除法,C是压缩指令。适合低端MCU。
- RV32IMFC:加了F(单精度浮点),可以做些简单AI推理。
- RV64GC:64位通用组合,G包含IMAFD,性能更强。
RISC-V有个杀手锏——自定义指令扩展。你可以为AI算子专门设计一条指令,比如一条指令完成卷积+激活函数。编译器需要识别这些自定义指令,并生成对应的机器码。我在做RISC-V AI编译器时,最头疼的就是指令编码空间有限,得精打细算。
我的建议:如果团队自研芯片,优先考虑RISC-V。开源生态越来越成熟,工具链(GCC、LLVM)支持也很好。但要注意,RISC-V的碎片化问题——每家厂商的自定义指令都不一样,编译器得做适配。
2.3 NPU与DSP加速器:算力担当
光靠CPU跑AI,效率太低。NPU和DSP就是专门干这活的。
NPU(神经网络处理单元)
NPU是专门为神经网络设计的。它的核心是乘累加阵列(MAC Array),一次能算几百甚至几千个乘加操作。常见的NPU架构有:
- 脉动阵列(Systolic Array):数据像流水一样在阵列中流动,效率极高。Google TPU用的就是这种。
- 近存计算(Near-Memory Computing):把计算单元放在存储旁边,减少数据搬运。我在一个低功耗AI芯片项目中用过,效果不错。
NPU的指令集通常是VLIW(超长指令字)或SIMD风格。编译器需要把神经网络图映射到NPU的硬件流水线上,包括数据布局、计算调度、内存分配。这活儿不轻松——我曾经为了一个卷积层的NPU映射,调了整整一周。
DSP(数字信号处理器)
DSP比NPU通用一些。它擅长做向量运算、滤波、FFT。很多MCU里集成了DSP,比如STM32的Cortex-M4就有DSP指令。DSP的典型特征:
- 哈佛架构(指令和数据分开存储)
- 硬件循环(零开销循环)
- SIMD向量指令
- 低延迟中断响应
AI编译器可以利用DSP做预处理(比如音频特征提取)或轻量级推理。但要注意,DSP的位宽通常有限(16位或24位),精度不如NPU。
避坑指南:我曾经在一个项目里,把NPU和DSP的驱动写成了轮询模式,结果CPU占用率飙到90%。后来改成中断驱动,CPU占用降到5%。记住——加速器再快,也得有好的驱动配合。
2.4 内存与带宽限制:AI编译器的紧箍咒
嵌入式AI最大的瓶颈不是算力,而是内存和带宽。你想想看,一个MobileNet模型可能几MB,但MCU的SRAM只有几百KB。怎么办?
内存层次
典型的嵌入式AI系统内存层次:
| 层级 | 容量 | 速度 | 用途 |
|---|---|---|---|
| 寄存器 | 几十字节 | 1周期 | 临时变量 |
| TCM(紧耦合内存) | 几十KB | 1-2周期 | 关键数据、中断向量 |
| SRAM | 几百KB~几MB | 2-5周期 | 模型权重、中间结果 |
| Flash | 几MB~几十MB | 几十周期 | 模型存储、代码 |
| 外部DRAM | 几十MB~几百MB | 上百周期 | 大数据缓存 |
AI编译器要做的,就是把模型数据合理地分配到这些层级里。我常用的策略:
- 权重驻留:把频繁使用的权重放在TCM或SRAM
- 数据复用:尽量复用中间结果,减少重复计算
- 分块计算:把大矩阵切成小块,一块一块算
带宽瓶颈
带宽就是数据搬运的速度。嵌入式系统的总线带宽通常很有限——比如STM32H7的AXI总线带宽只有几百MB/s。而一个NPU每秒要处理几GB的数据。差距怎么补?
我总结了几条经验:
- 减少数据搬运:能一次算完就别分两次。算子融合就是这个道理。
- 利用DMA:让DMA负责数据搬运,CPU专心算。我习惯把DMA配置成双缓冲模式,一边算一边搬。
- 量化压缩:把32位浮点量化成8位整数,数据量直接减到1/4。带宽压力小很多。
- 数据布局优化:把数据排成硬件喜欢的格式。比如NPU通常要求NHWC格式,你给个NCHW格式,性能直接腰斩。
核心观点:AI编译器80%的工作是在跟内存和带宽较劲。模型结构再先进,数据搬不动也是白搭。我见过太多团队,模型精度刷得飞起,一部署到嵌入式设备上就卡成PPT——都是内存带宽惹的祸。
2.5 本章知识体系
下面这张图,是我梳理的嵌入式AI硬件知识体系。你可以把它当作一个地图,后面讲编译器优化时,会反复提到这些概念。
这张图把嵌入式AI硬件分成三大块:CPU架构、硬件加速器、内存与带宽。编译器的工作,就是在这三者之间找到最优解。后面每一章,都会围绕这张图展开。
我的习惯:每接触一个新硬件平台,我都会先画一张类似的图。把CPU、加速器、内存层次标清楚,然后对着图做编译器优化。这比直接看数据手册管用多了。
公众号:蓝海资料掘金营,微信deep3321