...

CUDAプログラミングモデルの概要

by user

on
Category: Documents
22

views

Report

Comments

Transcript

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