cudaプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド...
TRANSCRIPT
CUDAプログラミングモデルの概要
© NVIDIA Corporation 2008
設計目標
数百個のコア、数千個の並列スレッドまでスケール
プログラマを並列アルゴリズムに専心並列プログラミング言語のメカニズムに拘泥させない
ヘテロジニアスなシステムに(CPU+GPU) CPUとGPUはそれぞれにDRAMを備えた個別のデバイス
© NVIDIA Corporation 2008
CUDAのカーネルとスレッド
アプリケーションの並列部分をデバイス上でカーネルとして実行
一度に1個のカーネルを実行
たくさんのスレッドで1個のカーネルを処理
CUDAスレッドとCPUスレッドの違いCUDAスレッドはきわめて軽量
非常に小さな生成オーバーヘッド
瞬時のスイッチング
CUDAは数千個のスレッドを使って効率性を向上マルチコアCPUが使うスレッドは数個
定義デバイス=GPUホスト=CPU
カーネル=デバイス上で実行する関数
© NVIDIA Corporation 2008
並列スレッドのアレイ
CUDAカーネルはスレッドのアレイが実行すべてのスレッドが同じコードを処理
各スレッドがIDを持ち、メモリアドレスの計算と制御の判定に使用
0 1 2 3 4 5 6 7
…float x = input[threadID];float y = func(x);output[threadID] = y;…
threadID
© NVIDIA Corporation 2008
スレッドの協調
欠けている要素:場合によりスレッドの協調が必要
スレッドの協調の価値結果を共有して処理の重複を省く
メモリアクセスを分担
帯域幅の大幅な節減
スレッド協調はCUDAの強力な機能
スレッド全体にわたる1枚板の協調はスケーラビリティに問題あり
スレッドの小バッチ内の協調ならばスケーラブル
© NVIDIA Corporation 2008 6
スレッドのバッチ化
GridThread Block 0
Shared Memory
Thread Block 1
Shared Memory
Thread Block N-1
Shared Memory
…
カーネルはスレッドブロックのグリッド(格子)を起動
ブロック内のスレッドは共有メモリを介して協調
ブロック内のスレッドは同期が可能
別のブロックのスレッドは協調できない
プログラムが異なるGPUにも透過的なスケール変化を可能にする
© NVIDIA Corporation 2008
透過的なスケーラビリティ
Kernel grid
Block 2 Block 3
Block 4 Block 5
Block 6 Block 7
Device Device
Block 0 Block 1 Block 2 Block 3
Block 4 Block 5 Block 6 Block 7
Block 0 Block 1
Block 2 Block 3
Block 4 Block 5
Block 6 Block 7
Block 0 Block 1
ハードウェアはどのプロセッサにも自由にスレッドブロックをスケジュール
カーネルは並列マルチプロセッサ全体にスケール変化
© NVIDIA Corporation 2008
10シリーズアーキテクチャ
240個のスレッドプロセッサがカーネルスレッドを処理
30個のマルチプロセッサ、それぞれが次のユニットを内蔵
8個のスレッドプロセッサ
1個の倍精度ユニット
スレッド協調のための共有メモリ
スレッドプロセッサ
マルチプロセッサ
SharedMemory
Double
© NVIDIA Corporation 2008
カーネルのメモリアクセス
スレッドRegisters
Local Memory
SharedMemory
ブロック
...カーネル0
...カーネル1
GlobalMemory
オンチップ
オフチップ、キャッシュなし
• オンチップ、小容量• 高速
• オフチップ、大容量• キャッシュなし
• カーネル起動を越えて生存
• カーネルI/O
Multiprocessor
© NVIDIA Corporation 2008
メモリの物理配置
“ローカル”メモリはデバイスDRAMの中
レジスタと共有メモリを使ってローカルメモリの使用を最小限に抑える
ホストはグローバルメモリを読み書きでき、共有メモリはアクセス不可
Host
CPU
ChipsetDRAM
Device
DRAMLocal
Memory
GlobalMemory
GPU
MultiprocessorMultiprocessor
RegistersShared Memory
© NVIDIA Corporation 2008
実行モデルソフトウェア ハードウェア
スレッドはスレッドプロセッサによって処理
スレッド
スレッドプロセッサ
スレッドブロックマルチプロセッサ
スレッドブロックはマルチプロセッサの上で処理
スレッドブロックは位置を動かない
1つのマルチプロセッサに複数の並列スレッドブロックが入る - マルチプロセッサのリソース(共有メモリやレジスタファイル)で制限される
...
グリッド デバイス
カーネルはスレッドブロックのグリッドとして起動
1個のデバイスで一度に実行できるカーネルは1個
© NVIDIA Corporation 2008
従来のGPGPUと比べたCUDAの利点
バイトアドレス可能メモリにランダムアクセス
スレッドはどのメモリ位置でもアクセス
メモリへの無制限のアクセススレッドは必要なだけの数の位置を読み書き
共有メモリ(ブロック単位)とスレッド同期スレッドは協調して共有メモリにデータをロード
どのスレッドも共有メモリのすべての位置にアクセス可能
容易な習得Cへのわずかな拡張
グラフィックスの知識が不要
© NVIDIA Corporation 2008
CUDAの鍵になる並列抽象化
数兆個の軽量スレッド
シンプルな分解モデル
同時スレッドの階層構造
シンプルな実行モデル
プリミティブの軽量な同期シンプルな同期モデル
共有メモリモデルによるスレッド協調
シンプルな通信モデル
CUDAプログラミングモデルの概要