cudaメモ

20
ÌÝꜲメモ 高野 祐輝 1

Upload: yuuki-takano

Post on 07-Aug-2015

182 views

Category:

Software


3 download

TRANSCRIPT

Page 1: CUDAメモ

CCUUDDAAメモ高野 祐輝

1

Page 2: CUDAメモ

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

Page 3: CUDAメモ

CCUUDDAAの実行イメージ

hhttttpp::////ddooccss..nnvviiddiiaa..ccoomm//ccuuddaa//ppaarraalllleell--tthhrreeaadd--eexxeeccuuttiioonn//3

Page 4: CUDAメモ

カーネル関数定義

カーネル関数

GGPPUUに実行させる関数

____gglloobbaall____ vvooiidd kkeerrnneell(()) {{ }}

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

____ddeevviiccee____ vvooiidd ffuunncc(()) {{ }}

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

4

Page 5: CUDAメモ

カーネル関数呼び出し

kkeerrnneell<<<<<<ggiirrddDDiimm,, bblloocckkDDiimm>>>>>>((引数));;

ggrriiddDDiimm:: グリッドの大きさ(ブロックの数) 11 oorr 22次元で指定

bblloocckkDDIImm:: ブロックの大きさ(スレッドの数) 11〜33次元で指定

ggrriidd

bblloocckk

tthhrreeaadd

ggrriiddDDiimm xx bblloocckkDDiimmの数だけスレッドが生成される

数万~数百万スレッド

5

Page 6: CUDAメモ

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

Page 7: CUDAメモ

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

Page 8: CUDAメモ

計算例

画像データの編集

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

tthhrreeaaddss

8

Page 9: CUDAメモ

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

Page 10: CUDAメモ

バリア同期

____ssyynncctthhrreeaaddss(()) でバリア同期

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

10

Page 11: CUDAメモ

aattoommiicc処理

aattoommiiccAAdddd,, aattoommiiccSSuubb,, aattoommiiccCCAASS等

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

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

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

11

Page 12: CUDAメモ

カーネル関数呼び出し速度

数マイクロ秒

22..55 GGHHzz CCPPUUクロック換算で数千クロックのオーバーヘッド

12

Page 13: CUDAメモ

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

Page 14: CUDAメモ

共有メモリLL11キャッシュ

11ブロックあたりの容量

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

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

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

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

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

14

Page 15: CUDAメモ

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

グローバルメモリ

11,,000000 クロック前後

LL22キャッシュ

330000 クロック前後

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

数十クロック

15

Page 16: CUDAメモ

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

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

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

DDeeeepp--LLeeaarrnniinngg

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

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

正規表現

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

最大で,CCPPUUの1100倍ぐらい

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

16

Page 17: CUDAメモ

コンスタントメモリと共有メモリ

____ccoonnssttaanntt____ iinntt ffoooo;;

コンスタントメモリ

____sshhaarreedd____ iinntt bbaarr;;

共有メモリ

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

17

Page 18: CUDAメモ

コンスタントメモリへのデータ転送

__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

Page 19: CUDAメモ

グローバルメモリの利用__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

Page 20: CUDAメモ

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

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

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

ストリームと非同期実行

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

いわゆるパイプライン化

マルチGGPPUU

より高速に計算できる

多数のメモリの種類

ppiinnnneedd mmeemmoorryy,, mmaappppeedd mmeemmoorryy,, uunniiffiieedd mmeemmoorryy

20