MLIR多級中間表示概述
MLIR項目是構建可重用和可擴展的編譯器基礎設施的一種新方法。MLIR旨在解決軟件碎片化問題,改進異構硬件的編譯,顯著降低構建特定領域編譯器的成本,並幫助將現有編譯器連接在一起。
More resources
有關MLIR的更多信息,請參見:
l LLVM論壇的MLIR部分有任何問題。
l LLVM不一致服務器MLIR通道的實時討論。
l 之前的會談。
另請參閱TensorFlow MLIR SIG,它每周組織一次關於MLIR的公眾“公開設計會議”。
What is MLIR for?
MLIR旨在成為一個混合IR,它可以在一個統一的基礎設施中支持多種不同的需求。例如,這包括:
l 表示數據流圖的能力(例如在TensorFlow中),包括動態形狀、用戶可擴展的算子生態系統、TensorFlow變量等。
l 通常在這種圖上進行的優化和轉換(例如在Grappler中)。
l 以適合優化的形式表示ML算子的內核。
l 能夠跨內核托管high-performance-computing-style高性能計算風格的循環優化(融合、循環交換、並行tiling等),並轉換數據的內存布局。
l 代碼生成“降低”轉換,如DMA插入、顯式緩存管理、內存平鋪和一維和二維寄存器架構的矢量化。
l 能夠代表target-specific目標的算子,例如accelerator-specific high-level加速器特定的高級算子。
l 在深度學習圖上進行的量化和其他圖形轉換。
MLIR是一種通用的IR,它還支持特定於硬件的操作。因此,對圍繞MLIR的基礎結構的任何投資(例如,在其上工作的編譯器通行證)都應該產生良好的回報;許多目標可以使用該基礎結構並從中受益。
MLIR是一個強大的代表,但它也有非目標。不支持低級機器代碼生成算法(如寄存器分配和指令調度)。它們更適合於較低級別的優化器(如LLVM)。而且,不希望MIIR是最終用戶自己編寫內核(類似於CUDA C++)的源語言。另一方面,MLIR為表示任何此類DSL並將其集成到生態系統中提供了主干。
編譯器基礎結構
在建立MLIR時,受益於從構建其他IRs(LLVM IR、XLA HLO和Swift SIL)中獲得的經驗。MLIR框架鼓勵現有的最佳實踐,例如編寫和維護IR規范,構建IR驗證器,提供將MLIR文件轉儲並解析為文本的能力,使用FileCheck工具編寫大量的單元測試,以及將基礎結構構建為一組可以以新方式組合的模塊化庫。
其它的優點也被巧妙地融入到設計中。例如,LLVM存在一些不明顯的設計錯誤,這些錯誤會阻止多線程編譯器同時處理LLVM模塊中的多個函數。MLIR通過限制SSA作用域來減少使用def鏈,並用顯式符號引用替換跨函數引用來解決這些問題。