cudaメモ
TRANSCRIPT
CCUUDDAAメモ高野 祐輝
1
MMaaxxwweellllのブロック図
6
GM107 Maxwellアーキテクチャの詳細
グラフィックス機能の観点から見ると、NVIDIAの第 1世代 Maxwell GPUは、Kepler GPUと同じ API機能を備えています。ハイレベルでは、Maxwellは GPC(グラフィックス・プロセッシング・クラスタ)内に複数の SMユニットを実装しており、各 SMには Polymorphエンジンとテクスチャ・ユニットが、各GPCにはラスタ・エンジンが搭載されています。これまでと同様、ROPは L2キャッシュ・スライスおよびメモリ・コントローラと連携しています。内部では、すべてのユニットとクロスバーの構造について設計
の見直しが行われており、データフローの最適化や、電力管理の大幅な向上などが実現しています。
GM107 GPUには、1基の GPC、5基の Maxwellストリーミング・プロセッサ(SMM)、2基の 64ビット・メモリ・コントローラ(合計 128ビット)が搭載されています。これは、同チップのフル実装であり、GeForce GTX 750 Tiでの出荷時と同じ構成になっています。
図 2:GM107のフルチップ・ブロック図
緑色の四角がCCUUDDAA CCoorree
CCUUDDAA CCoorreeの中で複数スレッドが同時に実行される
2
CCUUDDAAの実行イメージ
hhttttpp::////ddooccss..nnvviiddiiaa..ccoomm//ccuuddaa//ppaarraalllleell--tthhrreeaadd--eexxeeccuuttiioonn//3
カーネル関数定義
カーネル関数
GGPPUUに実行させる関数
____gglloobbaall____ vvooiidd kkeerrnneell(()) {{ }}
ホストから呼び出し可能な関数
____ddeevviiccee____ vvooiidd ffuunncc(()) {{ }}
デバイスからのみ呼び出し可能な関数
4
カーネル関数呼び出し
kkeerrnneell<<<<<<ggiirrddDDiimm,, bblloocckkDDiimm>>>>>>((引数));;
ggrriiddDDiimm:: グリッドの大きさ(ブロックの数) 11 oorr 22次元で指定
bblloocckkDDIImm:: ブロックの大きさ(スレッドの数) 11〜33次元で指定
ggrriidd
bblloocckk
tthhrreeaadd
ggrriiddDDiimm xx bblloocckkDDiimmの数だけスレッドが生成される
数万~数百万スレッド
5
スレッドIIDD他
スレッドIIDD
tthhrreeaaddIIddxxで取得.tthhrreeaaddIIddxx..xx,, tthhrreeaaddIIddxx..yy,, tthhrreeaaddIIddxx..zz
ブロックIIDD
bblloocckkIIddxxで取得.bblloocckkIIddxx..xx,, bblloocckkIIddxx..yy
ブロックの大きさ(11ブロックあたりのスレッド数)
bblloocckkDDiimmで取得.bblloocckkDDiimm..xx,, bblloocckkDDiimm..yy,, bblloocckkDDiimm..zz
グリッドの大きさ(11グリッドあたりのブロック数)
ggrriiddDDiimmで取得.ggrriiddDDiimm..xx,, ggrriiddDDiimm..yy
6
HHeelllloo WWoorrlldd#include <stdio.h>
__kernel__ void hello() { if (threadIdx.x == 0 & blockIdx.x == 0) { printf(“Hello World!”); }}
void main() { hello<<<2, 10>>>(); cudaThreadSynchronize(); // カーネル関数の終了を待つ}
7
計算例
画像データの編集
11スレッドが11ピクセル担当
tthhrreeaaddss
8
WWAARRPP ベクトル演算グループSSPP内では3322スレッド単位でSSIIMMTT実行
SSIIMMTT: ssiinnggllee iinnssttrruuccttiioonn mmuullttiippllee tthhrreeaadd
aadddd aadddd aadddd aadddd aadddd aadddd aadddd aadddd
mmuull mmuull mmuull mmuull mmuull mmuull mmuull mmuull
sseettpp sseettpp sseettpp sseettpp sseettpp sseettpp sseettpp sseettpp
bbrraa LL11 bbrraa LL11 bbrraa LL11 bbrraa LL11 bbrraa LL11 bbrraa LL11 bbrraa LL11 bbrraa LL11
ssuubb ssuubb ssuubb
bbrraa LL22 bbrraa LL22 bbrraa LL22
aadddd aadddd aadddd aadddd aadddd
mmoovv mmoovv mmoovv mmoovv mmoovv mmoovv mmoovv mmoovv
tthhrreeaadd
ttiimmee
LL11
LL22
9
バリア同期
____ssyynncctthhrreeaaddss(()) でバリア同期
ブロック単位での同期のみ可能
10
aattoommiicc処理
aattoommiiccAAdddd,, aattoommiiccSSuubb,, aattoommiiccCCAASS等
下手に使うと遅くなるので注意
数万スレッドで同期処理が実行されてしまう
バリア同期と組み合わせて利用されることが多い
11
カーネル関数呼び出し速度
数マイクロ秒
22..55 GGHHzz CCPPUUクロック換算で数千クロックのオーバーヘッド
12
GGPPUUのメモリレイアウトCPU Memory
GPU Global Memory
L2 Cache
Shared Memory
texture memoryConstant memory
L1/texture cache Shared Memory L1/texture cache
local memory
register register
GPU
CPU
SM
13
共有メモリLL11キャッシュ
11ブロックあたりの容量
4488 KKBB 共有メモリ,1166 KKBB キャッシュ
1166 KKBB 共有メモリ,4488 KKBB キャッシュ
アクセス速度(レイテンシ)
グローバルメモリの110000倍程度高速
hhttttpp::////ddeevvbbllooggss..nnvviiddiiaa..ccoomm//ppaarraalllleellffoorraallll//uussiinngg--sshhaarreedd--mmeemmoorryy--ccuuddaa--cccc//
14
メモリアクセス速度(レイテンシ)
グローバルメモリ
11,,000000 クロック前後
LL22キャッシュ
330000 クロック前後
LL11キャッシュ,, テクスチャメモリ,コンスタントキャッシュ
数十クロック
15
どれだけ速くなるか?多体問題
ベクトル化,計算分割が容易
CCPPUU(11スレッド)の110000〜220000倍以上
DDeeeepp--LLeeaarrnniinngg
ベクトル化,計算分割が容易
CCPPUU(11スレッド)の110000〜220000倍以上
正規表現
条件分岐が多く,ベクトル化が難しい
最大で,CCPPUUの1100倍ぐらい
マルチコアCCPPUUをフルに使ったのと大体同じ
16
コンスタントメモリと共有メモリ
____ccoonnssttaanntt____ iinntt ffoooo;;
コンスタントメモリ
____sshhaarreedd____ iinntt bbaarr;;
共有メモリ
デバイス内の関数のみで定義可能
17
コンスタントメモリへのデータ転送
__constant__ int foo;__constant__ int bar[100];
int func() { int i = 100; int j[100];
cudaMemcpyToSymbol(foo, &i, sizeof(i)); cudaMemcpyToSymbol(bar, j, sizeof(j));}
配列でも,そうじゃなくても&&はいらない
18
グローバルメモリの利用__kernel__ void func(int *arg, int n) { for (int i = 0; i < n; i++) { printf(“%d\n”, arg[d]); }}
int func() { int val[3] = {1, 3, 5}; int *d_val;
cudaMalloc((void**)&d_val, sizeof(val)); cudaMemcpy(d_val, val, sizeof(val), cudaMemcpyHostToDevice);
func<<<1, 1>>>(d_val, 3);}
19
今回触れなかったことテクスチャメモリ
コアとメモリ間の距離に差があるメモリ
イメージ的にはNNUUMMAA的なメモリ
ストリームと非同期実行
GGPPUUへのメモリコピーとGGPPUUでの計算を同時に行える
いわゆるパイプライン化
マルチGGPPUU
より高速に計算できる
多数のメモリの種類
ppiinnnneedd mmeemmoorryy,, mmaappppeedd mmeemmoorryy,, uunniiffiieedd mmeemmoorryy
20