CUDA
訪問者数 5162      最終更新 2008-10-26 (日) 16:29:57
  > GPU

Johan Seland(johan.seland@sintef.no) の「CUDA Programming」より

この記述はJohan Seland(johan.seland@sintef.no) の「CUDA Programming」 (http://www.sintef.no/upload/IKT/9011/SimOslo/eVITA/2008/seland.pdf)から 整理したものです。図版等はSelandの物を借りていますのでCopyrightはもとの著者 にあります。記述内容を整理したことによる誤解・表現上の問題の責任は 山内にあります。

スレッド実行モデル(26〜ページを解釈)

実行の仕組

この上に(スケジューラが)「スレッド」を割付け

実行速度を制限する要因

操作にかかるクロック数

メモリモデル

cuda_memory_for_blocks.png
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)を参照のこと。


添付ファイル: filecuda_memory_for_blocks.png 644件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2008-10-26 (日) 16:29:57 (3167d)