cudaプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド...

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

Upload: others

Post on 20-May-2020

2 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

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

Page 2: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

設計目標

数百個のコア、数千個の並列スレッドまでスケール

プログラマを並列アルゴリズムに専心並列プログラミング言語のメカニズムに拘泥させない

ヘテロジニアスなシステムに(CPU+GPU) CPUとGPUはそれぞれにDRAMを備えた個別のデバイス

Page 3: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

CUDAのカーネルとスレッド

アプリケーションの並列部分をデバイス上でカーネルとして実行

一度に1個のカーネルを実行

たくさんのスレッドで1個のカーネルを処理

CUDAスレッドとCPUスレッドの違いCUDAスレッドはきわめて軽量

非常に小さな生成オーバーヘッド

瞬時のスイッチング

CUDAは数千個のスレッドを使って効率性を向上マルチコアCPUが使うスレッドは数個

定義デバイス=GPUホスト=CPU

カーネル=デバイス上で実行する関数

Page 4: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© 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

Page 5: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

スレッドの協調

欠けている要素:場合によりスレッドの協調が必要

スレッドの協調の価値結果を共有して処理の重複を省く

メモリアクセスを分担

帯域幅の大幅な節減

スレッド協調はCUDAの強力な機能

スレッド全体にわたる1枚板の協調はスケーラビリティに問題あり

スレッドの小バッチ内の協調ならばスケーラブル

Page 6: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008 6

スレッドのバッチ化

GridThread Block 0

Shared Memory

Thread Block 1

Shared Memory

Thread Block N-1

Shared Memory

カーネルはスレッドブロックのグリッド(格子)を起動

ブロック内のスレッドは共有メモリを介して協調

ブロック内のスレッドは同期が可能

別のブロックのスレッドは協調できない

プログラムが異なるGPUにも透過的なスケール変化を可能にする

Page 7: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© 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

ハードウェアはどのプロセッサにも自由にスレッドブロックをスケジュール

カーネルは並列マルチプロセッサ全体にスケール変化

Page 8: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

10シリーズアーキテクチャ

240個のスレッドプロセッサがカーネルスレッドを処理

30個のマルチプロセッサ、それぞれが次のユニットを内蔵

8個のスレッドプロセッサ

1個の倍精度ユニット

スレッド協調のための共有メモリ

スレッドプロセッサ

マルチプロセッサ

SharedMemory

Double

Page 9: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

カーネルのメモリアクセス

スレッドRegisters

Local Memory

SharedMemory

ブロック

...カーネル0

...カーネル1

GlobalMemory

オンチップ

オフチップ、キャッシュなし

• オンチップ、小容量• 高速

• オフチップ、大容量• キャッシュなし

• カーネル起動を越えて生存

• カーネルI/O

Page 10: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

Multiprocessor

© NVIDIA Corporation 2008

メモリの物理配置

“ローカル”メモリはデバイスDRAMの中

レジスタと共有メモリを使ってローカルメモリの使用を最小限に抑える

ホストはグローバルメモリを読み書きでき、共有メモリはアクセス不可

Host

CPU

ChipsetDRAM

Device

DRAMLocal

Memory

GlobalMemory

GPU

MultiprocessorMultiprocessor

RegistersShared Memory

Page 11: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

実行モデルソフトウェア ハードウェア

スレッドはスレッドプロセッサによって処理

スレッド

スレッドプロセッサ

スレッドブロックマルチプロセッサ

スレッドブロックはマルチプロセッサの上で処理

スレッドブロックは位置を動かない

1つのマルチプロセッサに複数の並列スレッドブロックが入る - マルチプロセッサのリソース(共有メモリやレジスタファイル)で制限される

...

グリッド デバイス

カーネルはスレッドブロックのグリッドとして起動

1個のデバイスで一度に実行できるカーネルは1個

Page 12: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

従来のGPGPUと比べたCUDAの利点

バイトアドレス可能メモリにランダムアクセス

スレッドはどのメモリ位置でもアクセス

メモリへの無制限のアクセススレッドは必要なだけの数の位置を読み書き

共有メモリ(ブロック単位)とスレッド同期スレッドは協調して共有メモリにデータをロード

どのスレッドも共有メモリのすべての位置にアクセス可能

容易な習得Cへのわずかな拡張

グラフィックスの知識が不要

Page 13: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

© NVIDIA Corporation 2008

CUDAの鍵になる並列抽象化

数兆個の軽量スレッド

シンプルな分解モデル

同時スレッドの階層構造

シンプルな実行モデル

プリミティブの軽量な同期シンプルな同期モデル

共有メモリモデルによるスレッド協調

シンプルな通信モデル

Page 14: CUDAプログラミングモデルの概要 · 2017-04-28 · cudaのカーネルとスレッド アプリケーションの並列部分をデバイス上でカーネルとして

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