[[CUDA>ノート/CUDA]]~
訪問者数 &counter();      最終更新 &lastmod();~
  > [[GPU>ノート/CUDA/GPU]]~

**Johan Seland(johan.seland@sintef.no) の[[「CUDA Programming」:http://www.sintef.no/upload/IKT/9011/SimOslo/eVITA/2008/seland.pdf]]より [#ebe121a5]

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

***スレッド実行モデル(26〜ページを解釈) [#w700c458]
実行の仕組
-GPU(チップのこと?)はN個のMP(マルチプロセッサ)からなる~
    複数のチップ(ボード)を集めてシステムにすることができるが、ここではGPUはチップだろう。
-MPはM個(G80では128個?)のSP(スカラープロセッサ)からなる~
    スカラープロセッサは1つの演算器のイメージ?

この上に(スケジューラが)「スレッド」を割付け
-1つのMPは、「ブロック」を実行する~
    1つのブロックは必ず1つのMPで実行される
-1つのブロックは、X個のワープ(ワープは複数のスレッドからなる)に分割される
-1つのワープが、並列に(ワープ内のスレッドが同時並列に)実行される
--スケジューラは、ワープからワープへと実行を切り替える
-1つのワープは、(スレッドIDが昇順に連番の)複数(現行32個)のスレッドからなる

実行速度を制限する要因
-Shared Memoryとレジスタは、全リソースが決まっていて、それをブロックに割り付ける。だから、ブロック数が多いとブロック当りの割当量は減る。
--1つのMP上で、複数ブロックが実行できることに注意
-1つのワープ内では、条件分岐して実行パスが異なると、一方が終わるまで他方は待たされる。

操作にかかるクロック数
-4クロック~
    浮動小数点の加算、乗算、及びmultiply-add計算~
    整数加算、ビット演算、比較、min、max
-16クロック~
    除算、[[平方根の逆数:http://en.wikipedia.org/wiki/Reciprocal_square_root#Iterative_methods_for_reciprocal_square_roots]](平方根の逆数を求める方法があり、それに元の数をかけて平方根を求められる)、__log(x)、32ビット整数乗算
-32クロック~
    __sin(x)、__cos(x)、__exp(x)  多分超関数計算ユニットを使う(共有されていないか?)
-36クロック~
    浮動小数点除算 (ただし、24ビットバージョンは20クロック)
-特にコストが高いのは~
    整数除算、剰余modulo
-倍精度計算は、(もし機能があれば)2倍の時間がかかる (2倍の時間でできる?)

***メモリモデル [#ic2f3316]
&ref(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)する必要がある。
>グローバルメモリは非常にアクセスが遅い(400〜600サイクル)のと、かたまりで転送(Coalesced)する必要がある。細かくはProgramming GuideのSection5.1.2.1 (page 52)を参照のこと。

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS