【CUDA】Grid,Block,Thread,Warpについて

CUDA入門

Grid,Block,Thread,Warp(グリッド、ブロック、スレッド、ワープ)の関係について解説していきます。

何か高速化のヒントになるかもしれません。

グリッド・ブロック・スレッド(Grid/Block/Thread)

グリッド・ブロック・スレッドはこのような階層構造になっています。

グリッドはブロックの上位構造として存在していますが、特別何かをするというわけではないので、概念だけ覚えておけば大丈夫です。

しかし、ブロックはスレッドを保持し、独特の動きをします。

ブロック・スレッドの特徴

資源の共有

同じブロック内のスレッドでは、
「シェアードメモリ」
「レジスタメモリ」
などの資源を共有できます。

「グローバルメモリ(デバイスメモリ)」 の読み書き速度と比べると、これらは数十倍~百倍以上は早いので、できるだけブロック内で共有資源を活用できるようコーディングすることになります。

しかし、逆に言うと、ブロックが違うスレッド同士はグローバルメモリを介さないとデータを共有することはできません。

Warp(ウォープ)

複数スレッドの1単位です。32Threadが1warpとして、必ず同時に動きます。
逆に、別々のWarpどうしは同時に実行されないことがあります。

例えば、カーネル内で共有資源が大量に使われていたり、if文を多用していた場合です。

if文で分岐していた場合、if文に入るThreadと、入らないThreadそれぞれにWarpが使われます。
どちらか一方の分岐で1Threadしか実行されないケースでも、1Warpが丸々動くので、効率が落ちてしまいます。

そのため、if文の影響は意外と大きいので、使わずに済むなら使わないようにしましょう。

Occupancy(占有率)

Warpが同時に動いていたほうが、当然高速です。
どの程度同時に動いているかの指標がOccupancy(占有率)です。

正確には、最大のWarp数と同時実行されているWarp数の比です。

Nsightのタイムラインで見ることができます。

【CUDA】ブロック・スレッドを2次元で使う
CUDAのスレッドは2次元で持つことができるので、その使い方の解説をします。

マウスコンピューター/G-Tune