![]() |
ノート/CUDA/JohanSelandhttp://pepper.is.sci.toho-u.ac.jp/pepper/index.php?%A5%CE%A1%BC%A5%C8%2FCUDA%2FJohanSeland |
![]() |
CUDA
訪問者数 6026 最終更新 2008-10-26 (日) 16:29:57
> GPU
この記述はJohan Seland(johan.seland@sintef.no) の「CUDA Programming」 (http://www.sintef.no/upload/IKT/9011/SimOslo/eVITA/2008/seland.pdf)から 整理したものです。図版等はSelandの物を借りていますのでCopyrightはもとの著者 にあります。記述内容を整理したことによる誤解・表現上の問題の責任は 山内にあります。
実行の仕組
この上に(スケジューラが)「スレッド」を割付け
実行速度を制限する要因
操作にかかるクロック数
Johan Seland(johan.seland@sintef.no) "CUDA Programming"(http://www.sintef.no/upload/IKT/9011/SimOslo/eVITA/2008/seland.pdf) page 30
レジスタと共有メモリは、ブロック間で分配される。
山内の理解では、ブロック(やワープ)はOSの「プロセス」のようなもので、物理的に(その個数分)存在するわけではなさそうだ。
つまり、レジスタや共有メモリは、物理的には、1つのストリーミングマルチプロセッサ(=8×スカラープロセッサ)の内部に1組、つまりレジスタは(8K個=32KB分)あり、共有メモリは(16KB分、但し16バンクに構成されている)ある。これらの数値はCUDAのProgramming GuideのAppendix A1.1 (page 78)を参照。GTX9800の場合はComputing Capability 1.1なので、上記の数字になる。Teslaだと1.3なのでレジスタや共有メモリが2倍になっている。
この容量のメモリを、ロードリストアすることなく、領域を分割割当てして使っている。つまりスレッド切替え(正確にはワープ切替えというかブロック切替えというか)の時には(OSのスレッド切替でやるようには)ロードリストアしない。その分割割当ては、おそらくコンパイル時に確定してしまうのだろう。
上の図で、各スレッドにレジスタがあり、各ブロックに共有メモリがあるように描かれているのは、その(コンパイル時の?)分割割当てが済んだ分量を割り当てた状況なのだろうと思う。だから「レジスタや共有メモリの容量はブロック数に依存する」ことになるのだろうと思う。
この他に、グローバルメモリ、定数メモリ、テクスチャメモリが使えるが、CUDAのプログラミング上、定数メモリやテクスチャメモリをどう使うのか、未確認。
グローバルメモリは非常にアクセスが遅い(400〜600サイクル)のと、かたまりで転送(Coalesced)する必要がある。細かくはProgramming GuideのSection5.1.2.1 (page 52)を参照のこと。