Table-driven Declarative Rewrite Rule (DRR)

Table-driven Declarative Rewrite Rule (DRR

  • 好处
  • 规则定义
  • 原模式
  • 基于位置的匹配
  • 操作的匹配有向无环图(DAG)
    • (AOp (BOp), $attr):
  • 绑定操作的结果

好处

模式创建者只需要声明性地指定重写模式,而不必担心调用具体的C++方法。
消除样板代码,展示重写的核心:mlir::RewritePattern已经能够很好地隐藏定义重写规则的样板代码。但是我们仍然需要编写C++编程语言所需的类和函数结构,检查操作符以进行匹配,并调用操作符的build()方法进行构建。这些语句通常非常简单且相似,因此可以进一步通过自动生成来简化。由于我们将样板代码减少到最低限度,声明性的重写规则将只包含重写的核心要素。这使得模式非常容易理解。

规则定义

重写规则的核心构造是在[PatternBase.td][PatternBase]中定义的:

class Pattern<dag sourcePattern, list<dag> resultPatterns,list<dag> additionalConstraints = [],list<dag> supplementalPatterns = [],dag benefitsAdded = (addBenefit 0)>;

一个声明式的重写规则包含两个主要组件:

  • 源模式,用于匹配操作的DAG。
  • 一个或多个结果模式,用于生成操作的DAG以替换匹配到的DAG。

我们允许多个结果模式以支持多结果操作和辅助操作,但通常我们只是想将一个操作的DAG转换为另一个操作的DAG。有一个方便的Pattern包装器,Pat,它接受一个单一的结果模式:

class Pat<dag sourcePattern, dag resultPattern,list<dag> additionalConstraints = [],dag benefitsAdded = (addBenefit 0)> :Pattern<sourcePattern, [resultPattern], additionalConstraints, benefitsAdded>;

每个模式被指定为一个TableGen的DAG对象,语法为(operator arg0, arg1, …)。

  • operator 通常是一个MLIR操作,但它也可以是其他指令。
  • argN 用于匹配(如果在源模式中使用)或生成(如果在结果模式中使用)operator的第N个参数。如果操作是某个MLIR操作,这意味着第N个参数如操作定义的参数列表中所指定。因此,我们说模式中的操作参数规范是基于位置的:它们出现的位置很重要。

argN 本身可以是一个DAG对象,因此我们可以有嵌套的DAG树来建模操作之间的定义-使用关系。

比如加法重写为乘法

def : Pat<(AddI32 $x, $y),(MulI32 $x, $y)
>;

假设我们有一个32位整数加法操作 AddI32,我们希望将其转换为一个乘法操作 MulI32 和一个减法操作 SubI32。以下是一个声明式重写规则的例子:

def : Pattern<(AddI32 $x, $y), [(MulI32 $x, $y), (SubI32 $x, $y)]
>;
  • def : Pat:用于定义简单的匹配和替换规则,适用于简单的操作模式。
  • def : Pattern:用于定义更复杂的匹配和替换规则,可以包含更多的属性和逻辑,适用于复杂的操作模式。

原模式

源模式用于匹配操作的有向无环图(DAG)。DAG对象中的参数旨在捕获操作的参数。它们还可以用于进一步限制匹配条件。捕获是通过指定以 $ 符号开头的符号来完成的,而进一步的约束是通过指定 TypeConstraint(对于操作数)或 AttrConstraint(对于属性)来引入的。

在这个上下文中,我们可以将操作的参数捕获下来。捕获的方式是通过使用 $ 符号开头的标识符,例如 $a_input 和 $a_attr。我们还可以通过 TypeConstraint(类型约束)和 AttrConstraint(属性约束)来进一步限制这些参数。

def AOp : Op<"a_op"> {let arguments = (insAnyType:$a_input,AnyAttr:$a_attr);let results = (outsAnyType:$a_output);
}

在这个例子中,我们定义了一个操作 AOp,它有两个参数:

  • $a_input,可以是任何类型(AnyType)。
  • $a_attr,可以是任何属性(AnyAttr)。

操作的结果定义为一个输出($a_output),它也是任意类型。

接下来,我们定义一个模式:

def : Pat<(AOp $input, F32Attr:$attr), ...>;

这个模式匹配一个 AOp 操作,其中:

  • $input 可以是任何有效的输入。
  • $attr 必须是一个浮点属性(F32Attr)。

如果这个模式匹配成功,我们会将 $input 绑定到操作的输入 $a_input,并将 $attr 绑定到操作的属性 $a_attr。之后,我们可以在其他模式和约束中使用这些绑定。

位置匹配和符号使用

在定义模式(pattern)的时候,你不需要严格遵循操作(operation)定义中使用的符号名称。换句话说,你可以使用不同的符号名称来匹配操作定义中的参数,只要它们的位置对应即可。让我们通过一个具体的例子来说明这一点

假设我们有一个操作定义如下:

def AOp : Op<"a_op"> {let arguments = (insAnyType:$a_input,AnyAttr:$a_attr);let results = (outsAnyType:$a_output);
}

基于位置的匹配

当我们定义一个模式来匹配这个操作时,位置(顺序)比符号名称更重要。也就是说,你可以在模式中使用不同的符号名称来引用这些参数,只要它们的位置正确。例如:

def : Pat<(AOp $input, F32Attr:$attr), ...>;

在这个模式中:

  • $input 对应于 AOp 操作的第一个参数 $a_input。
  • $attr 对应于 AOp 操作的第二个参数 $a_attr,并且施加了浮点属性(F32Attr)的约束。

尽管符号名称不同),但因为它们的位置与 AOp 操作定义中的参数位置一致,所以匹配依然有效。

操作的匹配有向无环图(DAG)

要匹配一个操作的有向无环图(DAG),使用嵌套的DAG对象:

def BOp : Op<"b_op"> {let arguments = (ins);let results = (outsAnyType:$b_output);
}def : Pat<(AOp (BOp), $attr), ...>;

(AOp (BOp), $attr):

这部分表示我们想要匹配的操作图结构。

  • AOp 是我们想要匹配的主要操作(Op)。
  • (BOp) 表示 AOp 的输入必须由 BOp 生成。换句话说,AOp 的唯一输入必须是 BOp 的输出。
  • $attr 是一个占位符,表示 AOp 操作可能有某些属性,我们用 $attr 来匹配这些属性。
    所以,我们可能会匹配到这样的两行IR
%0 = "b_op"() : () -> f32
%1 = "a_op"(%0) {attr = "example"} : (f32) -> i32

绑定操作的结果

在编写某种模式匹配的代码时,有时候我们需要将一个符号(变量)与某个操作的结果进行绑定,以便在后续的代码中可以引用这个结果。通过在操作定义中附加这个符号,我们就可以实现这种绑定。

举个MLIR(多级中间表示)的例子:
假设我们有两个操作AOp和BOp,并且BOp有一个结果需要在AOp中使用。我们可以这样定义一个模式(pattern):

def : Pat<(AOp (BOp:$b_result), $attr), /* 替换规则 */>;

在这个例子中,$b_result 就被绑定到 BOp 的结果上,这样我们在后续的模式或替换规则中可以引用 $b_result。

func @example_func() -> i32 {%0 = "BOp"() : () -> i32%1 = "AOp"(%0) : (i32) -> i32return %1 : i32
}

在这个示例中,BOp的结果(%0)被绑定到变量$b_result,并在AOp中作为输入使用。这种绑定方式在模式匹配和转换中非常有用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/40292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Laravel5+mycat 报错 “Packets out of order”

背景 近期对负责项目&#xff0c;配置了一套 主从复制的 MySQL 集群 使用了中间件 mycat 但测试发现&#xff0c;替换了原来的数据连接后&#xff0c;会出现 Packets out of order 的报错 同时注意到&#xff0c;有的框架代码中竟然也会失效&#xff0c;比如 controller 类中&…

Linux:进程间通信(一.初识进程间通信、匿名管道与命名管道、共享内存)

上次结束了基础IO&#xff1a;Linux&#xff1a;基础IO&#xff08;三.软硬链接、动态库和静态库、动精态库的制作和加载&#xff09; 文章目录 1.认识进程间通信2.管道2.1匿名管道2.2pipe()函数 —创建匿名管道2.3匿名管道的四种情况2.4管道的特征 3.基于管道的进程池设计4.命…

基于java将dicom转化为jpg的几种方式

参考1 JAVA代码实现DICOM文件转换JPG package com.example;import java.awt.image.BufferedImage; import java.io.File;import javax.imageio.ImageIO;import ij.plugin.DICOM;/*** dicom文件java解析&#xff0c;生成图片* 不过这里不能解析压缩的dicom文件*/ public class …

Vue3学习笔记(n.0)

vue指令之v-for 首先创建自定义组件&#xff08;practice5.vue&#xff09;&#xff1a; <!--* Author: RealRoad1083425287qq.com* Date: 2024-07-05 21:28:45* LastEditors: Mei* LastEditTime: 2024-07-05 21:35:40* FilePath: \Fighting\new_project_0705\my-vue-app\…

重载一元运算符

自增运算符 #include<iostream> using namespace std; class CGirl { public:string name;int ranking;CGirl() { name "zhongge"; ranking 5; }void show() const{ cout << "name : "<<name << " , ranking : " <…

cmake编译源码教程(一)

1、介绍 本次博客介绍使用cmake编译平面点云分割的源代码,其对室内点云以及TLS点云中平面结构进行分割,分割效果如下: 2、编译过程 2.1 源代码下载 首先,下载源代码,如下所示,在该文件夹下新建一个build文件夹,用于后续生成sln工程。 同时,由于该库依赖open…

自动化设备上位机设计 二

目录 一 设计原型 二 后台代码 一 设计原型 二 后台代码 namespace 自动化上位机设计 {public partial class Form1 : Form{public Form1(){InitializeComponent();timer1.Enabled true;timer1.Tick Timer1_Tick;}private void Timer1_Tick(object? sender, EventArgs e)…

您的私人办公室!-----ONLYOFFICE8.1版本的桌面编辑器测评

随时随地创建并编辑文档&#xff0c;还可就其进行协作 ONLYOFFICE 文档是一款强大的在线编辑器&#xff0c;为您使用的平台提供文本文档、电子表格、演示文稿、表单和 PDF 编辑工具。 网页地址链接&#xff1a; https://www.onlyoffice.com/zh/office-suite.aspxhttps://www…

AJAX-day1:

注&#xff1a;文件布局&#xff1a; 一、AJAX的概念&#xff1a; AJAX是浏览器与服务器进行数据通信的技术 >把数据变活 二、AJAX的使用&#xff1a; 使用axios库&#xff0c;与服务器进行数据通信 基于XMLHttpRequest封装&#xff0c;代码简单 Vue,React项目使用 学习…

自定义控件绘图篇(一)基本几何图形绘制

在Android开发中&#xff0c;自定义控件是一种强大的技术&#xff0c;它允许开发者创建具有独特外观和行为的UI组件。通过自定义控件&#xff0c;你可以实现标准组件库中没有的功能和设计。自定义控件通常涉及两个主要方面&#xff1a;布局和绘图。本回答将重点介绍如何在自定义…

哪个品牌的加密软件稳定方便使用?

一、什么是企业加密软件&#xff1f; 企业加密软件是一种用于保护企业内部数据安全的工具。在数字化时代&#xff0c;随着数据量的爆炸式增长&#xff0c;信息安全和隐私保护变得愈发重要。企业加密软件作为保障数据安全的关键工具&#xff0c;受到越来越多用户的青睐。 企业…

昆虫学(书籍学习资料)

包括昆虫分类&#xff08;上下册&#xff09;、昆虫生态大图鉴等书籍资料。

调和均值

文章目录 调和均值的定义和公式调和均值的几何解释调和均值的应用调和均值与算术平均和几何平均的比较示例 调和均值的定义和公式 调和均值是一种特殊的平均数&#xff0c;适用于处理涉及比率或速度的数据。对于一组正数 x 1 , x 2 , … , x n x_1, x_2, \ldots, x_n x1​,x2…

Java中的AQS

Java中的AbstractQueuedSynchronizer&#xff08;AQS&#xff09;是Java并发框架的核心组件之一&#xff0c;它位于java.util.concurrent.locks包下。AQS为Java的锁和其他同步工具提供了基础架构&#xff0c;它使用模板设计模式和一种称为“CLH锁”的算法来实现高效的线程同步。…

如何使用 SwiftUI 构建 visionOS 应用

文章目录 前言WindowsVolumes沉浸式空间结论 前言 Apple Vision Pro 即将推出&#xff0c;现在是看看 SwiftUI API 的完美时机&#xff0c;这使我们能够将我们的应用程序适应 visionOS 提供的沉浸式世界。苹果表示&#xff0c;构建应用程序的最佳方式是使用 Swift 和 SwiftUI。…

2024年软件测试岗必问的100+个面试题【含答案】

一、基础理论 1、开场介绍 介绍要领&#xff1a;个人基本信息、工作经历、之前所做过的工作及个人专长或者技能优势。扬长避短&#xff0c;一定要口语化&#xff0c;语速适中。沟通好的就多说几句&#xff0c;沟通不好的话就尽量少说两句。举例如下&#xff1a; 面试官你好&…

Java中Predicate(谓词),方法引用,以及正则的一些讲解

1.Predicate接口简述 FunctionalInterface public interface Predicate<T> {boolean test(T t);default Predicate<T> and(Predicate<? super T> other) {Objects.requireNonNull(other);return (t) -> test(t) && other.test(t);}default Pred…

速盾:cdn加速效果

CDN&#xff08;Content Delivery Network&#xff09;即内容分发网络&#xff0c;是一种通过在全球多个节点服务器上缓存网站的静态资源&#xff0c;并将用户请求导向离用户最近的服务器节点&#xff0c;从而提供更快速的访问体验的技术。 在传统的网络架构中&#xff0c;用户…

鸿蒙 HarmonyOs 网络请求 快速入门

官方文档&#xff1a; ArkUI简介-ArkUI&#xff08;方舟UI框架&#xff09;-应用框架 | 华为开发者联盟 (huawei.com) 一、通过原有的http组件进行网络请求&#xff08;方式一&#xff09; 1.1 HttpRequestOptions的操作 名称类型描述methodRequestMethod请求方式&#xff…

12款超良心好用APP推荐,每一款都值得下载!

AI视频生成&#xff1a;小说文案智能分镜智能识别角色和场景批量Ai绘图自动配音添加音乐一键合成视频https://aitools.jurilu.com/分享是奉献的果实&#xff0c;分享是快乐的前提。每天给小伙伴们分享自己认可的软件&#xff0c;也是莫大的幸福&#xff0c;今天获得12款好用的软…