
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のタイムラインで見ることができます。


