背景
MLIR を Vulkan で動かしたい
LLVM Adds MLIR-Vulkan-Runner To Run MLIR On Vulkan-Enabled GPUs
https://www.phoronix.com/scan.php?page=news_item&px=LLVM-MLIR-Vulkan-Runner
mlir-vulkan-runner が追加されたので, これを試してみます.
試す
を参考にして, 一式ビルドします.
git clone https://github.com/llvm/llvm-project.git
mkdir llvm-project/build
cd llvm-project/build
cmake -G Ninja ../llvm \
-DLLVM_ENABLE_PROJECTS=mlir \
-DLLVM_BUILD_EXAMPLES=ON \
-DLLVM_TARGETS_TO_BUILD="X86;NVPTX;AMDGPU" \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ -DLLVM_ENABLE_LLD=ON
Vulkan 実行だけなら, NVPTX, AMDGPU ターゲットは不要かもしれません
cmake に, -DMLIR_VULKAN_RUNNER_ENABLED=1
を追加しておきます.
ビルドには, vulkan ライブラリのインストールが必要かもしれません(Ubuntu なら apt で入る)
Ryzen9 3950X で, 4 分 45 秒くらいでした(clang, lld 利用)
ビルドできれば bin/mlir-vulkan-runner
ができているはずです!
サンプルを動かしてみます.
$ ./bin/mlir-vulkan-runner ../mlir/test/mlir-vulkan-runner/addf.mlir --shared-libs=lib/libvulkan-runtime-wrappers.so,lib/libmlir_runner_utils.so --entry-point-result=void
Emitting via RTDyldObjectLinkingLayer:
{ ("main", [Callable]), ("_mlir_main", [Callable]) }
Unranked Memref rank = 1 descriptor@ = 0x7ffe6d0ff900
Memref base@ = 0x32478d0 rank = 1 offset = 0 sizes = [8] strides = [1] data =
[3.3, 3.3, 3.3, 3.3, 3.3, 3.3, 3.3, 3.3]
Voala!
内部としては, LLVM が SPIR-V コード生成, mlir-vulkan-runner が Vulkan API いろいろ呼び出して, SPIR-V カーネルを実行, という感じになっています(IREE などは使っていない)
SwiftShader で動かす
サーバで動かしているなど, Vulkan 対応 GPU がないときは, SwiftShader で動かせます!
冬到来! SwiftShader を使い人類史上最速で Vulkan プログラミングをはじめよう!
https://qiita.com/syoyo/items/ef5518f8c3638e50a6b9
Windows でビルドする.
Windows で llvm-project のビルドは, llvm-tblgen の処理がとっっっても遅いです! ビルドに 1 時間くらい時間かかります(しかもなぜか並列実行してくれない)
VULKAN_SDK 環境変数で Vulkan の場所を設定することで, Vulkan あり(mlir-vulan-runner)でビルドまでできるのを確認しました.
現状 mlir-vulkan-runner の unit test で memory allocation error あたりを出して落ちます.
しばし待てば治りそうです.
Windows の場合, LunarG の Vulkan SDK をインストールするのが手っ取り早いでしょうか.
ただ, Windows では LunarG Vulkan SDK は, installer 形式(exe)しかありません.
CI でビルドしたいなどの場合, Header(Vulkan-Headers)/Lib(Vulan-Loaders)をマニュアルで指定したい(self-contained でビルドしたい)場合は
SwiftShader の Software Vulkan 実装で自前 Vulkan アプリを作る準備(Linux)
https://qiita.com/syoyo/items/17a74b6809ebf1577ce7
にある vulkan-minimal-compute swiftshader branch https://github.com/syoyo/vulkan_minimal_compute/tree/swiftshader を参照するとよいでしょう.
今後に期待...?
途中でプロジェクトキャンセルのリスクはありますが, うまく開発が継続されれば, MLIR Vulkan で, 学習まで Vulkan でできる日は近いかもしれません(AMDGPU では, ROCm 不要で動かすことができる)