054、MLIR中的Canonicalization(规范化)Pass从一次半夜的IR爆炸说起凌晨两点,我盯着终端里长达三万行的MLIR输出,CPU风扇在机箱里发出绝望的哀鸣。一个简单的矩阵乘法kernel,经过几轮pass之后,IR膨胀到了原始大小的二十倍。更诡异的是,某些中间操作明明可以合并,却像钉子户一样赖在IR里不走。debug到天亮才发现——规范化(Canonicalization)pass没有正确执行,或者说,我压根没理解它到底在干什么。那次之后,我花了整整一周把MLIR里所有与规范化相关的代码翻了个底朝天。今天这篇笔记,就是那次“血泪史”的沉淀。规范化不是“优化”,是“强迫症”很多刚接触MLIR的朋友会把Canonicalization和优化混为一谈。这是个大坑。优化追求的是“更快更省”,而规范化追求的是“统一和规整”。打个比方:优化是给代码做瘦身和提速,规范化是给代码做格式化——把a + 0变成a,把mul by 1直接消掉,把addi的两个操作数按某种规则排序。MLIR的Dialect设计天然允许各种“花式写法”。同一个语义,有人用arith.addi,有人用std.addi,还有人自己写了个自定义op。规范化pass的作用就是把这些五花八门的表示“拧”成统一的、更简单的形式。它不改变语义,只改变表示方式。
054、MLIR中的Canonicalization(规范化)Pass
054、MLIR中的Canonicalization(规范化)Pass从一次半夜的IR爆炸说起凌晨两点,我盯着终端里长达三万行的MLIR输出,CPU风扇在机箱里发出绝望的哀鸣。一个简单的矩阵乘法kernel,经过几轮pass之后,IR膨胀到了原始大小的二十倍。更诡异的是,某些中间操作明明可以合并,却像钉子户一样赖在IR里不走。debug到天亮才发现——规范化(Canonicalization)pass没有正确执行,或者说,我压根没理解它到底在干什么。那次之后,我花了整整一周把MLIR里所有与规范化相关的代码翻了个底朝天。今天这篇笔记,就是那次“血泪史”的沉淀。规范化不是“优化”,是“强迫症”很多刚接触MLIR的朋友会把Canonicalization和优化混为一谈。这是个大坑。优化追求的是“更快更省”,而规范化追求的是“统一和规整”。打个比方:优化是给代码做瘦身和提速,规范化是给代码做格式化——把a + 0变成a,把mul by 1直接消掉,把addi的两个操作数按某种规则排序。MLIR的Dialect设计天然允许各种“花式写法”。同一个语义,有人用arith.addi,有人用std.addi,还有人自己写了个自定义op。规范化pass的作用就是把这些五花八门的表示“拧”成统一的、更简单的形式。它不改变语义,只改变表示方式。