CCP4/インストール

Advancedで極上なCCP4環境を作る  

このページでは、とにかく先進の機能を使いたい!、パフォーマンスチューニングしたい!、でもなくてもいいよ〜っていうようなCCP4のインストールを試してみます。
Vine 4.2ではおそらく手順どおりにすればインストール可能だと思いますが、少々トラブル対応の知識がいるかも。ま、無理にインストールしなくても解析にはほとんど影響しないとは思いますが・・・
MrBUMPXIA2もオプショナルなのでややマニアックですが、このページは構造解析のアーリーアダプターを目指すあなたに贈ります [heart]

CCP4 6.1でIntel Math Kernel Libraryを使いたい!  

私は全然知らなかったのですが、CCP4ではver.4.2からベクトルとかマトリックスの計算にBLASまたはLAPACKというライブラリを使っているらしく(CCP4のドキュメント)、通常はディフォルトでNetLib版が(ソース)パッケージに含まれています。で、それをIntelのMath Kernel Library(MKL)を使ってみようという企画です。これは「みんなのひろば」のがっちゃんさんの書き込みで興味を持って試してみました。これらはSCALA, REFMAC5, BEASTなどに使われているらしく、Intel MKLを使えば計算が速くなるかも? 特にマルチコアCPUの場合は、MKLを使用した場合の計算を自動的にマルチスレッドで実行するらしいのでパフォーマンスの変化は顕著だそうです。
実際の作業にはコンパイルに相当時間がかかると思いますので、「今すぐCCP4をセットアップしなきゃ!!」っていう場合は止めた方がいいと思います [huh]。(最小限のコンパイルでも最低1時間はかかります)
Intel MKLを使わなくてもIntel Compilerでのコンパイルも同じ方法になりますので参考にしてみてください。

TLSに対応してる?  

まず最初の問題はこれです。Vine4のglibcは古いのでTLS(Thread Local Storage)という仕組みに対応してません。従ってglibcをTLSを使用可能な状態でコンパイルし直すか、TLSに対応しているディストリビューションを使います。今回のビルドはとりあえず居室にあったFedora8で試してみました。なお、CentOS5もTLSに対応しているので問題ないと思います。
TLSに対応していないVineでもglibcを再構築すれば使えますのでご心配なく。

Vine 4.2でもTLS対応glibcをインストールすればIntel MKLを使用可能です。

CCP4ソースパッケージの取得  

いつものようにCCP4のサイトからパッケージを取得します。今回は自分でビルドするのでソースパッケージを取得して下さい。フルセットをビルドするとなると一体どのくらい時間がかかるかわからないので今回はCCP4+Phaser/CCTBXで試してみました。なお、CCP4 + Phaser/CCTBXで約2.5時間、CCP4のみで約1時間かかりました(Core2 Quad 2.4GHz, Fedora8)。共にX-Window用のプログラムはビルドしてません。
今回はCCP4 Program Suite v6.1とPhaser/CCTBXを選択します。最小構成という意味ではこの組み合わせになりますがPhaser/CCTBXなしのCCP4パッケージのみでもビルド可能です(その場合、POINTLESSやRAMPAGEも入りません)。

  1. DownloadサイトのChoose platformでGeneric (source code only)を選択し、Customized Installationをクリックします
  2. CCP4 Program Suite v6.1とPhaser v2.1.4 and CCTBX(Source code)にチェックを入れます
  3. そのままContinueで進みます
  4. ライセンスに同意してファイルをダウンロードします

ビルドとインストール  

取得したファイルをインストールしたい場所に展開します。例えば/usr/local/ccp4-intelに展開します。作業はtcshでIntel Compiler 11.0の環境で行いました。

# tcsh
# source /opt/intel/Compiler/11.0/074/bin/iccvars.csh ia32
# source /opt/intel/Compiler/11.0/074/bin/ifortvars.csh ia32
# mkdir /usr/local/ccp4-intel
# cd /usr/local/ccp4-intel
# tar xvf CCP4-Oth.tar

展開したら環境変数XLDFLAGSおよびCOPTIMをセットします。これがポイントです。

# setenv XLDFLAGS "-lmkl -liomp5 -lguide"
# setenv COPTIM "-O -ip"

Intel Processorsへの最適化

  • COPTIM(C++最適化オプション)とFOPTIM(Fortran最適化オプション)にオプションをセットします。
# setenv COPTIM "-O3 -xW -axT -parallel -no-prec-div -ip"
# setenv FOPTIM "-O3 -xW -axT -parallel -no-prec-div -ip"

でビルドして確認しました(CCP4 + Phaser/CCTBX)。-xW -axTはプロセッサの種類によって異なりますので環境に合わせて下さい。

環境変数まとめ
環境変数内容
XLDFLAGSLAPACKを使用するのに必要なライブラリ"-lmkl -liomp5 -lguide"
COPTIMCコンパイラの最適化オプション標準:"-O -ip"
最適化例:"-O3 -xW -axT -parallel -no-prec-div -ip"
FOPTIMFortranコンパイラの最適化オプション標準:設定なし
最適化例:"-O3 -xW -axT -parallel -no-prec-div -ip"
プロセッサへの最適化を行わない場合はFOPTIMを設定しなくても構いません。

これで準備ができました。そのままインストールスクリプトを実行します。

# ./install.sh

以上です。
インストールスクリプトはこんな感じでした。これはCCP4本体だけで実行した結果です。

 #############################
 # INSTALLER FOR CCP4 v6.1.0 #
 #############################

Installing the following packages:
   CCP4 source code

We have detected an existing installation at /usr/local/ccp4
Would you like to use install there? (yes/no):
 Currently [yes]
no <- すでにCCP4がセットアップされていたら聞かれるはず。noにします

Do you want to keep all default parameters for installation (yes/no):
 Currently [yes]
 NB: By default, the crystallographic packages will be extracted and built here.
no <- パラメータも設定するのでnoにします

Where do you want to install/extract the packages?
Currently:  [/usr/local/ccp4-intel] 
<- よければEnter
################################
# CCP4 Installation Parameters #
################################

 We detect your operating system as a Linux operating system 
If you disagree or want to try another configuration,
please select from the list below: 
1) Linux type 64 bits operating system
2) Irix 64 bits operating system
3) Solaris 64 bits operating system
4) Linux type operating system
5) Irix operating system
6) Solaris operating system
7) Free BSD operating system
8) Hewlet Packard operating system (HPUX)
9) IBM operating system (AIX)
0) Other generic Unix system
Press Return to confirm correct auto-detection
4 <- システムを選択。Enterだけでもいいかも

 Do you want to use one of the following compilers?
1) Intel compilers
2) Compaq compilers
3) IBM compilers
Enter number or press Return for default compilers
1 <- Intel Compilerを使うので1

Where do you want to install CCP4 executables:
Default[/usr/local/ccp4-intel/ccp4-6.1.0/bin]
<- Enter

Where do you want to install CCP4 libraries:
Default[/usr/local/ccp4-intel/ccp4-6.1.0/lib]
<- Enter

(この辺からインストールするコンポーネントが聞かれる。通常はDefaultでいいと思います)
Do you want to build only libraries (y/n): Default[n] 
What type of build do you want to do (shared/static) libraries: Default[static]
Do you want to enforce compilation and use of Netlib-Lapack (y/n): Default[n]
Do you want to build the x-windows programs (y/n): Default[y]
Do you want to use rx-dispencer library (y/n): Default[n]
Do you want to build clipper library (y/n): Default[y]
Do you want to build ccif library (y/n): Default[y]
Do you want to build mapslicer (y/n): Default[y]
Do you want to build fftw library (y/n): Default[y] <-- MKLのFFTWラッパーを使う場合はn
Do you want to build ssm library (y/n): Default[y]
Do you want to build pdb-extract suite (y/n): Default[y]

 We are now ready to install :
  CCP4 source code
 NB: The remaining usually does not require your intervention. 
If it is your first installation of CCP4 you might be prompted to agree licence first.
The installation will take some time, so you'd better grasp a cup of coffee and relax.
Press any key to start.
<- Enterで開始されます

ビルドを開始するとパッケージが展開され、コンパイルが始まります。この時の出力はccp4.logとエラー出力はccp4e.logになります。
念のため、MKL_LAPACKが認識されるかどうかをccp4.logを見て確認します。119行目あたりの

********* BLAS AND LAPACK CONFIGURATION ***********

からライブラリの確認に入っています。

/opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_lapack.so: undefined reference to ...

というようなメッセージが大量に流れますが、無視してずーっと見ていき、318行目あたりに、

/opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_lapack.so: undefined reference to `mkl_lapack_cgbtrf'
/opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_lapack.so: undefined reference to `mkl_pds_blkldl_omp_pardiso'
ifort -Vaxlib -O -w -w95 -w90 -o testlink testlink.f -L/opt/intel/Compiler/11.0/074/mkl/lib/32 -lmkl_lapack -lmkl -liomp5 -lguide -lpthread
Link ok - using libmkl_lapack from /opt/intel/Compiler/11.0/074/mkl/lib/32 <- これ

というメッセージがあればおそらくOKです。
なお、TLSに対応していないシステム(Vine4)では、

ifort -Vaxlib -O -w -w95 -w90 -o testlink testlink.f -L/opt/intel/Compiler/11.0/074/mkl/lib/32 -lmkl_lapack -lmkl -liomp5 -lguide -lpthread
/opt/intel/Compiler/11.0/074/lib/ia32/libiomp5.so: undefined reference to `___tls_get_addr'
  link failed - cannot use libmkl_lapack

こんな感じになります。
最終的に703行目付近に、

Linking in LAPACK/BLAS using XLAPACK_LIB="-L/opt/intel/Compiler/11.0/074/mkl/lib/32 -lmkl_lapack"

***** BLAS AND LAPACK CONFIGURATION FINISHED *******

というのが出力されていれば認識しています。このXLAPACK_LIBが/usr/local/ccp4-intel/ccp4-6.1.0/lib/lapack...というようになっていたら認識してません。XLDFLAGSを確認してください。
CCP4パッケージのみの場合、1時間少々でビルドが完了してました。

確認してみる  

実際にMKLがリンクされているかを確認します。

% cd /usr/local/ccp4-intel/ccp4-6.1.0/bin
% ldd scala
       linux-gate.so.1 =>  (0x00110000)
       libmkl_lapack.so => /opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_lapack.so (0x004e2000)
       libimf.so => /opt/intel/Compiler/11.0/074/lib/ia32/libimf.so (0x00112000)
       libsvml.so => /opt/intel/Compiler/11.0/074/lib/ia32/libsvml.so (0x00331000)
       libm.so.6 => /lib/libm.so.6 (0x00423000)
       libstdc++.so.6 => /usr/lib/libstdc++.so.6 (0x00aa8000)
       libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x0044d000)
       libirc.so => /opt/intel/Compiler/11.0/074/lib/ia32/libirc.so (0x00459000)
       libdl.so.2 => /lib/libdl.so.2 (0x0049c000)
       libmkl_intel.so => /opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_intel.so (0x00b93000)
       libmkl_intel_thread.so => /opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_intel_thread.so (0x00cfd000)
       libmkl_core.so => /opt/intel/Compiler/11.0/074/mkl/lib/32/libmkl_core.so (0x01149000)
       libiomp5.so => /opt/intel/Compiler/11.0/074/lib/ia32/libiomp5.so (0x011bd000)
       libguide.so => /opt/intel/Compiler/11.0/074/lib/ia32/libguide.so (0x0123b000)
       libpthread.so.0 => /lib/libpthread.so.0 (0x004a2000)
       libc.so.6 => /lib/libc.so.6 (0x012b2000)
       /lib/ld-linux.so.2 (0x004c5000)

無事にlibmkl_lapackとlibmkl_*がリンクされていました [smile]

 

$CCP4/lib以下にlibfftw.aができていなければ、MKLのfftwが使用されていると考えていいと思います。

プログラムのテスト  

ちゃんと動作するかどうかをテストしてみます。

# source /usr/local/ccp4-intel/setup-scripts/csh/ccp4.setup
# source /usr/local/ccp4-intel/setup-scripts/csh/ccp4-others.setup
# cd /usr/local/ccp4-intel/ccp4-6.1.0
# make runtest

失敗するとエラーが表示されます。パッケージによっては全て実行されません(CCP4メインのみならPHASERなどがスキップされます)。

テストの結果  

どのぐらいの時間がかかるかを比べてみました。Intel Pentium Dual-Core E2160 1.8GHz + 4GB RAMで、Vine 4.2上で実施しました。
使用したのはCCP4 6.1.0 + Phaser/CCTBXです。

プログラム時間timeコマンドの出力
RH8用バイナリ19分38秒1105.425u 24.833s 19:38.08 95.9% 0+0k 0+0io 1046pf+0w
Intel Compiler + Intel MKL18分09秒1185.598u 31.633s 18:09.18 111.7% 0+0k 0+0io 399pf+0w

テストの比較では大幅な変化はありませんでした(8%程度)。MKLが活躍するようなプログラムをガシガシ使えば差が出るかもしれませんね。

実際の使い方  

$CCP4/bin以下のプログラムをコピーして使うか、パスの探索順序を前の方にすればいいと思います。

Intel FFTW wrapperの検討  

フーリエ変換ライブラリFFTWをMKLに置き換える(FFTの挙動が異なるのか、正しい結果が得られません)

  • FFTWライブラリはCLIPPERライブラリが使っているのでCLIPPERを使うBUCCANEER、PIRATE、PARROTあたりに影響を及ぼします。
    • CLIPPERライブラリ中のFFTW関係の関数の挙動が本来と異なるようです。
  • BUCCANEERのテスト(cbuccaneer.exam)で失敗していましたが、それ以前のCPIRATEのテスト(cpirate.exam)でプレビルド版とは結果が全く異なりました(たぶん解が出てません)。従ってIntel FFTW wrapperは使用しない方がいいと思います。
  • これはgcc + Intel FFW wrapperでもIntel Compiler + Intel FFW wrapperでも同じ結果でした。
cpirate.examのログ(pre-built vs. intel-FFTW wrapper)
Automatic content fitting:
 Skew by: -0.21875,0 (dense, ordered)  0.96875,0.875 (dense, ordered)

Unbiased results from initial cycle:
 R-factor     : 0.790483               0.195488
 Free R-factor: 0.845515               1.15188
 E-correl     : 0.504196               0.991128
 Free E-correl: 0.195072               0.2489
 LgLkGain     : 0.331314               2.8692
 Free LgLkGain: 0.30185                -inf
  • 原因が究明されたときのためにメモは残しておきます。しかし・・・何でこんなことが起こるんだろう?

FFTWライブラリをIntel MKLに置き換える場合は以下の環境変数をセットして、CCP4のインストールスクリプト(install.sh)実行時にDo you want to build fftw libraryの質問をnにして標準のFFTWを使わないようにします。

# setenv FFTW_LIBS "-lfftw2xc_intel -lmkl -liomp5 -lguide"
# setenv FFTW_CXXFLAGS "-I/opt/intel/Compiler/11.0/074/mkl/include/fftw" (環境に合わせて下さい)

これらの変数をセットしておけばMKLのFFTWラッパーライブラリを使うことができます。なお、Intel Compilerをインストールしただけではラッパーライブラリが構築されていませんのであらかじめ構築しておきます。Intel MKLディレクトリ/opt/intel/Compiler/11.0/074/mkl/interfaces以下のfftw2xc, fftw2xf, fftw3xc, fftw3xfそれぞれのディレクトリに移動して、

# make lib32 PRECISION=MKL_SINGLE

を実行すればmkl/lib以下にlibfftw2xc_intel.a, libfftw2xf_intel.a, libfftw3xc_intel.a, libfftw3xf_intel.aが構築されます。libfftw?xc_intel.aのcはC++用ライブラリ、fはFortran用に分かれていますが、CCP4で使うのはlibfftw2xc_intel.aで、CLIPPERライブラリから使用されます(たぶん)。なお、オリジナルのfftw2ライブラリはlibfftw,librfftwに分かれていますが、MKLのfftwラッパーライブラリは一つに集約されているようです。なお、構築時に浮動小数点の精度をMKL_SINGLE(単精度)にしないと、CLIPPER関係のプログラムが動作しませんでした(CTRUNCATEでSegmentation Faultが出ました)。

MOLREP 10.2をインストールしてみる  

CCP4 6.1では標準でインストールされてます

 

CCP4パッケージの分子置換プログラムであるMOLREPの最新版(2008年10月時点)をインストールしてみます。CCP4 6.0.2に収録されているver.9とそんなに変わらないかもしれませんが、説明によるとFortran 90を使用することでメモリアロケーションが効率化され、以前の2倍の速度で動作するのだとか。そんなわけで試してみます。もちろんIntel Compilerを使います。
ビルドなんてめんどくさい人はバイナリを取得してください。

CCP4開発用ライブラリのビルド  

CCP4バイナリパッケージで提供されている開発用ライブラリ(libccp4c.aとlibccp4f.a)は、なぜかMOLREPをコンパイルしたときにUndefined referenceエラーがでてリンクできません(環境によるのかもしれませんが)。そんなわけで、まずCCP4開発用ライブラリをIntel Compilerでビルドします。ここで用意しておけば、他にも利用できる・・・かも? ライブラリのビルドはIntel Compilerの9.xを使います。今回は9.1を使用しました。10.xではconfigure時にエラーが出てうまくいきませんでした。

ソースアーカイブの取得
CCP4のダウンロードページGeneric(source code only)を選択してContinueで次に進みます。次のページ中ほどのCCP4 Program Suite v6.0.2にチェックを入れて一番下のContinueで次に進みます。続いてContinueでI agree to the licence conditionsをクリックするとダウンロード画面が表示されます。
おそらくファイル名はCCP4-Oth-.tarになっているはずです。
ライブラリのビルド
ダウンロードしたファイルを展開してビルドします。ライブラリの出力先は/usr/local/ccp4/ccp4-6.0.2-ic91/libとします。インクルードファイルは/usr/local/ccp4/ccp4-6.0.2-ic91/includeになります。
適当なディレクトリで作業します。あらかじめディレクトリを作成しておきます。
# mkdir -p /usr/local/ccp4/ccp4-6.0.2-ic91/lib
# mkdir -p /usr/local/ccp4/ccp4-6.0.2-ic91/include
続いてビルド。
% tar xvf CCP4-Oth-tar
% tar zxvf packages.tar.gz
% cd ccp4-6.0.2
% ./configure --libdir=/usr/local/ccp4/ccp4-6.0.2-ic91/lib --onlylibs linux_intel_compilers
% make onlylib
# su -
# source /opt/intel/9.1.047/bin/iccvars.sh <-- Intel Compilerのバージョンによる
# make install
これで必要なライブラリ群が/usr/local/ccp4/ccp4-6.0.2-ic91にインストールされます。コンパイル時間は15-30分程度だと思います。

MOLREPのビルド  

ライブラリが準備できたらMOLREPをビルドします。

% tar zxvf molrep_f90.tar.gz
% cd molrep/src
% setenv CLIB /usr/local/ccp4/ccp4-6.0.2-ic91/lib
% chmod +x molrep.setup
% ./molrep.setup intel

以上でビルドするとmolrep/bin/molrepができているはずです。

MOLREPのファイルのインストール  

MOLREPのソースアーカイブを展開したディレクトリにccp4iディレクトリがありますが、これらのファイルをCCP4iのディレクトリにコピーします。以前のファイルは念のため名前を変えておいておきます。
ディレクトリは/usr/local/ccp4/ccp4-6.0.2/ccp4i以下です。

とでもしておきます。続いて、ファイルをコピーします。元のファイルはMOLREPアーカイブを展開したディレクトリです。ccp4i以下のファイルはgzで圧縮されているのでgunzipしておきます。

CCP4i設定ファイル
実行ファイル

以上でインストールは完了です。
なお、molrep.tcl内のバージョンの部分が変更されていないのでCCP4iでの表示はversion 9.2になってますが、気になる方は変更してみるといいかもしれません。

318:  CreateLine line \
319:    label "This interface is for version 9.2 of Molrep" -italic

この部分ですね。

使ってみた  

以前のバージョンMOLREP 9.2で20分かかった計算が10.2では7分半で終わりました。すごいっす!