Simulation Summer School 2015 : 8/3-7 千葉大学

Slides:



Advertisements
Similar presentations
G ゼミ 2010/5/14 渡辺健人. パフォーマンスの測定 CUDA Visual Profiler CUDA の SDK に標準でついているパフォーマン ス測定用のツール 使い方: exe ファイルのパスと作業ディレクトリ指定して実 行するだけ 注意点 : GPU のコード実行後にプログラム終了前に,
Advertisements

「 R 入門」 第6章:リストとデータフレーム 6.3 データフレーム 発表日:10月30日 担当者:脇坂恭志郎.
Doxygen ~ IGModel を一例にした, 数値モデルのドキュメンテーションにおける Doxygen の利用
連続系アルゴリズム演習 第2回 OpenMPによる課題.
知能機械工学科 担当:長谷川晶一 TA:新・後藤・ナンバ
ビッグデータ解析手法を用いた 宇宙天気予報アルゴリズムの開発
Fortran と有限差分法の 入門の入門の…
極小集合被覆を列挙する 実用的高速アルゴリズム
計算科学演習 第6回 講義 「OpenMP並列処理」
運動方程式の方法: 惑星の軌道 出席のメール(件名に学生番号と氏名)に,中点法をサブルーチンを使って書いたプログラムを添付
SharePoint Server において 構成ウィザードが失敗する場合の トラブルシューティング
FORTRAN 科学技術計算用 数値演算精度を重視したシステム K=0 DO 10 I=0,N,1 K=K+I 10 CONTINUE
LMNtalからC言語への変換の設計と実装
2006/11/30 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
DNASシステム上のアプリケーション起動シーケンスのための基盤であるdsh部分の性能評価
コンパイラ演習番外編 (その1): min-rt 改 コンテスト
LMNtalからC言語への変換の設計と実装
スペクトル法による数値計算の原理 -一次元線形・非線形移流問題の場合-
LMNtalからC言語への変換の設計と実装
技術トピックス 2014/08.
高次精度化&特性変数変換 柴山拓也 (名大、STEL) 2015年8月7日.
中間発表用スライド 田中健太.
シミュレーション物理5 運動方程式の方法: サブルーチンの使い方.
オブジェクト指向プログラミング(2) OOPの三大要素 「クラス」「ポリモーフィズム」「継承」
2007/1/18 山下 諒蔵 佐藤 春旗 前田 俊行 大山 恵弘 佐藤 秀明 住井 英二郎
  【事例演習6】  数式インタプリタ      解 説     “インタプリタの基本的な仕組み”.
数値相対論の展望        柴田 大 (東大総合文化:1月から京大基研).
京都大学大学院医学研究科 画像応用治療学・放射線腫瘍学 石原 佳知
文献名 “Performance Tuning of a CFD Code on the Earth Simulator”
進捗 Javaバイトコード変換による 細粒度CPU資源管理
2003年12月2日 課題研究ガイダンス (3分) S2 太陽物理 柴田一成 花山天文台 北井礼三郎 飛騨天文台.
現実の有限密度QCDの定性的な振る舞いに
ステンシル計算を対象とした 大規模GPUクラスタ向け 自動並列化フレームワーク
有機化合物に対する第一原理GW計算 arXiv: 東京大学
プロセス間データ通信  齋藤グループ 小林 直樹
格子QCDにおけるGPU計算 広大理 尾崎裕介 共同研究者 石川健一.
PCPU物理設計 ~マクロレベルの配置配線~
PGIコンパイラーによる ディレクティブベースのGPGPU
第二回 VB講座 電卓を作ろう.
MPIとOpenMPを用いた Nクイーン問題の並列化
Java Virtual Machine 高速化のためのbyte code 解析 An analysis of byte code to improve the performance of Java Virtual Machine 鈴木タカハル 谷研究室 Feb, 2003.
デバッガ dbx の使い方.
平成30年度高知工科大学教職科目 微分方程式特論I 11 高知大学教育学部技術教育コース 北川 晃.
基礎宇宙物理学 II 電磁流体力学入門 第1回 天体活動現象入門 2011年4月8日.
通信機構合わせた最適化をおこなう並列化ンパイラ
0.2 プロジェクトの準備 DXライブラリを使うための準備.
磁気浮上領域での太陽ジェットと エネルギー解放
実行時情報を用いて通信を最適化するPCクラスタ上の並列化コンパイラ
phononの分散関係の計算 -カイラルナノチューブ(18,3)-
MPIを使った加算  齋藤グループ 小林直樹
第5回 個人の動画配信補足のためのWeb構築
2. 浮上磁場とリコネクション 様々な太陽のジェット現象 -----宮越 2. 対流現象を粒子で追いかける -----野澤
目的:高速QR分解ルーチンのGPUクラスタ実装
太陽フレアと彩層底部加熱に関する 観測的研究
新潟大学集中講義 ープラズマ物理学特論ー (天体電磁流体力学入門) 2004年1月19日ー1月21日
基礎宇宙物理学 II 電磁流体力学入門 第1回 天体活動現象入門 2012年4月13日.
岩澤全規 理化学研究所 計算科学研究機構 粒子系シミュレータ研究チーム 2015年7月22日 AICS/FOCUS共催 FDPS講習会
C言語 はじめに 2016年 吉田研究室.
シミュレーション物理 大槻東巳.
参照されないリテラル 長谷川啓
全体ミーティング (5/23) 村田雅之.
社会の情報インフラストラクチャとして、高性能コンピュータおよびネットワークの重要性はますます増大しています。本研究室では、コンピュータおよびネットワークの高速化を狙いとする並列・分散情報処理の科学と技術に関する研究に取り組んでいます。効率のよいシステムの実現を目指して、下記の項目を追求しています。 ◇コンピュータアーキテクチャ.
サブゼミ第7回 実装編① オブジェクト型とキャスト.
川島 朋尚 (国立天文台)、朝比奈 雄太 (国立天文台)、工藤祐己 (千葉大) supervised by 松本 洋介 (千葉大)
基礎宇宙物理学 II 電磁流体力学入門 第1回 天体活動現象入門 2012年4月13日.
目的とするユーザーコードを 作成するために
河村 聡人 京都大学附属花山天文台 2017/08/25 – CANS+部分電離化計画 河村 聡人 京都大学附属花山天文台 2017/08/25 –
Bash on Ubuntu on Windowsに オープンCAEのソフトを インストールする(2)
0.1 DXライブラリの導入 必要なファイルの準備.
2011年8月9日の巨大フレアに伴う Ha線モートン波とEUV波現象、および プロミネンス/フィラメント振動について (Asai et al
Presentation transcript:

Simulation Summer School 2015 : 8/3-7 千葉大学 PIPコード高速化 河村 聡人 京都大学 花山天文台 D2 (メンター:松本洋介) Simulation Summer School 2015 : 8/3-7 千葉大学

Partially Ionized Plasma (PIP)コード 開発チーム・京大 柴田一成 門下   中村、高棹、Hillier、(+ 河村) 2流体:中性流体、プラズマ 多解法:HLLD、SLW MPI実装済み 太陽の彩層における 現象を解く為に開発 (例:下図、Hinode衛星による彩層ジェットの観測)

PIPコードの問題点=洗練されてない 原因。 SLWコード (中村) とHLLDコード (高棹) を第三者 (Hillier) が無理やりくっつけた為(と思う)。 今回やりたかったこと。 高速化(のノウハウを得る)。  コードの無駄を省く ⇒ スカラチューニング  コードのハイブリッド並列化 ⇒ OpenMPの実装 Originalコード  既に’-O2’にてコンパイル。(gfortran使用)  定数の割り算は掛け算になっている。  今回はSLWを選択  解く問題はカレントシートの力学的釣り合いのチェック

無駄を見つける (gprof w/ option ‘-pg’) Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 60.29 16.58 16.58 144 0.12 0.13 __scheme_rot_MOD_artvis 8.29 18.86 2.28 72 0.03 0.03 __solver_rot_MOD_add_flux 7.16 20.83 1.97 154 0.01 0.01 __scheme_rot_MOD_cq2pv_mhd 今回は時間がないので、artvis (人工粘性) のところだけ 高速化した。 DOループの順番変え ⇒ (採用) なぜか遅くなった。 WHEREの削除 ⇒ (不採用) WHEREの方が速かった。 より良いコンパイルオプションの選択 ⇒ “-O3 –mavx” OpenMPの実装 ⇒ ‘WORKSHARE’より’DO’!? 詳細は予備スライドに。

スカラチューニングとコンパイルオプション 環境:1ノード・Core i7 (Hyper Threading: 8 virtual cores) MPI nodes = 2 遅い 速い コンパイルオプションを適切に選べば 数%の高速化は直ぐに可能の様だ。

OpenMPの実装: ‘WORKSHARE’より’DO’!? 環境:1ノード・Core i7 (Hyper Threading: 8 virtual cores) MPI nodes = 2  OpenMP threads = 2, 3, 4 遅い 一部WORKSHAREではなくDOを使用。 速い OpenMPを実装するとなぜか遅くなった。 OpenMPの実装の中ではThread数を増やせば速くなった。

クラスタ システムではより意味があると信じて、 高速化を試してみて コードのスカラチューニングは一筋縄ではいかない。(OpenMPあり/なしでも違う!?) コンパイルオプションは試し易い。 OpenMPはやる価値がある(?) クラスタ システムではより意味があると信じて、   残りの部分もOpenMP化してより、 良い並列化&高速化をしたい。

5日間、お世話になりました (_ _*)(*_ _)ペコリ

【スカラチューニング】DOループの順番変え 一番離れた変数群を まとめて処理していた do k=zs,ze do j=ys,ye do i=xs,xe U(i,j,k,1:n_target) = U(i,j,k,1:n_target) & - dt*( F(i,j,k,:,dir) & -F(i-1,j,k,:,dir) )/dx(i) & *tanh(dv(i,j,k)) enddo [Original Code] 一番近い変数群を まとめて処理する ように変更 do ntrgt=1,n_target do k=zs,ze do j=ys,ye U(xs:xe,j,k,ntrgt) = U(xs:xe,j,k,ntrgt) & - dt*( F(xs:xe,j,k,ntrgt,dir) & -F(xs-1:xe-1,j,k,ntrgt,dir) )/dx(:) & *tanh(dv(xs:xe,j,k)) enddo [Modefied Code]

【スカラチューニング】DOループの順番変え 一番離れた変数群を まとめて処理していた do k=zs,ze do j=ys,ye do i=xs,xe U(i,j,k,1:n_target) = U(i,j,k,1:n_target) & - dt*( F(i,j,k,:,dir) & -F(i-1,j,k,:,dir) )/dx(i) & *tanh(dv(i,j,k)) enddo [Original Code] 一番近い変数群を まとめて処理する ように変更 遅くなった!? [Modefied Code] do ntrgt=1,n_target do k=zs,ze do j=ys,ye U(xs:xe,j,k,ntrgt) = U(xs:xe,j,k,ntrgt) & - dt*( F(xs:xe,j,k,ntrgt,dir) & -F(xs-1:xe-1,j,k,ntrgt,dir) )/dx(:) & *tanh(dv(xs:xe,j,k)) enddo [Modefied Code]

【スカラチューニング】whereの排除 phi(:,:,;,:) = 0.0d0 [Original Code] where((UR(xs:xe,ys:ye,zs:ze,:)-UL(xs:xe,ys:ye,zs:ze,:)) & *(U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target))>0.0d0) & phi(xs:xe,ys:ye,zs:ze,:)= & ((UL(xs:xe,ys:ye,zs:ze,:)-UR(xs:xe,ys:ye,zs:ze,:)) /& (U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target)))**2 [Original Code] phi(:,:,:,:) = 0.0d0 adktmp(xs:xe,ys:ye,zs:ze,:)=0.5*(1- & sign(1.d0,(UL(xs:xe,ys:ye,zs:ze,:)-UR(xs:xe,ys:ye,zs:ze,:)) & *(U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target)))) ! phi is nonzero is adktmp eq 1 otherwize adktmp eq 0 phi(xs:xe,ys:ye,zs:ze,:) = (dU(xs:xe,ys:ye,zs:ze,:)*dU(xs:xe,ys:ye,zs:ze,:)& *(min(adktmp(xs:xe,ys:ye,zs:ze,:),erreps)/erreps)/& max((U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)-& U(xs:xe,ys:ye,zs:ze,1:n_target))**2*adktmp(xs:xe,ys:ye,zs:ze,:),erreps)) phi(xs:xe,ys:ye,zs:ze,:) = phi(xs:xe,ys:ye,zs:ze,:)*phi(xs:xe,ys:ye,zs:ze,:) [Modefied Code]

【スカラチューニング】whereの排除 遅くなった!? phi(:,:,;,:) = 0.0d0 [Original Code] where((UR(xs:xe,ys:ye,zs:ze,:)-UL(xs:xe,ys:ye,zs:ze,:)) & *(U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target))>0.0d0) & phi(xs:xe,ys:ye,zs:ze,:)= & ((UL(xs:xe,ys:ye,zs:ze,:)-UR(xs:xe,ys:ye,zs:ze,:)) /& (U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target)))**2 [Original Code] phi(:,:,:,:) = 0.0d0 adktmp(xs:xe,ys:ye,zs:ze,:)=0.5*(1- & sign(1.d0,(UL(xs:xe,ys:ye,zs:ze,:)-UR(xs:xe,ys:ye,zs:ze,:)) & *(U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)- & U(xs:xe,ys:ye,zs:ze,1:n_target)))) ! phi is nonzero is adktmp eq 1 otherwize adktmp eq 0 phi(xs:xe,ys:ye,zs:ze,:) = (dU(xs:xe,ys:ye,zs:ze,:)*dU(xs:xe,ys:ye,zs:ze,:)& *(min(adktmp(xs:xe,ys:ye,zs:ze,:),erreps)/erreps)/& max((U(xs+is:xe+is,ys+js:ye+js,zs+ks:ze+ks,1:n_target)-& U(xs:xe,ys:ye,zs:ze,1:n_target))**2*adktmp(xs:xe,ys:ye,zs:ze,:),erreps)) phi(xs:xe,ys:ye,zs:ze,:) = phi(xs:xe,ys:ye,zs:ze,:)*phi(xs:xe,ys:ye,zs:ze,:) 遅くなった!? [Modefied Code]

【スカラチューニング】コンパイルオプション 使用コンパイラ:mpif90 (gfortran) 元の最適化コンパイルオプション  “-O2” 変更後  “-O3 –mavx” ⇒ 速くなりました。

【スカラチューニング】コンパイルオプション 使用コンパイラ:mpif90 (gfortran) 元の最適化コンパイルオプション  “-O2” 変更後  “-O3 –mavx” ⇒ 速くなりました。 コードの変更がいらないので、 とりあえずコンパイルオプションを変えてみるだけでも高速化をやってみる価値はあると思う。 ”-O3 –mavx2”の方がいいらしい。

OpenMP実装 コンパイルオプション ’-fopenmp’ を追加 “!$OMP WORKSHARE”や”!$OMP DO”を各所に追加 1) gprofの出力がおかしい。  callしていないルーチンが動いている事になっている。  ⇒ OpenMPが動くとgprofが正常に動作しない。   ⇒ ‘-pg’ を消す。 2) コンパイル出来ない (OpenMPなしでコンパイル可)  エラーメッセージ  > internal compiler error : output_operand : floating constant misused  ⇒ コンパイル時のデバッグオプション ‘–g’ を消す。

Gprof使わず、何で時間測る? ? MPI : FUNCTION MPI_WTIME() OpenMPを使っている時はきれいに出ないらしい △ OpenMP : FUNCTION OMP_GET_WTIME()     ちゃんと測れているのか、結果をみると不安 ? Fortran : SUBROUTINE DATE_AND_TIME(…)     MPI_WTIMEと同じ結果。