Open20

[情報収集]Vulkan APIでGPGPUがしたい

ピン留めされたアイテム
山田(ymd)山田(ymd)

動機

  • 昔からずっとGPGPUに興味があったが、ちゃんとしたGPUが積まれたPCを持っていなくてそのままになっていた
  • たまたまIntel CPU内蔵のHD Graphicsでも (性能はともかく) Vulkan APIが使えることを知った
  • 手元に遊べる環境があるのなら、自分で実装してみたい
山田(ymd)山田(ymd)

Vulkan APIをPythonのレイヤーにそのまま出している。

https://github.com/realitix/vulkan

Pythonのバージョンの非互換によるバグがあって、PRがマージされてるけどPyPIに公開されていない。。。
更新止まってるかな。。。

山田(ymd)山田(ymd)

使うだけ

apt install libvulkan1 libvulkan-dev

開発用

https://vulkan.lunarg.com/doc/sdk/1.3.236.0/linux/getting_started_ubuntu.html

wget -qO - http://packages.lunarg.com/lunarg-signing-key-pub.asc | apt-key add -
wget -qO /etc/apt/sources.list.d/lunarg-vulkan-focal.list http://packages.lunarg.com/vulkan/lunarg-vulkan-focal.list
apt update
apt install -y libvulkan1 libvulkan-dev vulkan-headers shaderc

公式に書いてあるとおりに、 vulkan-sdk をインストールしようとすると、孫依存の qt5-default が無いって言われて失敗する。

https://askubuntu.com/a/1335187
どうやら qt5-default は obsolete みたいなので、 vulkan-sdk そのもののインストールは諦め、サブパッケージの vulkan-headersshaderc を入れた。

shaderc には glslc が含まれている。

山田(ymd)山田(ymd)

Subgroup について

https://www.khronos.org/blog/vulkan-subgroup-tutorial

Even if you don't use any other part of the new subgroup functionality, you should aim to make your local workgroup be at least the size of the subgroup in most situations.

デバイスの Subgroup サイズよりも小さい local size をシェーダーで指定すると、
work group 内に非稼働の領域を生み出してしまう。
そのため、少なくともデバイスの Subgroupサイズよりも大きな値を指定すべき。

CUDA は subgroup が 32、AMD は subgroup 64 との記載もあり(常に?)

山田(ymd)山田(ymd)

疑似乱数 (PRNG)

調べた限り Vulkan 標準にはPRNG は無いみたい。

PCG32

同様の質問に、PCG32 の利用を提案している人がいる。
https://www.reddit.com/r/vulkan/comments/jhzjvp/comment/gaa1d8q/?utm_source=share&utm_medium=web2x&context=3

PCG32 は実装自体は簡単だが、64bitの乗算が必要。
https://www.pcg-random.org/download.html

xoshiro128++ 他

xoshiro128++ が 32bit 演算かつ軽量で積みやすそうである。

https://qiita.com/Nabetani/items/a8c245f2f4fd4f69bf42
https://qiita.com/STDNUL/items/1d9b227340a43281f1ab

公式
https://prng.di.unimi.it/
https://prng.di.unimi.it/xoshiro128plusplus.c