背景
AMD GPU で GPGPU(CUDA ぽいの)ができる ROCm がいつまで経っても RDNA/RDNA2 対応しておらんかった...
しかし, 最近 Cycles X が AMD HIP で RDNA2 で動かせるようになる(まずは Windows で)という記事があり, HIP 再訪することにしました.
https://code.blender.org/2021/11/next-level-support-for-amd-gpus/
https://code.blender.org/2021/04/cycles-x/
(ちなみに buggy OpenCL driver とあるのは AMD のことでしょうね )
Linux では, 21.40 でついに対応し始めったっぽい?
admgpu 入れると rocm 関連のパッケージも入ります.
いままでは rocm 用(GPUGPU 用)と, OpenCL/OpenGL などのグラフィックスドライバの SW スタックは別でした.
21.40 から OpenCL あたりも rocr(ROC runtime) で動くようになります(ついでにいうと OpenCL も完全? OSS なスタックとなる).
ROC は Radeon Open Compute の略かしら?
upgrade
Linux では cuda repo とは異なり, amdgpu-install では(現時点では)アップグレードは対応していません.
amdgpu-uninstall してパッケージをアンインストールしておき, amdgpu-install の deb を再インストールで対応となります.
HIP とは
NVIDIA で言う CUDA みたいなのです(CUDA API 互換のライブラリとかを提供)
内部的には C/C++(LLVM に変換できるコンパイラがあれば rust なども) を GCN/RDNA ISA などで動くようにしていますので,
特に CUDA API にこだわらなければ, より汎用な C/C++ コードを GPU で動かせると思います.
いろいろ紆余曲折あったようですが, 最近では binary(fat binary)を comgr/rocr で動くように統一されてきたっぽい.
2020 年後半以降の HIP, HIP clang compiler について
https://qiita.com/syoyo/items/240a1b08cb72f1ea6fbe
最近ではやっと hipcc
も apt で入る感じになってきました.
仕組み
AMD のサイトとかにまともな資料無いっぽいので推定ですが, こんな感じでしょうか...
(VEGA or later)
HIP app | OpenCL app とか
|
| | |
|/ | |/
+-----------+-----------+
| hip.bc | oclc.bc | device library bitcode(`/opt/rocm/amdgcn/bitcode`)
+-----------------------+
| rocr/rocclr | (common) runtime
+-----------------------+
| amdgpu(former amdkfd) | kernel driver
+-----------------------+
動かす.
amdgpu
ドライバ(最近は apt meta package 形式)を入れているとします.
$ sudo apt install roc-dev
で hipcc など入れます.
あとはコンパイルするだけです!
square
サンプルを動かしてみます.
info: running on device AMD Radeon RX 6800
info: allocate host mem ( 7.63 MB)
info: allocate device mem ( 7.63 MB)
info: copy Host2Device
info: launch 'vector_square' kernel
info: copy Device2Host
info: check result
PASSED!
Voila!
これで RDNA2 で Vulkan/OpenGL などでレイトレしたりレンダリングしたり, マイニング(OpenCL)したりしつつ, GPGPU(HIP)もできるようになります!
pytorch-rocm は...?
残念ながら最新 docker image でも gfx1003 が有効になっていないっぽく seg fault(HIP compile 失敗)しました.
ソースコードから gfx1003 有効にしてビルドすればいけるかもしれません.
しかし, Radeon VII で試したところ, 結局のところ pytorch-rocm は使い物にならないままのようですので(GPU のカーネルコンパイルが激遅 + GPU のほうが遅い),期待しないほうがいいでしょう.
(pytorch CUDA の API や書き方に合わせて無理やり動かしているので, 非効率)
HIP(C/C++) で, 自前で機械学習ライブラリ(MIOpen, ROCblas, ...)を叩いたほうがよさそうです!
HSA はどうなる?
不明. HIP に統一されていくのでしょうか...
RT core はどうなる?
ISA 自体はあるっぽいので, うまく叩けば使えるかもしれませんが, OptiX のように簡易に使える API は提供されていません.
とりあえずは Vulkan 経由になるでしょうか(HIP sample に Vulkan interop の例があります)
ただ, RDNA2 の HW raytracing(texture unit)の性能自体そんなに良いわけではないので, 無理して使っても性能でないでしょうから, RDNA3 など次期アーキテクチャに期待でしょうか.
Intel dGPU はどうなる?
Intel Xe ではどうなるでしょうか. Intel は OpenCL コンパイラをきちんとメンテしている感じがしますが... SYCL とかになるのかな?