MLIR在边缘计算设备(如ARM Cortex-M)中的应用
昨晚调试一块STM32H743板子到凌晨三点,问题出在MLIR生成的代码在Cortex-M7上跑飞了。PC指针跳到一个匪夷所思的地址,反汇编一看,是浮点寄存器压栈时对齐出了问题。这种问题在x86上永远不会出现,但在Cortex-M上,一个未对齐的LDMFD就能让你怀疑人生。
为什么MLIR需要关注Cortex-M
很多人觉得MLIR是给GPU、TPU这些大家伙用的,跟Cortex-M这种小片子八竿子打不着。这个想法害人不浅。我手头一个项目,需要在Cortex-M4上跑一个轻量级推理引擎,模型是从PyTorch导出的。直接用TFLite Micro?算子支持不够。手写汇编?维护成本上天。MLIR恰好能在这中间搭一座桥——把高层次的算子表示一步步lower到接近硬件的IR,最后生成C代码或者直接生成ARM指令。
关键点在于:Cortex-M没有MMU,没有浮点单元(M0/M3),或者只有单精度FPU(M4/M7),内存通常只有几十到几百KB。MLIR的dialect设计天然适合做这种“渐进式降级”——从Tensor dialect到Linalg,再到SCF,最后到LLVM IR,每一步都可以插入针对Cortex-M的优化pass。
踩过的坑:Dialect选择与内存布局
第一个坑是dialect选择。别一上来就用Linalg。Linalg的tiling和fusion在Cortex-M上经常产生巨大的中间缓冲区。我试过把一个3x3卷积用Linalg的t