2025/04/18 09:33 Zig and GPUs

ロボ子、最近のGPUプログラミング、何か変わってきたのを知ってるかのじゃ?

はい、博士。以前はC++が主流でしたが、RustやZigのような新しい言語でもGPUコードが書けるようになってきたと聞きました。

そうそう!特にZigは熱いのじゃ!自己ホスト型のSPIR-Vバックエンドが進化して、実験とか基本的なシェーダーの移植には十分使えるレベルになったみたいじゃぞ。

SPIR-Vですか。VulkanやOpenCLで使われる中間表現ですよね。Zigが直接SPIR-Vを生成できるようになったのはすごいですね。

その通り!しかもZigはLLVMを使ってPTX(NVIDIA)やAMDGCN(AMD)コードも直接生成できるから、実行時にロードできるネイティブバイナリも作れるのじゃ!

それは便利ですね。でも、VulkanとOpenCL、どちらをターゲットにするかで違いはあるんですか?

ふむ。OpenCLは`Kernel`や`Addresses`みたいな機能が保証されてるから、ポインタ演算とかキャストが許可されてるのじゃ。Vulkan 1.2をターゲットにした場合、ZigのSPIR-VバックエンドはOpenCLだと75%くらいの動作テストに合格するけど、Vulkanだと50%くらいみたいじゃな。

なるほど。OpenCLの方が制約が緩い分、Zigとの相性が良いんですね。汎用言語からSPIR-Vをターゲットにする際の課題は何ですか?

アドレス空間(ストレージクラス)を明示的に指定する必要があることじゃな。これはちょっと面倒じゃ。

確かに、それは少し手間ですね。ハードウェアアクセラレーションされた数学命令についてはどうですか?

VulkanとOpenCLは両方とも`OpExtInst`を介して命令を公開してるけど、Vulkanの`fma`、`sqrt`、`exp`、`log`は、ZigやOpenCLと違って、正しく丸められた結果を保証しないのじゃ。

それは重要な違いですね。精度が求められる処理では注意が必要ですね。今後の課題は何があるんでしょうか?

複合整数への対応、Zigで生成したバイナリで`spirv-val`がエラーにならないようにすること、動作テストの合格率を上げること、CUDA/HIPランタイムへのバインディングの提供、stdlibにGPUで動作する共通アルゴリズムを追加・拡張すること、じゃな。

たくさんありますね。ZigのGPUサポートがさらに進化するのが楽しみです。

ほんとじゃな!そういえばロボ子、GPUプログラミングで一番難しいのは何だと思う?

うーん、メモリ管理とか並列処理の最適化とかでしょうか?

ブー!正解は、グラフィックボードが高くてお財布が軽くなること!…って、オチが弱いかのじゃ?
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。