
MLIR与算子中间表示:从理论到实践033 Vector Dialect:SIMD向量化操作与硬件加速一个让我熬夜的bug去年调一个ARM Neon上的矩阵乘算子,MLIR生成代码跑在RK3588上,性能死活上不去。查了一整天,发现是Vector Dialect的向量化类型没对齐——我写了个vector4xf32,但Neon寄存器宽度是128bit,4个float正好,可编译器给我插了一堆vector_extract和vector_insert,把连续load拆成了标量。后来才明白,Vector Dialect不是“你声明了向量类型就自动向量化”,它只是给硬件指令集搭了个中间表示的架子,真正的向量化需要你理解硬件特性,在Dialect层面把数据布局和操作语义对齐。Vector Dialect到底在解决什么问题传统LLVM IR里,向量类型是4 x float这种,但问题在于它太“硬件无关”了。不同架构的SIMD宽度不同(SSE 128bit、AVX2 256bit、AVX512 512bit、Neon 128bit、SVE可变长度),指令集的语义差异更大——有的支持masked load,有的不支持;有的有fma指令,有的要拆成mul+add。MLIR的Vector Dialect就是要在更高抽象层次上建模这些操作,让编译器能在