AMBER/インストール

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は古いため新しいコンパイラだと問題が生じるようです。以下の組み合わせで行いました。

を使いました。
Intel Compiler 11.0を使った場合、newton_raphテストでProgram errorがでました(解決済み)。それ以外は細かい数値の差は出ましたが、大きな問題なさそうなのですが・・・

Intel Math Kernel Library(MKL)のインストール  

数学計算を行うためのライブラリです。Intel製のためIntelプロセッサに最適化されています。

アーカイブファイルの取得  

Intelのサイトから非商用無料版を取得します(それにしてもIntelのホームページはわかりにくい!!)。

LAM-MPIのインストール  

MPIによる並列計算を行う場合はインストールします。シングルスレッドでの計算しか行わない場合は不要です。
AMBERのコンパイルにIntel Compilerを使うので同様にIntel Compilerを使います。GCCでコンパイルするとAMBERとリンクするときにエラーが出て失敗します。

configureオプション  

最適化オプションを調べるのがめんどくさかったので最低限のオプションでビルドしました。

インストール先は/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でインストール  

必要なもの  

ビルド  

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を使ったことがないのでわかりませんが、パッチを当てると結果が多少変わり、テスト結果に変化が現れます。使う人に聞きながら確認したところあまり問題はなさそうですが、よく確認して下さい。

オリジナルの場合(シングル、パラレル)
パッチを当てた場合(シングル)
パッチを当てた場合(パラレル)

パッチを当てていない場合、実行時にエラーが出ました。また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でたまたま回避できました。詳しくは検証してません [huh]
少なくとも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

並列版のビルド  

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デーモンの起動も忘れずに。

以上です。苦労したー [sad]