Akira Naruse, Developer Technology, 2016/8/31 Pascal世代以降の GPUメモリシステム
Akira Naruse, Developer Technology, 2016/8/31
Pascal世代以降の GPUメモリシステム
2
PASCAL
3
Perf
orm
ance /
W
2012 2014 2008 2010 2016 2018
GPUロードマップ
Tesla Fermi
Kepler
Maxwell
Pascal
Volta
4
倍精度 5.3TF | 単精度 10.6TF | 半精度 21.2TF
TESLA P100 PASCALアーキテクチャ世代の最新GPU
5
TESLA P100 世界最速の計算ノードを実現する最新GPUアーキテクチャ
Pascalアーキテクチャ NVLink HBM2スタックメモリ Page Migration Engine
PCIe
Switch
PCIe
Switch
CPU CPU
高い演算能力 高速なシステム・インタコネクト 高いメモリバンド幅 シンプルなプログラミング
Unified Memory
CPU
Tesla P100
6
GP100
56 SMs
3584 CUDA Cores
5.3 TF – fp64
10.6 TF – fp32
21.2 TF – fp16
16 GB HBM2
720 GB/s
SM (Stream Multiprocessor)
7
GP100 SM
GP100
CUDAコア 64
レジスタ 256 KB
共有メモリ 64 KB
Activeスレッド 2048
Activeワープ 64
8
GPU SPECS
K40 (Kepler) M40 (Maxwell) P100 (Pascal)
SM数 15 24 56
CUDAコア数 / SM 192 128 64
CUDAコア数 / GPU 2880 3072 3584
ベースクロック 745 MHz 948 MHz 1328 MHz
製造プロセス 28-nm 28-nm 16-nm FinFET
レジスタ容量 / SM 256 KB 256 K 256 KB
レジスタ容量 / GPU 3.75 MB 6.0 MB 14.0 MB
L2キャッシュ容量 1.5 MB 3.0 MB 4.0 MB
9
HBM2 : 720GB/s メモリ容量: 16GB
10
HBM2 : 720GB/s ECCはnative実装
Spacer
HBM2 stack (4層)
Bumps
Silicon Interposer
GPU
Substrate
11
GPU COMPUTING
12
GPU Computing
Low latency + High throughput
CPU GPU
13
Pros. and Cons. Latency vs. Throughput
GPU
CPU
Throughput (FLOPS, GB/s)
Higher
Lower
Latency (Sec)
Shorter
Longer
14
Proc. and Cons. Capacity vs. Throughput
GPU
CPU
Throughput (FLOPS, GB/s)
Higher
Lower
Capacity (Cache, Memory)
Larger
Smaller
15
GPU Computing
CPU GPU
GPU Memory
CPU Memory
High Capacity + High Throughput
16
UNIFIED MEMORY
17
CUDA CODE CPUとGPUで別々のポインター
9/2/20
16
void sortfile(FILE *fp, int N) { char *data; data = (char *)malloc(N); fread(data, 1, N, fp); qsort(data, N, 1, compare); use_data(data); free(data); }
void sortfile(FILE *fp, int N) { char *data char *d_data; data = (char *)malloc(N); cudaMalloc(&d_data, N); fread(data, 1, N, fp); cudaMemcpy(d_data, data, N, ..); qsort<<<...>>>(data,N,1,compare); cudaDeviceSynchronize(); cudaMemcpy(data, d_data, N, ..); use_data(data); cudaFree(data); free(data); }
CPU code GPU code
18
UNIFIED MEMORY CPUとGPUでポインター共有
9/2/20
16
void sortfile(FILE *fp, int N) { char *data; data = (char *)malloc(N); fread(data, 1, N, fp); qsort(data, N, 1, compare); use_data(data); free(data); }
void sortfile(FILE *fp, int N) { char *data; cudaMallocManaged(&data, N); fread(data, 1, N, fp); qsort<<<...>>>(data,N,1,compare); cudaDeviceSynchronize(); use_data(data); cudaFree(data); }
CPU code GPU code (Unified Memory)
19
Unified Memory on Kepler/Maxwell CUDA 6.0~
GPUは仮想アドレス対応(カーネル実行中、アドレスを論物変換、ページ単位)
Kepler/Maxwell世代GPUはページフォルト未対応 カーネル起動前に全てのページがGPUメモリ上にないといけない
GPUメモリサイズを超えるデータはallocateできない
カーネル実行中に、on-demandでページをCPUからGPUへ移動できない
cudaMallocManaged(&ptr, ...); *ptr = 1; qsort<<<...>>>(ptr);
CPUページフォルト: データはCPUへ移動
GPU上に必要ページを確保
カーネル起動: データはGPUへ移動
20
Unified Memory on Pascal GPUページフォルトをサポート
First touchされたところで、ページは確保される
ページフォルトをきっかけに、データはCPU・GPU間を移動
9/2/2
016
cudaMallocManaged(&ptr, ...); *ptr = 1; qsort<<<...>>>(ptr);
CPUページフォルト: CPU上にページが確保
物理ページは確保されない (mallocの様に)
GPUページフォルト: データをGPUに移動
21
Unified Memory on Pascal Keperl/Maxwell世代GPUからの改善ポイント
On-demand Page Migration
GPUメモリ容量を超えるデータ (oversubscription, out-of-core) (*)
CPUとGPUからの同時アクセス (coherencyはページ単位)
(*) Pascal以前のGPUでも、mapped memoryでoversubscriptionは可能だったが、データは常にHostメモリ上にあった
9/2/2
016
22
SIMPLE EXAMPLE
9/2/20
16
float *array; cudaMallocManaged(&array, N*sizeof(float)); cudaMemset(array, 0, N*sizeof(float)) for (i=0; i<N; i++) { array[i] += ..; } Reduce_sum<<<.., ..>>>(sum, array, N);
Malloc
Init
Sum
Update
23
Kepler (TESLA K40)
Malloc Update
(on-demand D2H) Init
Sum
(H2D then kernel)
24
Pascal (TITAN X)
Malloc Init Update
(on-demand D2H)
Sum
(on-demand H2D)
25
UM Performance Tuning
ページフォールトオーバーヘッドの削減:
遅延は10 us以上(データがくるまで実行はストール)
Localityの向上
Localityが良いほど、高bandwidth、低latency
スラッシングの回避
データマイグレーション回数を減らす
9/2/2
016
26
UM Performance Tuning New Hint API in CUDA 8
cudaMemPrefetchAsync(ptr, length, destDevice, stream)
cudaMemcpyAsync()のUnified Memory版
CUDAストリーム対応 (非同期転送可能)
cudaMemAdvise(ptr, length, advice, device)
ページ確保方針、データ使用方針の指示
プログラム実行中に、設定、解除、変更が可能
9/2/20
16
27
PREFETCHING
9/2/20
16
void foo(cudaStream_t s) { char *data; cudaMallocManaged(&data, N); init_data(data, N); cudaMemPrefetchAsync(data, N, myGpuId, s); mykernel<<<..., s>>>(data, N, 1, compare); cudaMemPrefetchAsync(data, N, cudaCpuDeviceId, s); cudaStreamSynchronize(s); use_data(data, N); cudaFree(data); }
GPUからCPUにデータプリフェッチ CPUページフォルト回数の削減
CPUからGPUにデータプリフェッチ GPUページフォルト回数の削減
cudaMemPrefetchAsync()
28
init_data(data, N);
cudaMemAdvise(data, N, cudaMemAdviseSetReadMostly, myGpuId);
mykernel<<<...>>>(data, N);
use_data(data, N);
READ DUPLICATION cudaMemAdvise()
Advice: cudaMemAdviseSetReadMostly
データはRead主体、時々Writeされる
9/2/2
016
GPUページフォールトで、Read-onlyページが確保される
(CPUページはそのまま)
CPU readsではページフォールトが発生しない
29
READ DUPLICATION cudaMemAdvise() and cudaMemPrefetchAsync()
Prefetchで、GPU上にread-only copyが作られ、GPUページフォルトを回避
(注) この領域にwriteすると、ページフォルトが発生する
9/2/2
016
init_data(data, N);
cudaMemAdvise(data, N, cudaMemAdviseSetReadMostly, myGpuId);
cudaMemPrefetchAsync(data, N, myGpuId, s);
mykernel<<<..., s>>>(data, N);
use_data(data, N);
PrefetchでRead-only copy が生成される
GPUでも、CPUでも、page faultは発生しない
30
DIRECT MAPPING Preferred location and direct access
Advice: cudaMemAdviseSetPreferredLocation
指定プロセッサ(のメモリ)にデータを固定する (マイグレーション抑止)
First accessでpage faultが発生し、page mappingされる。
Advice: cudaMemAdviseSetAccessedBy
First accessの前に、page mappingされる (page fault抑止)
データの場所は任意
9/2/2
016
31
OUT-OF-CORE APPLICATION
32
Deep Learning Anywhere
インターネットとクラウド
画像分類 音声認識 言語翻訳 言語処理 感情分析 推薦
メディアとエンターテイメント
字幕 ビデオ検索
リアルタイム翻訳
機械の自動化
歩行者検出 白線のトラッキング 信号機の認識
セキュリティと防衛
顔検出 ビデオ監視 衛星画像
医学と生物学
癌細胞の検出 糖尿病のランク付け
創薬
33
DNN: DEEPER AND LARGER
30000 100%
24000 80%
18000 60%
12000 40%
6000 20%
0 0%
30000 100%
24000 80%
18000 60%
12000 40%
6000 20%
0 0%
(*) Minsoo et al., “vDNN: Virtualized Deep Neural Networks for Scalable, Memory-Efficient Neural Network Design”
ResNet: 152 layers
34
NETWORK WIDE MEMORY ALLOCATION In Memory: 全データをGPU上
(*) Minsoo Rhu et al., “vDNN: Virtualized Deep Neural Networks for Scalable, Memory-Efficient Neural Network Design”
35
LAYER WISE MEMORY ALLOCATION Swap-in/out: データをホストメモリから転送
(*) Minsoo Rhu et al., “vDNN: Virtualized Deep Neural Networks for Scalable, Memory-Efficient Neural Network Design”
36
LAYER WISE MEMORY ALLOCATION Swap-in/out: データをホストメモリから転送
(*) Minsoo Rhu et al., “vDNN: Virtualized Deep Neural Networks for Scalable, Memory-Efficient Neural Network Design”
37
Chainer
Deep Learning framework developed by PFN
GPU対応 (CuPy: GPU用numpy互換の数値計算ライブラリ)
Out-of-core対応版を試験実装
Layer毎に、データをswap in/out (naïve実装: 冗長なデータ転送)
計算とデータ転送のオーバーラップ
Github
Powerful, Flexible, Intuitive
38
VGG-16 (Batch:32) Chainer, CUDA 8.0RC, CUDNN 5.1
1785
654
348
0
500
1000
1500
2000
2500
K40 (Kepler) M6000 (Maxwell) TitanX (Pascal)
Tim
e (
ms)
In Memory
39
VGG-16 (Batch:32, In memory) Quadro M6000, Chainer, CUDA 8.0RC, CUDNN 5.1
654 ms
40
VGG-16 (Batch:32) Chainer, CUDA 8.0RC, CUDNN 5.1
1785
654
348
2112
1062
836
0
500
1000
1500
2000
2500
K40 (Kepler) M6000 (Maxwell) TitanX (Pascal)
Tim
e (
ms)
In Memory Swap In/Out
41
VGG-16 (Batch:32, Swap in/out) Quadro M6000, Chainer, CUDA 8.0RC, CUDNN 5.1
1,062 ms
42
GPU SPEC
Tesla K40 Quadro M6000 TitanX
TFLOPS (単精度) 4.29 6.06 10.2
メモリバンド幅 [GB/s] 288 317 480
DL training (VGG-16)
[imgs/s] 17.9 48.9 92.0
CPU・GPU I/F [GB/s] 16 16 16
問題: CPU・GPUバンド幅が速くならない
43
NVLINK
44
NVLINK
単方向:20GB/s、双方向:40GB/s (リンクあたり)
Tesla P100: 4リンク
実効バンド幅: ~94%
GPU間接続、GPU・CPU間接続
複数リンクを束ねることも可能(gang)
NVLink on Tesla P100
20+20 GB/s
20+20 GB/s
20+20 GB/s
20+20 GB/s
45
NVLINK: GPU間接続 (NVIDIA DGX-1)
全結合4GPUクラスタ x 2
接続GPUのメモリへのload/store
接続GPUへのatomics操作
高速コピーエンジン (バルクデータコピー)
CPU・GPUはPCIe接続
46
NVLINK: CPU接続の例
全結合4GPUクラスタ
各GPUが、CPUとNVLink接続
GPUから、直接CPUメモリをload/store
高速コピーエンジンで、CPU・GPU間データ転送
47 (*) http://on-demand.gputechconf.com/gtc/2016/presentation/s6825-sumit-gupta-revolutionizing-data-centric-transformation.pdf