<紙>さんLOG

「パソコンヲタクの雑記帳」
 PC/Linux系/物理・化学で遊んでいます。
思いついたことを綴っています。

CP2K を FFTW で高速化

2009年09月08日 | Linux系
ご訪問ありがとうございます。  昨日までの状況は右下の「アクセス状況」にあります。

CP2K をインストールした時に参考にさせて貰った「CP2Kのインストール」は、
「1.g95でもっとも簡単なインストール」でした。
その下に、「2.FFTW3で高速化を図る」と云うのがありますね。

「FFTW」って 何?

本家「FFTW」では、
  FFTW is a C subroutine library for computing the discrete
  Fourier transform (DFT) in one or more dimensions, of arbitrary input size,
  and of both real and complex data (as well as of even/odd data, i.e.
  the discrete cosine/sine transforms or DCT/DST).
  We believe that FFTW, which is free software,
  should become the FFT library of choice for most applications.
Nicetranslator で翻訳すると、
  FFTWを離散フーリエ変換(DFT)を1つまたは複数のディメンションでは、
  任意の入力サイズの変換を計算するためのCのサブルーチンライブラリであり、
  両方の現実と、複雑なデータ(のと同様、偶数/奇数のデータは、
  離散コサイン変換すなわち/正弦変換やDCT / DST)の。
  私たちは、FFTWを、フリーソフトウェアの場合、ほとんどのアプリケーションに
  最適なFFTライブラリにならなければならないと思います。
ちょっと、酷いかナ。

FFTWは、離散フーリエ変換(DFT)計算のためのCのサブルーチンライブラリであり、
1つまたは複数の次元の、任意の入力サイズの、実数でも複素数でも(さらには、
偶数/奇数の、すなわち、離散コサイン/サイン変換、即ちDCT/DST)計算ができる。
FFTWは、フリーソフトウェアであり、ほとんどのアプリケーションに
最適なFFTライブラリであると信じている。

と云ったところでしょうか?


本家「CP2K」のサイトの「cp2k/INSTALL」には、
 1) Acquire the code.
 2a) gnu make should be on your system (gmake or make on linux).
 2b) an f95 compiler should be installed on your system.
 2c) BLAS and LAPACK should be installed.
 2d) MPI and SCALAPACK are needed for parallel runs.
 2e) fftw can be used to improve FFT speed (depending on architecture).
 2f) Hartree-Fock exchange (optional) requires the libint package to be installed,
  and a Fortran compiler that supports ISO_C_BINDING and Fortran procedure pointers.
 3) to compile the code.
 ・・・・・
とあります。

1)~2c) は済んでいます。
2d) は、パラレルコンピューティングなので、パスですネ。
そして、2f) はチンプンカンプン(汗)でパス。
3) は当然。
残るは、2e) ですね。
 FFTの速度を改善するために、(アーキテクチャに応じた)fftwを使用することができます。
ですね。


それで、「2.FFTW3で高速化を図る」に倣って、
「andLinux」に
1.FFTWのインストール
2.CP2KへのFFTWの組み込み
を行いました。

書いてある通りにやって、一苦労も二苦労もしました。(いや、三苦労も四苦労もです。)

1.FFTWをインストールする。
  ・ http://www.fftw.org/からDownloadを選択し、fftw-3.2.1.tar.gzをダウンロードする。
  ・ tar xvzf fftw-3.2.1.tar.gzで展開する。
  ・ cd fftw-3.2.1で移動する。
  ・ ./configureを実行すると、コンピュータの環境を自動で検索し、Makefileが作られる。
  ・ 151行目、152行目を以下のように変える。
   F77 = g95
   FFLAGS = -O3 -ffast-math -funroll-loops -march=nocona -ftree-vectorize
  ・ makeでMakefileを実行する。
  ・ suでrootの権限を持ち、make installでインストールする。
とある。
・ダウンロード、・tar展開、・cd移動、・./configure実行はその通り。
(但し、現在は、Ver.3.2.2 になっている。)

次のエディットでは、
先ず、151行目はそうなっていて、変える必要が無い!
そして、152行目は「-march=nocona」の「nocona」が気になったので、
結局、出来た「Makefile」は何も変えなかった。

それで、makeして、suで、make installを実行。

これで、「FFTW」が、正確には「FFTW3」が出来たようです。
(と云うのは、どうなれば正しいのかが、今ひとつ不明???)

問題は、「2.CP2KへのFFTWの組み込み」で、8回も「make」をやり直しました。
(もっと慎重に推理すれば、2~3回で済んだでしょう?)

前回のarch fileに少し加えるだけでうまくいく
 ・「CPPFLAGS =」に「-D__FFTW」を加える。
 ・「LDFLAGS =」に「-I /usr/local/include -L /usr/local/lib」を加える。
 ・「LIBS =」に「-lfftw -lm」を加える。

ここで、(「LDFLAGS =」への追加は間違っていない。)

(1)最初の「-D__FFTW」を「-D_FFTW」だと思った為、5回ほどやり直した。
 ・・・・・ これは、<紙>のミスですネ。(アンダーバーは2つ!)
   ただし、なかなか気がつかなかったのは、
   「g95」では、パラメータ・エラーにならない為もあった。
  さらに、本当は、(正解は)「-D__FFTW3」でした。
  (FFTW2 か FFTW3 を指定する、とCP2K本家には書いてあった!)

(2)「-lfftw」のパラメータは「g95」ではエラーです。
  正解は「/usr/local/lib/libfftw3.a」でした。
 ・・・・・ 「fftw.a」ではなくて「libfftw3.a」でした。
   これで、3回ほどやり直しました。

1回のmakeが20分も掛かるマシンで!!!!!
実行確認を含めると5時間以上も掛けました(泣)

結局
 ・「CPPFLAGS =」に「-D__FFTW3」を加える。
 ・「LDFLAGS =」に「-I /usr/local/include -L /usr/local/lib」を加える。
 ・「LIBS =」に「/usr/local/lib/libfftw3.a -lm」を加える。
が正解です。

コンパイル&リンク:


結果(実行形式プログラム):



こんなに苦労して“どんだけ”速くなったの?

処理時間で6~7割に、速度で1.5~1.4倍でしょうか。
19分が16分に。また、3時間が2時間10分に成りました。
(でも、やはり何を計算しているか今一つ???)

とりあえず、めでたし、めでたし???     



見ていただきありがとうございました。
お帰りに投票して頂けると嬉しいです。 ⇒ 日記@BlogRanking(「60代~」と「茨城」)

人気BlogRanking ⇒ (「インターネット・・・・・」>「ウェブログ」)

P-NETBANKING ⇒ (「パソコン・・・・・」と「茨城」)