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

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

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

OpenACCによる並列化

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

第8回講義(2016年12月6日)

OpenACC入門

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

Reedbush 利用の手引き 2 ノートパソコンの設定 : 公開鍵の生成 登録 ネットワーク環境に接続してから行ってください

内容に関するご質問は まで お願いします [Oakforest-PACS(OFP) 編 ] 第 85 回お試しアカウント付き並列プログラミング講習会 ライブラリ利用 : 科学技術計算の効率化入門 スパコンへのログイン テストプログラム起動 東京大学情報基盤セ

openmp1_Yaguchi_version_170530

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

PowerPoint プレゼンテーション

演習1: 演習準備

Oakforest-PACS 利用の手引き 2 ノートパソコンの設定 : 公開鍵の生成 登録

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

目次 LS-DYNA 利用の手引き 1 1. はじめに 利用できるバージョン 概要 1 2. TSUBAME での利用方法 使用可能な LS-DYNA の実行 4 (1) TSUBAMEにログイン 4 (2) バージョンの切り替え 4 (3) インタラ

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

ex04_2012.ppt

コードのチューニング

GPU n Graphics Processing Unit CG CAD

Microsoft Word - HOKUSAI_system_overview_ja.docx

VXPRO R1400® ご提案資料

XACCの概要

<4D F736F F F696E74202D D F95C097F D834F E F93FC96E5284D F96E291E85F8DE391E52E >

HPC143

ERDAS IMAGINE における処理速度の向上 株式会社ベストシステムズ PASCO CORPORATION 2015

Microsoft PowerPoint - OpenMP入門.pptx

Anaconda (2019/7/3)

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

第 1 回ディープラーニング分散学習ハッカソン <ChainerMN 紹介 + スパコンでの実 法 > チューター福 圭祐 (PFN) 鈴 脩司 (PFN)

Reedbush-Uアカウントの発行

NUMAの構成

Microsoft PowerPoint - RBU-introduction-J.pptx

スライド 1

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

スライド 1

並列計算導入.pptx

NUMAの構成

appli_HPhi_install

$ cmake --version $ make --version $ gcc --version 環境が無いあるいはバージョンが古い場合は yum などを用いて導入 最新化を行う 4. 圧縮ファイルを解凍する $ tar xzvf gromacs tar.gz 5. cmake を用

OpenACC

PowerPoint プレゼンテーション

Hphi実行環境導入マニュアル_v1.1.1

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

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

Microsoft Word - appli_SMASH_tutorial_2.docx

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

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

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

GPUを用いたN体計算

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

TopSE並行システム はじめに

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

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 - sales2.ppt

Microsoft Word - openmp-txt.doc

担当 大島聡史 ( 助教 ) 星野哲也 ( 助教 ) 質問やサンプルプログラムの提供についてはメールでお問い合わせください 年 03 月 14 日 ( 火 )

東大センターのスパコン 2 基の大型システム,6 年サイクル (?) FY Yayoi: Hitachi SR16000/M1 IBM Power TFLOPS, 1152 TB T2K To

GPGPUクラスタの性能評価

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

01_OpenMP_osx.indd

HPEハイパフォーマンスコンピューティング ソリューション

OpenMP¤òÍѤ¤¤¿ÊÂÎó·×»»¡Ê£±¡Ë

Slide 1

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

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

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

2018 年 11 月 10 日開催 第 27 回日本コンピュータ外科学会大会 ハンズオンセミナー 2 外科領域における医用画像の深層学習 事前インストール手順 2018 年 10 月 11 日版 作成 : 名古屋大学小田昌宏 1

Microsoft PowerPoint - GTC2012-SofTek.pptx

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 連携とライブラリの活用 )

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

PowerPoint プレゼンテーション

Microsoft PowerPoint - suda.pptx

Microsoft PowerPoint - GPU_computing_2013_01.pptx

1 GPU GPGPU GPU CPU 2 GPU 2007 NVIDIA GPGPU CUDA[3] GPGPU CUDA GPGPU CUDA GPGPU GPU GPU GPU Graphics Processing Unit LSI LSI CPU ( ) DRAM GPU LSI GPU

04-process_thread_2.ppt

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

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

FX10利用準備

memo

演習準備

Total View Debugger 利用の手引 東京工業大学学術国際情報センター version 1.0

Microsoft Word - ユーザ向け利用の手引き_v0.3.doc

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

Reedbush-U の概要 ログイン方法 東京大学情報基盤センタースーパーコンピューティング研究部門

PowerPoint Presentation

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

3次多項式パラメタ推定計算の CUDAを用いた実装 (CUDAプログラミングの練習として) Implementation of the Estimation of the parameters of 3rd-order-Polynomial with CUDA

RICCについて

LS-DYNA 利用の手引 第 1 版 東京工業大学学術国際情報センター 2017 年 9 月 25 日

hpc141_shirahata.pdf

N08

DO 時間積分 START 反変速度の計算 contravariant_velocity 移流項の計算 advection_adams_bashforth_2nd DO implicit loop( 陰解法 ) 速度勾配, 温度勾配の計算 gradient_cell_center_surface 速

PowerPoint プレゼンテーション

この時お使いの端末の.ssh ディレクトリ配下にある known_hosts ファイルから fx.cc.nagoya-u.ac.jp に関する行を削除して再度ログインを行って下さい

Microsoft PowerPoint - ca ppt [互換モード]

スライド 1

OpenMPプログラミング

GPU CUDA CUDA 2010/06/28 1

Transcription:

スパコンプログラミング (1)(Ⅰ) 1 OpenACC の紹介 Reedbush-H お試し 東京大学情報基盤センター准教授塙敏博 2019 年 7 月 17 日 ( 水 )10:25 12:10

2019/7/16 スパコンプログラミング (1) (Ⅰ) 講義日程 ( 工学部共通科目 ) 1. 4 月 9 日 : ガイダンス 2. 4 月 16 日 l 並列数値処理の基本演算 ( 座学 ) 3. 4 月 23 日 : スパコン利用開始 l ログイン作業 テストプログラム実行 4. 5 月 7 日 l 高性能プログラミング技法の基礎 1 ( 階層メモリ ループアンローリング ) 5. 5 月 21 日 l 高性能プログラミング技法の基礎 2 ( キャッシュブロック化 ) 6. 5 月 28 日 l 行列 - ベクトル積の並列化 7. 6 月 4 日 l べき乗法の並列化 8. 6 月 11 日 l 行列 - 行列積の並列化 (1) 9. 6 月 25 日 l 行列 - 行列積の並列化 (2) 10. 7 月 2 日 l LU 分解法 (1) l コンテスト課題発表 11. 7 月 9 日 l LU 分解法 (2) 12. 7 月 16 日 l LU 分解法 (3) 非同期通信 13. 7 月 17 日 l レポートおよびコンテスト課題 ( 締切 : 2019 年 8 月 5 日 ( 月 )24 時厳守 2 RB-H お試し 研究紹介他

スパコンプログラミング (1)(Ⅰ) 3 GPU プログラミングの紹介 一部は本センターの GPU 講習会資料から です

スパコンプログラミング (1)(Ⅰ) 4 GPU を使った汎用計算 : GPGPU GPU: Graphic Processing Unit, 画像処理用のハードウェア 高速な描画 3 次元画像処理など 3 次元画像処理などに用いる演算を汎用計算に応用 多数のピクセル ( 画素 ) に対して高速に計算するために 多数の演算器で並列処理数値計算に 10 年程度で歴史は浅いが HPC では広く使われている 最近では機械学習 (Deep Learning) の主役に

スパコンプログラミング (1)(Ⅰ) Green 500 Ranking (November, 2018) 5 http://www.top500.org/ TOP 500 Rank System Cores HPL Rmax (Pflop/s) Power (MW) GFLOPS/W 1 374 Shoubu system B, Japan 953,280 1,063 60 17.604 2 373 DGX SaturnV Volta, USA 22,440 1,070 97 15.113 3 1 Summit, USA 2,397,824 143,500 9,783 14.668 4 7 ABCI, Japan 391,680 19,880 1,649 14.423 5 22 TSUBAME 3.0, Japan 135,828 8,125 792 13.704 6 2 Sierra, USA 1,572,480 94,640 7,438 12.723 7 444 AIST AI Cloud, Japan 23,400 961 76 12.681 8 409 MareNostrum P9 CTE, Spain 19,440 1,018 86 11.865 9 38 Advanced Computing System (PreE), China 163,840 4,325 380 11.382 10 20 Taiwania 2, Taiwan 170,352 900 798 11.285 - - Reedbush-L, U.Tokyo, Japan 16,640 806 79 10.167 - - Reedbush-H, U.Tokyo, Japan 17,760 802 94 8.576

スパコンプログラミング (1)(Ⅰ) 6 メモリ 128G B DDR4 DDR4 DDR4 DDR4 76.8GB/s Reedbush-H ノードのブロック図 Intel Xeon E5-2695 v4 (Broadwell- EP) G3 x1 6 76.8GB/s QPI QPI 76.8GB/s 15.7 GB/s 15.7 GB/s Intel Xeon E5-2695 v4 (Broadwell- EP) G3 x16 DDR4 DDR4 DDR4 DDR4 76.8GB/s メモリ 128G B PCIe sw PCIe sw IB FDR HCA G3 x16 G3 x16 NVIDIA Pascal 20 GB/s NVLinK NVLinK 20 GB/s G3 x16 NVIDIA Pascal G3 x16 IB FDR HCA EDR switch EDR

スパコンプログラミング (1)(Ⅰ) 7 なぜ GPU コンピューティング? 性能が高いから! P100 BDW KNL 動作周波数 (GHz) 1.480 2.10 1.40 コア数 ( 有効スレッド数 ) 3,584 18 (18) 68 (272) 理論演算性能 (GFLOPS) 5,304 604.8 3,046.4 主記憶容量 (GB) 16 128 16 メモリバンド幅 (GB/sec., Stream Triad) 備考 534 65.5 490 Reedbush-H の GPU Reedbush-U/H の CPU Oakforest-PACS の CPU (Intel Xeon Phi)

スパコンプログラミング (1)(Ⅰ) 8 GPU プログラミングは何が難しい? CPU: 大きなコアをいくつか搭載 Reedbush-H の CPU : 2.10 GHz 18コア 大きなコア 分岐予測 パイプライン処理 Out-of-Order 要はなんでもできる 逐次の処理が得意 GPU: 小さなコアをたくさん搭載 Reedbush-H の GPU: 1.48 GHz 3,584 コア 小さなコア... 上記機能が弱い, またはない! 並列処理が必須 GPU の難しさ 1. 並列プログラミング自体の難しさ 2. 多数のコアを効率良く扱う難しさ

スパコンプログラミング (1)(Ⅰ) 9 参考 :NVIDIA Tesla P100 56 SMs 3584 CUDA Cores 16 GB HBM2 P100 whitepaper より

スパコンプログラミング (1)(Ⅰ) 10 参考 :NVIDIA Tesla P100 の SM

スパコンプログラミング (1)(Ⅰ) 参考 :NVIDIA 社の GPU 11 製品シリーズ GeForce コンシューマ向け 安価 Tesla HPC 向け 倍精度演算器 大容量メモリ ECC を備えるため高価 アーキテクチャ ( 世代 ) 1. Tesla: 最初の HPC 向け GPU TSUBAME1.2 など 2. Fermi:2 世代目 TSUBAME2.0 など ECC メモリ FMA 演算 L1 L2 キャッシュ 3. Kepler: 現在 HPC にて多く利用 TSUBAME2.5 など シャッフル命令 Dynamic Parallelism Hyper-Q 4. Maxwell: コンシューマ向けのみ 5. Pascal: 最新 GPU Reedbush-H に搭載 HBM2 半精度演算 NVLink 倍精度 atomicadd など 6. Volta: 次世代 GPU Tensor Core など

スパコンプログラミング (1)(Ⅰ) 12 押さえておくべき GPU の特徴 CPUと独立のGPUメモリ 性能を出すためにはスレッド数 >> コア数 階層的スレッド管理と同期 Warp 単位の実行 やってはいけないWarp 内分岐 コアレスドアクセス

スパコンプログラミング (1)(Ⅰ) 13 CPU と独立の GPU メモリ ノードの外へ ~20GB/s CPU OS が動いている 1. 必要なデータを送る バス (PCIe など ) ~32GB/s 3. 計算結果を返す GPU OS は存在しない 2. 計算を行う ~200GB/s ~1,000GB/s メインメモリ デバイスメモリ 計算は CPU から始まる 物理的に独立のデバイスメモリとデータのやり取り必須

スパコンプログラミング (1)(Ⅰ) 性能を出すためにはスレッド数 >> コア数 推奨スレッド数 CPU: スレッド数 = コア数 ( 高々数十スレッド ) GPU: スレッド数 >= コア数 *4~ ( 数万 ~ 数百万スレッド ) 最適値は他のリソースとの兼ね合いによる 理由 : 高速コンテキストスイッチによるメモリレイテンシ隠蔽 CPU : レジスタ スタックの退避は OS がソフトウェアで行う ( 遅い ) GPU : ハードウェアサポートでコストほぼゼロ メモリアクセスによる暇な時間 ( ストール ) に他のスレッドを実行 メモリ read 開始 メモリ read 終了 1core=1 スレッドのとき 1core=N スレッドのとき 14

スパコンプログラミング (1)(Ⅰ) 15 階層的スレッド管理と同期 コアの管理に対応 1 SM の中に 64 CUDA core 56 SM で 3584 CUDA core 1 CUDA core が複数スレッドを担当 スレッド間の同期 同一 SM 内のスレッド間は同期できる 正確には同一スレッドブロック内 異なるSMのスレッド間は同期できない 同期するためにはGPUの処理を終了する必要あり atomic 演算は可能 メモリ資源の共有 値は P100 の場合 L1 cache, shared memory, Instruction cache などはSM 内で共有 L2 cache, Device memory などは全スレッドで共有

スパコンプログラミング (1)(Ⅰ) 16 Warp 単位の実行 連続した 32 スレッドを 1 単位 = Warp と呼ぶ この Warp は足並み揃えて動く 実行する命令は 32 スレッド全て同じ データは違っていい Volta 世代からは実装が変わったので注意 : 各スレッドが独立して動作可能但し資源が競合すれば待つことには変わらない スレッド 1 2 3 31 32 配列 A 4 3 5 8 0 配列 B 2 3 1 1 9 OK! スレッド 1 2 3 31 32 配列 A 4 3 5 8 0 + 配列 B 2 3 1 1 9 NG!

スパコンプログラミング (1)(Ⅰ) 17 やってはいけない Warp 内分岐 Divergent Branch Warp 内で分岐すること Warp 単位の分岐なら OK : : if ( TRUE ) { : : } else { : : } : : : : if ( 奇数スレッド ) { : : } else { : : } : : else 部分は実行せずジャンプ 一部スレッドを眠らせて全分岐を実行最悪ケースでは 32 倍のコスト

スパコンプログラミング (1)(Ⅰ) 18 コアレスドアクセス 同じ Warp 内のスレッドが近いアドレスに同時にアクセスするのがメモリの性質上効率的 これをコアレスドアクセス (coalesced access) と呼ぶ スレッド 1 2 3 4 32 デバイスメモリ メモリアクセスが 1 回で済む スレッド 1 2 3 4 32 32 回のメモリアクセスが行われる 128 バイト単位でメモリアクセス Warp 内のアクセスが 128 バイトに収まってれば 1 回 外れればその分だけ繰り返す 最悪ケースでは 32 倍のコスト

スパコンプログラミング (1)(Ⅰ) 19 GPU 向けプログラミング環境 CUDA (Compute Unified Device Architecture) NVIDIA の GPU 向け開発環境 C 言語版は CUDA C として NVIDIA から Fortran 版は CUDA Fortran として PGI( 現在は NVIDIA の子会社 ) から提供されている OpenACC: 指示文を用いて並列化を行うプログラミング環境 C 言語と Fortran の両方の仕様が定められている PGI コンパイラなど幾つかのコンパイラが対応 (GPU が主なターゲットだが )GPU 専用言語ではない ( 特に単純なプログラムにおいては )OpenACC でも CUDA でも同様の性能が出ることもあるが 一般的には CUDA の方が高速 レガシーコードがある場合は OpenACC で書く方がはるかに楽

スパコンプログラミング (1)(Ⅰ) 20 OpenACC 規格 各コンパイラベンダ (PGI, Crayなど ) が独自に実装していた拡張を統合し共通規格化 (http://www.openacc.org/) 2011 年秋にOpenACC 1.0 最新の仕様はOpenACC 2.5 対応コンパイラ 商用 :PGI, Cray, PathScale PGI は無料版も出している 研究用 :Omni (AICS), OpenARC (ORNL), OpenUH (U.Houston) フリー :GCC 6.x 開発中 ( 開発状況 : https://gcc.gnu.org/wiki/offloading) 実用にはまだ遠い RB-H では PGI コンパイラを用いる

スパコンプログラミング (1)(Ⅰ) 21 OpenACC と OpenMP の実行イメージ比 較 1 スレッド OpenMP OpenACC int main() { #pragma for(i = 0;i < N;i++) { } } CPU CPU CPU デバイス

スパコンプログラミング (1)(Ⅰ) 22 OpenACC と OpenMP の比較 OpenMP の想定アーキテクチャ マルチコア CPU 環境 MEMORY 計算コアが N 個 N < 100 程度 (Xeon Phi 除く ) CPU(s) 共有メモリ 計算 計算 計算 計算 計算 計算 計算 計算 一番の違いは対象アーキテクチャの複雑さ

スパコンプログラミング (1)(Ⅰ) 23 OpenACC と OpenMP の比較 OpenACC の想定アーキテクチャ アクセラレータを備えた計算機環境 MEMORY ( ホスト ) CPU(s) MEMORY ( デバイス ) 計算コア N 個を M 階層で管理 N > 1000 を想定 階層数 M はアクセラレータによる ホスト - デバイスで独立したメモリ ホスト - デバイス間データ転送は低速 一番の違いは対象アーキテクチャの複雑さ

スパコンプログラミング (1)(Ⅰ) 24 OpenACC と OpenMP の比較 OpenMP と同じもの Fork-Join という概念に基づくループ並列化 OpenMP になくて OpenACC にあるもの ホストとデバイスという概念 ホスト - デバイス間のデータ転送 多階層の並列処理 OpenMP にあって OpenACC にないもの スレッド ID を用いた処理など OpenMP の omp_get_thread_num() に相当するものが無い その他 気をつけるべき違い OpenMP と比べて OpenACC は勝手に行うことが多い 転送データ 並列度などを未指定の場合は勝手に決定

スパコンプログラミング (1)(Ⅰ) 25 OpenACC と OpenMP の比較 デフォルトでの変数の扱い OpenMP 全部 shared OpenACC スカラ変数 : firstprivate or private 配列 : shared プログラム上の parallel/kernels 構文に差し掛かった時 OpenACC コンパイラは実行に必要なデータを自動で転送する 正しく転送されないこともある 自分で書くべき 構文に差し掛かるたびに転送が行われる ( 非効率 ) 後述の data 指示文を用いて自分で書くべき 配列はデバイスに確保される (shared 的振る舞い ) 配列変数を private に扱うためには private 指示節使う

スパコンプログラミング (1)(Ⅰ) 26 GPU プログラミング難易度早見表 易 OpenACC OpenACC with Unified Memory OpenMP omp parallel do 書くだけ データマネージメントの壁 OpenACC with データ指示文 スレッド制御の壁 難 OpenACC のカーネルチューニング カーネルの CUDA 化 指示文を用いた SIMD 化 intrinsic を用いた SIMD 化

スパコンプログラミング (1)(Ⅰ) 27 Reedbush-H の利用開始 OFP との違いを中心に

スパコンプログラミング (1)(Ⅰ) 28 鍵の登録 (1/2) 1. ブラウザを立ち上げる 2. 以下のアドレスを入力する https://reedbush-www.cc.u-tokyo.ac.jp/ 3. ユーザ名 にセンターから配布された 利用者番号 をいれる 4. パスワード に センターから配布された パスワード を入力する なお 記載されているパスワードはパスワードではない

スパコンプログラミング (1)(Ⅰ) 29 Reedbush へログイン Ø ターミナルから 以下を入力する $ ssh reedbush.cc.u-tokyo.ac.jp -l tyyxxx -l はハイフンと小文字の L tyyxxx は利用者番号 ( 数字 ) Ø Ø Ø tyyxxx は 利用者番号を入れる接続するかと聞かれるので yes を入れる 鍵の設定時に入れた自分が決めたパスワード ( パスフレーズ ) を入れる成功すると ログインができる

スパコンプログラミング (1)(Ⅰ) 30 バッチキューの設定のしかた バッチ処理は Altair 社のバッチシステム PBS Professional で管理されています OFPとの対応 : 以下 主要コマンドを説明します ジョブの投入 : pjsub => qsub qsub < ジョブスクリプトファイル名 > pjstat => rbstat 自分が投入したジョブの状況確認 : rbstat 投入ジョブの削除 : qdel < ジョブID> バッチキューの状態を見る : rbstat --rsc バッチキューの詳細構成を見る : rbstat rsc -x 投げられているジョブ数を見る : rbstat -b 過去の投入履歴を見る : rbstat H 同時に投入できる数 / 実行できる数を見る : rbstat --limit

スパコンプログラミング (1)(Ⅰ) 31 JOB スクリプトサンプルの説明 ( ピュア MPI) (hello-pure.bash, C 言語 Fortran 言語共通 ) #!/bin/bash #PBS -q h-lecture #PBS -Wgroup_list=gt16 #PBS -l select=8:mpiprocs=36 #PBS -l walltime=00:01:00 cd $PBS_O_WORKDIR. /etc/profile.d/modules.sh mpirun./hello リソースグループ名 :h-lecture 利用グループ名 :gt16 利用ノード数 ノード内利用コア数 (MPI プロセス数 ) 実行時間制限 :1 分 MPI ジョブを 8*36 = 288 プロセスで実行する カレントディレクトリ設定 環境変数設定 ( 必ず入れておく )

スパコンプログラミング (1)(Ⅰ) 32 本講義でのキュー名 本演習中のキュー名 : h-lecture6 最大 10 分まで 最大ノード数は2ノード (4GPU) まで 本演習時間以外 (24 時間 ) のキュー名 : h-lecture 利用条件は演習中のキュー名と同様

スパコンプログラミング (1)(Ⅰ) 33 Reedbush における注意 /home ファイルシステムは容量が小さく ログインに必要なファイルだけを置くための場所です /home に置いたファイルは計算ノードから参照できません ジョブの実行もできません => ログイン後は /lustre ファイルシステムを使ってください ホームディレクトリ : /home/gt16/t16xxx cd コマンドで移動できます Lustre ディレクトリ : /lustre/gt16/t16xxx cdw コマンドで移動できます

スパコンプログラミング (1)(Ⅰ) 34 OpenACC の指示文

スパコンプログラミング (1)(Ⅰ) 35 OpenACC の主要な指示文 並列領域指定指示文 kernels, parallel データ移動最適化指示文 data, enter data, exit data, update ループ最適化指示文 loop その他 比較的よく使う指示文 host_data, atomic, routine, declare

スパコンプログラミング (1)(Ⅰ) 36 並列領域指定指示文 :parallel, kernels アクセラレータ上で実行すべき部分を指定 OpenMP の parallel 指示文に相当 2 種類の指定方法 :parallel, kernels parallel:( どちらかというと ) マニュアル OpenMP に近い ここからここまでは並列実行領域です 並列形状などはユーザー側で指定します kernels:( どちらかというと ) 自動的 ここからここまではデバイス側実行領域です あとはお任せします 細かい指示子 節を加えていくと最終的に同じような挙動になるので どちらを使うかは好み どちらかというと kernels 推奨

スパコンプログラミング (1)(Ⅰ) 37 kernels/parallel 指示文 kernels parallel program main!$acc kernels do i = 1, N! loop body end do!$acc end kernels program main!$acc parallel num_gangs(n)!$acc loop gang do i = 1, N! loop body end do!$acc end parallel end program end program

kernels/parallel 指示文 kernels スパコンプログラミング (1)(Ⅰ) 38 ホスト-デバイスを意識するのがkernels 並列実行領域であることを意識するのがparallel parallel ホスト側 program main デバイス側 program main!$acc kernels do i = 1, N! loop body end do!$acc end kernels end program!$acc parallel num_gangs(n)!$acc loop gang do i = 1, N! loop body end do!$acc end parallel end program 並列数はデバイスに合わせてください 並列数 N でやってください

スパコンプログラミング (1)(Ⅰ) 39 kernels/parallel 指示文 : 指示節 kernels parallel async wait device_type if default(none) copy async wait device_type if default(none) copy num_gangs num_workers vector_length reduction private firstprivate

スパコンプログラミング (1)(Ⅰ) 40 kernels/parallel 指示文 : 指示節 kernels parallel 非同期実行に用いる 実行デバイス毎にパラメータを調整 データ指示文の機能を使える parallel では並列実行領域であることを意識するため 並列数や変数の扱いを決める指示節がある async wait device_type if default(none) copy num_gangs num_workers vector_length reduction private firstprivate

スパコンプログラミング (1)(Ⅰ) 41 kernels/parallel 実行イメージ Fortran C 言語 subroutine copy(dst, src) real(4), dimension(:) :: dst, src void copy(float *dst, float *src) { int i;!$acc kernels copy(src,dst) do i = 1, N dst(i) = src(i) end do!$acc end kernels #pragma acc kernels copy(src[0:n] dst[0:n]) for(i = 0;i < N;i++){ dst[i] = src[i]; } end subroutine copy }

スパコンプログラミング (1)(Ⅰ) 42 kernels/parallel 実行イメージ Fortran subroutine copy(dst, src) real(4), dimension(:) :: dst, src!$acc kernels copy(src,dst) do i = 1, N dst(i) = src(i) end do!$acc end kernels end subroutine copy ( ホスト ) ( デバイス ) dst, src 1dst, src の値がコピーされる 3dst _dev, src _dev の値がコピーされる dst, src 0dst, src の領域が確保される dst_dev, src_dev 2 デバイス上の計算 dst _dev, src _dev 4dst, src の領域が解放される

スパコンプログラミング (1)(Ⅰ) 43 デバイス上で扱うデータについて プログラム上の parallel/kernels 構文に差し掛かった時 OpenACC コンパイラは実行に必要なデータを自動で転送する 正しく転送されないこともある 自分で書くべき 構文に差し掛かるたびに転送が行われる ( 非効率 ) 後述のdata 指示文を用いて自分で書くべき 自動転送はdefault(none) で抑制できる スカラ変数は firstprivate として扱われる 指示節により変更可能 配列はデバイスに確保される (shared 的振る舞い ) 配列変数をスレッドローカルに扱うためには private を指定する

スパコンプログラミング (1)(Ⅰ) 44 データ移動最適化指示文が必要なとき Fortran C 言語 subroutine copy(dst, src) real(4), dimension(:) :: dst, src do j = 1, M!$acc kernels copy(src,dst) do i = 1, N dst(i) = dst(i) + src(i) end do!$acc end kernels end do end subroutine copy void copy(float *dst, float *src) { int i, j; for(j = 0;j < M;j++){ #pragma acc kernels copy(src[0:n] } } dst[0:n]) for(i = 0;i < N;i++){ dst[i] = dst[i] + src[i]; } Kernels をループで囲むと, HtoD 転送 => 計算 =>DtoH 転送の繰り返し

スパコンプログラミング (1)(Ⅰ) 45 data 指示文 Fortran C 言語 subroutine copy(dst, src) real(4), dimension(:) :: dst, src!$acc data copy(src,dst) do j = 1, M!$acc kernels present(src,dst) do i = 1, N dst(i) = dst(i) + src(i) end do!$acc end kernels end do!$acc end data end subroutine copy present: 既に転送済であることを示す void copy(float *dst, float *src) { int i, j; #pragma acc data copy(src[0:n] dst[0:n]) { for(j = 0;j < M;j++){ #pragam acc kernels present(src,dst) for(i = 0;i < N;i++){ dst[i] = dst[i] + src[i]; } } } } C の場合 data 指示文の範囲は {} で指定 ( この場合は for が構造ブロックになってるのでなくても大丈夫だが )

スパコンプログラミング (1)(Ⅰ) 46 data 指示文の効果 ( ホスト ) ( デバイス ) dst, src dst_dev, src_dev 計算 ( ホスト ) ( デバイス ) dst, src dst_dev, src_dev 計算 計算 計算 計算 計算 dst, src dst _dev, src _dev dst, src dst _dev, src _dev

スパコンプログラミング (1)(Ⅰ) 47 データ移動指示文 : データ転送範囲指定 送受信するデータの範囲の指定 部分配列の送受信が可能 注意 :Fortran と C で指定方法が異なる 二次元配列 A を転送する例 Fortran 版!$acc data copy(a(lower1:upper1, lower2:upper2) ) fortranでは下限と上限を指定!$acc end data C 版 #pragma acc data copy(a[start1:length1][start2:length2]) { Cでは先頭と長さを指定 }

スパコンプログラミング (1)(Ⅰ) 48 階層的並列モデルとループ指示文 OpenACC ではスレッドを階層的に管理 gang, worker, vector の 3 階層 gang:worker の塊一番大きな単位 worker:vector の塊 vector: スレッドに相当する一番小さい処理単位 loop 指示文 parallel/kernels 中のループの扱いについて指示 パラメータの設定はある程度勝手にやってくれる 粒度 (gang, worker, vector) の指定 ループ伝搬依存の有無の指定 GPUでの行列積の例!$acc kernels!$acc loop gang do j = 1, n!$acc loop vector do i = 1, n cc = 0!$acc loop seq do k = 1, n cc = cc + a(i,k) * b(k,j) end do c(i,j) = cc end do end do!$acc end kernels

スパコンプログラミング (1)(Ⅰ) 49 階層的並列モデルとアーキテクチャ OpenMP は 1 階層 マルチコア CPU も 1 階層 最近は 2 階層目 (SIMD) がある CUDA は block と thread の 2 階層 NVIDA GPU も 2 階層 1 SMX に複数 CUDA core を搭載 各コアは SMX のリソースを共有 OpenACC は 3 階層 様々なアクセラレータに対応するため NVIDIA GPU の構成 GPU SMX CUDA コア デバイスメモリ 49

スパコンプログラミング (1)(Ⅰ) 50 OpenACC と Unified Memory Unified Memory とは 物理的に別物の CPU と GPU のメモリをあたかも一つのメモリのように扱う機能 Pascal GPU ではハードウェアサポート ページフォルトが起こると勝手にマイグレーションしてくれる Kepler 以前も使えるが, ソフトウェア処理なのでひどく遅い OpenACC と Unified Memory OpenACC に Unified Memory を直接使う機能はない PGI コンパイラに managed オプションを与えることで使える pgfortran acc ta=tesla,managed 使うとデータ指示文が無視され 代わりに Unified Memory を使う

スパコンプログラミング (1)(Ⅰ) 51 Unified Memory のメリット デメリット メリット データ移動の管理を任せられる ポインタなどの複雑なデータ構造を簡単に扱える 本来はメモリ空間が分かれているため ディープコピー問題が発生する デメリット ページ単位で転送するため 細かい転送が必要な場合には遅くなる CPU 側のメモリ管理を監視しているので allocate, deallocate を繰り返すアプリでは CPU 側が極端に遅くなる

スパコンプログラミング (1)(Ⅰ) 52 OpenACC への アプリケーション移植方法

スパコンプログラミング (1)(Ⅰ) 53 アプリケーションのOpenACC 化手順 1. プロファイリングによるボトルネック部位の導出 2. ボトルネック部位のOpenACC 化 1. 並列化可能かどうかの検討 2. (OpenACCの仕様に合わせたプログラムの書き換え) 3. parallel/kernels 指示文適用 3. data 指示文によるデータ転送の最適化 4. OpenACCカーネルの最適化 1 ~ 4 を繰り返し適用 それでも遅ければ 5. カーネルの CUDA 化 スレッド間の相互作用が多いアプリケーションでは shared memory や shuffle 命令を自由に使える CUDA の方が圧倒的に有利

スパコンプログラミング (1)(Ⅰ) 54 既に OpenMP 化されているアプリケーション の OpenACC 化手順 1.!$omp parallel を!$acc kernels に機械的に置き換え 2. Unified Memory を使い とりあえず GPU 上で実行 3. コンパイラのメッセージを見ながら OpenACC カーネルの最適化 4. データ指示文を用いて転送の最適 5. カーネルの CUDA 化 スレッド間の相互作用が多いアプリケーションでは shared memory や shuffle 命令を自由に使える CUDA の方が圧倒的に有利

スパコンプログラミング (1)(Ⅰ) 55 データ指示文による最適化手順 int main(){ double A[N]; sub1(a); sub2(a); sub3(a); } sub2(double A){ suba(a); subb(a); } suba(double A){ sub 1 sub A mai n sub 2 sub B sub 3 ホスト デバイス } for( i = 0 ~ N ) { } 葉っぱの部分から OpenACC 化を始める

スパコンプログラミング (1)(Ⅰ) 56 データ指示文による最適化手順 int main(){ double A[N]; sub1(a); sub2(a); sub3(a); } sub2(double A){ suba(a); subb(a); } sub 1 sub A mai n sub 2 sub 3 ホスト data 指示文で配列 Aをコピー sub B デバイス sub A suba(double A){ #pragma acc for( i = 0 ~ N ) { } } この状態でも必ず正しい結果を得られるように作る! この時 速度は気にしない!

スパコンプログラミング (1)(Ⅰ) 57 データ指示文による最適化手順 int main(){ double A[N]; sub1(a); #pragma acc data { sub2(a); } sub3(a); } sub 1 mai n sub 2 ホスト デバイス data sub 指示文で配列 Aをコピー 3 sub 2 sub2(double A){ suba(a); subb(a); } sub A sub B sub A sub B suba(double A){ #pragma acc for( i = 0 ~ N ) { } } 徐々にデータ移動を上流に移動する

スパコンプログラミング (1)(Ⅰ) 58 データ指示文による最適化手順 int main(){ double A[N]; #pragma acc data { sub1(a); sub2(a); sub3(a); } } sub 1 mai n sub 2 sub 3 ホスト デバイス data 指示文で配列 A をコピー sub 1 mai n sub 2 sub 3 sub2(double A){ suba(a); subb(a); } sub A sub B sub A sub B suba(double A){ #pragma acc for( i = 0 ~ N ) { } } ここまで来たら ようやく個別のカーネルの最適化を始める データの転送時間が相対的に十分小さくなればいいので かならずしも最上流までやる必要はない

スパコンプログラミング (1)(Ⅰ) 59 PGI コンパイラによるメッセージの確認方法 コンパイラメッセージの確認は OpenACC では極めて重要 OpenMP と違い 保守的に並列化するため 本来並列化できるプログラムも並列化されないことがある 並列化すべきループが複数あるため どのループにどの粒度 (gang, worker, vector) が割り付けられたかしるため ターゲットデバイスの性質上 立ち上げるべきスレッド数が自明に決まらず スレッドがいくつ立ち上がったか知るため 感覚としては Intelコンパイラの最適化レポートを見ながらのSIMD 化に近い メッセージを見て プログラムを適宜修正する コンパイラメッセージ出力方法 コンパイラオプションに -Minfo=accel をつける

スパコンプログラミング (1)(Ⅰ) 60 よく使うツール群 PGI コンパイラが出力するレポート pgfortran -Minfo=accel 環境変数 PGI_ACC_TIME export PGI_ACC_TIME=1 で 標準エラーに実行情報が出力される NVIDIA Visual Profiler cuda-gdb

PGI コンパイラによ るメッセージの確認 コンパイラオプションとして -Minfo=accel を付ける サブルーチン名 コンパイラメッセージ (fortran) スパコンプログラミング (1)(Ⅰ) 61 pgfortran -O3 -acc -Minfo=accel -ta=tesla,cc60 -Mpreprocess acc_compute.f90 -o acc_compute acc_kernels: 配列 aはcopyin, bはcopyoutとして扱われます 14, Generating implicit copyin(a(:,:)) Generating implicit copyout(b(:,:)) 15, Loop is parallelizable 16, Loop is parallelizable Accelerator kernel generated Generating Tesla code 15,!$acc loop gang, vector(4)! blockidx%y threadidx%y 16,!$acc loop gang, vector(32)! blockidx%x threadidx%x. ソースコード 8. subroutine acc_kernels() 9. double precision :: A(N,N), B(N,N) 10. double precision :: alpha = 1.0 11. integer :: i, j 12. A(:,:) = 1.0 13. B(:,:) = 0.0 14.!$acc kernels 15. do j = 1, N 16. do i = 1, N 17. B(i,j) = alpha * A(i,j) 18. end do 19. end do 20.!$acc end kernels 21. end subroutine acc_kernels 15, 16 行目の 2 重ループは (32x4) のスレッドでブロック分割して扱います

PGI_ACC_TIME による OpenACC 実行の確認 OpenACC_samples を利用 $ qsub acc_compute.sh 実行が終わると以下ができる acc_compute.sh.exxxxx ( 標準エラー出力 ) acc_compute.sh.oxxxxx ( 標準出力 ) $ less acc_compute.sh.exxxxx PGI_ACC_TIME による出力メッセージ Accelerator Kernel Timing data /lustre/pz0108/z30108/openacc_samples/c/acc_compute.c acc_kernels NVIDIA devicenum=0 time(us): 149,101 50: compute region reached 1 time 51: kernel launched 1 time grid: [1] block: [1] スパコンプログラミング (1)(Ⅰ) 62 40. void acc_kernels(double *A, double *B){ 41. double alpha = 1.0; 42. int i,j; / * A と B 初期化 */ 50. #pragma acc kernels 51. for(j = 0;j < N;j++){ 52. for(i = 0;i < N;i++){ 53. B[i+j*N] = alpha * A[i+j*N]; 54. } 55. } 56. } 起動したスレッド数 device time(us): total=140,552 max=140,552 min=140,552 avg=140,552 elapsed time(us): total=140,611 max=140,611 min=140,611 avg=140,611 50: data region reached 2 times 50: data copyin transfers: 2 device time(us): total=3,742 max=3,052 min=690 avg=1,871 56: data copyout transfers: 1 device time(us): total=4,807 max=4,807 min=4,807 avg=4,807 カーネル実行時間 データ移動の回数 時間

スパコンプログラミング (1)(Ⅰ) 63 参考 :module コマンドの使い方 様々なコンパイラ,MPI 環境などを切り替えるためのコマンド パスや環境変数など必要な設定が自動的に変更される ジョブ実行時にもコンパイル時と同じ module を load すること 使用可能なモジュールの一覧を表示 :module avail 使用中のモジュールを確認 :module list モジュールの load: module load モジュール名 モジュールの unload: module unload モジュール モジュールの切り替え :module switch 旧モジュール新モジュール モジュールを全てクリア : module purge

スパコンプログラミング (1)(Ⅰ) 64 コンパイラ等の切替 : module コマンド デフォルトでは,Intel コンパイラ +Intel MPI cf. module list Currently Loaded Modulefiles: 1) intel/18.1.163 2) intel-mpi/2018.1.163 3) pbsutils PGI コンパイラを使う場合 :(OpenACC や CUDA Fortran) module switch intel pgi/17.5 CUDA 開発環境を使う場合 module load cuda 別途 C コンパイラも必要 ジョブ実行時にも同じ module を load 複数組み合わせても良いが, 順序に注意 環境変数 PATH や LD_LIBRARY_PATH などを確認 MPI を使う場合 ( コンパイラに追加して load, コンパイラにあったものを選ぶ ) module load mvapich2/gdr/2.3a/{gnu,pgi} module load openmpi/gdr/2.1.2/{gnu,intel,pgi}

スパコンプログラミング (1)(Ⅰ) 65 サンプルプログラムの実行 ( 行列 - 行列積 OpenACC)

スパコンプログラミング (1)(Ⅰ) 66 行列 - 行列積のサンプルプログラム (OpenACC 版 ) の注意点 C 言語版および Fortran 言語版のファイル名 Mat-Mat-acc.tar.gz ジョブスクリプトファイル mat-mat-acc.bash 中のキュー名を h-lecture から h-lecture6 グループ名を gt16 に変更し qsub してください h-lecture : 実習時間外のキュー h-lecture6: 実習時間内のキュー Reedbush-H では, キュー名は h- で始まる

スパコンプログラミング (1)(Ⅰ) 67 行列 - 行列積のサンプルプログラムの実行 以下のコマンドを実行する $ cdw $ cp /lustre/gt16/z30105/mat-mat-acc.tar.gz./ $ tar xvfz Mat-Mat-acc.tar.gz $ cd Mat-Mat-acc 以下のどちらかを実行 $ cd C : C 言語を使う人 $ cd F : Fortran 言語を使う人 以下は共通 $ module switch intel pgi/18.7 $ make $ qsub mat-mat-acc.bash 実行が終了したら 以下を実行する $ cat mat-mat-acc.bash.oxxxxx

スパコンプログラミング (1)(Ⅰ) 68 行列 - 行列積のコードの OpenMP 化の解答 (C 言語 ) 以下のようなコードになる #pragma omp parallel for private (j, k) for(i=0; i<n; i++) { for(j=0; j<n; j++) { for(k=0; k<n; k++) { C[i][j] += A[i][k] * B[k][j]; } } }

スパコンプログラミング (1)(Ⅰ) 69 行列 - 行列積のコードの OpenACC 化 すべて GPU 上で実行 #pragma acc kernels copyin(a[0:n][0:n], B[0:N][0:N]) copyout(c[0:n][0:n]) #pragma acc loop independent gang for(i=0; i<n; i++) { #pragma acc loop independent vector for(j=0; j<n; j++) { double dtmp = 0.0; #pragma acc loop seq for(k=0; k<n; k++) { dtmp += A[i][k] * B[k][j]; } C[i][j] = dtmp; } }

スパコンプログラミング (1)(Ⅰ) 70 行列 - 行列積のコードの OpenMP 化の解答 (Fortran 言語 ) 以下のようなコードになる!$omp parallel do private (j, k) do i=1, n do j=1, n do k=1, n C(i, j) = C(i, j) + A(i, k) * B(k, j) enddo enddo enddo

スパコンプログラミング (1)(Ⅰ) 71 行列 - 行列積のコードの OpenACC 化 (Fortran 言語 ) すべて GPU 上で実行!$acc kernels copyin(a,b) copyout(c)!$acc loop independent gang do i=1, n!$acc loop independent vector do j=1, n dtmp = 0.0d0!$acc loop seq do k=1, n dtmp = dtmp + A(i, k) * B(k, j) enddo C(i,j) = dtmp enddo enddo!$acc end kernels

行列 - 行列積のサンプルプログラムの実行 以下のような結果が見えれば成功 N = 8192 Mat-Mat time = 8.184022 [sec.] 134348.567798 [MFLOPS] OK! 実際にはデータ転送の時間が含まれている. 正味の計算時間は mat-mat-acc.bash.e* にある MyMatMat NVIDIA devicenum=0 time(us): 6,864,586 つまり 160GFLOPS スパコンプログラミング (1)(Ⅰ) 72

スパコンプログラミング (1)(Ⅰ) 73 Reedbush を用いた成果例

スパコンプログラミング (1)(Ⅰ) 74 ChainerMN Chainer Preferred Networksによって開発されているニューラルネットワークのためのフレームワーク Open Source Software Python GPU 向けに内部で CUDA や cudnn を使用 ChainerMN Chainerのマルチノード拡張 MPI (Message Passing Interface) NCCL (NVIDIA Collective Communications Library) の活用 クラスタ内のGPU 間における集団通信を最適化 必要な通信の大半は集団通信の Allreduce 通信

スパコンプログラミング (1)(Ⅰ) 75 Reedbush-H での ImageNet 学習 Accuracy 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1 0 64 GPU(H) 128 GPU(H) 240 GPU(H) 0 2000 4000 6000 8000 10000 Elapsed time (sec) 高いスケーラビリティ # GPUs ResNet-50 100 エポック実行 100 epoch 実行時間 64, 128, 240 GPU (RB-H) ChainerMN 1.0.0 OpenMPI 2.1.1, NCCLv2 Chainer 3.1.0 python 3.6.1, CUDA 8, cudnn7, cupy 2.1.0 精度 32 6 時間で終了せず (72%) 64 3 時間 58 分 20 秒 72.0% 128 1 時間 59 分 02 秒 72.2% 240 1 時間 7 分 24 秒 71.7%

スパコンプログラミング (1)(Ⅰ) 76 Seq2seq 学習結果 BLEU 0.25 0.2 0.15 0.1 32GPU # GPUs 15 epoch 実行時間 32 24 時間で終了せず (12 epoch) BLEU (~23.6 %) 64 13.6 時間 23.5 % 15 エポック実行 64GPU 32, 64 GPU (RB-H) 0.05 0 0 5 10 15 20 25 Elapsed time (hour) ChainerMN 1.0.0 OpenMPI 2.1.1, NCCLv2 Chainer 3.1.0 python 3.6.1, CUDA 8, cudnn7, cupy 2.1.0

スパコンプログラミング (1)(Ⅰ) 77 Reedbush における Python 環境構築 1. Module コマンドでインストール済みのものをロード module avail でモジュール名を確認しロードする module load chainer/2.0.0 module load chainermn/1.3.0 openmpi/gdr/2.1.2/intel module load horovod/0.15.2 (keras 2.2.4, tensorflow 1.8.0 込み ) 随時更新 ( リクエスト可 ), しかし残念ながら更新頻度には限界 2. 半分自力で構築 インストール済みの Anaconda を使う ある物は極力使いつつ, 最新を追いかける 3. 基本的に自力で構築 Anaconda も自分で入れたい場合 等々

スパコンプログラミング (1)(Ⅰ) 78 Anaconda を利用した ChainerMN 環境構築 1. CUDA モジュールをロード $ module load cuda/8.0.44-cudnn7 2. MPI モジュールを Open MPI に切り替え CUDA Aware な MPI が必要 GPU Direct を使いたい MVAPICH2 ではエラーになる $ module switch intel-mpi openmpigdr/2.1.1/intel 3. Anaconda モジュールをロード $ module load anaconda3 4. HOME を /lustre に差し替え 計算ノードは /lustre 以下を使用 $ export HOME=/lustre/gi99/i12345 5. Anaconda の環境を create, activate $ conda create -n chainermn python=3 $ source activate chainermn 6. cupy をインストール $ pip install -U cupy --no-cache-dir -vvv 7. cythonをインストール 8. chainerをインストール 9. chainermnをインストール スパコンニュース 7 月号に新しい情報を執筆

スパコンプログラミング (1)(Ⅰ) 79 ChainerMN 実行 リソースグループ名 :h-regular 構築の際使ったのと同じモジュールをロード, 環境変数を設定 ジョブ登録 $ qsub train_imagenet.sh ジョブ実行状況 $ rbstat 実行中の出力確認 利用ノード数 RB-H 32 ノード =64GPU $ tail -f log-ジョブ番号.reedbushpbsadmin0 (Ctrl+C 入力 ) 利用グループ名 :gi99 スパコンニュース 7 月号に新しい情報を執筆 実行時間制限 :4 時間 ジョブスクリプト例 : train_imagenet.sh #!/bin/sh #PBS -q h-regular #PBS -l select=32:mpiprocs=2 #PBS -l walltime=04:00:00 #PBS -W group_list=gi99 cd $PBS_O_WORKDIR module load cuda/8.0.44-cudnn7 anaconda3 module switch intel-mpi openmpi-gdr/2.1.1/intel export HOME=/lustre/gi99/i12345 source activate chainermn mpirun --mca mtl ^mxm --mca coll_hcoll_enable 0 --mca btl_openib_want_cuda_gdr 1 --mca mpi_warn_on_fork 0./get_local_rank_ompi python train_imagenet.py >& log-${pbs_jobid}

スパコンプログラミング (1)(Ⅰ) 80 レポート課題 1. [L10] GPU 搭載スパコンについて なるべく最新の 3 機種について詳細を調査せよ Top500, HPCG, Green500 などを参考にすること 2. [L30~40] これまで実施した演習問題について OpenACC を用いた記述に変更し GPU 上で実行し性能を評価せよ ( ベースの問題に応じて変動 ) 問題のレベルに関する記述 : L00: きわめて簡単な問題 L10: ちょっと考えればわかる問題 L20: 標準的な問題 L30: 数時間程度必要とする問題 L40: 数週間程度必要とする問題 複雑な実装を必要とする L50: 数か月程度必要とする問題 未解決問題を含む L40 以上は 論文を出版するに値する問題

スパコンプログラミング (1)(Ⅰ) 81 半年間お疲れ様でした コンテスト レポートを頑張ってください