簡介
MLIR 項目是一個構建可重用和可擴展編譯器基礎設施創新項目,旨在解決軟件碎片化問題,顯著降低構建特定領域編譯器的成本。
基于MLIR,可以實現:
- 數據流圖表達(如TensorFlow),包含dynamic shape,用戶擴展op等;
- 數據流圖的優化和變換,如Grappler;
- 跨Kernel實現HPC風格的循環優化(如fusion,interchange,tiling等),數據在內存中的layout變換;
- 針對1D(如CPU)和2D(如GPU)寄存器架構的代碼生成“lowering”轉換,如DMA指令插入,顯式cache管理,內存Tiling,矢量化;
- 表達特定硬件后端的的op,如加速器的高級操作;
- 深度學習圖變換,如量化等;
- 多面體原語;
- 硬件綜合工具。
常用術語
語言
Dialect
一組擴展MLIR系統的功能。Dialect創建了一個唯一的namespace,包含operations,attributes,types。可以把MLIR看作一種meta-IR,所有的Dialects都是MLIR的一部分。使用dialect而不是language是想強調Dialect不是一個獨立的IR。
轉換
Translation
將非MLIR的形式轉換為MLIR的形式(Import),或者反之(Export)。
Export
將MLIR形式轉換為語義等價的外部IR的形式(如LLVM IR)。
Import
將外部IR(如Torch IR)轉換為語義等價的MLIR的形式。
Conversion
將代碼從一種Dialect表示轉換為語義等價的同一種(intra-dialect)或另一種Dialect(inter-dialect)表示。在MLIR的上下文中,conversion表示MLIR內的轉換,既不轉換到MLIR Dialect以外的表示(如LLVM IR),否則是Translation。
Round-trip
將源格式轉換為目標格式,再轉換回源格式的過程。
Lowering
將高級IR表達的operation轉換為語義等價的低級IR表達。在MLIR中通常通過dialect conversion來實現。
Legalization
將operations轉換為符合轉換目標所設定要求的語義等價表示的過程。通常是Lowering中的一部分。
Transitive lowering
一種A->B->C的lowering方式,多個模式(patterns)需要按順序應用,以將一個對target非法的操作完全轉換為一組合法操作。
CSE (Constant Subexpression Elimination)
公共子表達式消除,消除不可達的代碼和值未被使用的表達式。
DRR(Declarative Rewrite Rule)
聲明式重寫規則。在編譯時,這些規則會被擴展成等價的mlir::RewritePattern子類。
結構
Operation (op)
MLIR代碼單元。Operations是MLIR所有代碼和計算的構建單元。高度支持擴展(沒有固定的operation列表,可以靈活自定義),支持應用特定語義。
在MLIR中,有2個主要的Operation相關的類:Operation和Op。Operation是一個對用戶透明的實例,表達了Operation實例的通用API。Op是派生Operation(如ConstantOp)的基類,派生類可以為每個具體的操作提供特定的方法和屬性,同時,Op也是Operation的一個智能指針,兩個類之間可以靈活的互相轉換。
Module
一個Operation,包含一個Region,Region中包含一個Block,Block包含一個或多個Operations。提供了MLIR Operations的組織結構,是IR中的top-level Operation。
Function
一個有名的Operaiton,包含一個Region。Region可以隱式捕獲function外的值,所有外部引用必須使用function arguments或者attributes的形式,建立一個符號鏈接。
Region
一個Blocks組成的CFG。
Block(Basic Block)
一個沒有控制流的順序Operation列表。
Terminator operation
終止1個Block的Operation,有2個作用:
-
結束當前塊的執行:終止操作明確地表示當前塊的結束,防止代碼繼續執行到下一個操作。
-
控制程序的下一步行為:終止操作通常會決定程序的下一步行為,例如:
- 跳轉到另一個塊:使用
br
(分支)操作跳轉到另一個塊。 - 返回函數結果:使用
return
操作返回函數的結果。 - 拋出異常。
參考資料:
MLIR
Glossary - MLIR