[情報収集]Vulkan APIでGPGPUがしたい
動機
- 昔からずっとGPGPUに興味があったが、ちゃんとしたGPUが積まれたPCを持っていなくてそのままになっていた
- たまたまIntel CPU内蔵のHD Graphicsでも (性能はともかく) Vulkan APIが使えることを知った
- 手元に遊べる環境があるのなら、自分で実装してみたい
とりあえずなんとなく形になったので公開。
色々足りていないし、問題もあるので先は長い。
実際のコード付き
概要を理解するのに非常に役立つ
Vulkan APIをPythonのレイヤーにそのまま出している。
Pythonのバージョンの非互換によるバグがあって、PRがマージされてるけどPyPIに公開されていない。。。
更新止まってるかな。。。
Pythonから簡単に使うにはこれが楽っぽい。
ただ、ライセンスが(中国の)人権(?)活動っぽい奴で、よくあるOSI Approvedなライセンスではない。
すごすぎる
まじめにやるとこんなにコード書かないといけないのか。。。
使うだけ
apt install libvulkan1 libvulkan-dev
開発用
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
が無いって言われて失敗する。
qt5-default
は obsolete みたいなので、 vulkan-sdk
そのもののインストールは諦め、サブパッケージの vulkan-headers
と shaderc
を入れた。
shaderc
には glslc
が含まれている。
Compute Shader (に変換するGLSL) について
Subgroup について
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 との記載もあり(常に?)
subgroup 系の関数を利用するには、SPIR-V 1.3 (= Vulkan 1.1) を指定する必要あり。
GLSL に記載されるメモリレイアウト std430 / std140
- bool も 4byte 単位に配置される。
- 配列を使うなら std430 にしておくと、C++と配置が一致
疑似乱数 (PRNG)
調べた限り Vulkan 標準にはPRNG は無いみたい。
PCG32
同様の質問に、PCG32 の利用を提案している人がいる。
PCG32 は実装自体は簡単だが、64bitの乗算が必要。
xoshiro128++ 他
xoshiro128++ が 32bit 演算かつ軽量で積みやすそうである。
公式
[0, 1) 一様乱数を正規分布に変換するのは、分岐を考慮すると、Box-Mullerが効率的
GLSLの reference
builtin functionを見たり用