構造解析ことはじめ/03 プログラムのインストール
 #floatcontents
 * AMBER8のインストール &Vine4; &Vine5; [#a24667cd]
 分子動力学シミュレーション(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は相当古いのでこのメモがどの程度役に立つかは不明です&huh;~
 シングルCPU環境でしか実行しない場合はIntel Compilerがあればいいのですが、並列環境で実行する場合はLAM-MPIをインストールしてMPI環境を準備します。
 ~
 &color(red){''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が出力されます。符号が全て逆転しています。
 -- &ref(1rrb_vac_mwcovarmat_evecs.dat.dif.txt);
 
 ** ビルド環境 [#m61a11e0]
 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について>Intel Compiler/インストール#va92d9b1]]を参考にして下さい。
 - MKLについては[[Intel Math Kernel Libraryのバージョン>Intel Compiler/インストール#va92d9b1]]を参考にして下さい。
 
 ** LAM-MPIのインストール [#la3bec37]
 MPI環境で並列計算を行う場合はインストールします。LAM-MPIは現在OpenMPIプロジェクトになっているようですがAMBER8はLAM-MPIを使用します((たぶん当時はまだOpenMPIがなかったのだと思います))。LAM-MPI 7.1.4を使用しました。
 
 *** configureオプション [#e7226b85]
 オプションは以下のような設定にしてみました。
 - 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直下にインストールされます。
 
 *** ビルド [#n464543f]
 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本体のインストール [#se2eb7f1]
 ようやく準備が整ったのでAMBERをビルドします。/usr/local/amber8以下にインストールしますが、ビルドも同じ場所で行うので最後の並列テスト以外はroot権限で実行します。
 
 ** aptでインストール [#me18f97e]
 - byacc
 - libXt-devel
 - libXext-devel
 
 ** ビルド [#b2a39892]
 *** Intel Compilerおよび環境変数のセットアップ [#l31770d0]
  # 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オプションを使って下さい。
 
 *** パッチを当てる [#w7375b4a]
 Intel Compiler 11用にオプションを変更したパッチとAMBER8のバグフィックスパッチを当てます。
 - AMBER8バグフィックスパッチ -- http://ambermd.org/bugfixes80.html
 - &color(red){[通常はこっち]}; : Intel Compiler 11用パッチ(2010-05-24版) -- &ref(amber8-ic11-20100524.patch);
 - [旧版] : Intel Compiler 11用パッチ -- &ref(amber8-ic11.patch); 
 
  # cd $AMBERHOME
  # patch -p1 < amber8-ic11-20100524.patch
  # patch -p0 < bugfix.all
 
 パッチを当てたらビルドします。
 
 #classdiv(box-blue)
 &color(blue){''[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のバージョンが異なる際に使用します
 
 &color(blue){''[旧版] amber8-ic11.patchの内容''};
 :src/configure|
 - CコンパイラもIntel Compilerを使うようにした(icc,icpc,fpp)
 - FFLAGSおよびCFLAGSをSSE4.2最適化オプションにした
 -- &color(red){''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に落とした
 #classdiv(end)
 
 *** 通常版のビルド [#w609b750]
 &color(red){''[旧版のみ]''}; 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 |
 変更したらビルドします。
 
 #classdiv(box-yellow)
 &color(red){''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
 のみです。
 #classdiv(end)
 実際の手順は以下の通りです。
 
  # cd $AMBERHOME/src
  # ./configure '''[適切なオプション]''' ifort
  # make serial  <-- make -j4などで並列コンパイルすると結果がおかしくなるので-jは使用しない
 ビルドが完了したらテストします。
  # cd $AMBERHOME/test
  # make test    <-- -jオプションで並列にするとSegmentation faultしたときわからない
 テストが終了したら差のある結果をチェックします。
  # find ./ -name "*.dif" -print -exec cat {} \;
 私の環境での差は以下の通り。
 - &ref(amber8.serial.diff.txt);
 
 *** 並列版のビルド [#n947aa26]
 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 {} \;
 #br
 以上で完了です。~
 私の環境での差は以下の通りです。
 - &ref(amber8.lammpi.diff.txt);
 
 #classdiv(box-yellow)
 &color(blue){''通常版と並列版の共存''};~
 並列版は通常版をビルドし、その後並列版をビルドすることで通常版のプログラムが上書きされてしまいます。そうすると非MPI環境で実行できなくなってしまうので、私は通常版と並列版を別ディレクトリで用意しました。~
 手順は、
 
 + 通常版をビルド
 + 通常版を別ディレクトリにコピー
 + コピーしたディレクトリで並列版をビルド
 
 としてみました。
 #classdiv(end)
 ** 実行環境のセットアップ [#h4086e38]
 実行するための環境を整えます。.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}