news 2026/6/17 18:17:51

011、MLIR的Pattern Rewrite框架:DRR与C++ Rewrite

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
011、MLIR的Pattern Rewrite框架:DRR与C++ Rewrite

MLIR的Pattern Rewrite框架:DRR与C++ Rewrite

上周帮团队排查一个MLIR自定义Pass的bug,现象很诡异:同一个IR经过两次Pass后,某些op的operand顺序莫名其妙变了,导致下游的bufferization直接崩掉。我盯着dump出来的IR看了半小时,最后发现是Pattern Rewrite的匹配优先级在作祟——一个DRR生成的pattern和一个手写的C++ Rewrite pattern互相覆盖了。这种问题在MLIR的pattern rewrite框架里太容易踩坑了,今天就把这块掰开揉碎讲清楚。

为什么需要两套Rewrite机制

MLIR的pattern rewrite框架本质上解决的是“如何在IR上做局部变换”的问题。你写一个Pass,无非就是遍历op,匹配某种结构,然后替换成另一种结构。但MLIR的IR是SSA形式的DAG,不是简单的树,所以匹配和替换的复杂度比AST rewrite高一个量级。

MLIR给了两条路:DRR(Declarative Rewrite Rules)和C++ Rewrite。DRR用TableGen写声明式规则,自动生成C++代码;C++ Rewrite则是手写继承OpRewritePattern的类。两条路各有适用场景,但混用的时候坑特别多。

DRR:看起来很美,但别被它骗了

DRR的语法确实简洁,比如你想把addimuli合并成一个fused_mul_add

def FuseMulAdd : Pat< (addi (muli $x, $y), $z), (fused_mul_add $x, $y, $z) >;

三行搞定。但实际项目里DRR有几个隐藏的坑。

第一个坑:DRR生成的pattern是“贪婪”的。它默认会匹配所有可能的子图,而且匹配顺序由TableGen生成的代码决定,不是你写的顺序。我遇到过DRR把一个muli同时匹配到两个不同的pattern里,导致IR被重复改写。解决办法是在DRR里显式指定PatternBenefit,但很多人不知道DRR也支持这个:

def FuseMulAdd : Pat< (addi (muli $x, $y), $z), (fused_mul_add $x, $y, $z) >; // 这里踩过坑:不加benefit的话,默认benefit是1,容易被其他pattern覆盖 let benefit = 10;

第二个坑:DRR对op的约束检查是“静态”的。它只能检查op的类型和operand数量,没法做动态的运行时检查。比如你想只在xy都是float类型时才做融合,DRR里写不了这种条件。你必须在生成的C++代码里手动加NativeCodeCall,但那样又失去了DRR的简洁性。

第三个坑:DRR生成的pattern无法处理“副作用”。如果你的rewrite需要修改op的属性、插入新的op、或者做复杂的类型推导,DRR基本无能为力。这时候就得老老实实写C++ Rewrite。

C++ Rewrite:手写才是硬道理

C++ Rewrite的核心是继承OpRewritePattern,重写matchAndRewrite方法。这里有个关键点:matchAndRewrite返回LogicalResult,成功返回success(),失败返回failure()。别写成return truereturn false,MLIR的框架会检查返回值类型,写错了编译不过,但运行时行为可能诡异。

一个典型的C++ Rewrite长这样:

structFuseMulAddPattern
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 5:59:56

GPT-4参数量与激活率真相:1.8万亿不是体积,2%不是固定值

1. 这句话到底在说什么&#xff1f;先别急着转发&#xff0c;我们来拆开看看“GPT-4 Has 1.8 Trillion Parameters. It Uses 2% of Them Per Token.”——这句话过去两年在技术社区、自媒体和AI科普帖里反复刷屏&#xff0c;常被当作“大模型黑科技”的标志性论断&#xff1a;万…

作者头像 李华
网站建设 2026/6/9 5:59:55

别再手动算权重了!用SPSSAU的AHP层次分析法,5分钟搞定旅游决策

旅游决策神器&#xff1a;用SPSSAU的AHP分析法告别选择困难症每次组织团队出游最头疼什么&#xff1f;不是预算不够&#xff0c;不是目的地太少&#xff0c;而是众口难调——有人想看山水&#xff0c;有人想玩项目&#xff0c;有人在意交通便利性&#xff0c;还有人特别怕排队。…

作者头像 李华
网站建设 2026/6/9 5:59:02

用闲置安卓手机+HC-05蓝牙模块,DIY一个无线串口调试终端(免Root)

用闲置安卓手机HC-05蓝牙模块打造无线串口调试终端&#xff08;免Root&#xff09;在硬件开发调试过程中&#xff0c;串口通信是最基础也最常用的手段之一。传统的USB转串口线虽然稳定可靠&#xff0c;但线缆的束缚常常让调试过程变得不够灵活。本文将介绍如何利用家中闲置的安…

作者头像 李华
网站建设 2026/6/9 5:50:27

量子自旋系统与平均场理论:原理与应用

1. 量子自旋系统与平均场理论概述量子自旋系统是凝聚态物理中最富挑战性的研究对象之一。想象一个由无数个微小磁针&#xff08;自旋&#xff09;组成的网络&#xff0c;每个磁针都能向上或向下&#xff0c;并且通过量子力学规律相互作用。这种系统在低温下会展现出磁性有序、量…

作者头像 李华
网站建设 2026/6/9 5:47:25

pandas多维聚合实战:生产级数据立方体计算指南

1. 项目概述&#xff1a;为什么多维聚合不是“加个groupby”就能搞定的事我在银行风控部门做过三年数据管道开发&#xff0c;后来跳槽到一家头部支付机构做BI平台架构。这期间最常被业务方拍着桌子问的一句话是&#xff1a;“上个月华东区餐饮类商户的交易金额中位数、手续费波…

作者头像 李华