ディスカッション (9件)
CUDAカーネルを起動した瞬間、GPU内部で一体何が繰り広げられているのでしょうか?ホスト側からデバイス側への指示の伝達、スレッドブロックのスケジューリング、そしてメモリへのアクセスに至るまで、プログラムがGPUで実行されるまでの舞台裏を分かりやすく紐解いていきます。
ハードウェアについては、オープンなドキュメントがいくつか公開されているよ。メソッドのドキュメントやqmdフォーマットを知るために、必ずしもカーネルのソースコードを読み込む必要はないんだ。ここを見てみて。https://github.com/NVIDIA/open-gpu-doc/blob/master/classes/compute/clcdc0qmd.h
まずは素晴らしいまとめだね。細かいところまでよく掘り下げられてる。ただ、CUDAの「ランタイムAPI」を通さなければ、ユーザー空間の「魔術(voodoo)」の多くは消え去るよ。ドライバAPIを使ってカーネルソースを文字列として扱い、NVIDIAのランタイムコンパイラでコンパイルすれば、何が起きているか(すべてとは言わないまでも)もっと見通しが良くなるはず。その「生」のバージョンについてはここを見てみて:https://github.com/NVIDIA/cuda-samples/tree/master/cpp/0_Introduction/vectorAdd_nvrtc 。でも、もっと読みやすくてモダンなC++ APIを使った透明性の高いバージョンなら、こっちがおすすめ。https://github.com/eyalroz/cuda-api-wrappers/blob/master/examples/modified_cuda_samples/vectorAdd_nvrtc/vectorAdd_nvrtc.cpp これは僕が作っているCUDA APIラッパー(ヘッダーオンリー)のサンプルプログラムだよ。
今、カーネルを最適化して高速化すること自体を専門にしている企業があるよね。そういう企業が、すごく高性能なオープンソースライブラリに取って代わられることになるのか(NVIDIAがその気になればいつでも出せそうだけど…)、それとも彼らが成功して、推論を高速化するための「堀(moat)」として大手プロバイダーに買収されていくのか、どっちになるんだろうね。
興味深い記事だった。デフォルトストリームにおけるセマフォの話も面白かったよ。CUDAがユーザーの代わりにコマンドの同期を暗黙的に処理してくれて、並列コマンドはストリームを通じて任意で選択できるようにしているのは素晴らしいよね。同期の複雑さを最初からすべてユーザーに押し付けるVulkanとは大違いだよ。
HPCの修士課程を終えたところで、CUDA、MPI+CUDA、OpenCLの授業を受けたんだけど、授業を受ける前にこういう記事を読んでおきたかったよ!特に「Warpが実行可能であるとはどういう意味か?」の前後あたりがすごく参考になりそう。
これはすごく役に立つね。ドアベルとQMDの部分が特に便利だった。CUDAの起動構文が実際にどうやってGPUへ送られるのかという道筋がわかったから。たいていの解説はカーネルやブロック、Warpの話で終わっちゃうけど、これのおかげでCPUからドライバ、そしてGPUに至るまでのパスがずっと追いやすくなった。
制御コード(Control codes)は記事で説明されているよりもう少し複雑だよ。単なる制御ワードのビットというよりは、実際にはテーブルルックアップに近いものなんだ。
ベアメタルで動くの?