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
© Copyright 2024 Paperzz