2007年7月25日水曜日

GROMACSの特殊な環境へのインストール

通常のPCでlinuxであれば、結構楽にインストールする事が出来ます。しかし、大型計算機で私的に使いたいという要望がある時は別の問題が発生します。システムレベルでリンクライブラリが定義されていないような物をリンクする必要が生じるからです。通常はそのような場合はstaticリンクを用いて回避します。しかしMKLはstaticリンクの方法を間違えると非常にややこしい事に陥ります。

通常は動的ライブラリとして-lmklというオプションをリンク時に与えればいいのですが、上のような状況でさらにMPICHで並列化処理をしたいとなると、どこかのノードでlibmkl.soなんてみつからないぞとエラーを言ってきます。さらにはiccの最新バージョンをやはり私的に使用していると同じような事になります。

dynamic linkできないという問題です。

元々のシステムのコンパイラを使えばよいっていっても最新の外注プログラムは動かないんですよ。新しくしないと。

そこで、mpichとicc,ifort,mklを/home/hoge/intel/内にインストールしている場合
どうするかを以下に書こうと思います。

というよりはスクリプトを作って対応しました。
----chconfig.csh----
#!/bin/csh

setenv INSTALLDIR /home/hoge/program/gromacs-3.3.1
setenv COMPDIR /home/hoge/intel

echo just installing mdrun_mpi $INSTALLDIR
echo making configure for MPICH MKL ICC static

setenv CC icc
setenv CXX icpc
setenv MPICC $COMPDIR/mpich/bin/mpicc
setenv F77 ifort
setenv MKLPATH $COMPDIR/mkl/8.0.2/lib/32
setenv MKLIPTH $COMPDIR/mkl/8.0.2/include
setenv ICCPATH $COMPDIR/cc/9.0/lib


setenv LD_LIBRARY_PATH /home/hoge/intel/mkl/8.0.2/lib/32:/home/hoge/intel/cc/9.0/lib

setenv LDFLAGS "$LDFLAGS -L$MKLPATH -lmkl_ia32 -lguide -lpthread "
setenv CPPFLAGS " -I$MKLIPTH"
setenv CXXFLAGS " -I$MKLIPTH"

sed "s/-lmkl /-lmkl_ia32 -lguide -lpthread /g" configure |cat > test
sed "s/LDFLAGS -all-static/LDFLAGS -static/g" test |cat > configure.int.static

rm test

echo "configure"
chmod +x configure.int.static
./configure.int.static --enable-double --enable-mpi --disable-nice --with-fft=mkl --program-suffix=_mpi --prefix=$INSTALLDIR --enable-all-static

echo "compile"
make mdrun
echo "install"
make install-mdrun
echo "all done"
ldd $INSTALLDIR/bin/mdrun_mpi

----------------------end of script-----------
この中核となるのが、configureのsedによる編集部分です。-lmklが自動的に設定されるので動的リンクが働いて --enable-all-staticのオプションが動作しませんでした。さらにiccでは-all-staticというオプションがないので、-staticに変えないとダメでした。

DFTのMKLのroutineを使う際にするオプション"-lmkl_ia32 -lguide -lpthread"はそのままstaticリンクを行います。これだけではiccの方が見失うのでやはり-staticは必要でした。

このスクリプトでmdrun_mpiという並列専用のMdアプリケーションを作成する事が出来ました。

今度は別で、どうやってキューイングシステムに入れて計算させるかという事が必要となります。mpirunをコントロールするスクリプトscriptAがあるシステムを使っている場合、
投入時のスクリプトの最後の方に
scriptA miprun mdrun_mpi -N 2 -s $TPR -o $TRR -g $LOG

と書けば、アーカイブ化されたインプット$TPRを用いて$LOGにログを出力し、$TRRに座標を出力するように出来ます。

で、なんとか計算させることが出来ました。


mdrun以外のアプリケーションを非並列で、倍精度の条件で、
-enable-all-staticを使ってコンパイルするとdynamicリンクしているのがlddコマンドで分かります。なので、
上のスクリプトで
--program-suffix=_statとして、make&make installに書き換えてやると…成功しました!!これだけで2時間はかかった。_statには意味がない。並列でもシングルでも動くライブラリ非依存のプログラムが完成しました。これで、同じ機械上ならば、動的ライブラリを参照する事無く使えます。

走らせてやると、2cpuで、並列効率98%、一日で4.89nsecほど(@6000原子程)。
かなり早いらしい…。

次はこのプログラムの中身を解読し、独自の関数を埋め込まなければいけません。
そのために孤立系を用意しなければ。

0 件のコメント: