2025/10/06 11:57 A case for learning GPU programming with a compute-first mindset – Maister's Gr

ロボ子、今日はグラフィックスAPIの新しい学習方法について話すのじゃ!

博士、グラフィックスAPIですか。楽しみです!

従来のグラフィックスAPIから入るのではなく、コンピュートシェーダから学習を始めるのが新しいアプローチなのじゃ。

コンピュートシェーダからですか?それはどうしてでしょう?

GPUプログラミングにおいて、コンピュートシェーダがますます重要になっているからじゃ!

なるほど。それで、どのAPIが良いのでしょうか?

CUDAやOpenCLもあるけど、Vulkan Computeがコンピュートに特化したAPIとして最適なのじゃ!

Vulkan Computeですか。初めて聞きました。

そして、RenderDocのようなデバッガー/プロファイラーを最初に使うのが大事!GPUでのコード実行を理解するのじゃ。

デバッガーファーストですね!

シェーディング言語はVulkan GLSLを推奨するぞ。SPIRV-CrossのGLSLバックエンドを介したシェーダー置換とラウンドトリップに役立つからの。

バッファデバイスアドレスのサポートもあるんですね。

そうじゃ!デバッガー中心のアプローチなら、明示的な同期処理は後回しにできるぞ。

最初のプログラムはLinuxかWindowsでビルド可能で、CMakeビルドで利用できるんですね。

その通り!RenderDocでVulkanコードをキャプチャして、GPUで実行されるコードを観察するのじゃ。

シェーダーの実行では、コピーの代わりに独自のmemcpyを作成するんですね。

shadercを使ってGLSLをCヘッダーファイルにコンパイルするぞ。

シェーダーの置換ワークフローでは、SPIRV-Crossとデバッグプリントを使うんですね。

SPIR-Vを同等のGLSLに変換して、コードを修正し、プログラム全体を再コンパイルせずに結果を確認できるのじゃ。

ISAの検査には、AMD GPUとLinux上のRADVドライバを推奨するんですね。

Mesaドライバは、グラフィックスカードに関係なくISAを提供してくれるから便利じゃ。

コンピュートディスパッチの構成について教えてください。

CPU側で3Dグリッドのワークグループをディスパッチするのじゃ。ワークグループごとに、別の3Dグリッドのインボケーションが存在するぞ。

ワークグループ内のインボケーションはサブグループに分割されるんですね。

AMDの特性として、v_命令はベクター命令で、s_命令はスカラー命令じゃ。

SPIR-Vアセンブリの修正によるシェーダー置換では、OpAccessChainの代わりにOpInBoundsAccessChainを使用するんですね。

記述子を導入すると、テクスチャの効率的なサンプリング、自動フォーマット変換、"無料"の境界チェックが可能になるのじゃ。

STORAGE_BUFFERとUNIFORM_TEXEL_BUFFERの2つの記述子タイプを導入するんですね。

基本的なVulkanバインディングモデルでは、Graniteは古いバインディングモデルを実装しているぞ。シェーダーでlayout(set = 0, binding = 1)のような宣言を使うのじゃ。

VK_EXT_descriptor_bufferによる深い理解も重要ですね。記述子セットを生のメモリとして扱うことが可能になるんですね。

ShaderToyシェーダーをコンピュートに移植して、より数学的なグラフィックスを試すこともできるぞ!

ストレージテクスチャを作成し、シェーダーにバインドするんですね。

アトミック、共有メモリ、サブグループ操作、テクスチャサンプリングとミップマッピング、メモリコヒーレンシ、API同期などを学習していくのじゃ。

独自のVulkanコードをスクラッチから作成できるようになりたいです!

そうじゃ、そうじゃ! 頑張るのじゃ!

ところで博士、Vulkan Computeをマスターしたら、グラフィックスカードでじゃんけんができるようになりますか?

もちろんじゃ!ただし、相手がチョキしか出さないバグがあるかもしれんぞ!
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。