AMBER8のインストール -- Vine 4.2
これはIntel Compiler 11が使えないと思い、試行錯誤した記録です。Intel Compiler 11の記録はこちら。
分子動力学シミュレーション(MD)で一般的に使用されるAMBERをインストールしてみます。
専門外なので難しいことはよーわかりません。ちなみに2008年8月現在の最新版はAMBER10なので相当古いバージョンです。シングルCPU環境の場合はIntel Math Kernel Library(MKL)を追加インストールしますが、並列環境で実行する場合は加えてLAM-MPIをインストールしてMPI環境を準備します。
なお、このプログラムは古く、いろいろ試してみたところCentOS 5.2では動作しなかったため、結局Vine 4.2にインストールしました。なお、Vine 2.6r4を使えばすんなり動作しました。
註:Intel Compiler 11を使えばCentOS 5.2でも動作するかもしれません。
使用するコンパイラ
AMBER8は古いため新しいコンパイラだと問題が生じるようです。以下の組み合わせで行いました。
- GCC Ver.3.3.6 (Vine 4.2ディフォルト)
- Intel C Compiler Ver.8.1.038
- Intel Fortran Compiler Ver.8.1.034
- Intel Math Kernel Library Ver.9.1.023
を使いました。
Intel Compiler 11.0を使った場合、newton_raphテストでProgram errorがでました(解決済み)。それ以外は細かい数値の差は出ましたが、大きな問題なさそうなのですが・・・
Intel Math Kernel Library(MKL)のインストール
数学計算を行うためのライブラリです。Intel製のためIntelプロセッサに最適化されています。
アーカイブファイルの取得
Intelのサイトから非商用無料版を取得します(それにしてもIntelのホームページはわかりにくい!!)。
- Intel Math Kernel Library -- http://www.intel.com/cd/software/products/asmo-na/eng/307757.htm
- 非商用版の申し込みページ
ユーザー登録を行います。登録するとライセンスキーが取得でき、ダウンロードができるようになります。あまり新しいと問題が出るのでインストールはVer.9.1.023を使いました。
インストールはIntel Compiler本体と同様です。
LAM-MPIのインストール
MPIによる並列計算を行う場合はインストールします。シングルスレッドでの計算しか行わない場合は不要です。
AMBERのコンパイルにIntel Compilerを使うので同様にIntel Compilerを使います。GCCでコンパイルするとAMBERとリンクするときにエラーが出て失敗します。
- http://structbio.vanderbilt.edu/archives/amber-archive/2005/1848.php
このコメントでは-staticオプションが指定されていますが以下に示すようにコンパイラの指定のみでも問題なさそうです。
configureオプション
最適化オプションを調べるのがめんどくさかったので最低限のオプションでビルドしました。
- CC=icc <-- Intel Compiler (C)
- FC=ifort <-- Intel Compiler (Fortran)
- CXX=icpc <-- Intel Compiler (C++)
- CFLAGS,FFLAGS,CXXFLAGS,LDFLAGSなどは設定しませんでした。最適化オプションを使うと処理速度が向上するかも。
インストール先は/usr/local/lamにしたかったのでprefixオプションも使用します。prefixオプションなしだと/usr/local直下にインストールされます。
ビルド
configureに結構時間がかかりますが、makeは10分ほどで終わりました(Pentium Dual Core 1.8GHz)。
% source /opt/intel_fc_80/bin/ifortvars.csh <-- bashなら.sh % source /opt/intel_cc_80/bin/iccvars.csh <-- bashなら.sh % ./configure CC=icc FC=ifort CXX=icpc --prefix=/usr/local/lam % make # make install
AMBER8本体のインストール
ようやく準備が整ったのでAMBERをビルドします。/usr/local/amber8以下にインストールしますが、ビルドも同じ場所で行うので最後の並列テスト以外はroot権限で実行します。
aptでインストール
- byacc
- XOrg-devel
必要なもの
- LAM-MPI -- 並列化環境で実行する場合
- Intel Math Kernel Library(MKL) 9.1
- Intel Fortran Compiler 8.1 -- Ver.9.1でもビルドはできましたが、テストが通りません
ビルド
Intel Compilerおよび環境変数のセットアップ
# source /opt/intel_fc_80/bin/ifortvars.sh # cd /usr/local # tar zxvf amber8.tgz # export AMBERHOME=/usr/local/amber8 # export LAM_HOME=/usr/local/lam (並列化版もビルドする場合) # export MKL_HOME=/opt/intel/mkl/9.1.023
修正パッチ
AMBER8は修正パッチが配布されており、使用する場合はこの段階でパッチを当てます -- http://ambermd.org/bugfixes80.html
# cd $AMBERHOME # patch -p0 -N -r patch_rejects < bugfix.all
私はAMBERを使ったことがないのでわかりませんが、パッチを当てると結果が多少変わり、テスト結果に変化が現れます。使う人に聞きながら確認したところあまり問題はなさそうですが、よく確認して下さい。
- オリジナルの場合(シングル、パラレル)
- テストは全部通る
- 50%程度の確率でtest/qmmm/divcon/Run.crambinおよびtest/qmmm/divcon/Run.crambin_mdが失敗する。連続して実行するとPASSしたりFAILUEしたりする
diffing crambin.out.save with crambin.out possible FAILURE: check crambin.out.dif
こんな感じ。crambin.out.difを見ると、> MINDO not supported -- program terminated
というエラーが出ています。
- パッチを当てた場合(シングル)
- test/antechamber/fluorescein/prmtop.dif
- test/tgtmd/change_target.ntr/tgtmd.out.dif
- test/tgtmd/PME/tgtmd.out.dif
小数点以下4桁目が1ずれているものがある(丸め誤差のような気がしますが)。またprmtop.difを見るとDIHEDRALの出力結果の数が異なる。
- パッチを当てた場合(パラレル)
- シングルの結果に加えてtest/pheTI/out.p1.difが出力される。内容は以下の通り。
190c190 < Ewald error estimate: 0.5094E-16 --- > Ewald error estimate: 0.0000
静電ポテンシャルだから、並列で実行すると差が出ることはあるそうな。まあ、マイナス16乗のオーダーなので・・・
パッチを当てていない場合、実行時にエラーが出ました。またSegmentation faultが出ることもあります。
cd qmmm/divcon; ./Run.crambin ../../../exe/sander.QMMM: relocation error: ../../../exe/sander.QMMM: symbol mkstemp64, version GLIBC_2.2 not defined in file libc.so.6 with link time reference ./Run.crambin: Program error make: *** [test.sander.QMMM] エラー 1
パッチを当てずにこの問題を解決するにはglibcの再構築が必要な気がします。おそらくcompatオプションを入れてビルドすれば回避できると思うのですが、私の場合TLS対応glibcでたまたま回避できました。詳しくは検証してません
少なくともldd sanderでダイナミックリンクライブラリを確認したときにlibc.so.6の参照先が/lib/tls/libc.so.6の時は問題が発生しませんでしたが、LD_ASSUME_KERNEL=2.4.1を設定し、参照先を/lib/i686/libc.so.6にした時、またはLD_ASSUME_KERNEL=2.4.0で/lib/libc.so.6の時は同様のエラーが発生しました。
シングルスレッド版のビルド
並列化版をビルドする際もまずシングルスレッド版をビルドします。
Pentium4への最適化オプションである-p4をつけてコンパイルします。
# cd $AMBERHOME/src # ./configure -p4 ifort
生成されるconfig.h中のLAPACKのライブラリ名が異なるので修正します。
- config.h
OLD:61 LOADLIB= -lsvml -L/opt/intel/mkl/9.1.023/lib/32 -lvml -lmkl_lapack64 -lmkl -lguide -lpthread NEW:61 LOADLIB= -lsvml -L/opt/intel/mkl/9.1.023/lib/32 -lvml -lmkl_lapack -lmkl -lguide -lpthread
修正したらビルドし、テストを実施します。コンパイラのバージョンによってはテストに失敗するのでちゃんと確認しておいた方が良さそうです。
# make serial <-- -jオプションでmakeするとビルドに失敗します # cd $AMBERHOME/test # make test <-- マシンパワーに余裕があるなら-jオプションを使ってもOK
テストが終了したら差のある結果をチェックします。
# find ./ -name "*.dif"
で結果に差があったプログラムの出力ファイルのリストが得られます。パッチを当てたかどうかで結果が若干変わります。
- staticリンクの場合
% ./configure -p4 -static ifort
でstaticリンクも作れますが、以下のエラーが出るので$AMBERHOME/src/leap/src/leap/Makefileを修正します。/usr/X11R6/lib/libX11.a(XlcDL.o): In function `try_both_dlsym': XlcDL.o(.text+0x111): undefined reference to `dlsym' XlcDL.o(.text+0x136): undefined reference to `dlsym' /usr/X11R6/lib/libX11.a(XlcDL.o): In function `open_object': XlcDL.o(.text+0x635): undefined reference to `dlopen' /usr/X11R6/lib/libX11.a(XlcDL.o): In function `close_object': XlcDL.o(.text+0x6a4): undefined reference to `dlclose' collect2: ld returned 1 exit status make: *** [xaLeap] エラー 1
- 修正部分($AMBERHOME/src/leap/src/leap/Makefile)
113 XALEAP_LIB = ../Xraw/libXaw.a ../Wc/libWcLeap.a ../Xpm/libXpm.a \ 114 ../Xmu/libXmu.a -L$(XHOME)/lib -lXt -lXext -lSM -lICE -lX11 -lm -lpthread
114行目の最後に-ldlを追加。114 ../Xmu/libXmu.a -L$(XHOME)/lib -lXt -lXext -lSM -lICE -lX11 -lm -lpthread -ldl
並列版のビルド
SANDERを並列化環境下で実行する場合は通常版をビルドした後に並列版をビルドします。
# cd $AMBERHOME/src # make clean # ./configure -lam -p4 ifort # vi config.h <-- シングル版と同様に修正 # make parallel
並列版のテスト
シングルスレッド版はrootでテストしましたが、並列版は一般ユーザーで行います。ユーザーdobuoで行う場合以下のようになります。
まず、testディレクトリ以下のファイルの所有者をpooに変更します。
# chown -R dobuo:dobuo $AMBERHOME/test
続いて、ユーザーdobuoでテストを実行します。付属のドキュメントにはmake test.parallelで行えと書いてありますが、存在しないのでmake testを実行します。どうやらDO_PARALLELをセットしておけば並列化テストになるようです。この例はcshですがsh系の場合exportを使って下さい。なお、DO_PARALLELの設定を4以上にしたらテストが途中で失敗しました(残基よりもプロセッサが多い、というようなことを言われた)。
% setenv DO_PARALLEL "mpirun -np 2" (2はCPUの数) % setenv AMBERHOME /usr/local/amber8 % source /opt/intel_fc_80/bin/ifortvars.sh % setenv LD_LIBRARY_PATH /opt/intel/mkl/9.1.023/lib/32:${LD_LIBRARY_PATH} % setenv PATH /usr/local/lam:${PATH} % cd $AMBERHOME/test % lamboot <-- LAMデーモンの起動 % make test % lamhalt <-- LAMデーモンのシャットダウン % find ./ -name "*.dif"
以上で完了です。
実行環境のセットアップ
実行するための環境を整えます。.cshrcに以下の行を追加します。
# for AMBER8 # Intel Compiler source /opt/intel_fc_80/bin/ifortvars.sh source /opt/intel_cc_80/bin/iccvars.sh setenv LD_LIBRARY_PATH /opt/intel/mkl/9.1.023/lib/32:${LD_LIBRARY_PATH} # LAM-MPI setenv LAM_HOME /usr/local/lam setenv PATH $LAM_HOME/bin:${PATH} # AMBER setenv AMBERHOME /usr/local/amber8 setenv PATH $AMBERHOME/exe:${PATH}
AMBERではIntel Compiler 8.1を使うので他のバージョンでコンパイルしたプログラムを使うときに競合するかも・・・
また、MPIで実行する場合はmpirunするときにMPIデーモンの起動も忘れずに。
- 起動:lamboot
- 停止:lamhalt
以上です。苦労したー