#floatcontents
* SHELXのインストール [#r070ab70]
** プログラムアーカイブの入手 [#r4374ecd]
アカデミックフリーですが、プログラムの入手は若干面倒です。
アプリケーションフォーム( http://shelx.uni-ac.gwdg.de/SHELX/applfrm.htm )を''印刷して''必要事項を記入の上''FAX''を送ります(e-mailはダメらしい)。しばらくすると記載したメールアドレスにダウンロード方法が届くはずです。その際、利用者リストにメールアドレスとともに載るので、スパムメールが気になる場合は掲載しないように伝えるとよいかもしれません(私は掲載された後、スパムが急増したのでメールで削除して貰うように連絡しました)。~
得られたアーカイブに全てのプラットフォームのバイナリおよびソースが収録されています。
:参考|How to obtain SHELX -- http://shelx.uni-ac.gwdg.de/SHELX/#Obtain%20SHELX
** バイナリインストール [#a8aa0195]
#anno2(2010-06-21 追加)
- 参考:http://shelx.uni-ac.gwdg.de/SHELX/#Install%20SHELX
Linuxバイナリを適当な場所に展開してパスを通すだけです。
# tar zxvf shelx_linux.tgz
# cp linux/* /usr/local/bin
OpenMP版がある場合はそれもコピーします。その際、シンボリックリンクを張ると便利でしょう。
# cp mp/shelxl_ifc /usr/local/bin
# cd /usr/local/bin
# mv shelxl shelxl.orig <-- オリジナルファイルの名前を変更
# ln -s shelxl_ifc shelxl <-- シンボリックリンクを張る
なお、Intel Compilerでビルドし直すと若干の速度向上が見込めるので試してみてもいいかもしれません。
** SHELXLをIntel Compilerを使ってビルドする [#p41bbaae]
*** OpenMP版をIntel Compiler 11.1でビルド &Vine5; [#u696302b]
#anno2(2011-05-17 追加)
- 2011-05-18 -- Intel Compiler 12(Intel Parallel Studio 2011XE)でも動作確認しました
OpenMP版のSHELXLをIntel Compiler 11.1でビルドしてみます。バイナリで提供されるshelxl_ifcはおそらくIntel Compiler 9以前でビルドされているものなので、新しい方がたぶん速いだろうと思って試してみたところ、実際に10%ほど高速でした⌣。~
OpenMP対応版はSHELXソースディレクトリのmpサブディレクトリ以下にあるのでその中で作業します。なお使用したいスレッド数が4を超える場合、shelxh_omp.fのパラメータを変更します。
16 c maximum number of CPUs (choose the actual number with the
17 c environment variable OMP_NUM_THREADS):
18 parameter(maxcpu=4) <-- この値(例えば8にする)
修正したらビルドします。
% ifort -O3 -xsse4.1 -openmp -prec-div -heap-arrays shelxh_omp.f shelxlv_omp.f -o shelxl.omp
ここではオリジナルと区別するためにshelxl.ompという名前にしています。
:オプションの意味|
- ''-openmp'' -- OpenMPフラグを有効にする
- ''-prec-div'' -- 精度を上げるため、浮動小数点演算の効率化を行わない。ディフォルトでオンなのでなくてもいいかも
- ''-heap-arrays''
-- このオプションを指定しないと計算が始まる時にスタック領域が不足してセグメントエラーでプログラムが強制終了されます。巨大な配列をヒープ領域に取ることでスタック領域不足を回避するようで、このオプションはVer.10以降で導入されたみたいです。それ以前のバージョンではifort –Wl,-stack_size,0x10000000,-stack_addr,0xc0000000 foo.fという感じでスタック領域のサイズを指定するみたいです(未確認)。
-- 参考:[[Intel® Fortran Compiler - Increased stack usage of 8.0 or higher compilers causes segmentation fault>http://software.intel.com/en-us/articles/intel-fortran-compiler-increased-stack-usage-of-80-or-higher-compilers-causes-segmentation-fault/]]
- なお、-xsse4.1といったCPU最適化オプションは使用する環境に合わせて変更してください。([[Intel Compiler/コンパイルオプション]])
複数ファイル最適化オプションである-ipoを付けると計算速度が10%程度低下したため、付けていません。
*** Intel Compiler 11によるビルド &Vine5; [#a7b08e0a]
&color(red){OpenMP版があれば不要です。};~
バイナリファイルをインストールは簡単なのですが、Intel Compilerを使って自動並列化による高速化を試してみます。オリジナルバイナリよりは30-50%程度高速になりますが、OpenMP版の方が遥かに高速です。~
SHELXLはIntel Compiler 11.1を用いて以下のようにビルドしました。
% ifort -O3 '''-xsse4.1''' -parallel -prec-div shelxl.f shelxlv.f -o shelxl.intel
'''-xsse4.1'''などの拡張命令セットの指定はCPUにあわせて下さい。([[Intel Compiler/コンパイルオプション]])~
生成されたshelxl.intelを適当な場所(例えば/usr/local/binにコピーして使って下さい)。ここではオリジナルのバイナリと区別するためにshelxl.intelという名前にしています。
*** ベンチマーク [#mbf14968]
#anno2(2011-05-17)
- 260残基 x 1分子および500個ほどの水分子、0.9Å(水素原子なし)
|使用プログラム |時間 |環境 |クロック数|スレッド数|h
| |RIGHT: | |CENTER: |CENTER: |c
|~OpenMP版(11.1でビルド) |4分51秒(291秒) |Core i7-940 |2.93GHz |8(HT) |
|~OpenMP版(11.1でビルド) |6分44秒(404秒) |Core2 Quad Q9650|3.0GHz |4 |
|~OpenMP版(オリジナルバイナリ)|7分48秒(468秒) |Core2 Quad Q9650|3.0GHz |4 |
|~Intel自動並列化版 |32分22秒(1942秒)|Core2 Quad Q9650|3.0GHz |4 |
|~オリジナル |54分49秒(3289秒)|Core2 Quad Q9650|3.0GHz |4 |
|使用プログラム |>|時間 |環境 |クロック数|スレッド数|h
| |RIGHT:|RIGHT: | |CENTER: |CENTER: |c
|~OpenMP版(11.1でビルド) |4分51秒|(291秒) |Core i7-940 |2.93GHz |8(HT) |
|~OpenMP版(11.1でビルド) |6分44秒|(404秒) |Core2 Quad Q9650|3.0GHz |4 |
|~OpenMP版(オリジナルバイナリ)|7分48秒|(468秒) |Core2 Quad Q9650|3.0GHz |4 |
|~Intel自動並列化版 |32分22秒|(1942秒)|Core2 Quad Q9650|3.0GHz |4 |
|~オリジナル |54分49秒|(3289秒)|Core2 Quad Q9650|3.0GHz |4 |
この場合、OpenMP版ではオリジナルに比べて約90%時間短縮されています。おそるべしOpenMP版!また、Intel Compilerでビルドした自動並列化版では40%程の時間短縮が見られました。~
さらにCore i7-940にしたところ約30%時間短縮されました。