当前位置: 首页 > 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.jsqmd.com/news/979406/

相关文章:

  • 保姆级教程:用UHD命令行工具搞定USRP固件升级与MATLAB连接验证
  • 告别手动复制粘贴:用UiPath Studio 2024.4自动化读取Excel表格的保姆级教程
  • 2026西南螺母供应商排行:成都螺母批发、成都非标紧固件、成都非标螺丝、不锈钢螺丝、四川紧固件厂家、四川螺丝厂选择指南 - 优质品牌商家
  • 从零到生产级:在VMware ESXi上部署NBU主服务器的完整配置流程
  • 告别轮询!用STM32CubeMX+HAL库快速配置串口中断,搞定HWT101姿态角数据流
  • DIY T12烙铁头驱动:用三极管和电容搞定NMOS上管驱动(附Multisim仿真)
  • 保姆级教程:安装CUDA后,用这5种方法彻底验证你的GPU开发环境是否正常
  • 张力三角剖分与细胞镶嵌的力学建模技术
  • 基于深度学习YOLOv8的吸烟识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 从‘信息检索’的视角拆解Transformer Attention:你的Query如何找到最相关的Key并提取Value?
  • 微信小程序Webview加载PDF和网页,除了wx.downloadFile,你还可以试试这个方案
  • 别再为PCB仿真发愁了!手把手教你用AD22+Ansys EDB Exporter打通HFSS流程
  • 北京管道疏通公司采购指南,5家务实推荐清单 - 品牌推荐
  • 普通电脑做大数据采集的3种实战方案
  • PyTorch实战:手把手教你为不确定性建模——混合密度网络(MDN)从理论到代码
  • 手把手教你用Verilog实现一个最简单的RISC-V核(基于RV32I指令集)
  • 2025-2026年海参品牌推荐:十大榜专业评测送礼选滋补性价比高 - 品牌推荐
  • 基于深度学习YOLOv8的固体废物识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • 2026年6月比较好的小型冻干机定制厂家推荐,小型冻干机/工业冻干机/压盖款冻干机,小型冻干机推荐找哪家 - 品牌推荐师
  • PCIe 4.0实战避坑指南:Switch配置、Lane分配与信号完整性那些事儿
  • 告别Overleaf!在Windows上搭建本地LaTeX环境(VS Code + MiKTeX + Perl保姆级教程)
  • 给你的K210一双‘慧眼’:手把手教你制作240x240数据集并用Mx-yolov3训练专属检测模型
  • GitHub Topics功能背后的故事:一个机器学习项目如何改变了我们找代码的方式
  • GPT-4的2%稀疏激活:MoE架构下的工程真相与实战指南
  • TVA视觉智能体工业落地进阶实战(三):TVA日志系统深度运维指南|五类日志分类解析、故障秒级定位、日志轮转优化全方案
  • 【包头黄金回收】六大口碑机构实测报告 - 润富黄金回收
  • 【包头黄金回收】本地六大诚信回收商家深度实测 - 润富黄金回收
  • 自动售货机串口投币 FPGA 设计 Verilog Vivado
  • 基于深度学习YOLOv8的安全手套佩戴识别检测系统(YOLOv8+YOLO数据集+UI界面+Python项目源码+模型)
  • Element Plus Tree V2虚拟化树形控件,除了展示大数据,还能这样玩?一个Select下拉框的改造实录