FPGA開発日記

カテゴリ別記事インデックス https://msyksphinz.github.io/github_pages , English Version https://fpgadevdiary.hatenadiary.com/

LLVMの新しい中間言語表現 MLIRを試す(4. MLIRに関する発表資料を読む)

MLIRについてもう少し具体的な例を勉強するために、資料を読み込んでいくことにした。前回の続き。

以下の資料を参考にした。Chris Lattnerの所属がSiFiveに変わっているので、比較的最近の資料だ。

docs.google.com


MLIR Infrastructureについて

f:id:msyksphinz:20200704234045p:plain:w400

この"Batteries Included"というのは、自分自身がオペレーションを定義することができる、ということだと思う。

Op definitionの例ということで、TensorFlowのLeakyReluの例が出てくる。

f:id:msyksphinz:20200704234113p:plain:w400

TableGenによって定義されるDSLなのだが、まずはTF_LeakyReluOpは"TensorFlowの単項演算子である"という定義がなされている。プロパティの設定(パラメータの設定のようなもの:NoSideEffects)が行われている。Opの定義はSameValueTypeで指定されているのだろうか。入力と出力オペランドの形はlet argumentsで指定されているようだ。最後にドキュメントが指定されている。

これにより、自動的にドキュメントが生成されるという仕組みになっているようだ。

f:id:msyksphinz:20200704234127p:plain:w400

このDSLからC++のコードが出力されるわけだが、これにはCheker(Verifier)まで一緒に実装されているらしい。アサーションが自動的に挿入されているという仕組みかな。

f:id:msyksphinz:20200704234140p:plain:w400

Opのダンプ用のコードやParserをassemblyFormatで指定することができるということか?

f:id:msyksphinz:20200704234154p:plain:w400

Declarative Rewrite Rules(DDR)。これはLLVMのRewrite Ruleと大して変わらないのだろうか?

f:id:msyksphinz:20200704234206p:plain:w400

で、このRewriteのルールを大量に記述すると動作が遅くなるらしい。これをステートマシンに変換して速度を改善すると書いてあるが、詳しいことは正直良く分からない。

f:id:msyksphinz:20200704234219p:plain:w400

mlir-optはコンパイラのPassをテストするためのフレームワーク。llvm-optと同様。

f:id:msyksphinz:20200704234230p:plain:w400

デバッグ機能。ソースロケーショントラッキング。これはLLVM IRにも付いている奴かな?

f:id:msyksphinz:20200704234245p:plain:w400

そして、MLIRはLLVM IRを方言として受け付けることができるらしい。LLVM IRは「ベクトル付きのC」と言われているくらいあって、あまりレイヤが高くないのでこれを受け取ることができる。

f:id:msyksphinz:20200704234302p:plain:w400