
专栏总结:MLIR与算子中间表示的未来展望去年冬天调试一个AI推理引擎的跨平台部署问题,让我对MLIR的“未来”有了切肤之痛。客户那边报了个诡异的性能回退:同样的模型,在x86上跑得飞快,换到ARM服务器上,某个卷积算子竟然慢了3倍。我翻遍LLVM的优化pass日志,最后发现是MLIR的linalg-to-affine lowering阶段,把原本应该保持的tile结构给拆散了——ARM的NEON指令集对连续内存访问有特殊偏好,而MLIR默认的循环分块策略完全没考虑这一点。那个晚上我盯着MLIR的Dialect转换图,突然意识到:我们离“一次编写,到处高效”的理想,还差一个“硬件感知的中间表示”的距离。当前MLIR生态的“甜蜜点”与“暗礁”MLIR现在最让我兴奋的地方,是它真正打破了“前端语言”和“后端硬件”之间的玻璃墙。以前我们做算子开发,要么手写汇编(比如针对特定DSP的intrinsic),要么依赖TVM这种端到端编译栈——但TVM的IR太高层,很难精细控制寄存器分配。MLIR的Multi-Level特性,允许你在同一个框架里,从TOSA(Tensor Operator Set Architecture)这种高层次的算子语义,一路降到LLVM IR甚至机器码。我在一个自研NPU项目里,甚至用MLIR的PDL(Pattern Declarative Language)写了一套自定义的算子融合规则,把三个element-wise op和一个卷积合并成一个硬件原语——这在传统LLVM pass里几乎不可能实现。但暗礁也很明显。最让我头疼的是Dialect之间的“语义鸿沟”。比如从StableHLO(高层次的HLO方