
101、MLIR在CPU上的代码生成:x86与ARM优化从一次诡异的性能回退说起去年做AI推理引擎的CPU后端时,遇到一个让我抓狂了两天的bug。同样的模型,同样的MLIR IR,在Intel Xeon上跑出120ms,换到ARM的Ampere Altra上直接飙到380ms。更诡异的是,ARM平台的理论算力并不差,L2 cache还更大。我盯着生成的汇编看了三个小时,最后发现是MLIR的向量化pass在ARM上生成了大量非对齐的LD1指令——x86的硬件能优雅处理非对齐访问,ARM那边直接触发了一次load跨越两个cache line的惩罚。这个教训让我意识到:MLIR的代码生成从来不是“写一个通用pass就完事”的活。CPU架构的差异,从指令集特性到微架构的隐藏陷阱,都会在最终性能上放大成数量级的差距。x86后端:那些你以为是常识的坑向量化宽度不是越大越好MLIR的--convert-vector-to-llvmpass默认会尝试使用最宽的向量寄存器。在x86上,这意味着AVX-512的512位向量。但实际项目中,我见过太多因为512位模式导致频率降频的例子——Intel的CPU在AVX-512 heavy workload下会主动降低核心频率,有时候512位向量带来的吞吐提升,根本抵不过频率从4.0GHz掉到3.2GHz的损失。我的做法是在MLIR的VectorLowering配置里显式限制向量宽度: