More Related Content
Similar to 2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
Similar to 2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造 (20)
2015年度GPGPU実践プログラミング 第2回 GPUのアーキテクチャとプログラム構造
- 3. GPU(Graphics Processing Unit)とは
画像処理専用のハードウェア
具体的には画像処理用のチップ
チップ単体では販売されていない
PCI‐Exカードで販売
チップ単体と区別せずにGPUと呼ぶことも多い
ノートPCに搭載
PCI‐Exカードとして販売されるGPUには,ビデオメモリと呼ばれ
るDRAMが搭載
2015/04/22GPGPU実践プログラミング3
- 4. GPU(Graphics Processing Unit)の役割
グラフィックスを表示するために様々な処理を行い,処
理の結果をディスプレイに出力
3次元グラフィックスの発展に伴って役割が大きく変化
3次元座標変換
ポリゴンとピクセルの
対応付け
ピクセル色計算
テクスチャ参照
フレームバッファ(ビデ
オメモリ)への書き込み
ディスプレイ出力
CPU
GPU
3次元座標変換
ポリゴンとピクセルの
対応付け
ピクセル色計算
テクスチャ参照
フレームバッファ(ビデ
オメモリ)への書き込み
ディスプレイ出力
現在過去
CPUが3D描画
の演算を実行
GPUが出力
描画情報
画面出力
GPUが演算から
出力までの全て
を担当
CPUは描画情報
の生成やGPUへ
の情報の引き渡
し , GPU の 制 御
を行う
描画情報
画面出力
2015/04/22GPGPU実践プログラミング4
ディスプレイコントローラ
- 5. GPUの描画の流れ
1. CPUからGPUへ描画情報を送信
2. 頂点処理(頂点シェーダ)
座標変換
画面上での頂点やポリゴンの位置・大きさの決定
頂点単位での照明の計算
3. 頂点やポリゴンからピクセルを生成
(ラスタライザ)
4. ピクセル処理(ピクセルシェーダ)
画面上のピクセルの色
テクスチャの模様
5. 画面出力
ピクセルの色情報をフレームバッファに書き込み
2.
3.
4.
2015/04/22GPGPU実践プログラミング5
- 15. Teslaアーキテクチャ
2015/04/22GPGPU実践プログラミング15
Tesla C1060の仕様
CUDAコア数(単精度) 240 Cores
CUDAコアクロック周波数 1,296 MHz
単精度演算ピーク性能 622*1
(933*2
) GFLOPS
倍精度演算ユニット数 30*3
Units
倍精度演算ピーク性能 78 GFLOPS
メモリクロック周波数 800 MHz
メモリバス幅 512 bit
最大メモリバンド幅*4
102 GB/s
*1単精度演算ピーク性能 = コアクロック周波数×コア数×命令の同時発行数(2)
*2CUDA CoreとSFUが同時に命令を発行できれば1296 MHz×240×3
*3一つのSMに倍精度演算器が一つ搭載(と言われている)
*4最大メモリバンド幅=メモリクロック周波数×メモリバス幅/8×2(Double Data Rate)
- 16. Fermiアーキテクチャ
2015/04/22GPGPU実践プログラミング16
Tesla M2050の仕様
SM数 14
CUDA Core数 448(=32 Core/SM×14 SM)
L1/L2 キャッシュを搭載
ECC(誤り訂正機能)を搭載
Register File
(16384 × 32‐bit)
64 KB Shared
Memory / L1 Cache
SM
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU×4
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory Controller
GPC
Raster Engine
GPC
Raster Engine
SM
Raster Engine
GPC
Raster Engine
GPC
Memory ControllerMemory Controller
Memory ControllerMemory ControllerMemory Controller
詳細はhttp://www.nvidia.co.jp/docs/IO/
81860/NVIDIA_Fermi_Architecture_Whitep
aper_FINAL_J.pdfを参照のこと
- 18. Keplerアーキテクチャ
2015/04/22GPGPU実践プログラミング18
Tesla K20c/mの仕様
SMX数 13
Streaming Multiprocessor eXtreme (?)
CUDA Core数 2,496(=192 Core/SM×13 SMX)
Register File (65536 × 32‐bit)
64 KB Shared Memory / L1 Cache
48 KB Read‐Only Data Cache
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
DP Unit
SMX
SMX
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory ControllerMemory ControllerMemory Controller
Memory ControllerMemory ControllerMemory Controller
詳細はhttps://www.nvidia.co.jp/content
/apac/pdf/tesla/nvidia‐kepler‐gk110‐ar
chitecture‐whitepaper‐jp.pdfを参照のこと
- 20. Maxwellアーキテクチャ
GeForce GTX TITAN Xの仕様
SM数 24
CUDA Core数 3,072(=128 Core/SM×24 SM)
2015/04/22GPGPU実践プログラミング20
64 KB Shared Memory
L1 Cache
SMM
Register File
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
L1 Cache
Register File
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Register File
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
Register File
(16,384 × 32‐
bit)
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
Core
SFU
SFU
SFU
SFU
SFU
SFU
SFU
SFU
PolyMorph Engine 3.0
SMM
Raster Engine
GPC
Raster Engine
GPC
L2 Cache
GigaThread Engine
PCI Express 3.0 Host Interface
Memory Controller
Raster Engine
GPC
Raster Engine
GPC
Memory Controller
Memory ControllerMemory Controller
第1世代の詳細はhttps://www.nvidia.co.jp/cont
ent/product‐detail‐pages/geforce‐gtx‐750‐ti
/geforce‐gtx‐750ti‐whitepaper.pdfを参照のこと
- 21. Maxwellアーキテクチャ
GeForce GTX TITAN Xの仕様*
CUDAコア数(単精度) 3,072 Cores
CUDAコアクロック周波数 1,002 MHz
単精度演算ピーク性能 6.14 TFLOPS
倍精度演算ユニット数 0*1
Units
倍精度演算ピーク性能 192 GFLOPS*2
メモリクロック周波数 3.5 GHz*3
メモリバス幅 384 bit
最大メモリバンド幅 336.5 GB/s
*1http://www.4gamer.net/games/121/G012181/20141225075/
*2倍精度演算は単精度演算の性能の1/32 (1/16 Flop/Core/clock)
*3DDR(Double Data Rate) 7GHz相当と書かれている場合もある
2015/04/22GPGPU実践プログラミング21
http://http://www.geforce.com/hardware/desk
top‐gpus/geforce‐gtx‐titan‐x/specifications
*http://ja.wikipedia.org/wiki/FLOPS
- 22. Pascalアーキテクチャ
2016年にリリース予定
倍精度演算器を搭載予定
NVLink
GPU同士やGPUとCPUを接続する独自の方式
通信(CPU ↔ メモリ ↔ PCI Express ↔ メモリ ↔ GPU)の
ボトルネックを解消(PCI Express3.0の5~12倍)
複数のGPUを使って大規模な計算が可能
3Dメモリ(High Bandwidth Memory, HBM)*
3次元積層技術を利用し,メモリの容量と帯域を大幅に増加
最大32GB,メモリ帯域1TB/s
2015/04/22GPGPU実践プログラミング22
*http://pc.watch.impress.co.jp/docs/column/kaigai/20150421_698806.html
- 23. Voltaアーキテクチャ*
Pascalの後継
詳しい情報は不明
アメリカの次世代スーパーコンピュータへ採用予定
オークリッジ国立研究所 SUMMIT 150~300PFLOPS
ローレンス・リバモア研究所 SIERRA 100PFLOPS以上
地球シミュレータと同等の演算性能を1ノードで実現
現在Top500 2位のスーパーコンピュータと同じ電力で5~10
倍高速,サイズは1/5
2015/04/22GPGPU実践プログラミング23
*http://www.4gamer.net/games/121/G012181/20141225075/
- 25. GPUの並列化の階層
グリッド-ブロック-スレッドの3階層
グリッド(Grid)
並列に実行する処理
GPUが処理を担当する領域全体
スレッド(Thread)
GPUの処理の基本単位
CPUのスレッドと同じ
ブロック(Block)もしくはスレッドブロック(Thread Block)*
スレッドの集まり
2015/04/22GPGPU実践プログラミング25
*スレッドブロックだと長い上にスレッドや変数名
との兼ね合いで混乱を招くのでブロックで統一
- 30. Hello World
何を確認するか
最小構成のプログラムの作り方
ファイル命名規則(拡張子は.c/.cpp)
コンパイルの方法(gcc, cl等を使用)
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
2015/04/22GPGPU実践プログラミング30
helloworld.c
- 31. CUDAでHello World
何を確認するか
最小構成のプログラムの作り方
ファイル命名規則(拡張子は.cu)
コンパイルの方法(nvccを使用)
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
2015/04/22GPGPU実践プログラミング31
#include<stdio.h>
int main(void){
printf("hello world¥n");
return 0;
}
違いは拡張子だけ?
helloworld.cu helloworld.c
- 44. CPUとGPUのやり取り(単純な加算)
2015/04/22GPGPU実践プログラミング44
add.cの処理の一部をGPUの処理に置き換え
#include<stdio.h>
__global__ void add(int a, int b, int *c){
*c = a + b;
}
int main(void){
int c;
int *dev_c;
cudaMalloc( (void **)&dev_c, sizeof(int) );
add<<<1, 1>>>(6, 7, dev_c);
cudaMemcpy(&c, dev_c, sizeof(int), cudaMemcpyDeviceToHost);
printf("6 + 7 = %d¥n", c);
cudaFree(dev_c);
return 0;
}
__global__を追加・・・
GPU上のメモリに確保される変数のアドレス・・・
GPU上にint型変数
一個分のメモリを確保
・・・
↑GPUから結果をコピー
メモリを解放・・・
add.cu
- 47. Hello Thread(Fermi世代以降)
<<<,>>>内の数字で並列度が変わる
この情報を利用すれば並列処理が可能
2015/04/22GPGPU実践プログラミング47
#include<stdio.h>
__global__ void hello(){
printf("Hello Thread¥n");
}
int main(void){
hello<<<?,?>>>();
cudaDeviceSynchronize();
return 0;
}
<<<,>>>内の数字を変えると画面表
示される行数が変わる
<<<1,8>>>, <<<8,1>>>,
<<<4,2>>>等
・・・
hellothread.cu
- 50. Hello Threads(Fermi世代以降)
<<<,>>>内の数字で表示される内容が変化
2015/04/22GPGPU実践プログラミング50
#include<stdio.h>
__global__ void hello(){
printf("gridDim.x=%d, blockIdx.x=%d,
blockDim.x=%d, threadIdx.x=%d¥n",
gridDim.x, blockIdx.x, blockDim.x, threadIdx.x);
}
int main(void){
hello<<<?,?>>>();
cudaDeviceSynchronize();
return 0;
}
<<<,>>>内の数字を変えると画面表
示される内容が変わる
<<<,>>>内の数字とどのパラメータが
対応しているかを確認
・・・
hellothreads.cu