Words for GPGPU

論文を読むときに、自分の知らない単語がいくつかあったので簡単にまとめます。
もっと早めに理解しておかなければならなかったのですが、後回しにしてました。。

「スレッド(thread)」
カーネルを動作させたときのプログラムの最小単位。GPUではコアに対し数千~数万のスレッドが並列に動作することにより、高い性能を引き出している。

「ブロック(block)」
スレッドをまとめたもので、1つのブロックあたり最大512スレッドを格納できる。x方向、y方向、z方向に8スレッドずつ、つまり「1ブロックに8×8×8スレッド」というように3次元的に管理できる。また、1次元的、2次元的にも管理できる。

「グリッド(grid)」
ブロックをまとめたもので、1つのグリッドあたり最大65535個のブロックを格納できる。ブロック同様に3次元で管理することができるが、現在z方向は1ブロックでなければならないため、実質2次元で管理することになる。

「ストライド(stride)」
strideはアクセスの順番の跳び番のことであり、ストライドが1であれば一般的なアクセス(連続アクセス)をする。また、ストライドが2であれば、「1,3,5…」というように1つおきのアクセスとなる。
→部分行列へのアクセスに対応するために使用する変数

「バンクコンフリクト(bank conflict)」
GPUの各スレッドが共有メモリの同じバンクに同時アクセスを行うことにより発生する衝突。これを回避するためにpaddingを用いる場合がある(padded matrixといった表現で用いられることもある)。

「パディング(padding)」
例えば、a[16][16]の配列を16のスレッドで処理をした際に、全てのスレッドが同じバンクにアクセスしてbank conflictが発生する場合がある。このとき、中身のない行列を加えてa[16][17]の配列にすることにより、同時にアクセスするバンクがずれるため回避することができる。(Wikipediaより)
ちなみにパディングをしても意味がない場合は、行列転置で回避する方法もある(?)らしい。

「ワープ(warp)」
32個のCUDAコアが1クロックのサイクルで1スレッド動くため、32スレッドが1つの単位となり、これをwarpという。
なお、スレッド処理数は32の倍数が適しており、それより大きくても小さくても余りのスレッドが発生するため、GPUの処理に無駄ができる。

「コアレス・アクセス(coalesced access)」
グローバルメモリにアクセスするとき、スレッドが連続したメモリに同時にアクセスするようにすると、半分のwarpに相当する16スレッド分のデータを一度の処理で転送できるようになること。
(複数のスレッドが同時にアクセスするとき、アクセスする要素がメモリ上で連続したアドレスに配置されていれば、DRAMの高速アクセスモードを利用できる。)
これにより、メモリへのアクセス時間を大幅に減らすことができると言われている。

Categories: Study