当前位置: 首页 > news >正文

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
http://www.zskr.cn/news/1491131.html

相关文章:

  • 2026西南螺母供应商排行:成都螺母批发、成都非标紧固件、成都非标螺丝、不锈钢螺丝、四川紧固件厂家、四川螺丝厂选择指南 - 优质品牌商家
  • 从零到生产级:在VMware ESXi上部署NBU主服务器的完整配置流程
  • 从‘信息检索’的视角拆解Transformer Attention:你的Query如何找到最相关的Key并提取Value?
  • 张力三角剖分与细胞镶嵌的力学建模技术
  • 2025-2026年海参品牌推荐:十大榜专业评测送礼选滋补性价比高 - 品牌推荐
  • PyTorch实战:手把手教你为不确定性建模——混合密度网络(MDN)从理论到代码
  • 告别Overleaf!在Windows上搭建本地LaTeX环境(VS Code + MiKTeX + Perl保姆级教程)
  • GPT-4的2%稀疏激活:MoE架构下的工程真相与实战指南
  • Element Plus Tree V2虚拟化树形控件,除了展示大数据,还能这样玩?一个Select下拉框的改造实录
  • 基于深度学习YOLOv8的安全手套佩戴识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 从YUV到H.265:搞懂这些‘行话’,你才算入了音视频开发的门
  • Sqribble文档自动化:模板驱动的结构化排版系统解析
  • 西安黄金回收市场六大品牌服务测评 - 润富黄金回收
  • 告别GUI依赖:用APDL命令流高效管理你的ANSYS分析项目(含.log文件妙用)
  • 时序签名变换:用路径积分提升拐点预测鲁棒性
  • 10分钟精通跨平台翻译神器Pot:解决多语言工作痛点的终极指南
  • 医疗AI为何伤人?从数据偏见到临床断崖的真相
  • 拆解TriCore的CMPSWAP.W指令:从TC264官方库看多核锁的硬件实现
  • 从地图App到算法竞赛:手把手教你用C++实现Dijkstra最短路径(附邻接表避坑指南)
  • 2026年操作台厂家选购参考指南:工业操作台、实验室操作台、不锈钢操作台、控制系统操作设备优质厂商汇总 - 海棠依旧大
  • XR处理器性能对比:高通XR2 Gen 2与旗舰SoC解析
  • Python中文语音合成实战:本地化TTS引擎选型与部署指南
  • PCA降维后数据‘镜像’了?用sklearn和自实现代码对比鸢尾花数据可视化,揭秘差异原因与注意事项
  • 粉盒植绒加工技术全解析:美妆蛋植绒加工/衣架植绒加工/遮阳板植绒加工/铝管植绒加工/面板植绒加工/香水瓶植绒加工/选择指南 - 优质品牌商家
  • 别再手动算权重了!用SPSSAU的AHP层次分析法,5分钟搞定旅游决策
  • 咸阳黄金回收市场盘点 2026年6月六大正规渠道实测 - 润富黄金回收
  • 物理增强神经网络DDCCNet革新量子化学计算
  • TPU双通道XOR架构实现SVPWM全占空比与高精度死区控制
  • 告别命令行焦虑:用Rancher 2.5.11的图形界面,5分钟搞定K8s集群与应用部署
  • 浙江珠宝展柜定制技术解析:温州商场专柜/温州实木烤漆展柜/温州展柜设计安装/温州珠宝展柜/温州美妆展柜/温州金银首饰展柜/选择指南 - 优质品牌商家