云计算百科
云计算领域专业知识百科平台

121、MLIR的Constant Propagation与Folding

MLIR的Constant Propagation与Folding:一次踩坑后的深度复盘

上个月调试一个AI推理引擎的中间表示优化流程,遇到一个诡异现象:模型在x86上跑得好好的,交叉编译到RISC-V后,某些层的计算结果开始出现微小偏差。追了两天,发现是MLIR的constant folding阶段把一些本该保留的浮点常量折叠成了不同的精度表示。这个坑让我重新审视了MLIR中看似简单的常量传播与折叠机制——它远不止“把常量算出来”这么简单。

从一次“过度优化”说起

问题出在某个量化感知训练后的模型,图中存在大量形如 %c = arith.addf %a, %b 的节点,其中 %a 和 %b 都是通过 arith.constant 定义的浮点常量。MLIR的 canonicalization pass 默认会尝试将这些常量运算折叠成新的常量。但问题在于,当 %a 和 %b 的精度不同(比如一个f32一个f16),或者它们来自不同的dialect(比如tosa.const与arith.constant混用)时,折叠行为会触发隐式的类型提升,导致最终结果与原始语义不一致。

更隐蔽的是,MLIR的 fold() 接口默认返回 Optional<Value>,如果返回 nullopt 表示无法折叠。但很多自定义op的fold实现会“偷懒”——直

赞(0)
未经允许不得转载:网硕互联帮助中心 » 121、MLIR的Constant Propagation与Folding
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!