構造解析ことはじめ/03 プログラムのインストール

AMBER8のインストール Vine4 Vine5  

分子動力学シミュレーション(MD)で一般的に使用されるAMBERをインストールしてみます。
ここではIntel Compiler 11.0および11.1を使ってビルドします。たどり着くまで紆余曲折がありましたので別バージョンも残しておきます。

専門外なのでMDに関する難しいことはよーわかりません。ちなみに2009年2月現在の最新版はAMBER10でここで扱っているバージョン8は相当古いのでこのメモがどの程度役に立つかは不明です [huh]
シングル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でビルドします。注意して下さい。

ビルド環境  

Intel Compiler 11.0および11.1で確認しました。LAM-MPIに関してはIntel Compilerバージョンによる作業の違いはありません。
私の環境(Core2 Quad Q9650)では11.1に付属していたMKL(Ver.10.2)ではビルド後のテストで問題が発生しました。従って、ここでは11.0付属のMKL 10.1を使用します。

LAM-MPIのインストール  

MPI環境で並列計算を行う場合はインストールします。LAM-MPIは現在OpenMPIプロジェクトになっているようですがAMBER8はLAM-MPIを使用します*1。LAM-MPI 7.1.4を使用しました。

configureオプション  

オプションは以下のような設定にしてみました。

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

ビルド  

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のバグフィックスパッチを当てます。

# 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環境で実行できなくなってしまうので、私は通常版と並列版を別ディレクトリで用意しました。
手順は、

  1. 通常版をビルド
  2. 通常版を別ディレクトリにコピー
  3. コピーしたディレクトリで並列版をビルド

としてみました。

実行環境のセットアップ  

実行するための環境を整えます。.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}
*1 たぶん当時はまだOpenMPIがなかったのだと思います