構造解析ことはじめ/03 プログラムのインストール
AMBER8のインストール
分子動力学シミュレーション(MD)で一般的に使用されるAMBERをインストールしてみます。
ここではIntel Compiler 11.0および11.1を使ってビルドします。たどり着くまで紆余曲折がありましたので別バージョンも残しておきます。
- AMBER/インストール/Intel8 -- GCC 3.3.6 + Intel Compiler 8.1 + MKL 9.1のメモ
専門外なのでMDに関する難しいことはよーわかりません。ちなみに2009年2月現在の最新版はAMBER10でここで扱っているバージョン8は相当古いのでこのメモがどの程度役に立つかは不明です
シングルCPU環境でしか実行しない場合はIntel Compilerがあればいいのですが、並列環境で実行する場合はLAM-MPIをインストールしてMPI環境を準備します。
AMBER本体をビルドする際、Intel Compiler 11.1に同梱されているMath Kernel Library 10.2ではptrajのテスト時に問題が発生しました。そのため、ここではIntel Compiler 11.0/11.1+MKL 10.1でビルドします。注意して下さい。
- 発生する問題
$AMBERHOME/test/ptraj_matrixテストにおいて以下のdifが出力されます。符号が全て逆転しています。
ビルド環境
Intel Compiler 11.0および11.1で確認しました。LAM-MPIに関してはIntel Compilerバージョンによる作業の違いはありません。
私の環境(Core2 Quad Q9650)では11.1に付属していたMKL(Ver.10.2)ではビルド後のテストで問題が発生しました。従って、ここでは11.0付属のMKL 10.1を使用します。
- Vine 4.2 / Intel Compiler 11.0.074 (ifort + Math Kernel Library)
- Vine 5.1 / Intel Compiler 11.0.084 or 11.1.046 (ifort + Math Kernel Library 10.1)
- なお、Intel Compiler 11からMKLもCコンパイラに同梱されるようになりTypicalインストールなら同時にインストールされます。
- MKLについてはIntel Math Kernel Libraryのバージョンを参考にして下さい。
LAM-MPIのインストール
MPI環境で並列計算を行う場合はインストールします。LAM-MPIは現在OpenMPIプロジェクトになっているようですがAMBER8はLAM-MPIを使用します*1。LAM-MPI 7.1.4を使用しました。
configureオプション
オプションは以下のような設定にしてみました。
- CC=icc <-- Intel Compiler (C)
- FC=ifort <-- Intel Compiler (Fortran)
- CXX=icpc <-- Intel Compiler (C++)
- CFLAGSなどの最適化オプションは使用しませんでした。
インストール先は/usr/local/lam-7.1.4にしたかったのでprefixオプションも使用します。prefixオプションなしだと/usr/local直下にインストールされます。
ビルド
configureに結構時間がかかりますが、makeは10分ほどで終わりました(Pentium Dual Core 1.8GHz)。
% tar zxvf lam-7.1.4.tar.gz % cd lam-7.1.4 % ./configure CC=icc FC=ifort CXX=icpc --prefix=/usr/local/lam-7.1.4 % make # make install
AMBER8本体のインストール
ようやく準備が整ったのでAMBERをビルドします。/usr/local/amber8以下にインストールしますが、ビルドも同じ場所で行うので最後の並列テスト以外はroot権限で実行します。
aptでインストール
- byacc
- libXt-devel
- libXext-devel
ビルド
Intel Compilerおよび環境変数のセットアップ
# source /opt/intel/Compiler/11.0/074/bin/iccvars.sh ia32 <-- コンパイラにあわせる # source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh ia32 # cd /usr/local # tar zxvf amber8.tgz # export AMBERHOME=/usr/local/amber8 # export LAM_HOME=/usr/local/lam-7.1.4 (並列化版もビルドする場合) # export MKL_HOME=/opt/intel/Compiler/11.0/074/mkl <-- MKL 10.1の場所を指定
環境変数MKL_HOMEにMKL 10.1の場所を指定することでIntel Compiler 11.1でビルドすることも可能です。その際はconfigure時に後述の-static-mklオプションを使って下さい。
パッチを当てる
Intel Compiler 11用にオプションを変更したパッチとAMBER8のバグフィックスパッチを当てます。
- AMBER8バグフィックスパッチ -- http://ambermd.org/bugfixes80.html
- [通常はこっち] : Intel Compiler 11用パッチ(2010-05-24版) -- amber8-ic11-20100524.patch
- [旧版] : Intel Compiler 11用パッチ -- amber8-ic11.patch
# cd $AMBERHOME # patch -p1 < amber8-ic11-20100524.patch # patch -p0 < bugfix.all
パッチを当てたらビルドします。
[2010-05-24版] amber8-ic11-20100524.patchの内容
- src/configure
- -p4m1(65nm Core2)または-p4m2(45nm Core2)、-p4m3(Core i)をconfigureオプションで選択できるようにした
- これにより最適化オプションの-axssse3と-axsse4.1、-axsse4.2を切り替えることができます
- -static-mklオプションを追加
- MKL関連ライブラリ(libmkl_intel, libmkl_intel_thread, libmkl_core, libmkl_lapack)をスタティックリンクします
- 通常使用するIntel CompilerやMKLのバージョンが異なる際に使用します
[旧版] amber8-ic11.patchの内容
- src/configure
- CコンパイラもIntel Compilerを使うようにした(icc,icpc,fpp)
- FFLAGSおよびCFLAGSをSSE4.2最適化オプションにした
- Core i7以外の場合は-axsse4.2の部分を適切に変更して下さい
- FOPTFLAGSに-parallelオプションを追加
- -lmkl_lapack64を-lmkl_lapackに変更した
- libmkl_lapack64はMKL 6.1でのdouble precisionのライブラリ。現在はdouble precisionが標準なようです
- Intel Compiler 11.1のMKLに対応
- -lmklを-lmkl_intel -lmkl_intel_thread -lmkl_coreに変更
- src/nmode/Makefile
- test/newton_raph/Run.newton_raphがSegmentation faultをするので、nmodeのコンパイル時の最適化オプションを-O2に落とした
通常版のビルド
[旧版のみ] CPUによって最適化オプションが異なるため、パッチを当てた$AMBERHOME/src/configureを変更する
447: # Use icc as C compiler 448: fflags="$fflags -xsse2 -axsse4.2 " 449: cflags="$cflags -xsse2 -axsse4.2 "
448, 449行目の-axsse4.2を変更する。
Core i | -axsse4.2 |
---|---|
Core2 45nm | -axsse4.1 |
Core2 65nm | -axssse3 |
変更したらビルドします。
configureオプション
2010-05-24版では環境によってconfigureオプションが異なります。
Core i | -p4m3 |
---|---|
Core2 45nm | -p4m2 |
Core2 65nm | -p4m1 |
MKLをスタティックリンクにする | -static-mkl |
例えばCore i7を使いMKLをスタティックリンクにする場合は、
./configure -p4m3 -static-mkl ifort
になります。
スタティックリンクオプションはIntel Compiler 11.0以外を通常使用する場合にセットします。これは、ダイナミックリンクの場合、Intel Compiler 11.1の環境をセットアップするとMKLもそちらのバージョンが使われてしまうためです。
なお、旧版を使う場合は、
./configure -p4 ifort
のみです。
実際の手順は以下の通りです。
# cd $AMBERHOME/src # ./configure [適切なオプション] ifort # make serial <-- make -j4などで並列コンパイルすると結果がおかしくなるので-jは使用しない
ビルドが完了したらテストします。
# cd $AMBERHOME/test # make test <-- -jオプションで並列にするとSegmentation faultしたときわからない
テストが終了したら差のある結果をチェックします。
# find ./ -name "*.dif" -print -exec cat {} \;
私の環境での差は以下の通り。
並列版のビルド
SANDERを並列化環境下で実行する場合は通常版をビルドした後に並列版をビルドします。
# cd $AMBERHOME/src # make clean # ./configure [適切なオプション] -lam ifort # make parallel
mpirunはrootでは実行できないので、テストは一般ユーザーで行います。ここではユーザーdobuoで行うとしますが環境に合わせて読み替えて下さい。
まず、testディレクトリ以下のファイルの所有者をpooに変更します。
# cd $AMBERHOME/test # chown -R dobuo:dobuo ./
続いて、ユーザーdobuoでテストを実行します。付属のドキュメントにはmake test.parallelで行えと書いてありますが、存在しないのでmake testを実行します。どうやらDO_PARALLELをセットしておけば並列化テストになるようです。
% source /opt/intel/Compiler/11.0/074/bin/iccvars.sh ia32 % source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh ia32 % export DO_PARALLEL="mpirun -np 2" (2はCPUの数) % export AMBERHOME=/usr/local/amber8 % export LAM_HOME=/usr/local/lam-7.1.4 % export PATH ${LAM_HOME}/bin:${PATH} % cd $AMBERHOME/test % lamboot <-- LAM-MPIデーモンを起動 % make test % lamhalt <-- LAM-MPIデーモンを停止 % find ./ -name "*.dif" -print -exec cat {} \;
以上で完了です。
私の環境での差は以下の通りです。
通常版と並列版の共存
並列版は通常版をビルドし、その後並列版をビルドすることで通常版のプログラムが上書きされてしまいます。そうすると非MPI環境で実行できなくなってしまうので、私は通常版と並列版を別ディレクトリで用意しました。
手順は、
- 通常版をビルド
- 通常版を別ディレクトリにコピー
- コピーしたディレクトリで並列版をビルド
としてみました。
実行環境のセットアップ
実行するための環境を整えます。.cshrcに以下の行を追加します。
# for AMBER8 # source /opt/intel/Compiler/11.0/074/bin/iccvars.sh ia32 # source /opt/intel/Compiler/11.0/074/bin/ifortvars.sh ia32 # LAM-MPI setenv LAM_HOME /usr/local/lam setenv $LAM_HOME/bin:${PATH} # AMBER setenv AMBERHOME /usr/local/amber8 setenv PATH $AMBERHOME/exe:${PATH}