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.pswp.cn/web/40292.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/40292.shtml
英文地址,請注明出處:http://en.pswp.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款好用的軟…