Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
SlideShare a Scribd company logo

1

CCUUDDAAメモ
高野  祐輝
1

2

MMaaxxwweellllのブロック図
GM107 GPU には、1 基の GPC、5 基の Maxwell ストリーミング・プロセッサ(SMM)、2 基の 64 ビッ
ト・メモリ・コントローラ(合計 128 ビット)が搭載されています。これは、同チップのフル実装であり、
GeForce GTX 750 Ti での出荷時と同じ構成になっています。
緑色の四角がCCUUDDAA  CCoorree
CCUUDDAA  CCoorreeの中で


複数スレッドが同時に実行される
2

3

CCUUDDAAの実行イメージ
hhttttpp::////ddooccss..nnvviiddiiaa..ccoomm//ccuuddaa//ppaarraalllleell--tthhrreeaadd--eexxeeccuuttiioonn//3

4

カーネル関数定義
カーネル関数


GGPPUUに実行させる関数


____gglloobbaall____  vvooiidd  kkeerrnneell(())  {{  }}


ホストから呼び出し可能な関数


____ddeevviiccee____  vvooiidd  ffuunncc(())  {{  }}


デバイスからのみ呼び出し可能な関数
4

5

カーネル関数呼び出し
kkeerrnneell<<<<<<ggiirrddDDiimm,,  bblloocckkDDiimm>>>>>>((引数));;


ggrriiddDDiimm::  グリッドの大きさ(ブロックの数)

11  oorr  22次元で指定


bblloocckkDDIImm::  ブロックの大きさ(スレッドの数)

11〜33次元で指定
ggrriidd
bblloocckk
tthhrreeaadd
ggrriiddDDiimm  xx  bblloocckkDDiimmの数だけ


スレッドが生成される
数万∼数百万スレッド
5

6

スレッド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

7

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

8

計算例
画像データの編集


11スレッドが11ピクセル担当
tthhrreeaaddss
8

9

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

10

バリア同期
____ssyynncctthhrreeaaddss(())  でバリア同期


ブロック単位での同期のみ可能
10

11

aattoommiicc処理
aattoommiiccAAdddd,,  aattoommiiccSSuubb,,  aattoommiiccCCAASS
等


下手に使うと遅くなるので注意


数万スレッドで同期処理が実行さ
れてしまう


バリア同期と組み合わせて利用さ
れることが多い
11

12

カーネル関数


呼び出し速度
数マイクロ秒


22..55  GGHHzz  CCPPUUクロック換算で

数千クロックのオーバーヘッド
12

13

GGPPUUのメモリレイアウト
CPU Memory
GPU Global Memory
L2 Cache
Shared Memory
texture memory
Constant memory
L1/texture cache
Shared Memory
L1/texture cache
local memory
register register
GPU
CPU
SM
13

14

共有メモリ


LL11キャッシュ
11ブロックあたりの容量


4488  KKBB  共有メモリ,1166  KKBB  キャッシュ


1166  KKBB  共有メモリ,4488  KKBB  キャッシュ


アクセス速度(レイテンシ)


グローバルメモリの110000倍程度高速


hhttttpp::////ddeevvbbllooggss..nnvviiddiiaa..ccoomm//ppaarraalllleellffoorraallll//
uussiinngg--sshhaarreedd--mmeemmoorryy--ccuuddaa--cccc//
14

15

メモリアクセス速度


(レイテンシ)
グローバルメモリ


11,,000000  クロック前後


LL22キャッシュ


330000  クロック前後


LL11キャッシュ,,  テクスチャメモリ,コンスタ
ントキャッシュ


数十クロック
15

16

どれだけ速くなるか?
多体問題


ベクトル化,計算分割が容易


CCPPUU(11スレッド)の110000〜220000倍以上


DDeeeepp--LLeeaarrnniinngg


ベクトル化,計算分割が容易


CCPPUU(11スレッド)の110000〜220000倍以上


正規表現


条件分岐が多く,ベクトル化が難しい


最大で,CCPPUUの1100倍ぐらい


マルチコアCCPPUUをフルに使ったのと大体同じ
16

17

コンスタントメモリと


共有メモリ
____ccoonnssttaanntt____  iinntt  ffoooo;;


コンスタントメモリ


____sshhaarreedd____  iinntt  bbaarr;;


共有メモリ


デバイス内の関数のみで定義可能
17

18

コンスタントメモリへの


データ転送
__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

19

グローバルメモリの利用
__kernel__ void func(int *arg, int n) {
for (int i = 0; i < n; i++) {
printf(“%dn”, 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

20

今回触れなかったこと
テクスチャメモリ


コアとメモリ間の距離に差があるメモリ


イメージ的にはNNUUMMAA的なメモリ


ストリームと非同期実行


GGPPUUへのメモリコピーとGGPPUUでの計算を同時に行える


いわゆるパイプライン化


マルチGGPPUU


より高速に計算できる


多数のメモリの種類


ppiinnnneedd  mmeemmoorryy,,  mmaappppeedd  mmeemmoorryy,,  uunniiffiieedd  mmeemmoorryy
20

More Related Content

CUDAメモ