MLIR
出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2026/09/05 12:35 UTC 版)
|
|
この記事はカテゴライズされていないか、不十分です。
|
| 開発元 | LLVMプロジェクト |
|---|---|
| プログラミング 言語 |
C++ |
| 種別 | コンパイラ基盤 |
| ライセンス | Apache License 2.0 with LLVM Exceptions |
| 公式サイト | https://mlir.llvm.org/ |
MLIR(Multi-Level Intermediate Representation)は、LLVMプロジェクトで開発されているコンパイラ基盤および中間表現(IR)である。異なる抽象レベルの中間表現を同一の基盤上で扱うことを目的としており、機械学習、GPU、ベクトル演算、ドメイン固有言語などのコンパイラ開発に利用されている。[1]
MLIRは単一の固定されたIRではなく、Dialectと呼ばれる拡張機構を中心とした多層IRのフレームワークとして設計されている。DialectによってOperation、Attribute、Typeなどを定義でき、複数のDialectを同一のIR内で組み合わせることができる。[2]
概要
MLIRは、コンパイラの異なる段階において異なる抽象レベルのIRを使用できるように設計されている。
従来のコンパイラでは、フロントエンドが生成したIRを最終的な機械語に近いIRへ一度に変換するのではなく、複数の中間段階を設けることがある。MLIRでは、このような異なる段階をDialectとして表現できる。
例えば、機械学習コンパイラではテンソル演算を表す高水準のDialectから、ループやメモリアクセスを表すDialect、さらにLLVM IRに対応する低水準のDialectへ段階的に変換することができる。
MLIRはこのような変換、解析、最適化を共通のインフラストラクチャ上で行えるようにする。
IRの構造
MLIRのIRは階層的な構造を持つ。
基本的な構成要素には、Operation、Value、Block、Regionがある。[3]
概念的には次のような関係になっている。
Operation
└── Region
└── Block
└── Operation
Operation
OperationはMLIRにおける基本的なIR構成要素である。
Operationは、算術演算、関数、メモリ操作、テンソル演算など、さまざまな処理を表現できる。
Operationは次のような情報を持つ。
- Operand
- Result
- Attribute
- Property
- Region
- Successor
Operationの種類はDialectによって拡張できる。[4]
Value
Valueは、Operationによって生成されたResult、またはBlockに渡されるBlock Argumentを表す。
各Valueは型を持つ。
MLIRのValueは静的単一代入形式(SSA)に基づいている。
Block
BlockはOperationを順序付けて格納する単位である。
BlockにはBlock Argumentを持たせることができる。
MLIRでは、LLVM IRなどで利用されるPHIノードに相当する値の受け渡しをBlock Argumentによって表現できる。[5]
Region
RegionはBlockの集合であり、Operationの内部に保持される。
OperationがRegionを持つことによって、IRを階層的に構成できる。
Regionは、それを含むOperationによって意味が決定される。
Dialect
Dialectは、MLIRを拡張するための主要な仕組みである。
Dialectでは、独自のOperation、Attribute、Typeなどを定義できる。各Dialectには固有の名前空間があり、そのDialectに属する要素は名前空間によって識別される。[6]
例えば、LLVM DialectではLLVM IRに対応するOperationやTypeなどが定義されている。
MLIRでは複数のDialectを同じModule内で使用できる。そのため、高水準のDialectから低水準のDialectへ段階的に変換することが可能である。[7]
Dialectの定義
DialectはC++によって定義できるほか、TableGenを利用した宣言的な定義方法も提供されている。
MLIRでは、Dialectの定義からOperationなどに関連するコードを生成するための仕組みも用意されている。[8]
主なDialect
MLIRには多数のDialectが存在する。代表的なものを以下に示す。[9]
| Dialect | 主な用途 |
|---|---|
| builtin | MLIRの基本的なIR構造 |
| arith | 算術演算 |
| func | 関数 |
| scf | 構造化制御フロー |
| cf | 制御フロー |
| affine | アフィン変換 |
| linalg | 線形代数 |
| tensor | テンソル |
| memref | メモリ参照 |
| vector | ベクトル演算 |
| gpu | GPU処理 |
| llvm | LLVM IRとの連携 |
| spirv | SPIR-Vとの連携 |
| nvvm | NVIDIA GPU向け処理 |
| rocdl | AMD GPU向け処理 |
このほかにも、async、bufferization、complex、math、quant、sparse_tensor、transform、tosaなど、多数のDialectが存在する。[10]
型システム
MLIRでは、すべてのValueがTypeを持つ。
MLIRの型システムは拡張可能であり、あらかじめ決められた固定的な型だけでなく、Dialectによって用途に応じた独自の型を定義できる。[11]
代表的な型には以下がある。
- 整数型
- 浮動小数点型
- インデックス型
- テンソル型
- ベクトル型
- メモリ参照型
- 関数型
テンソル型
Tensor Dialectでは、テンソルを表現するためのOperationなどが提供される。
機械学習などではテンソルが主要なデータ構造として使用されるため、MLIRではテンソルを高水準のIRとして直接扱える。
ベクトル型
Vector Dialectではベクトル演算を表現できる。
高水準のベクトル演算を、対象となるハードウェアに適した低水準の処理へ変換するために利用できる。
Attribute
Attributeは、IRに付加される静的な情報を表す。
整数、浮動小数点数、文字列、配列、辞書などをAttributeとして表現できる。
Dialectによって独自のAttributeを定義することもできる。[12]
Property
PropertyはOperationに格納される追加情報である。
Operationに関連するデータを構造化して保持するために使用できる。[13]
Trait
TraitはOperationが持つ性質や制約を表現する仕組みである。
複数のOperationに共通する性質を定義したり、Operationが満たす条件を表現したりするために利用される。
Interface
Interfaceは、特定のOperationやDialectに直接依存せずにIRを扱うための抽象化機構である。
例えば、変換Passが特定のOperationの型を直接判定するのではなく、Operationが提供するInterfaceを通して必要な情報を取得することで、Dialectに依存しない汎用的な処理を構築できる。[14]
Pass
PassはMLIRのIRに対して解析、変換、最適化などを行う処理単位である。
複数のPassを組み合わせることで、コンパイルパイプラインを構築できる。
Passは特定のOperationを対象として実行することもでき、Operationの階層構造に沿って適用することもできる。
Pattern Rewrite
Pattern Rewriteは、IR内のOperationを別のOperationへ変換するための仕組みである。
特定のOperationやOperationの組み合わせをパターンとして定義し、そのパターンに一致するIRを別の形へ書き換える。
Dialectの変換や最適化などで利用される。[15]
Dialect Conversion
Dialect Conversionは、あるDialectから別のDialectへOperationを変換するための仕組みである。
変換対象となるOperationや変換後に許可されるDialectなどを指定し、段階的なLoweringを実現できる。
Lowering
Loweringは、IRをより低い抽象度の表現へ変換する処理である。
例えば、テンソル演算をより低水準のメモリ操作へ変換したり、GPU向けのOperationをターゲット固有のOperationへ変換したりできる。
一般的な構成は次のようになる。
高水準Dialect
↓
中間Dialect
↓
低水準Dialect
↓
LLVM Dialect
↓
LLVM IR
↓
機械語
LLVM IRとの関係
MLIRとLLVM IRは異なる役割を持つ。
LLVM IRはLLVMの最適化およびコード生成に利用される低水準の中間表現である。
一方、MLIRは高水準から低水準までの複数の抽象レベルを扱うコンパイラ基盤である。
MLIRにはLLVM Dialectが存在し、LLVM IRに対応するOperationやTypeをMLIR上で表現できる。[16]
LLVM DialectのOperationは、原則として対応するLLVM IRの命令と同じ意味を持つよう設計されている。
MLIRではLLVM IRのPHIノードを直接使用せず、Block Argumentによって同等の制御フロー上の値の受け渡しを表現する。
GPU
MLIRにはGPU Dialectが存在し、GPU向けの処理を表現できる。
GPU Dialectは、GPUカーネルやGPU固有の処理を表現するために利用され、さらにNVVM、ROCDL、SPIR-Vなどの低水準の表現へ変換できる。[17]
機械学習
MLIRは機械学習向けコンパイラの基盤として利用されている。
機械学習では、テンソル、行列演算、量子化、GPUなど複数の抽象レベルを扱う必要がある。
MLIRでは、それぞれの概念をDialectとして表現し、段階的に低水準のIRへ変換できる。
ドメイン固有コンパイラ
MLIRはドメイン固有コンパイラの構築にも利用できる。
独自Dialectを定義することで、特定の分野に特化したOperation、Type、Attributeなどを表現できる。
その後、既存のDialectへLoweringすることで、既存の最適化やコード生成機構を利用できる。
プログラミング言語との関係
MLIRは特定のプログラミング言語専用ではない。
プログラミング言語のコンパイラは、ソースコードを独自Dialectへ変換し、その後MLIRの変換・最適化機構を利用できる。
例えば、次のような構成が考えられる。
ソースコード
↓
Lexer
↓
Parser
↓
AST
↓
独自Dialect
↓
MLIRによる最適化
↓
Lowering
↓
LLVM Dialect
↓
LLVM IR
↓
機械語
テキスト形式
MLIRには、人間が読みやすいテキスト形式のIRが存在する。
MLIRのOperationは、汎用的な形式とDialectごとの読みやすい形式の両方で表現できる。
例えば、Operationは次のような形式で記述できる。
%0 = "foo"() : () -> i32
テキスト形式は、IRの確認、デバッグ、テストケースの作成などに利用される。[18]
バイトコード
MLIRにはIRを保存するためのバイトコード形式が存在する。
バイトコードでは、IRで使用されているDialectやOperationなどをコンパクトにエンコードできる。[19]
ツール
MLIRにはIRの解析、変換、デバッグなどを行うためのツールが用意されている。
代表的なものとして以下がある。
- mlir-opt
- MLIRのIRにPassを適用するためのツール。
- mlir-translate
- MLIRと他のIR形式との変換を行うためのツール。
- mlir-tblgen
- TableGenを利用してMLIR関連のコードを生成するためのツール。
- mlir-reduce
- 問題を再現するIRを縮小するためのツール。
利点
- 拡張性
- DialectによってOperation、Type、Attributeなどを追加できる。
- 多層IR
- 異なる抽象レベルのIRを同一の基盤上で扱える。
- 再利用性
- 既存のDialect、Pass、変換機構などを利用できる。
- 段階的Lowering
- 高水準の表現から低水準の表現まで、複数の段階に分けて変換できる。
- LLVMとの連携
- LLVM Dialectを利用してLLVM IRへ変換できる。
- 異種ハードウェアへの対応
- CPU、GPU、アクセラレータなどを対象とするコンパイラを構築できる。
制約
MLIRは完成したプログラミング言語やコンパイラそのものではなく、コンパイラを構築するための基盤である。
そのため、MLIRを利用する場合でも、対象となる言語やハードウェアに応じてDialect、Pass、Loweringなどを設計する必要がある。
単純なコンパイラでは、MLIRを導入することによって実装が複雑になる場合もある。
ライセンス
MLIRはLLVMプロジェクトの一部として公開されている。
ソースコードにはApache License 2.0およびLLVM Exceptionsが適用されている。
関連項目
脚注
- ↑ “MLIR”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “Dialects”. MLIR. 2026年9月5日閲覧。
- ↑ “Defining Dialects”. MLIR. 2026年9月5日閲覧。
- ↑ “Dialects”. MLIR. 2026年9月5日閲覧。
- ↑ “Dialects”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “Interfaces”. MLIR. 2026年9月5日閲覧。
- ↑ “Pattern Rewriting”. MLIR. 2026年9月5日閲覧。
- ↑ “LLVM Dialect”. MLIR. 2026年9月5日閲覧。
- ↑ “Dialects”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Language Reference”. MLIR. 2026年9月5日閲覧。
- ↑ “MLIR Bytecode Format”. MLIR. 2026年9月5日閲覧。
外部リンク
- MLIRのページへのリンク