CUDA 8

TOKYO | OCT. 5, 2016
Session ID: 2016-1010
CUDA 8.0 新機能のご紹介
エヌビディア合同会社
エンタープライズ マーケティング マネージャ for HPC
佐々木邦暢 (Kuninobu Sasaki)
はじめに
おしらせ
2
CUDA 8
正式リリース
https://developer.nvidia.com/cuda-toolkit
3
CUDA 8.0 新機能のご紹介
Pascal 世代 GPU のサポート
Unified Memory の進化
新しいアーキテクチャ、積層メモリ、 NVLINK
広大な仮想アドレス空間でシンプルな並列プログラミング
ライブラリの改善
開発ツール群の強化
nvGRAPH – グラフ分析アプリケーション高速化ライブラリ
ディープラーニングを加速する FP16 演算
アプリケーションチューニングを効率化するクリティカルパス分析
パフォーマンスを最適化する OpenACC プロファイリング
Pascal でのシングル GPU デバッグ
4
TESLA P100
CPU
CPU
最速の計算ノードを実現する新しい
GPU アーキテクチャ
PCIe
Switch
Pascal アーキテクチャ
PCIe
Switch
NVLink
HBM2 積層メモリ
ページマイグレーションエンジン
CPU
Tesla
P100
Unified Memory
最高の演算能力
スケーラビリティを最大化する
GPU インターコネクト
演算とメモリを一つの
パッケージに統合
広大な仮想アドレス空間で
シンプルな並列プログラミング
関連セッション: 2016-1011 「Pascal:最新GPUアーキテクチャ」
5
UNIFIED MEMORY
6
UNIFIED MEMORY
開発者の労力を劇的に低減
CUDA 6 以降
Kepler
GPU
CPU
メモリモデルと
プログラミングを
単純化
•
一度の割り当て、一つのポインタで
CPU, GPU メモリに透過的アクセス
•
明示的コピーの必要性を削減
•
CPU コードの移植容易性を大幅向上
Unified Memory
CPU - GPU 間でデータを自動的にコピー
データローカリティ
割当上限 = GPU のメモリサイズ
グローバルコヒーレンスの確保
手作業によるチューニングも依然可能
7
メモリ管理コードの単純化
CPU コード
void sortfile(FILE *fp, int N) {
char *data;
data = (char *)malloc(N);
}
Unified Memory を使った CUDA 6 コード
void sortfile(FILE *fp, int N) {
char *data;
cudaMallocManaged(&data, N);
fread(data, 1, N, fp);
fread(data, 1, N, fp);
qsort(data, N, 1, compare);
qsort<<<...>>>(data,N,1,compare);
cudaDeviceSynchronize();
use_data(data);
use_data(data);
free(data);
cudaFree(data);
}
8
CUDA 8: UNIFIED MEMORY
大きなデータセット、シンプルなプログラミング、ハイパフォーマンス
CUDA 8
Pascal
GPU
CPU
Unified Memory
GPU メモリサイズ以上の
領域を確保可能
大きなデータ
構造を利用可能
GPU メモリのオーバーサブスクライブ
上限はシステムのメモリサイズ
シンプルな
データアクセス
CPU/GPU データコヒーレンス
Unified Memory
パフォーマンス
チューニング
Unified memory アトミック操作
cudaMemAdvise() によるヒント付与
明示的なプリフェッチ API
9
UNIFIED MEMORY の例
オンデマンド ページング
__global__
void setValue(int *ptr, int index, int val)
{
ptr[index] = val;
}
void foo(int size) {
char *data;
cudaMallocManaged(&data, size);
Unified Memory 確保
memset(data, 0, size);
ホスト側ですべての値にアクセス
setValue<<<...>>>(data, size/2, 5);
デバイス側で一つの値を変更
cudaDeviceSynchronize();
useData(data);
cudaFree(data);
}
10
CUDA 6 の UNIFIED MEMORY
CPU のページフォルトを処理
GPU コード
CPU コード
__global__
void setValue(char *ptr, int index, char val)
{
ptr[index] = val;
}
GPU メモリマッピング
array
cudaMallocManaged(&array, size);
memset(array, size);
setValue<<<...>>>(array, size/2, 5);
CPU メモリマッピング
ページ
フォルト
array
インターコネクト
11
PASCAL 世代の UNIFIED MEMORY
CPU と GPU 双方のページフォルトを処理
GPU コード
CPU コード
__global__
Void setValue(char *ptr, int index, char val)
{
ptr[index] = val;
}
GPU メモリマッピング
array
cudaMallocManaged(&array, size);
memset(array, size);
setValue<<<...>>>(array, size/2, 5);
CPU メモリマッピング
ページ
フォルト
array
ページ
フォルト
インターコネクト
12
PASCAL 世代の UNIFIED MEMORY
GPU メモリ オーバーサブスクリプション
GPU メモリサイズ以上の領域を確保
void foo() {
// GPU のメモリサイズが 16 GB の環境で
// 32 GB のメモリを確保
char *data;
size_t size = 32L*1024*1024*1024;
cudaMallocManaged(&data, size);
}
Pascal アーキテクチャでは一部のページだけが
GPU メモリに存在するような割り当てをサポート
必要に応じて GPU へメモリページを転送
Kepler/Maxwell ではここでエラー
13
GPU メモリ オーバーサブスクリプション
HPGMG ベンチマークでの P100 と K40 の比較
Tesla P100 (16 GB)
Tesla K40 (12 GB)
*Tesla P100 performance is very early modelling results
14
PASCAL 世代の UNIFIED MEMORY
マネージドメモリへの CPU/GPU 同時並行アクセス
__global__ void mykernel(char *data) {
data[1] = ‘g’;
}
void foo() {
char *data;
cudaMallocManaged(&data, 2);
mykernel<<<...>>>(data);
// 同期なし
data[0] = ‘c’;
cudaFree(data);
}
Pascal ならこれで OK
マネージドメモリ “data” へ CPU と GPU が
同期コードなしに同時アクセス
以前の GPU であれば、
ここでセグメンテーション フォルトが発生
15
PASCAL 世代の UNIFIED MEMORY
明示的なヒントの付与とプリフェッチ API
Advise runtime on known memory access behaviors with cudaMemAdvise()
cudaMemAdviseSetReadMostly: Specify read duplication
cudaMemAdviseSetPreferredLocation: suggest best location
cudaMemAdviseSetAccessedBy: initialize a mapping
Explicit prefetching with cudaMemPrefetchAsync(ptr, length, destDevice, stream)
Unified Memory alternative to cudaMemcpyAsync
Asynchronous operation that follows CUDA stream semantics
関連セッション: 2016-1012 「Pascal 世代で進化する Unified Memory」
16
グラフ分析
17
グラフ分析
大量データ間の関連から有用な情報を引き出す
サイバーセキュリティ
ゲノム科学
その他: 並列コンピューティング, レコメンデーションシステム,
異常検出, 音声認識, テキスト認識, 検索等…
Circos.ca
Wikimedia Commons
ソーシャルネットワーク
18
nvGRAPH
新しいグラフ分析ライブラリ
nvGRAPH: 4倍の高速化
25
25 億エッジまでの分析を単一の GPU (Tesla M40 24GB)で
20
48 Core Xeon E5
様々な種類のアプリケーションを高速化:
ページランク
単一始点最短経路
Single Source
Widest Path
検索
ロボットのパスプランニング
IP ルーティング
レコメンデーション
エンジン
電源網の計画
チップデザイン / EDA
ソーシャル広告
ロジスティクス、
サプライチェーンの計画
Traffic sensitive
routing
Iterations/s
nvGRAPH on K40
15
10
5
0
PageRank on Wikipedia 84 M link dataset
関連セッション: 2016-1014 「CUDA 8.0: nvGRAPH の概要とプログラミング」
19
改良されたプロファイラ
20
依存性分析
最適化の重要度が高いカーネルを容易に発見
CPU
GPU
待機
5%
A
カーネル X
40%
B
待機
カーネル Y
時間軸
このカーネルを
最適化すべき
実行時間の長いカーネルが、最適化の最重要ターゲットとは限らない
21
依存性分析
Visual Profiler
Unguided Analysis
依存性分析
クリティカルパスの生成
クリティカルパス上の関数
22
依存性分析
Visual Profiler
クリティカルパス上にない関数呼出しや
GPU の動作はグレーアウト
23
CUDA 8 プロファイラの新機能
Unified Memory プロファイリング
OpenACC プロファイリング
CPU プロファイリング
NVLink トポロジと帯域幅のプロファイリング
24
コンパイラの改良
25
CUDA 8 でコンパイル時間を半減
CUDA 8 での NVCC の高速化
2.5x
2.0x
Speedup over CUDA 7.5
1.5x
1.0x
0.5x
0.0x
SHOC
Thrust
Examples
Rodinia
cuDNN
cuSparse
Open Source Benchmarks
QUDA increase
1.54x
Performance may vary based on OS and software
versions, and motherboard configuration
cuFFT
cuBLAS
cuRand
math
Internal Benchmarks
•
•
•
•
Average total compile times (per translation unit)
Intel Core i7-3930K (6-cores) @ 3.2GHz
CentOS x86_64 Linux release 7.1.1503 (Core) with GCC 4.8.3 20140911
GPU target architecture sm_52
26
ヘテロジニアス構成での C++ ラムダ式サポート
CPU/GPU 間でラムダ式をやりとり
__global__ template <typename F, typename T>
void apply(F function, T *ptr) {
*ptr = function(ptr);
}
int main(void) {
float *x;
cudaMallocManaged(&x, 2);
GPU 側でラムダを呼び出す
__host__ __device__ lambda
auto square =
[=] __host__ __device__ (float x) { return x*x; };
apply<<<1, 1>>>(square, &x[0]);
ラムダ式を CUDA カーネルに渡す
ptr[1] = square(&x[1]);
あるいは、同じものをCPU側で呼ぶ
cudaFree(x);
}
CUDA 8 での実験的コード
`nvcc --expt-extended-lambda`
27
パフォーマンスの改善
28
P100 と CUDA 8: HPC 用途に最適
分子動力学
2x K80
物理
1x P100
2x P100
4x P100
2x K80
8x P100
20x
Application Throughput Speedup Vs
Dual Socket Broadwell
15x
10x
5x
0x
AMBER (PMECellulose_NVE)
AMBER (average)
GROMACS
LAMMPS
NAMD
80x
70x
60x
50x
40x
30x
20x
10x
0x
HPC ベンチマーク
2x K80
1x P100
1x P100
HOOMD Blue
2x P100
4x P100
QUDA (Average)
8x P100
MiniFe
科学
2x P100
4x P100
8x P100
2x K80
40x
30x
3x
20x
2x
1x P100
2x P100
4x P100
8x P100
1x
10x
0x
0x
HPCG (128)
Performance may vary based on OS and software
versions, and motherboard configuration
HPCG (256)
VASP
• 2x K80, 1x, 2x, 4x, 8x P100 SXM2 (DGX-1) ; Base clocks
• Intel Xeon Broadwell dual-socket 22 core E5-2699 [email protected] 3.6GHz Turbo
29
cuBLAS-XT: シングルノードで 24 TFLOPS 以上
CUDA 7.5
1xK80
30000
4xK80
CUDA 8.0
1xP100
8xP100
25000
20000
15000
GFLOPS
10000
5000
0
SGEMM
SSYRK
Single
Performance may vary based on OS and software
versions, and motherboard configuration
STRSM
CGEMM
CSYRK
Single Complex
DGEMM
DSYRK
Double
DTRSM
ZGEMM
ZSYRK
ZTRSM
Double Complex
• cuBLAS 8 on P100 (r361; Base clocks
• cuBLAS 7.5 on K40m ; Base clocks, ECC ON (r352)
• Input and output data on device
• m=n=k=4096, transpose=no, side=right, fill=lower
• Host system: Intel Xeon Haswell dual-socket 22-core E5-2699 v4@ 2.2GHz, 3.6GHz Turbo
• CentOS 7.2 x86-64 with 256GB System Memory
30
cuSPARSE: P100 で 4 倍以上の高速化
csrmv
hybmv
bsrmv
csrmm
Speedup Relative to K40 with CUDA 7.5
4.5x
4.0x
3.5x
3.0x
2.5x
2.0x
1.5x
1.0x
0.5x
0.0x
Performance may vary based on OS and software
versions, and motherboard configuration
• cuSPARSE 8 on P100, Base clocks (r361)
• cuSPARSE 7.5 on K40m, Base clocks, ECC ON (r352)
• Input and output data on device; Average speedup across different data types
• Matrices obtained from: http://www.cise.ufl.edu/research/sparse/matrices/
• Host system: Intel Xeon Haswell single-socket 16-core E5-2698 v3 @ 2.3GHz, 3.6GHz Turbo
• CentOS 7.2 x86-64 with 128GB System Memory
31
PASCAL + CUDA 8 で画像処理を 2 倍以上高速化
GTX980
GTX1080
Abs Diff Size Sweep
Image Processing Function Group
Statistics
Geometry Transforms
Morphological
Image Linear Transform
Color Processing
Color Conversion
Threshold And Compare
Alpha Composition
Logical
Arithmetic
Data Exchange And Initialization
0
100
200
300
400
500
600
Bandwidth (GB/s)
Performance may vary based on OS and software
versions, and motherboard configuration
• NPP 7.5 on GTX980 (GM204) and NPP 8 on GTX1080, Base clocks
• Input and output data on device
• Each bar represents the average bandwidth over all routines in the function group
• Host system: Intel Xeon Haswell single-socket 16-core E5-2698 v3 @ 2.3GHz, 3.6GHz Turbo
• CentOS 7.2 x86-64 with 128GB System Memory
32
TOKYO | OCT. 5, 2016
Session ID: 2016-1010
CUDA 8.0 新機能のご紹介
JOIN THE CONVERSATION
#GTCJapan
http://developer.nvidia.com/cuda-toolkit
http://parallelforall.com
[email protected]
@_ksasaki