Comments
Description
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プログラミングモデルの概要