
049、从Linalg到Vector的循环分块与向量化一个让我熬夜三天的bug去年调一个AI加速器后端,模型跑在自研NPU上,精度死活不对。单算子测试全绿,一上网络就崩。折腾三天,最后发现是Linalg到Vector的lowering阶段,循环分块参数传错了——外层循环的tile size和内层向量化宽度没对齐,导致内存访问越界,写坏了相邻tensor的padding区域。这种问题,光看IR很难发现。Linalg的IR里一切看起来都那么规整,等降到Vector dialect,循环结构一变,边界条件就炸了。从那以后,我对这个lowering路径就格外敏感。Linalg的“优雅”与Vector的“粗暴”Linalg dialect的设计哲学是“结构化算子”——一个linalg.generic就把整个计算语义表达清楚了,循环结构、访存模式都隐含在索引映射里。比如一个矩阵乘法:%result = linalg.generic { indexing_maps = [affine_map(i,j,k) - (i,k), affine_map(i,j,k) - (k,j), affine_map(i,j,k) - (i,j)], iterator_types = [