GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 理化学研究所 共通コードプロジェクト

Similar documents
1. GPU コンピューティング GPU コンピューティング GPUによる 汎用コンピューティング GPU = Graphics Processing Unit CUDA Compute Unified Device Architecture NVIDIA の GPU コンピューティング環境 Lin

HPC143

スライド 1

TSUBAME2.0 における GPU の 活用方法 東京工業大学学術国際情報センター丸山直也第 10 回 GPU コンピューティング講習会 2011 年 9 月 28 日

PowerPoint Presentation

ストリームを用いたコンカレントカーネルプログラミングと最適化 エヌビディアジャパン CUDAエンジニア森野慎也 GTC Japan 2014

Microsoft PowerPoint - 03_What is OpenMP 4.0 other_Jan18

NUMAの構成

Vol.214-HPC-145 No /7/3 C #pragma acc directive-name [clause [[,] clause] ] new-line structured block Fortran!$acc directive-name [clause [[,] c

Slides: TimeGraph: GPU Scheduling for Real-Time Multi-Tasking Environments

Slide 1

スライド 1

GPU GPU CPU CPU CPU GPU GPU N N CPU ( ) 1 GPU CPU GPU 2D 3D CPU GPU GPU GPGPU GPGPU 2 nvidia GPU CUDA 3 GPU 3.1 GPU Core 1

Microsoft PowerPoint - GPU_computing_2013_01.pptx

GPGPUクラスタの性能評価

CUDA 連携とライブラリの活用 2

Microsoft Word ●IntelクアッドコアCPUでのベンチマーク_吉岡_ _更新__ doc

並列・高速化を実現するための 高速化サービスの概要と事例紹介

Microsoft PowerPoint - OpenMP入門.pptx

NUMAの構成

熊本大学学術リポジトリ Kumamoto University Repositor Title GPGPU による高速演算について Author(s) 榎本, 昌一 Citation Issue date Type URL Presentation

研究背景 大規模な演算を行うためには 分散メモリ型システムの利用が必須 Message Passing Interface MPI 並列プログラムの大半はMPIを利用 様々な実装 OpenMPI, MPICH, MVAPICH, MPI.NET プログラミングコストが高いため 生産性が悪い 新しい並

GPUコンピューティング講習会パート1

! 行行 CPUDSP PPESPECell/B.E. CPUGPU 行行 SIMD [SSE, AltiVec] 用 HPC CPUDSP PPESPE (Cell/B.E.) SPE CPUGPU GPU CPU DSP DSP PPE SPE SPE CPU DSP SPE 2

Microsoft PowerPoint - suda.pptx

GPGPU

Microsoft PowerPoint - GPUシンポジウム _d公開版.ppt [互換モード]

Microsoft PowerPoint - 演習1:並列化と評価.pptx

XACCの概要

Microsoft Word - openmp-txt.doc

1 OpenCL OpenCL 1 OpenCL GPU ( ) 1 OpenCL Compute Units Elements OpenCL OpenCL SPMD (Single-Program, Multiple-Data) SPMD OpenCL work-item work-group N

(Microsoft PowerPoint \215u\213`4\201i\221\272\210\344\201j.pptx)

GPUを用いたN体計算

CUDA を用いた画像処理 画像処理を CUDA で並列化 基本的な並列化の考え方 目標 : 妥当な Naïve コードが書ける 最適化の初歩がわかる ブロックサイズ メモリアクセスパターン

2ndD3.eps

Images per Second Images per Second VOLTA: ディープラーニングにおける大きな飛躍 ResNet-50 トレーニング 2.4x faster ResNet-50 推論 TensorRT - 7ms レイテンシ 3.7x faster P100 V100 P10

enshu5_4.key

RICCについて

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

スパコンに通じる並列プログラミングの基礎

Microsoft PowerPoint - GTC2012-SofTek.pptx

スパコンに通じる並列プログラミングの基礎

第12回講義(2019年7月17日)

目的と目次 OpenCL はこれからのマルチコアプログラミングの主流 ( かも ) GPU (NVIDIA, AMD/ATI) Cell B.E. 組み込みプロセッサ 共通コードとして OpenCL に対応するために必要な準備を考える 目次 基礎編 ( 今回 ) OpenCL とは 実践編 高速化の

( CUDA CUDA CUDA CUDA ( NVIDIA CUDA I

IPSJ SIG Technical Report Vol.2017-HPC-158 No /3/9 OpenACC MPS 1,a) 1 Moving Particle Semi-implicit (MPS) MPS MPS OpenACC GPU 2 4 GPU NVIDIA K2

GPUコンピューティング講習会パート1

Slide 1

修士論文

Microsoft PowerPoint - GDEP-GPG_softek_May24-1.pptx

卒業論文

MATLAB® における並列・分散コンピューティング ~ Parallel Computing Toolbox™ & MATLAB Distributed Computing Server™ ~

概要 OpenACC とは OpenACC について OpenMP, CUDA との違い OpenACC の指示文 並列化領域指定指示文 (kernels/parallel) データ移動指示文 ループ指示文 OpenACC の実用例 実習 コンパイラメッセージの見方 OpenACC プログラムの実装

マルチコアPCクラスタ環境におけるBDD法のハイブリッド並列実装

27_02.indd

Microsoft Word - HOKUSAI_system_overview_ja.docx

OpenACC入門

TSUBAME2.0におけるGPUの 活用方法

VOLTA ARCHITECTURE DEEP DIVE 成瀬彰, シニアデベロッパーテクノロジーエンジニア, 2017/12/12

スパコンに通じる並列プログラミングの基礎

CCS HPCサマーセミナー 並列数値計算アルゴリズム

AICS 村井均 RIKEN AICS HPC Summer School /6/2013 1

GPU n Graphics Processing Unit CG CAD

Microsoft PowerPoint - 阪大CMSI pptx

コードのチューニング

最新の並列計算事情とCAE

Microsoft PowerPoint - sales2.ppt

CPU Levels in the memory hierarchy Level 1 Level 2... Increasing distance from the CPU in access time Level n Size of the memory at each level 1: 2.2

Microsoft PowerPoint - C++_第1回.pptx

OpenACCによる並列化

研究報告用MS-Wordテンプレートファイル

演習1: 演習準備

GPU のアーキテクチャとプログラム構造 長岡技術科学大学電気電子情報工学専攻出川智啓

概要 目的 CUDA Fortran の利用に関する基本的なノウハウを提供する 本チュートリアル受講後は Web 上で公開されている資料等を参照しながら独力で CUDA Fortran が利用できることが目標 対象 CUDA Fortran の利用に興味を抱いている方 前提とする知識 Fortran

2 09:30-10:00 受付 10:00-12:00 HA-PACS ログイン GPU 入門 13:30-15:00 OpenACC 入門 15:15-16:45 OpenACC 最適化入門と演習 17:00-18:00 OpenACC の活用 (CUDA 連携とライブラリの活用 )

hpc141_shirahata.pdf

NUMAの構成

Microsoft PowerPoint - ARCEMB08HayashiSlides.ppt [互換モード]

Microsoft PowerPoint - GDEP-GPG_softek_May24-2.pptx

プログラミングI第10回

openmp1_Yaguchi_version_170530

4 倍精度基本線形代数ルーチン群 QPBLAS の紹介 [index] 1. Introduction 2. Double-double algorithm 3. QPBLAS 4. QPBLAS-GPU 5. Summary 佐々成正 1, 山田進 1, 町田昌彦 1, 今村俊幸 2, 奥田洋司

工学院大学建築系学科近藤研究室2000年度卒業論文梗概

PowerPoint プレゼンテーション

07-二村幸孝・出口大輔.indd

製品開発の現場では 各種のセンサーや測定環境を利用したデータ解析が行われ シミュレーションや動作検証等に役立てられています しかし 日々収集されるデータ量は増加し 解析も複雑化しており データ解析の負荷は徐々に重くなっています 例えば自動車の車両計測データを解析する場合 取得したデータをそのまま解析

GPGPUイントロダクション

01_OpenMP_osx.indd

PowerPoint プレゼンテーション

XcalableMP入門

NVIDIA Tesla K20/K20X GPU アクセラレータ アプリケーション パフォーマンス テクニカル ブリーフ

RX ファミリ用 C/C++ コンパイラ V.1.00 Release 02 ご使用上のお願い RX ファミリ用 C/C++ コンパイラの使用上の注意事項 4 件を連絡します #pragma option 使用時の 1 または 2 バイトの整数型の関数戻り値に関する注意事項 (RXC#012) 共用

PowerPoint プレゼンテーション

名称 : 日本 GPU コンピューティングパートナーシップ (G-DEP) 所在 : 東京都文京区本郷 7 丁目 3 番 1 号東京大学アントレプレナープラザ, 他工場 URL アライアンスパートナー コアテクノロジーパートナー NVIDIA JAPAN ソリュ

Microsoft PowerPoint - GPGPU実践基礎工学(web).pptx

プログラミング実習I

Microsoft PowerPoint - exp2-02_intro.ppt [互換モード]

memo

Transcription:

GPU チュートリアル :OpenACC 篇 Himeno benchmark を例題として 高エネルギー加速器研究機構 (KEK) 松古栄夫 (Hideo Matsufuru) 1 December 2018 HPC-Phys 勉強会 @ 理化学研究所 共通コードプロジェクト

Contents Hands On 環境について Introduction to GPU computing Introduction to OpenACC 実習 : Himeno benchmark の offload p-2

Contents Hands On 環境について Introduction to GPU computing Introduction to OpenACC 実習 : Himeno benchmark の offload p-3

Hands on HPCtech 製ポータブルGPUワークステーション NVIDIA GeForce GTX 680M (Kepler architecture) CUDA Toolkit 10.0 PGI compiler Community Edition 16.4 ( 無償版 ) OpenACC in a Nutshell 簡単なまとめ p-4

Hands on Himeno benchmark http://accc.riken.jp/en/supercom/documents/himenobmt/ 3 次元 Poisson 方程式をJacobi 反復法で解く ( 疎行列, stencil) 理研 情報基盤センターの姫野龍太郎氏による 例題 Himeno benchmark を多少改変して使う (Cの場合) 性能評価 : subroutine jacobi ここをオフロード ( いじりやすいようにしたもの : jacobi2) 反復ループ自体が一つの subroutine の中にまとまっていてオフロードしやすい p-5

Hands on 例題コード : /home/workshop/ himeno-benchmark/ host 用コード : ここからスタート 各自 login したらコピーして compile, 実行してみる himeno_c_openacc/: C での実装例 himeno_f77_openacc/: Fortran 77 での実装例 C code Jacobi2: 構造体のままだと処理が難しいので オフロードの前に要素に対するポインタを設定しておく 配列のように処理 (_mod.c) F77 code S size のものを利用 F90 code OpenACC 篇ではフォローしない (CUDA 篇で使用 ) p-6

Introduction to GPU computing GPU システムの一般的構成 ノードホスト (CPU) ホストメモリ ホストコア ホストメモリを共有 PCIe or NVLink ( ここが bottleneck) デバイス (GPU) グローバルメモリデバイスコア O(10k)/device 共有メモリ (local store) Streaming Multiprocessor (NVIDIA) 共有メモリを共有 するコアのセット p-7

NVIDIA GPU NVIDIA GPU GTX 680M (Kepler) Tesla K40 (Kepler) Tesla P100 (Pascal) Tesla V100 (Volta) Number of SM 7 15 56 80 FP64 Cores/GPU 448 960 1792 2560 FP32 Cores/GPU 1344 2880 3584 5120 Peak FP64 [TFlops/s] 0.68 1.7 5.3 7.8 Peak FP32 [TFlops/s] 2 5 10.6 15.7 Memory B/W [GB/s] 115 288 732 900 PCIe Gen3x16 [GB/s] 31.5 (x0.15) 31.5 31.5 31.5 NVLink [GB/s/port] N/A N/A 40 50 性能値は boost clock 時 * Tensor Core (Hands on machine real status: 2.5GT/s x8) p-8

HPC on GPU GPUを効果的に使える計算のタイプ 一部に計算時間が集中 ( ホットスポット ) その部分だけGPUに オフロード することで性能向上 多くの独立な計算に分割可能 多数のスレッドによる並列処理 長いループ 依存関係のない配列 ある程度複雑な処理 データの局所性 Host (CPU) と device (GPU) の間のデータ転送が bottleneck このデータ転送を少なく / 演算とオーバーラップできると高速 p-9

Coding framework Device を host (CPU) から制御 Device 上で実行されるコード (kernel code) ユーザが作成 (API-based): CUDA, OpenCL コンパイラが生成 (directive based): OpenACC ライブラリを利用 (cublas など ) API based Directive based 分散並列 MPI XcalableMP スレッド並列 オフロード Pthread TBB, C++ thread OpenCL CUDA (NVIDIA) OpenMP 自動並列化 + 指示文 OpenACC OpenMP 4.x Hitachi Fortran p-10

Coding framework Device 上のメモリ Host device のメモリ空間は一般に独立 最近は unified memory も登場 Host-device 間のバンド幅が bottleneck: PCIe, NVLink データ転送を最小化する必要 Device 上のカーネルコード 数千のコアで並列実行できるように演算を配置 互いに依存関係のないタスクに分解 SM (streaming muliprocessor) 内では共有メモリを通してデータ交換 アーキテクチャの特長を理解して最適化 SIMD 実行されるスレッド数 共有メモリの利用など Coalesced access: スレッドからのメモリアクセスを最適化するように配列順序を調整 Array of Structure (of Array) p-11

Coding framework 一般的な処理の流れ デバイスを使う準備 どのデバイスを使うか など デバイス上のメモリ領域の確保 Host での malloc に対応 (C++ の new) データ転送 : host device デバイス上のカーネル実行 Host からカーネル実行を発行する データ転送 : device host メモリ領域の解放 Host での free に対応 (C++ では delete) p-12

OpenACC OpenACC とは 演算加速器を使うためのディレクティブ ベースのライブラリ スレッド並列の OpenMP に対応 C/C++, Fortran で利用可能 対応しているcompiler PGI compiler (NVIDIA 傘下 ) ( 今回利用 ) Cray compiler ( 使ったことない ) References OpenACC Home: http://www.openacc.org/ OpenACC ディレクティブによるプログラミング (PGI) https://www.softek.co.jp/spg/pgi/openacc/ ( 和訳版 ) 以下ではこの文書をかなり参考にしている p-13

OpenACC OpenACC の基礎 Directive のフォーマット #pragma acc directive [clause[[,] clause]...] { 構造化ブロック } コンパイラは directive を解釈し カーネルコードを生成 カーネル : アクセラレータ側で動作するコード OpenACCの並列化の対象は loop 対象部分を procedure として切り出し device code を生成 p-14

OpenACC 3 種類の directive 構文が基本 並列領域の指定 = Accelerator compute 構文 アクセラレータ上にオフロードするループ対象部分を指定する 並列化階層それぞれのサイズを指定 Parallel 構文 kernels 構文, (Serial 構文 ) がある メモリの確保とデータ移動 (host device)= data 構文 データの転送 ( 存在場所 ) を明示的に指示 enter, exit, update 構文を使う方法もある (Cf. 第一回の資料 ) スレッド並列にするタスクの指定 = loop 構文 並列化する for を指定 どの階層にそのループを割り当てるかを指定 Reduction 処理も可能 p-15

OpenACC Accelerator Compute 構文 : 並列実行領域の指定 OpenMP の #pragma omp prallel に対応 Kernels 構文 コンパイラまかせ型 並列化のための依存性解析や並列性能に関するスケジューリングなどの責任はコンパイラが負う tightly nested loop に適用 Parallel 構文 ユーザまかせ型 ( こちらを使う) 並列分割方法やその場所を指定 依存性などにはユーザが責任を持つ この構文から後 スレッドに対する冗長実行が開始 Work-sharing を行うループに対し loop directive で指示 Work-sharing loop の終わりで同期は取らない Parallel region の最後で同期を取る p-16

OpenACC デバイスメモリの確保とデータ転送 コンパイラは並列領域内で使用する変数のメモリをデバイス上に確保 data 構文や declair 構文で明示的に生成できる 配列は明示的に生成する必要あり data 構文 プログラムがデータ構文に到達したときにデバイスメモリ領域を生成 データ転送 出る時に ( ホストへ ) データ転送 メモリ解放 コピーの方法を clause で指定 copyin(array[size]): host device のコピー copyout : 終了後 device host のコピー copy : copyin & copyout present : 既に存在するデータであることを指定 p-17

OpenACC もう一つの方法 enter 構文で確保 exit 構文で解放 update 構文で更新 OpenACC 2.0 から可能 オブジェクトの生成 破棄時にメモリ領域を確保 解放できる Parallel region の前では #pragma acc data present(var-list) アクセラレータ上のデータ private: parallel 構文で指定 gang に private Gang 内 (worker, vector) で共有される p-18

OpenACC 並列実行の階層構造 3 階層 それぞれのサイズを clause で指定 gang: streaming multi-processor (NVIDIA) に相当 同期無し worker: warp に対応 ( 同期可 ) vector: warp 内 thread に相当 最内 loop Loop 構文 parallel 構文の中では work-share する loop を指定するために必須 collapse(n): n 個のnestされたloopをまとめる reduction(operation:var-list) private(var-list) そのloopでプライベートな変数にする p-19

A recipe of offloading 以上のOpenACC 機能をどう使ってオフロードコードを書くか? 典型的な使い方 : recipe があると便利 Recipe (1) : data 構文でメモリ確保 + 転送, parallel 構文で並列化 Recipe (2) : enter data でメモリ確保 update で転送 parallel 構文で並列化 (my favorite 第 1 回 HPC-phys talk) 最小限のまとめ : OpenACC in a nutshell 各自の recipe を探してください p-20

CUDA, OpenCL との比較 CUDA, OpenCL API ベースの framework Kernel コードを自分で書く必要あり きめ細かく最適化できる OpenCL ではデバイス環境の設定がちょっと面倒 OpenACC から CUDA, OpenCL へ 上の recipe は CUDA/OpenCL での手順とほぼ 1 対 1 対応 それぞれの directive を API に置き換えていける #pragma acc data 構文で指定した変数 = kernel code の引数 #pragma acc loop で括った内部を kernel code として抽出 p-21

Summary メニーコア並列化が可能なタイプの計算に GPU は効果的 OpenACC を利用すると比較的手軽にGPUを使える GPU アーキテクチャの構造を理解することが高速化に重要 ホスト-デバイス間データ転送の最小化 メモリアクセスの最適化 スレッドの階層性 共有メモリ CUDA, OpenCL へ向けての準備としても有効 p-22

Hands On (1) まずはそのままコンパイル 実行 (2) OpenACC directive を挿入 コンパイル 実行 Rehersal での gosa の値は2 桁くらいは合ってないとおかしい (3) いろいろ試してみる num_workers, vector_length を変えてみる 正しくない結果になるような変更 Etc. p-23