東京大学HA8000クラスタシステムへのOpenFOAM-2.0.xのインストールと実行
出典: OFWikiJa
目次 |
[編集] 履歴
- GitリポジトリをThe OpenFOAM Foundation設立後の最新のものに訂正した。--H ono 2011年10月15日 (土) 11:17 (UTC)
- cavityのケースでプロットされるEPSフォーマットの図をconvertを使いPNGフォーマットに変更するようにした。 Masa 2011年10月4日 (火) 11:57 (UTC)
- MPIライブラリとしてMPICH2-MXだけでなく、MPICH-MXを使う方法も併記した。 Masa 2011年9月11日 (日) 09:25 (UTC)
- cavityのケースを追加した。 Masa 2011年9月21日 (水) 11:02 (UTC)
- 参考文献を追加した。 Masa 2011年9月22日 (木) 03:31 (UTC)
- cavityのケースの格子数を128*128に修正し、sampleDictにおけるinterpolationSchemeをcellPointFaceに変更した。また、MPICH-MXがdebugキューで使えるようになったので、ジョブを走らせるキューをdebugにした。 Masa 2011年9月27日 (火) 07:24 (UTC)
[編集] はじめに
ここでは、東京大学HA8000クラスタシステムへOpenFOAM-2.0.xをインストールする方法と実行方法を説明します。 なお、以下では点線で囲まれた背景色が水色の矩形領域はファイルの中身を、背景色が黒色の矩形領域は実行するコマンドを示します。
[編集] シェルの初期設定
ここでは、ログインシェルはbashを使っているものとし、$HOME/.bashrc で初期設定を行うと仮定しています。
[編集] MPI
MPIライブラリは、MPICH-MXをintel Cコンパイラ Ver.11でコンパイルしたものの共有ライブラリ版を使います。 以下を$HOME/.bashrcに加えてください。
[編集] MPIとしてMPICH-MXを使う場合
# MPICH-MX source /opt/itc/mpi/mpiswitch.sh mpich-mx-intel11-shared
[編集] MPIとしてMPICH2-MXを使う場合
# MPICH2-MX source /opt/itc/mpi/mpiswitch.sh mpich2-mx-intel11
ただし、MPICH2-MX については東京大学情報基盤センターのサポート外となるそうなので、通常はMPICH-MXの使用をお勧めします。
[編集] コンパイラ
CコンパイラはIntel C/C++コンパイラのVer.11.0を用います。 以下を$HOME/.bashrcに加えてください。
# Intel C,C++ compiler source /opt/intel/Compiler/11.0/074/bin/iccvars.sh intel64
[編集] Gitのコンパイル
HA8000には標準でGitがインストールされていないので、ソースからコンパイルします。$HOME/src にソースを置いてコンパイルするものとし、このディレクトリが無ければ作成します。
cd mkdir src cd src
Gitの公式サイト http://git-scm.com/ からソースをダウンロードします。
bzcat git*.tar.bz2 | tar xpf - cd git-*/
$HOME以下にインストールする場合、以下のようにしてビルドします。
make make install
以下を$HOME/.bashrcに加えて、$HOME/bin をパスに追加します。
# PATH export PATH=$PATH:$HOME/bin
[編集] ソースのダウンロード
[編集] OpenFOAM-2.0.x
HA8000のデフォルトのファイルシステムであるHSFS上でソースのコンパイルを行うと非常に遅いので、NFSファイルシステム上にソースを置きます。
mkdir -p /nfs/all/$USER/OpenFOAM cd /nfs/all/$USER/OpenFOAM git clone git://github.com/OpenFOAM/OpenFOAM-2.0.x.git
通常のインストール・ディレクトリ($WM_PROJECT_DIR)にあるように見せるために、$HOME/OpenFOAM/OpenFOAM-2.0.x にシンボリック・リンクします。
mkdir $HOME/OpenFOAM cd $HOME/OpenFOAM ln -s /nfs/all/$USER/OpenFOAM/OpenFOAM-2.0.x .
[編集] ThirdParty-2.0.x
ThirdParty-2.0.x も Repository Releaseを参照して$HOME/OpenFOAM にダウンロードします。$HOME/OpenFOAM/ThirdParty-2.0.x に置くことになります。 ThirdPartyはOpenFOAM-2.0.xと異なり、gitで最新版に更新する度にビルドする必要がありませんし、scotchのライブラリをビルドするだけですので、デフォルトのHSFS以下に置いても構いません。
[編集] OpenFOAMの環境設定
[編集] シェルでの環境設定
64bit版をコンパイルしますので、以下を$HOME/.bashrcに加えてください。
### OpenFOAM export WM_64=yes . $HOME/OpenFOAM/OpenFOAM-2.0.x/etc/bashrc
なお、東京大学のHA8000クラスタシステムでは、ログインノードでの並列コンパイルは原則として禁止されているので、WM_NCOMPPROCS 環境変数をセットして、並列コンパイルを行うことができません。
[編集] 使用コンパイラ、MPIライブラリの設定
$WM_PROJECT_DIR/etc/bash において、foamCompiler,WM_COMPILER,WM_MPLIBを以下のように設定します。
#- Compiler location: # foamCompiler= system | ThirdParty (OpenFOAM) #foamCompiler=OpenFOAM foamCompiler=system #- Compiler: # WM_COMPILER = Gcc | Gcc43 | Gcc44 | Gcc45 | Gcc46 | Clang | Icc (Intel icc) #export WM_COMPILER=Gcc export WM_COMPILER=Icc #- MPI implementation: # WM_MPLIB = SYSTEMOPENMPI | OPENMPI | MPICH | MPICH-GM | HPMPI # | GAMMA | MPI | QSMPI #export WM_MPLIB=OPENMPI export WM_MPLIB=MPICH
[編集] コンパイラ・コマンドの設定
$WM_PROJECT_DIR/etc/config/settings.sh において、WM_CCやWM_C++の設定を以下のようにします。
64)
WM_ARCH=linux64
export WM_COMPILER_LIB_ARCH=64
# export WM_CC='gcc'
# export WM_CXX='g++'
export WM_CC='icc'
export WM_CXX='icpc'
[編集] MPICHの設定
$WM_PROJECT_DIR/etc/config/settings.sh において、MPICHの設定を以下のように修正します。
[編集] MPIとしてMPICH-MXを使う場合
MPICH)
# export FOAM_MPI=mpich2-1.1.1p1
export FOAM_MPI=mpich-mx-intel11-shared
# export MPI_HOME=$WM_THIRD_PARTY_DIR/$FOAM_MPI
export MPI_HOME=/opt/itc/mpi/$FOAM_MPI
# export MPI_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$FOAM_MPI
export MPI_ARCH_PATH=$MPI_HOME
_foamAddPath $MPI_ARCH_PATH/bin
# _foamAddLib $MPI_ARCH_PATH/lib
_foamAddLib $MPI_ARCH_PATH/lib/shared
_foamAddMan $MPI_ARCH_PATH/share/man
;;
[編集] MPIとしてMPICH2-MXを使う場合
MPICH)
# export FOAM_MPI=mpich2-1.1.1p1
export FOAM_MPI=mpich2-mx-intel11
# export MPI_HOME=$WM_THIRD_PARTY_DIR/$FOAM_MPI
export MPI_HOME=/opt/itc/mpi/$FOAM_MPI
# export MPI_ARCH_PATH=$WM_THIRD_PARTY_DIR/platforms/$WM_ARCH$WM_COMPILER/$FOAM_MPI
export MPI_ARCH_PATH=$MPI_HOME
_foamAddPath $MPI_ARCH_PATH/bin
_foamAddLib $MPI_ARCH_PATH/lib
_foamAddMan $MPI_ARCH_PATH/share/man
;;
[編集] C/C++コンパイラオプションの設定
$WM_PROJECT_DIR/wmake/rules/linux64Icc/cOpt において、Cコンパイラ最適化オプションを以下のように設定します。
DBUG = cOPT = -msse3 -O3 -no-prec-div
同様に、$WM_PROJECT_DIR/wmake/rules/linux64Icc/c++Opt においてC++コンパイラ最適化オプションを以下のように設定します。
c++DBUG = c++OPT = -msse3 -O3 -no-prec-div
[編集] MPICHのインクルード・パス、ライブラリの設定
[編集] MPIとしてMPICH-MXを使う場合
$WM_PROJECT_DIR/wmake/rules/General/mplibMPICH を $WM_PROJECT_DIR/wmake/rules/linux64Icc/ のディクレクトリにコピーして、以下のように修正します。
PFLAGS = -DMPICH_SKIP_MPICXX #PINC = -I$(MPI_ARCH_PATH)/include PINC = -I$(MPI_ARCH_PATH)/include -I$(MPI_ARCH_PATH)/include/mpi2c++ #PLIBS = -L$(MPI_ARCH_PATH)/lib -lmpich -lrt PLIBS = -L$(MPI_ARCH_PATH)/lib/shared -lmpich -lrt
[編集] MPIとしてMPICH2-MXを使う場合
MPICH-MXを使う場合と異なり、$WM_PROJECT_DIR/wmake/rules/linux64Icc/mplibMPICH は不要です。
[編集] OpenFOAMのビルド
あとは通常通り、Allwmake でビルドするだけです。
foam ./Allwmake >& Allwmake.log &
以下のようにログを眺めて、エラーが出ないことを確認してください。
tail -f Allwmake.log
なお、並列コンパイルが出来ないことと、Intelコンパイラを使うことから、ソースからの全コンパイルには大変時間がかかります。
[編集] OpenFOAMの実行
[編集] ユーザー・ディレクトリの作成とチュートリアルのコピー
デフォルトのファイルシステムであるHSFSは入出力が遅いので、ユーザー・ディレクトリをHSFS上に置くのは避けたほうが良いのですが、NFSファイルシステムは原則として並列計算に使用できないので、ユーザー・ディレクトリはLusterファイルシステム上に置きます。
mkdir -p /lustre/$USER/OpenFOAM/$USER-2.0.x
さらに、通常のOpenFOAM/$USER-2.0.x にシンボリック・リンクしておきます。
cd $HOME/OpenFOAM ln -s /lustre/$USER/OpenFOAM/$USER-2.0.x .
あとは通常通り、チュートリアルのコピーを行います。
run cp -r $FOAM_TUTORIALS .
[編集] ログインノードでの非並列実行テスト
ログインノードでblockMeshやicoFoam等のコマンドの実行テストを行います。 ログインノードでは、並列実行が出来無いので、非並列での実行となります。
run cd tutorials/incompressible/icoFoam/cavity blockMesh icoFoam
blockMeshやicoFoamの実行でエラーが出る場合には、OpenFOAMのコンパイルに失敗していると思われるでの、Allwmake.log を確認してください。
[編集] 並列実行の準備
ジョブの投入時や終了時等にセンターのアカウント宛にメールが届きますが、これはログインしてmailコマンド等で読まないといけないので、$HOME/.forward に自分のメールアドレスを書いておいたほうが良いです。
その他、基礎的な事は、 利用の手引における第7章 プログラムの実行をご覧ください。
[編集] 並列実行用スクリプト
並列実行するには、ジョブスクリプトを書く必要があります。
pitzDaily (ジョブスクリプトの例)
!/bin/bash
#@$-q debug
#@$-N 1
#@$-J T16
#@$-lT 0:05:00
#@$-lm 2gb
# OpenFOAM and other settings
source ~/.bashrc
# run directory
cd ${QSUB_WORKDIR}
# get application name from system/controlDict
. $WM_PROJECT_DIR/bin/tools/RunFunctions
solver=`getApplication`
# store old log file
if [ -f log ];then
mv log log.`stat -c "%Y" log`
fi
# mpirun command
case "$FOAM_MPI" in
mpich-*)
MPIRUN="/opt/itc/mpi/mpirun"
;;
mpich2-*)
MPIRUN="/opt/torque/bin/mpiexec -comm=pmi"
export MX_PRE_CONNECT=1
;;
esac
# avoid this warning message - regcache incompatible with malloc
export MX_RCACHE=0
# record environment variables
env > log
# run solver
$MPIRUN ~/numarun ${solver} -parallel >> log 2>&1
FOAM_MPIにmpich-*が指定されている場合は、MPICH-MXを使うと仮定し、mpirunコマンドとして/opt/itc/mpi/mpirunを使います。 一方FOAM_MPIにmpich2-*が指定されている場合は、MPICH2-MXを使うと仮定し、mpirunコマンドとして/opt/torque/bin/mpiexec -comm=pmiを使い、MX_PRE_CONNECT=1 を指定します。
なお、ジョブのキュー状態を確認するqstatコマンドではジョブスクリプトの名前が出ますので、ジョブスクリプト名は計算ケースがわかる名前にするか、qsubのrオプションで計算ケースに応じて名前を変えてください。もしジョブスクリプト名前で計算ケースを区別できない場合には、qstatにlオプションを付けると、ジョブを投入したディレクトリが表示されますので、そこから判断します。
[編集] NUMA最適化
NUMA最適化実行を行うために、以下のような$HOME/numarun を用意しておきます。
#!/bin/bash if [ "$MXMPI_ID" ];then MYRANK=$MXMPI_ID elif [ "$PMI_ID" ];then MYRANK=$PMI_ID elif [ "$PBS_VNODENUM" ];then MYRANK=$PBS_VNODENUM fi NODE=$(expr $MYRANK % 4) echo "MXMPI_ID=" $MXMPI_ID ", PMI_ID=" $PMI_ID ", PBS_VNODENUM=" $PBS_VNODENUM ", MYRANK=" $MYRANK ", NODE=" $NODE /usr/bin/numactl --membind $NODE --cpunodebind $NODE $@
利用の手引におけるNUMA最適化スクリプトの例とは異なりMYRANKの設定に条件分岐を用いていますが、これはMPICH2-MX を使う場合、MPIランクが環境変数MXMPI_IDではなくて環境変数PMI_IDにセットされることを考慮して、MPICH-MXでもMPICH2-MXでも共有して使えるよう修正を行なっています。
[編集] 領域分割
並列実行のコア数に応じて、system/decomposeParDict におけるnumberOfSubdomains を修正します。
numberOfSubdomains 16;
1ノードで16コアですので、通常は1ノードで16以下か、16の倍数になるでしょう。 あとは、ログインノードで通常通り、decomposePar を実行します。
decomposePar
格子が多すぎてメモリが足りないというエラーが出る場合には、ログインノードではなくバッチノードで動かすので、以下のようなジョブスクリプト de.sh を用意します。
#!/bin/bash
#@$-q short
#@$-N 1
#@$-J T1
#@$-lT 1:00:00
source ~/.bashrc
cd ${QSUB_WORKDIR}
decomposePar > log.decomposePar 2>&1
decomposeParでは並列実行しないので、"-N 1"でノード数を1、"-J T1"でコア数を1に指定しています。ジョブのパイプキューの名前や実行時間等は適宜変更してください。
ジョブスクリプトを用意したら、以下のようにして投入します。
qsub de.sh
[編集] 並列計算の実行
qstatにbオプションを付けて、キューの状況を調べます。
qstat -b
適当なパイプキューにジョブスクリプトを投入します。
qsub pitzDaily
ジョブスクリプトの-q行に書いてあるキューと異なるキューに投入したい場合にはqオプションで明示的に指定します。
qsub -q short pitzDaily
qstatコマンドでジョブの状況が確認できます。
qstat
STATEがRUNNINGになったら、ログファイルを眺めましょう。
tail -f log
[編集] 並列計算用サンプルケース
[編集] cavity
チュートリアルにある incompressible/icoFoam/cavity のケース をHA8000クラスタシステムで並列計算するためのサンプルケースです。 GhiaによるRe=100の計算結果[1]と比較するために、計算領域の大きさを修正しています。なお、Ghiaの計算値は新潟大学の大嶋先生のWebページのおけるcavityのケースデータ中のファイルを収めてあります。
- Media:Cavity-HA8000-2011100401.tar.gz 最新版
- Media:Cavity-HA8000-2011092702.tar.gz
- Media:Cavity-HA8000-2011092701.tar.gz
- Media:Cavity-HA8000-2011092101.tar.gz
上記のファイルを実行用ディレクトリで展開してください
tar zxpf Cavity-HA8000-*.tar.gz cd Cavity-HA8000
setting.sh を編集してください。
#!/bin/sh NODE=1 PROCESSOR_PER_NODE=16 QUEUE_NAME=cavity RUN_QUEUE_NAME=debug RUN_LIMIT_TIME=00:05:00
- NODE: 使用するノード数。
- PROCESSOR_PER_NODE: 1ノードあたりのプロセッサ数。HA8000の場合、1ノードで16プロセッサ。
- RUN_QUEUE_NAME: 解析を行う時のジョブキュー名。ノード数や計算時間に応じて適切なキュー名を選択してください。
- RUN_LIMIT_TIME: 解析最大時間。なお、サンプルケースの格子数128*128では1ノードで60秒程度かかります。格子数を256*256に増やすと1ノードで600秒強かかります。
この後、ディレクトリ上で./Allrun を実行してください。
./Allrun >& log.Allrun &
実行後、Ghia の計算結果と速度の比較した図(validation_Ux.{eps,png}, validation_Uy.{eps,png})がプロットされます。
初期化するには以下を実行してください。
./Allclean
[編集] pitzDaily
チュートリアルにある incompressible/pisoFoam/les/pitzDaily のケース をHA8000クラスタシステムで並列計算するためのサンプルケースです。
上記のファイルを実行用ディレクトリで展開し、そのディレクトリ上で./Allrun を実行してください。
tar zxpf PitzDaily-HA8000-*.tar.gz cd pitzDailyHA8000 ./Allrun >& log.Allrun &
設定を変える場合にはsetting.shジョブスクリプトを編集してください。
#!/bin/sh NODE=1 QUEUE_NAME=pitzDaily RUN_QUEUE_NAME=debug RUN_LIMIT_TIME=00:05:00
- NODE: 使用するノード数。1ノードで16コアなので、この16倍した領域数に分割します。
- RUN_QUEUE_NAME: 解析を行う時のジョブキュー名。ノード数や計算時間に応じて適切なキュー名を選択してください。
- RUN_LIMIT_TIME: 解析最大時間。
サンプルではdebugキューを使うので、解析最大時間は5分が上限で、解析ソルバーのpisoFoamも5分で中断されます。 より長い時間解析する場合には、short,parallel等の適切なキューを使用してください。
[編集] 並列計算効率
[編集] 参考文献
- ↑ Ghia, U., Ghia, K. N., Shin, C. T., High-Re solutions for incompressible flow using the Navier-Stokes equations and a multigrid method, Journal of Computational Physics, 48, pp. 387-411, 1982.


