#keywords(CCP4,Intel Compiler,Intel Math Kernel Library,MKL)
 CCP4/インストール
 * Advancedで極上なCCP4環境を作る [#x6ce49bf]
 #floatcontents
 このページでは、とにかく先進の機能を使いたい!、パフォーマンスチューニングしたい!、でもなくてもいいよ〜っていうようなCCP4のインストールを試してみます。~
 Vine 4.2ではおそらく手順どおりにすればインストール可能だと思いますが、少々トラブル対応の知識がいるかも。ま、無理にインストールしなくても解析にはほとんど影響しないとは思いますが・・・~
 MrBUMP、XIA2もオプショナルなのでややマニアックですが、このページは構造解析のアーリーアダプターを目指すあなたに贈ります&heart;
 
 ** CCP4 6.1でIntel Math Kernel Libraryを使いたい! [#me958684]
 私は全然知らなかったのですが、CCP4ではver.4.2からベクトルとかマトリックスの計算にBLASまたはLAPACKというライブラリを使っているらしく([[CCP4のドキュメント>http://www.ccp4.ac.uk/dist/html/modlib.html#blas_and_lapack]])、通常はディフォルトでNetLib版が(ソース)パッケージに含まれています。で、それをIntelのMath Kernel Library(MKL)を使ってみようという企画です。これは「みんなのひろば」のがっちゃんさんの書き込みで興味を持って試してみました。これらはSCALA, REFMAC5, BEASTなどに使われているらしく、Intel MKLを使えば計算が速くなるかも? 特にマルチコアCPUの場合は、MKLを使用した場合の計算を自動的にマルチスレッドで実行するらしいのでパフォーマンスの変化は顕著だそうです。~
 実際の作業にはコンパイルに相当時間がかかると思いますので、「今すぐCCP4をセットアップしなきゃ!!」っていう場合は止めた方がいいと思います&huh;。(最小限のコンパイルでも最低1時間はかかります)~
 Intel MKLを使わなくてもIntel Compilerでのコンパイルも同じ方法になりますので参考にしてみてください。
 - [[SourceForge.jpのIntel MKLの記事>http://sourceforge.jp/magazine/08/12/24/123237]]
 
 *** TLSに対応してる? [#q5db88ab]
 まず最初の問題はこれです。Vine4のglibcは古いのでTLS(Thread Local Storage)という仕組みに対応してません。従ってglibcをTLSを使用可能な状態でコンパイルし直すか、TLSに対応しているディストリビューションを使います。今回のビルドはとりあえず居室にあったFedora8で試してみました。なお、CentOS5もTLSに対応しているので問題ないと思います。~
 TLSに対応していないVineでもglibcを再構築すれば使えますのでご心配なく。
 - [[Vine 4.2でTLS対応glibcを構築する>どぶお/Linuxで遊ぼう!/VineでTLS対応glibc]]
 
 Vine 4.2でもTLS対応glibcをインストールすればIntel MKLを使用可能です。
 
 *** CCP4ソースパッケージの取得 [#zfb82039]
 いつものように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も入りません)。
 + DownloadサイトのChoose platformで''Generic (source code only)''を選択し、''Customized Installation''をクリックします
 + CCP4 Program Suite v6.1とPhaser v2.1.4 and CCTBXの''(Source code)''にチェックを入れます
 + そのまま''Continue''で進みます
 + ライセンスに同意してファイルをダウンロードします
 
 *** ビルドとインストール [#ee6fc7c4]
 取得したファイルをインストールしたい場所に展開します。例えば/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''をセットします。これがポイントです。
 - XLDFLAGSにMKL関連オプションを追加しておきます。
 - &color(red){COPTIMに-ipオプションを入れないとlibccif.aが正常に動作しないらしく、CIFファイルの書き出しや読み込みに問題が発生して動作しないプログラムがあります(MLPHARE、TRUNCATEなど)。''オプションなしでもビルド自体は成功するのが厄介なところ。''};-ipオプションってファイル内最適化オプションのはずなんですが、なぜ影響するかはわかりません・・・
 
  # setenv XLDFLAGS "-lmkl -liomp5 -lguide"
  # setenv COPTIM "-O -ip"
 
 #classdiv(box-blue)
 &color(blue){''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''はプロセッサの種類によって異なりますので環境に合わせて下さい。
 - 参考:[[Intel Compiler/コンパイルオプション]]
 #classdiv(end)
 
 :環境変数まとめ|
 |環境変数  |内容                                |例|h
 |~XLDFLAGS |LAPACKを使用するのに必要なライブラリ|"-lmkl -liomp5 -lguide"|
 |~COPTIM   |Cコンパイラの最適化オプション       |標準:"-O -ip"&br;最適化例:"-O3 -xW -axT -parallel -no-prec-div -ip"|
 |~FOPTIM   |Fortranコンパイラの最適化オプション |標準:設定なし&br;最適化例:"-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時間少々でビルドが完了してました。
 
 *** 確認してみる [#tae55e0f]
 実際に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;。
 #br
 $CCP4/lib以下にlibfftw.aができていなければ、MKLのfftwが使用されていると考えていいと思います。
 
 *** プログラムのテスト [#n871b60e]
 ちゃんと動作するかどうかをテストしてみます。
  # 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などがスキップされます)。~
 - プログラムによっては$CCP4/examples/unix/runnableへの書き込み権限が必要になりますので、今回のようにroot権限でインストールした場合、一般ユーザーでテストを実行すると失敗しますので注意して下さい(bp3など)。
 - テストによっては実行権限が付加されていない場合があります(--;、その場合はchmodで権限を追加して下さい。
 
 *** テストの結果 [#tfd2da2b]
 どのぐらいの時間がかかるかを比べてみました。Intel Pentium Dual-Core E2160 1.8GHz + 4GB RAMで、Vine 4.2上で実施しました。~
 使用したのはCCP4 6.1.0 + Phaser/CCTBXです。
 |プログラム                |時間    |timeコマンドの出力|h
 |RH8用バイナリ             |19分38秒|1105.425u 24.833s 19:38.08 95.9%        0+0k 0+0io 1046pf+0w|
 |Intel Compiler + Intel MKL|18分09秒|1185.598u 31.633s 18:09.18 111.7%       0+0k 0+0io 399pf+0w|
 テストの比較では大幅な変化はありませんでした(8%程度)。MKLが活躍するようなプログラムをガシガシ使えば差が出るかもしれませんね。
 
 *** 実際の使い方 [#a1026893]
 $CCP4/bin以下のプログラムをコピーして使うか、パスの探索順序を前の方にすればいいと思います。
 
 *** Intel FFTW wrapperの検討 [#j81c0898]
 #classdiv(box-yellow)
 &color(blue){''フーリエ変換ライブラリFFTWをMKLに置き換える''};&color(red){''(FFTの挙動が異なるのか、正しい結果が得られません)''};~
 - FFTWライブラリはCLIPPERライブラリが使っているのでCLIPPERを使うBUCCANEER、PIRATE、PARROTあたりに影響を及ぼします。
 -- CLIPPERライブラリ中のFFTW関係の関数の挙動が本来と異なるようです。
 - &color(red){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?x''c''_intel.aのcはC++用ライブラリ、fはFortran用に分かれていますが、CCP4で使うのはlibfftw2xc_intel.aで、CLIPPERライブラリから使用されます(たぶん)。なお、オリジナルのfftw2ライブラリはlibfftw,librfftwに分かれていますが、MKLのfftwラッパーライブラリは一つに集約されているようです。&color(red){なお、構築時に浮動小数点の精度を''MKL_SINGLE''(単精度)にしないと、CLIPPER関係のプログラムが動作しませんでした(CTRUNCATEでSegmentation Faultが出ました)。};
 - 参考:http://www.intel.com/software/products/mkl/docs/WebHelp/appendices)/mkl_appG_FFTW2_Installation.html
 - 参考:http://www.intel.com/software/products/mkl/docs/WebHelp/appendices/mkl_appG_FFTW2_Installation.html
 #classdiv(end)
 
 ** MOLREP 10.2をインストールしてみる [#a5164980]
 &color(red){CCP4 6.1では標準でインストールされてます};
 #br
 CCP4パッケージの分子置換プログラムであるMOLREPの最新版(2008年10月時点)をインストールしてみます。CCP4 6.0.2に収録されているver.9とそんなに変わらないかもしれませんが、説明によるとFortran 90を使用することでメモリアロケーションが効率化され、以前の2倍の速度で動作するのだとか。そんなわけで試してみます。もちろんIntel Compilerを使います。~
 ビルドなんてめんどくさい人はバイナリを取得してください。
 
 - MOLREP(Alexeiさんのページ) -- http://www.ysbl.york.ac.uk/~alexei/molrep.html
 
 *** CCP4開発用ライブラリのビルド [#ccd8c694]
 CCP4バイナリパッケージで提供されている開発用ライブラリ(libccp4c.aとlibccp4f.a)は、なぜかMOLREPをコンパイルしたときにUndefined referenceエラーがでてリンクできません(環境によるのかもしれませんが)。そんなわけで、まずCCP4開発用ライブラリをIntel Compilerでビルドします。ここで用意しておけば、他にも利用できる・・・かも? ライブラリのビルドはIntel Compilerの9.xを使います。今回は9.1を使用しました。10.xではconfigure時にエラーが出てうまくいきませんでした。~
 :ソースアーカイブの取得|
 [[CCP4のダウンロードページ>http://www.ccp4.ac.uk/download/downloadman.php]]の''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のビルド [#k7072176]
 ライブラリが準備できたら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のファイルのインストール [#j196b0c3]
 MOLREPのソースアーカイブを展開したディレクトリにccp4iディレクトリがありますが、これらのファイルをCCP4iのディレクトリにコピーします。以前のファイルは念のため名前を変えておいておきます。~
 ディレクトリは''/usr/local/ccp4/ccp4-6.0.2/ccp4i''以下です。
 - templates/molrep.com -> molrep.com.org
 - tasks/molrep.def -> molrep.def.org
 - tasks/molrep.tcl -> molrep.tcl.org
 - scripts/molrep.script -> molrep.script.org
 
 - /usr/local/ccp4/ccp4-6.0.2/bin/molrep -> molrep.org
 
 とでもしておきます。続いて、ファイルをコピーします。元のファイルはMOLREPアーカイブを展開したディレクトリです。ccp4i以下のファイルはgzで圧縮されているのでgunzipしておきます。
 :CCP4i設定ファイル|
 - ccp4i/molrep.com -> templates/molrep.com
 - ccp4i/molrep.def -> tasks/molrep.def
 - ccp4i/molrep.tcl -> tasks/molrep.tcl
 - ccp4i/molrep.script -> scripts/molrep.script
 
 :実行ファイル|
 - bin/molrep -> /usr/local/ccp4/ccp4-6.0.2/bin/molrep
 
 以上でインストールは完了です。~
 なお、molrep.tcl内のバージョンの部分が変更されていないのでCCP4iでの表示はversion 9.2になってますが、気になる方は変更してみるといいかもしれません。
  318:  CreateLine line \
  319:    label "This interface is for version 9.2 of Molrep" -italic
 この部分ですね。
 
 *** 使ってみた [#vbb43f8c]
 以前のバージョンMOLREP 9.2で20分かかった計算が10.2では7分半で終わりました。すごいっす!