プロファイルツール実行例アプリ ntchem-rimp2 2013 年 9 月 3 日日本電気株式会社 0. はじめに 本ドキュメントでは, アプリ ntchem-rimp2 におけるプロファイルツール連携の作業履歴を記 載します. 目次 1. TSUBAME2.0 通常実行まで... 2 1.1. 環境設定 (MPI ライブラリ & コンパイラ )... 2 1.2. コンパイルとソース修正... 2 1.2.1. config_mine の修正... 2 1.2.2. config/makeconfig の修正... 3 1.3. バッチジョブ実行... 4 1.4. 実行結果の確認... 5 2. TSUBAME2.0 Scalasca 連携実行... 6 2.1. Scalasca 環境設定... 6 2.2. Scalasca 連携 コンパイル... 7 2.2.1. コンパイラの設定... 7 2.3. Scalasca 連携 プログラム実行... 8 2.4. Scalasca 連携 実行結果の表示 ( 可視化 )... 9 2.5. その他 ( 未完了項目 )... 10-1 -
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. config_mine の修正 システムに合わせて Makefile 一式を作成する config_mine を修正します.TSUBAME2.0 環境に合 わせて, LINUX64 mpif90(ifort) (For Tsubame2) と書かれたブロックをベースに編集します. 数学ライブラリの指定は, -mkl=parallel で並列版の MKL を使用します. --scratch で実際に存在するディレクトリを指定します. ~ 修正後 :config_mine~ # LINUX64 mpif90(ifort) (For Tsubame2)./configure \ --lapack= \ --blas= \ --atlas=-mkl=parallel \ --scratch=/work1/t2g-hp120261/12ih0187/hpci_fs2013_t/fsapp_2nd/ntchem-rimp2/mk_scr \ linux64_mpif90_omp_intel_tsubame2 編集完了後,./configure_mine で実行します. - 2 -
1.2.2. config/makeconfig の修正 config_mine によって作成された Makefile 一式では, プログラムの実行時にセグメンテーションフォルト (SIG SEGV) が発生する恐れがあります. これは,Intel コンパイラ ver.13.0 固有の問題で, -heap-arrays オプションが不具合発生のスイッチとなっています. コンパイルオプションの設定箇所から削除して, -heap-arrays オプションを使用せずコンパイルするよう修正しました. ~ 修正前 :config/makeconfig(33 行目付近 )~ F77C = mpif77 F77FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -heap-arrays -w95 F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -heap-arrays -w95 F90C = mpif90 F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -heap-arrays -w95 F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -heap-arrays -w95 ~ 修正後 :config/makeconfig(33 行目付近 )~ F77C = mpif77 F77FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report F90C = mpif90 F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report Intel コンパイラ ver.13.0 の -heap-arrays オプションに関する補足 一般的に,stack 領域が不足した場合の改善を目的として使用されています. 他にも原因に応じて, システム側の stack サイズ拡張 (ulimit -s 等 ) や,OpenMP スレッド毎の stack サイズ拡張 ( 環境変数 OMP_STACKSIZE) 等で回避が可能です.TSUBAME2.0 の計算ノードでは, 予めシステム側の stack サイズが unlimited となっています. エラーに関する参考情報 (URL):http://software.intel.com/en-us/articles/intelfortran-compiler-increased-stack-usage-of-80-or-higher-compilers-causessegmentation-fault - 3 -
1.3. バッチジョブ実行コンパイルして作成した実行モジュール rimp2.exe と, 配布されたデータ一式を使用して, バッチジョブを実行します. 4 種類あるデータの内,1 つを実行しました. ~ 使用ケース ~ データ名並列数 taxol 32ノード (MPI 64プロセス OpenMP 6スレッド ~ バッチジョブスクリプト (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}./rimp2.exe >&./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=00:30: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 で設定します. その他, バッチジョブの詳細については省略します ( 詳細はマニュアルにて ) - 4 -
1.4. 実行結果の確認 バッチジョブのログ (OTHERS.e*,OTHERS.o*) と mpirun の実行ログ (log.mpi) を確認し, プログラ ムが問題なく動作していることを確認しました. ~ 実行ログ (log.mpi) 抜粋 ~ : SCF energy = -2912.07578182458 MP1 energy = 0.000000000000000E+000 MP2 energy (Singlet corr ) = -6.75799573369710 MP2 energy (Triplet corr ) = -2.49726273967200 MP2 energy (Total corr ) = -9.25525847336910 SCS-MP2 energy (Total corr ) = -8.94201579366052 Total MP2 energy = -2921.33104029795 Total SCS-MP2 energy = -2921.01779761824... CPU time (3/3k 2cints comm) : 7.63... CPU time (4c Ints ) : 316.72... CPU time (EMP2 corr. ) : 8.44... WALL time (3/3k 2cints comm) : 1.34... WALL time (4c Ints ) : 53.92... WALL time (EMP2 corr. ) : 0.31... CPU time (RIMP2_RMP2Energy) : 333.73... WALL time (RIMP2_RMP2Energy) : 55.91... CPU time (RIMP2_Driver ) : 384.44... WALL time (RIMP2_Driver ) : 68.17 MPI has been terminated - 5 -
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. を設定している場合には, 削除する必要があります. - 6 -
2.2. Scalasca 連携 コンパイル 2.2.1. コンパイラの設定 Scalasca を利用したコンパイルは, 基本的には mpif90 等コンパイラのコマンドの前に scalasca -instrument ( もしくは短縮形 skin ) を追加するのみです.config/makeconfig の該当部分を修正しました. ~ 修正前 :config/makeconfig(32 行目付近 )~ F77C = mpif77 F77FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report F90C = mpif90 F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report : 中略 : LD = mpif90 LDFLAGS = -pc -intel -L$(LIB) LDFLAGS_NOMAIN = -nofor_main ~ 修正後 :config/makeconfig(32 行目付近 )~ F77C = skin mpif77 F77FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report F90C = skin mpif90 F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report : 中略 : LD = skin mpif90 LDFLAGS = -pc -intel -L$(LIB) LDFLAGS_NOMAIN = -nofor_main - 7 -
2.3. Scalasca 連携 プログラム実行 コンパイルして作成した実行モジュール rimp2.exe と, 配布されたデータ一式を使用して, バ ッチジョブを実行します. 使用するケースとジョブの投入方法は, 節 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}"./rimp2.exe >&./log.mpi ~ 設定ファイル (EPIK.CONF) の例 ~ EPK_TITLE=fs_ntchem アーカイブ名 EPK_METRICS=PAPI_SP_OPS:PAPI_DP_OPS:PAPI_VEC_SP メトリックの指定 (PAPIプリセットイベント) ESD_BUFFER_SIZE=100000000 バッファサイズの指定 - 8 -
2.4. Scalasca 連携 実行結果の表示 ( 可視化 ) X-window が使用できるターミナルを立ち上げて, 出力されたアーカイブ (epik_*) に対して. scalasca -examine ( もしくは短縮形 square ) を実行します. ~ コマンド実行例 ~ % square epik_fs_ntchem ~ 表示画面 ~ - 9 -
2.5. その他 ( 未完了項目 ) ワークショップでは,TSUBAME/Scalasca がターゲットだが,VampirTrace および京 &FX10 の場合に ついても同様に執筆のつもり? 本ドキュメントもしくは wiki で追加検討 ( 汎用的な部分は Tips として wiki 掲載を励行 ) 代表的な Scalasca のオプションやパラメータ ( コンパイル時 実行時 ) PAPI プリセットイベント (papi_avail 参照 ) ユーザー区間指定 ( 手動 ) の例 PAPI のイベント指定は変更する可能性アリ ( 東工大様への依頼分 ) 各種結果からの分析方法,Vampir サーバーの使い方, 全ツールの評価時間一覧表 ( オーバーヘッド ) - 10 -