プロファイルツール実行例 アプリ「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. その他(※未完了項目) ... 101. 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」で実行します.
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 0 -cm -w95
F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90C = mpif90
F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
※ 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/intel-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」で設定します. ※ その他,バッチジョブの詳細については省略します(詳細はマニュアルにて)
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
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」)を追加するのみです.config/makeconfig の 該当部分を修正しました. ~修正前:config/makeconfig(32 行目付近)~ F77C = mpif77
F77FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90C = mpif90
F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
:※中略※
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 0 -cm -w95
F77FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90C = skin mpif90
F90FLAGS = $(DMACRO) $(INCMOD) -i8 -O2 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
F90FLAGSNOOPT = $(DMACRO) $(INCMOD) -i8 -O0 -ftz -auto -assume byterecl -vec-report 0 -cm -w95
:※中略※
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 ★バッファサイズの指定
2.4. Scalasca 連携‐実行結果の表示(可視化) X-window が使用できるターミナルを立ち上げて,出力されたアーカイブ(epik_*)に対して. 「scalasca -examine」(もしくは短縮形「square」)を実行します. ~コマンド実行例~ % square epik_fs_ntchem ~表示画面~
2.5. その他(※未完了項目)
ワークショップでは,TSUBAME/Scalasca がターゲットだが,VampirTrace および京&FX10 の場合に ついても同様に執筆のつもり?
・ 本ドキュメントもしくは wiki で追加検討(汎用的な部分は Tips として wiki 掲載を励行) Ø 代表的な Scalasca のオプションやパラメータ(コンパイル時・実行時) Ø PAPI プリセットイベント(papi_avail 参照) Ø ユーザー区間指定(手動)の例 Ø PAPI のイベント指定は変更する可能性アリ Ø (東工大様への依頼分)各種結果からの分析方法,Vampir サーバーの使い方,全ツール の評価時間一覧表(オーバーヘッド)