背景
最新 RADV(オープンソースの amdgpu 向け Vulkan 実装)を使いたい.
ROCm で RADV で Vulkan(compute kernel) を使うメモ
https://qiita.com/syoyo/items/ce3943757281acbdba49
の続きです.
Mesa 21.3 or later,
Ubuntu 20.04 + AMD GPU(Radeon VII or later)を想定します.
Meson
mesa は scons(!) などでビルドできるようですが, ナウでヤングな若人さまでしたら meson かと思います.
(Mesa(freedesktop project?)は meson に移行しつつあるようですね)
従いまして meson でビルドします.
Ubuntu apt で入る meson は古くて libdrm, mesa がビルドができないので, meson 最新版(0.51 as of Dec 20th, 2019) を https://github.com/mesonbuild/meson/releases から取得してパスを通しておきます.
libdrm
mesa の amdgpu(radeon) モジュールが libdrm 2.4.100 を要求します. 現時点(2019/12/20)では apt で入る libdrm は古いので, まずは libdrm 2.4.100 をコンパイルします. このステップはいずれ ubuntu 側で libdrm 2.4.100 にアップデートされたら不要です.
libdrm のビルドには libpciaccess が必要です.
$ sudo apt install libpciaccess-dev
$ cd $libdrm
$ mkdir build
$ cd build
$ meson ..
...
Message:
Message: libdrm will be compiled with:
Message:
Message: libkms true
Message: Intel API true
Message: vmwgfx API true
Message: Radeon API true
Message: AMDGPU API true
Message: Nouveau API true
Message: OMAP API false
Message: EXYNOS API false
Message: Freedreno API false (kgsl: false)
Message: Tegra API false
Message: VC4 API false
Message: Etnaviv API false
Message:
Build targets in project:
と AMDGPU が true を確認しておきます.
$ sudo ninja install
/usr/local/
にインストールされます.
$ pkg-config --libs libdrm
で /usr/local
のほうのライブラリが使われているか確認しましょう.
local にインストールしたい場合は, meson --prefix /path/to/dir
でインストール先を指定して, PKG_CONFIG_PATH
に設定すれば後続の mesa ビルドでも見つけてくれると思われます.
Mesa build
ビルドのドキュメントが全く無いです.
オフィシャルのドキュメントは全く役に立ちませんし, Linux ビルドについて何も書かれていません. オフィシャルのドキュメントは無視しましょう.
まずは依存ライブラリを入れます.
テンプレートから C/C++ コード生成(?)のために python mako を使っていますので, pip あたりで入れます.
$ pip install mako
他に python 関連で依存があるかもしれませんので適宜 pip install します.
その後, apt でビルドに必要なのを入れます.
llvm は 11 が必要です.
Ubuntu 20.04.03 は現時点では 10 がデフォルトです. meson では llvm-config
しか見ないようなので,
$ sudo update-alternatives --install /usr/bin/llvm-config llvm-config /usr/bin/llvm-config-11 10
としておきます.
X11 関係の依存関係がおおくてつらくてぴえん
$ sudo apt install libelf-dev bison byacc flex
$ sudo apt install libx11-dev libxext-dev libxdamage-dev libxfixes-dev libxcb-glx0-dev libx11-xcb-dev libxcb-dri2-0-dev libxcb-dri3-dev libxcb-present-dev libxshmfence-dev libxxf86vm-dev libxrandr-dev
$ sudo apt install libwayland-dev wayland-protocols libwayland-egl-backend-dev
$ sudo apt install libxcb-shm0-dev libxcb-sync-dev
他, 足りないの出てきたら適宜 apt で入れます
(.gitlab/container/debian/
あたりのビルドスクリプト参照)
Vulkan 使う場合は dri3 必須です.
wayland は頑張れば disable できるかもしれませんが, ドキュメントが無いのでどうすれば設定できるか不明ですので諦めて wayland ありでビルドします.
meson で bootstrap 成功すれば, あとは ninja で普通にビルド通るはずです.
mesa は install すると GL や Vulkan などのヘッダをインストールするため, システムのヘッダファイルを上書きしないように, 適当な local dir にインストールするようにします. $HOME/local
は適宜変更ください.
$ mkdir build
$ cd build
$ meson --prefix $HOME/local ..
$ ninja
$ ninja install
これで $HOME/local
にインストールされます.
動かす
カーネルモジュールの drm はそのままでいけます.
VK_ICD_FILENAMES
環境変数で, 使う libvulkan を今回ビルドしたものに設定します.
$ export VK_ICD_FILENAMES=$HOME/local/share/vulkan/icd.d/radeon_icd.x86_64.json
あとは普通に vulkan アプリを動かします. vulkaninfo してみます
$ vulkaninfo
GPU0
VkPhysicalDeviceProperties:
===========================
apiVersion = 0x40106b (1.1.107)
driverVersion = 79704065 (0x4c03001)
vendorID = 0x1002
deviceID = 0x66af
deviceType = DISCRETE_GPU
deviceName = AMD RADV VEGA20 (LLVM 8.0.1)
...
VK_KHR_shader_float16_int8 : extension revision 1
...
Super cooool!
VK_KHR_shader_float16_int8
が使えるようになりました!
追記(Mesa 20)
Mesa 20(2020/Feb/19) で, RADV で Vulkan 1.2 が使えるようになりました.
HLSL でシェーダ記述もできるものと思われます.
追記(Mesa 21.3)
21.3 でレイトレ機能が experimental で使えるようになりました.
VK_ICD_FILENAMES
で使う Vulkan ドライバを指定しても, amdgpu-pro
を入れているとなぜか 32bit 版の amdvlk32 を見に行ってしまうようです. amdgpu-pro(closed source 版 Vulkan ドライバ)を入れている場合は削除しておきましょう.
また, デフォルトではレイトレ拡張出てきません.
環境変数で RADV_PERFTEST=rt
を指定する必要があります.
(念の為, vulkaninfo
などで, RADV が使われているのをを確認しましょう)
offscreen で動かす
video
group を追加すれば, offscreen(ssh でログインなど)で動かせます.
$ sudo usermod -aG video $USER
TODO
- デフォルトでは OpenGL 関連もビルドされるので, RADV(libvulkan)だけビルドするようにする
- libdrm をユーザディレクトリにインストールして mesa ビルドできるようにする
- Docker ビルドを用意する(オフィシャルには無いっぽい)