• 検索結果がありません。

1. TSUBAME2.0 通 常 実 行 まで 1.1. 環 境 設 定 (MPI ライブラリ&コンパイラ) 最 新 の Open MPI と Intel コンパイラを 使 用 するため,${HOME}/.bashrc 等 で 環 境 変 数 (パス 等 )を 設 定 します. ~ 設 定 例 ~

N/A
N/A
Protected

Academic year: 2021

シェア "1. TSUBAME2.0 通 常 実 行 まで 1.1. 環 境 設 定 (MPI ライブラリ&コンパイラ) 最 新 の Open MPI と Intel コンパイラを 使 用 するため,${HOME}/.bashrc 等 で 環 境 変 数 (パス 等 )を 設 定 します. ~ 設 定 例 ~"

Copied!
14
0
0

読み込み中.... (全文を見る)

全文

(1)

プロファイルツール実行例 アプリ「GT5D」 2013 年 8 月 26 日 日本電気株式会社

0. はじめに

本ドキュメントでは,アプリ「GT5D」におけるプロファイルツール連携の作業履歴を記載します.

目次

1. TSUBAME2.0‐通常実行まで ... 2 1.1. 環境設定(MPI ライブラリ&コンパイラ) ... 2 1.2. コンパイルとソース修正 ... 2 1.2.1. Makefile の修正 ... 2 1.2.2. OpenMP 指示行の修正 ... 3 1.3. バッチジョブ実行 ... 5 1.4. 実行結果の確認 ... 6 2. TSUBAME2.0‐Scalasca 連携実行 ... 7 2.1. Scalasca 環境設定 ... 7 2.2. Scalasca 連携‐コンパイル ... 7 2.2.1. コンパイラの設定 ... 7 2.2.2. MAIN プログラムの書式 ... 8 2.2.3. プリプロセスの分離 ... 9 2.2.4. OpenMP 指示行中のプリプロセッサ命令... 10 2.2.5. OpenMP 指示行(継続行)の誤認識... 11 2.3. Scalasca 連携‐プログラム実行... 12 2.4. Scalasca 連携‐実行結果の表示(可視化) ... 13 2.5. その他(※未完了項目) ... 14

(2)

1. TSUBAME2.0‐通常実行まで

1.1. 環境設定(MPI ライブラリ&コンパイラ)

最新の Open MPI と Intel コンパイラを使用するため,${HOME}/.bashrc 等で環境変数(パス等)を 設定します. ~設定例~ export SELECT_MPI=/usr/apps/openmpi/1.6.3/intel export PATH=${SELECT_MPI}/bin:$PATH export LD_LIBRARY_PATH=${SELECT_MPI}/lib:$LD_LIBRARY_PATH ※2013 年 8 月現在,デフォルトの Intel コンパイラの ver.は 13.0 です. 1.2. コンパイルとソース修正 TSUBAME2.0 環境におけるプログラム移植のための修正を記載します. 1.2.1. Makefile の修正 TSUBAME2.0 環境に合わせて,コンパイラおよびオプションの修正を行います.ソースコード環 境に含まれている’ Makefile.intel’の内容を参考にして, Makefile を作成しました. ~修正後:Makefile~ .SUFFIXES: .f .o fc = mpif90

cflag = -openmp -O3 -xHost -r8 -ipo -shared-intel -mcmodel=large -fpp -DMPI2=0 -DFFT_MKL -DBX -DFLATDIR -I$(MKLROOT)/include

libs = -mkl=parallel

.f.o:

$(fc) $(cflag) -c $<

obj = main.o init.o cip.o col.o bvector.o fem.o src.o diag.o tool.o time.o asrc.o

all: mkl_dfti $(obj)

$(fc) $(cflag) -o GT5D $(obj) $(libs)

mkl_dfti:

ifort -c $(MKLROOT)/include/mkl_dfti.f90

clean::

rm -f ./*.o ./*.mod core GT5D

(3)

1.2.2. OpenMP 指示行の修正 TSUBAME2.0(Intel コンパイラ)環境では,一部の OpenMP 指示行が原因で結果不正が発生してい ました.エラー発生箇所を調査した結果,以下の 2 つの問題点が見つかりました. ・ PRIVATE 属性の追加漏れ ・ 不要な REDUCTION 節の記述 ~修正前:diag.f(140 行目付近)~

!$OMP PARALLEL DO PRIVATE(j,i) !FRT ★最内側のループ変数kの指定が必要 do i = 1,nx do j = 1,ny do k = 1,nz dwk(i,j,k,1) = phd(i,j,k) vxa(j,i)=vxa(j,i)+vx1(k,j,i)/dble(nz) vya(j,i)=vya(j,i)+vy1(k,j,i)/dble(nz) enddo enddo enddo !fj>

!$OMP PARALLEL DO DEFAULT(NONE)

!$OMP&REDUCTION(+:wk) ★iループで並列化する場合,wkはREDCTION処理にならない !$OMP& PRIVATE(i,j,k,l,dzz,vp,v,hk,ff,vx,vy) !$OMP& SHARED(bbs,vx1,vy1,vxa,vya,bb,dww,vy0,vx0,f,w) !fj< do i = 1,nx dzz=dv*dww*2*pi*ami/b0**2 do j = 1,ny vp = dsqrt(bb(i,j)/b0)*w do k = 1,nz do l = 1,nv v = (l-nv/2-0.5d0)*dv hk = 0.5*ami*(v**2+vp**2) ff = f(l,k,j,i) wk(i,j,k,2) = wk(i,j,k,2)+ff*dzz*bbs(i,j,l) wk(i,j,k,3) = wk(i,j,k,3)+ff*dzz*bbs(i,j,l)*v wk(i,j,k,4) = wk(i,j,k,4)+ff*dzz*bbs(i,j,l)*hk

(4)

~修正後:diag.f(140 行目付近)~ !$OMP PARALLEL DO PRIVATE(k,j,i) !FRT do i = 1,nx do j = 1,ny do k = 1,nz dwk(i,j,k,1) = phd(i,j,k) vxa(j,i)=vxa(j,i)+vx1(k,j,i)/dble(nz) vya(j,i)=vya(j,i)+vy1(k,j,i)/dble(nz) enddo enddo enddo !fj>

!$OMP PARALLEL DO DEFAULT(NONE)

!$OMP& PRIVATE(i,j,k,l,dzz,vp,v,hk,ff,vx,vy) !$OMP& SHARED(bbs,vx1,vy1,vxa,vya,bb,dww,vy0,vx0,f,w,wk) !fj< do i = 1,nx dzz=dv*dww*2*pi*ami/b0**2 do j = 1,ny vp = dsqrt(bb(i,j)/b0)*w do k = 1,nz do l = 1,nv v = (l-nv/2-0.5d0)*dv hk = 0.5*ami*(v**2+vp**2) ff = f(l,k,j,i) wk(i,j,k,2) = wk(i,j,k,2)+ff*dzz*bbs(i,j,l) wk(i,j,k,3) = wk(i,j,k,3)+ff*dzz*bbs(i,j,l)*v wk(i,j,k,4) = wk(i,j,k,4)+ff*dzz*bbs(i,j,l)*hk

(5)

1.3. バッチジョブ実行 コンパイルして作成した実行モジュール「GT5D」と,配布されたデータ一式を使用して,バッチ ジョブを実行します. 問題サイズは以下の通りで,性能計測モード(ifdbg=1)で実行しました. ~使用ケース~ 問題サイズ (nnx,nny,nnz,nnv,npw)=(120,120,32,64,4) 並列数 32ノード(MPI 64プロセス×OpenMP 6スレッド 分割設定 (npx,npy,npw)=(4,4,4) ステップ数 nt=100 ~バッチジョブスクリプト(go.sh)~ #!/bin/bash cd ${PBS_O_WORKDIR} export OMP_NUM_THREADS=6

mpirun -np 64 --report-bindings -bysocket -cpus-per-proc 6 -bind-to-core -x OMP_NUM_THREADS -hostfile ${PBS_NODEFILE} ./GT5D >& ./log.mpi

・ 作業ディレクトリと同じパス(PBS_O_WORKDIR)に移動し,mpirun を実行します. ・ 環境変数 OMP_NUM_THREADS は,mpirun の「-x」オプションで全プロセスに渡します. ・ TSUBAME2.0(westmere)は,6 コア*2 ソケットの計 12 個の物理的 CPU 構成となっています.

bind に関する記述は Open MPI のオプションであり,ハイブリッド実行時の各プロセスをソ ケット毎に割り当てる設定となります.

※ その他,バッチジョブの詳細については省略します(詳細はマニュアルにて)

~バッチジョブ投入方法~

% t2sub -q S -W group_list=t2g-hp120261 -l walltime=01:00:00 -l select=32:ncpus=6:mpiprocs= 2:mem=50gb -l place=scatter ./go.sh

・ 「-q」でキュー名,「-W group_list」でグループ名を指定します(ワークショップ用リソー ス,およびアプリ FS の課題番号の情報に基づいて設定します) ・ 「-l select=32:ncpus=6:mpiprocs=2:mem=50gb -l place=scatter」で,2 プロセス&50GB のチャンクを 32 個分確保します.結果的に,32 ノード,MPI 64 プロセスの実行の設定と なります.使用時間(上限)は,「-l walltime」で設定します. ※ その他,バッチジョブの詳細については省略します(詳細はマニュアルにて)

(6)

1.4. 実行結果の確認

バッチジョブのログ(OTHERS.e*,OTHERS.o*)と mpirun の実行ログ(log.mpi)を確認し,プログラ ムが問題なく動作していることを確認しました. ~実行ログ(log.mpi)抜粋~ : subroutine costs(msec) init________ 7202.70068359375 dn__________ 2.22922119140625 field_______ 29.0511230468750 drift_______ 4.64650878906250 l4d_nl______ 19.8482055664062 l4d_l_______ 230.803220214844 rk__________ 498.912287597656 bc__________ 159.725722656250 col_________ 153.361323242187 asrc________ 0.104199218750000 out_________ 1.391601562500000E-004 1step_______ 1098.68195068359 end_________ 0.000000000000000E+000 communication costs(msec) total_______ 1098.68195068359 calc________ 941.514101028442 comm________ 157.167849655151 :

(7)

2. TSUBAME2.0‐Scalasca 連携実行

2.1. Scalasca 環境設定 Scalasca は,アプリ FS 共用にインストールしたパッケージを使用します.節 1.1 の環境設定に加 えて,${HOME}/.bashrc 等で環境変数(パス等)を設定します. ~設定例~ export PATH=/work1/t2g-hp120261/fs_share_tool/scalasca-1.4.3/bin:${PATH} export PAPI_ROOT=/work0/GSIC/apps/papi-5.0.0 export PATH=${PATH}:${PAPI_ROOT}/bin export LD_LIBRARY_PATH=${LD_LIBRARY_PATH}:${PAPI_ROOT}/lib export LIBRARY_PATH=${LIBRARY_PATH}:${PAPI_ROOT}/lib export FPATH=${FPATH}:${PAPI_ROOT}/include export CPATH=${CPATH}:${PAPI_ROOT}/include export MANPATH=${MANPATH}:${PAPI_ROOT}/man ※2013 年 8 月現在,Scalasca は ver.1.4.3 がインストールされています. ※HW カウンタの情報は,PAPI を利用して採取しています.PAPI の環境設定は不要ですが,異なる PAPI の ver.を設定している場合には,削除する必要があります. 2.2. Scalasca 連携‐コンパイル 2.2.1. コンパイラの設定 Scalasca を利 用し たコン パイ ルは ,基本 的には mpif90 等 コン パイ ラのコ マン ドの 前に 「scalasca -instrument」(もしくは短縮形「skin」)を追加するのみです.Makefile の該当部分 を修正しました. ~修正前:Makefile~ .SUFFIXES: .f .o fc = mpif90

cflag = -openmp -O3 -xHost -r8 -ipo -shared-intel -mcmodel=large -fpp -DMPI2=0 -DFFT_MKL -DBX -DFLATDIR -I$(MKLROOT)/include

~修正後:Makefile~ .SUFFIXES: .f .o

fc = skin mpif90

cflag = -openmp -O3 -xHost -r8 -ipo -shared-intel -mcmodel=large -fpp -DMPI2=0 -DFFT_MKL -DBX -DFLATDIR -I$(MKLROOT)/include

(8)

2.2.2. MAIN プログラムの書式

MAIN プログラムをコンパイル時,Scalasca が行うソースコードの変換によってコンパイルエラ ーが発生します(メッセージ中に,pomp や opari といったキーワードが含まれる).Scalasca の字 句解析を妨げる要因として,MAIN プログラム中に以下の 2 つの問題点が見つかりました. ・ 先頭に「PROGRAM ~」の記述がない ・ 最後の END の直前(正常終了時)に STOP 文が存在する ~修正前:main.f~ #ifdef HDF5 use hdf5 #endif

implicit real*8 (a-h,o-z) include "paramlist.f" include "mpif.h" dimension :※中略※ call mpi_finalize(ierr) stop end ~修正後:main.f~ program fs_gt5d #ifdef HDF5 use hdf5 #endif

implicit real*8 (a-h,o-z) include "paramlist.f" include "mpif.h" dimension :※中略※ call mpi_finalize(ierr) C stop end

(9)

2.2.3. プリプロセスの分離 コンパイルと同時にプリプロセス(cpp,fpp 等)を行うプログラムでは,Scalasca 連携のコンパ イルが正常に動作しない場合に,プリプロセスとコンパイルを分離して再実行します. アプリ「GT5D」では,Makefile に以下の変更を加えることで,プリプロセスの分離を実現しま した. ・ コマンドおよびオプションを,各々プリプロセス用とコンパイル用に分類する ・ オブジェクト(*.o)作成部分を 2 段階(プリプロセス→コンパイル)に処理する ~修正後:Makefile~ .SUFFIXES: .f .o fc = skin mpif90

cflag1 = -openmp -O3 -xHost -r8 -ipo -shared-intel -mcmodel=large -I$(MKLROOT)/include cflag2 = -P -C -traditional -DMPI2=0 -DFFT_MKL -DBX -DFLATDIR

libs = -mkl=parallel

.f.o:

cpp $(cflag2) $*.f > $*.fsapp.f $(fc) $(cflag1) -o $*.o -c $*.fsapp.f

obj = main.o init.o cip.o col.o bvector.o fem.o src.o diag.o tool.o time.o asrc.o

all: mkl_dfti $(obj)

$(fc) $(cflag1) -o GT5D $(obj) $(libs)

mkl_dfti:

ifort -c $(MKLROOT)/include/mkl_dfti.f90

clean::

(10)

2.2.4. OpenMP 指示行中のプリプロセッサ命令

Scalasca の字句解析を妨げる要因として,OpenMP 指示行の中にプリプロセッサ命令(ifdef)が 存在する箇所がありました.Scalasca を使用する場合にはエラーとなるため,当該部分の条件文 の真偽に従って,プリプロセッサ命令の削除を行いました.

~修正前:cip.f(1353 行目付近)~ !$OMP PARALLEL DO DEFAULT(NONE) !$OMP& REDUCTION(+:df2,dfc) !$OMP& PRIVATE(i,j,k,l,b0s) !$OMP& PRIVATE(vxl,vxr,vyl,vyr,vzl,vzr,vvl,vvr) !$OMP& PRIVATE(vxl2,vxr2,vyl2,vyr2,vzl2,vzr2,vvl2,vvr2) !$OMP& PRIVATE(fxl,fxr,fyl,fyr,fzl,fzr,fvl,fvr) !$OMP& PRIVATE(fxl2,fxr2,fyl2,fyr2,fzl2,fzr2,fvl2,fvr2) !$OMP& PRIVATE(flx,fly,flz,flv) !$OMP& PRIVATE(flx2,fly2,flz2,flv2) !$OMP& PRIVATE(flow) !$OMP& PRIVATE(dxi,dzi) !$OMP& PRIVATE(dx2i,dz2i) #ifdef FX1 !$OMP& PRIVATE(fl_wk) #endif !$OMP& SHARED(if5d,bbs,rg,vx,vy,vz,vv,f,df,fc,adt,ca) !$OMP& SHARED(dx2,dy2,dz2,dv2) !$OMP& SHARED(cxi,dyi,czi,dvi) !$OMP& SHARED(cx2i,dy2i,cz2i,dv2i) !$OMP& SHARED(cc1,cc2) !$OMP& SCHEDULE(static,1) do i = 1,nx ~修正後:cip.f(1353 行目付近)~ !$OMP PARALLEL DO DEFAULT(NONE) !$OMP& REDUCTION(+:df2,dfc) !$OMP& PRIVATE(i,j,k,l,b0s) !$OMP& PRIVATE(vxl,vxr,vyl,vyr,vzl,vzr,vvl,vvr) !$OMP& PRIVATE(vxl2,vxr2,vyl2,vyr2,vzl2,vzr2,vvl2,vvr2) !$OMP& PRIVATE(fxl,fxr,fyl,fyr,fzl,fzr,fvl,fvr) !$OMP& PRIVATE(fxl2,fxr2,fyl2,fyr2,fzl2,fzr2,fvl2,fvr2) !$OMP& PRIVATE(flx,fly,flz,flv) !$OMP& PRIVATE(flx2,fly2,flz2,flv2) !$OMP& PRIVATE(flow) !$OMP& PRIVATE(dxi,dzi) !$OMP& PRIVATE(dx2i,dz2i) !$OMP& SHARED(if5d,bbs,rg,vx,vy,vz,vv,f,df,fc,adt,ca)

(11)

2.2.5. OpenMP 指示行(継続行)の誤認識 Scalasca の字句解析では,OpenMP 指示行の継続行の内,以下の条件を満たすものについて,エ ラーが発生していました.適宜,スペースを追加してエラーが回避できることを確認しました. ・ 継続行「!$OMP&」の後にスペースが無い ・ 継続行が FIRSTPRIVATE 節,または LASTPRIVATE 節である. ~修正前:src.f(133 行目付近)~

!$OMP PARALLEL DO FIRSTPRIVATE(jl,il,i) !FRT !$OMP&LASTPRIVATE(jl,il,i,j,j0,i0,jj,ii) !FRT !$OMP& SCHEDULE(static,1) do jj=0,nncy+1 do ii=0,nncx+1 i0=imat(1,ii,jj) j0=imat(2,ii,jj) do j=-jmax,jmax do i=-imax,imax ~修正後:src.f(133 行目付近)~

!$OMP PARALLEL DO FIRSTPRIVATE(jl,il,i) !FRT !$OMP& LASTPRIVATE(jl,il,i,j,j0,i0,jj,ii) !FRT !$OMP& SCHEDULE(static,1) do jj=0,nncy+1 do ii=0,nncx+1 i0=imat(1,ii,jj) j0=imat(2,ii,jj) do j=-jmax,jmax do i=-imax,imax ※その他,src.f,asrc.f に複数,同様の箇所があります. 尚,このエラーが発生している箇所では,FIRSTPRIVATE や LASTPRIVATE で指定された変数の値 は,並列化ループ内でローカルに使用しているため,通常の PRIVATE 属性に修正しています.

(12)

2.3. Scalasca 連携‐プログラム実行 コンパイルして作成した実行モジュール「GT5D」と,配布されたデータ一式を使用して,バッチ ジョブを実行します.使用するケースとジョブの投入方法は,節 1.3 の通常実行と同じです(性能計 測モードにて実行). Scalasca を利用したプログラム実行は,実行モジュール(逐次)や mpirun(MPI 並列)コマンドの前 に「scalasca -analyze」(もしくは短縮形「scan」)を追加して行います.

TSUBAME2.0 のバッチジョブでの実行では,Scalasca と mpirun のオプションが正しく識別できな いため,mpirun のオプションを「”(ダブルクォーテーション)」で囲う必要があります.混同を避け るため,Scalasca 側のオプションを指定する場合は,設定ファイル(EPIK.CONF)に書くことをお勧め します. ~バッチジョブスクリプト(go.sh)~ #!/bin/bash cd ${PBS_O_WORKDIR} export OMP_NUM_THREADS=6

scan mpirun -np 64 "--report-bindings" "-bysocket -cpus-per-proc 6 -bind-to-core" "-x OMP_N UM_THREADS" "-hostfile ${PBS_NODEFILE}" ./GT5D >& ./log.mpi

~設定ファイル(EPIK.CONF)の例~

EPK_TITLE=fs_gt5d ★アーカイブ名

EPK_METRICS=PAPI_SP_OPS:PAPI_DP_OPS:PAPI_VEC_SP ★メトリックの指定(PAPIプリセットイベント) ESD_BUFFER_SIZE=100000000 ★バッファサイズの指定

(13)

2.4. Scalasca 連携‐実行結果の表示(可視化) X-window が使用できるターミナルを立ち上げて,出力されたアーカイブ(epik_*)に対して. 「scalasca -examine」(もしくは短縮形「square」)を実行します. ~コマンド実行例~ % square epik_fs_gt5d ~表示画面~

(14)

2.5. その他(※未完了項目)

ワークショップでは,TSUBAME/Scalasca がターゲットだが,VampirTrace および京&FX10 の場合に ついても同様に執筆のつもり?

・ 本ドキュメントもしくは wiki で追加検討(汎用的な部分は Tips として wiki 掲載を励行) Ø 代表的な Scalasca のオプションやパラメータ(コンパイル時・実行時)

Ø PAPI プリセットイベント(papi_avail 参照) Ø ユーザー区間指定(手動)の例

Ø PAPI のイベント指定は変更する可能性アリ

参照

関連したドキュメント

Elemental color content maps of blackpree{pitates at Akam{ne, Arrows 1 and 2 in &#34;N&#34; hindieate. qualitative analytical points

Elemental color content maps of blackpree{pitates at Akam{ne, Arrows 1 and 2 in &#34;N&#34; hindieate. qualitative analytical points

SVF Migration Tool の動作を制御するための設定を設定ファイルに記述します。Windows 環境 の場合は「SVF Migration Tool の動作設定 (p. 20)」を、UNIX/Linux

&#34;A matroid generalization of the stable matching polytope.&#34; International Conference on Integer Programming and Combinatorial Optimization (IPCO 2001). &#34;An extension of

OPTIMAL PROBLEMS WITH DISCONTINUOUS INITIAL CONDITION.. systems governed by quasi-linear neutral differential equations with dis- continuous initial condition is considered.

[r]

Rumsey, Jr, &#34;Alternating sign matrices and descending plane partitions,&#34; J. Rumsey, Jr, &#34;Self-complementary totally symmetric plane

McKennon, &#34;Dieudonn-Scwartz theorem on bounded sets in inductive limits&#34;, Proc. Schwartz, Theory of Distributions, Hermann,