PSI3 & MPQC on cygwin

シミュレーション計算の論文書きに使ったソースコードは誰もが利用できるよう須らくフリーソフトウェアまたはオープンソースソフトウェアとして公開されるべきだと思っているのだが,世の趨勢はそうではない.しかし同様に考える人々が量子化学コミュニティにもいくらかいたようで,GPLライセンスの計算量子化学ソフトウェアが存在している:

こいつらをCore2 Duo T2300のノートPCのWindows XP上のcygwin環境で使ってやろうと言う目論見.
計算量子化学ソフトウェアは大抵,(後述するが)BLASLAPACKといった線形代数計算ライブラリがインストールされていることを要求する.こいつらを先に準備せねばならない.そこでATLASとCLAPACKを先にインストールする.
ATLASは,線形代数計算ライブラリのうちでもBLASと呼ばれる一群の標準的関数*1を実装したライブラリで,コンパイル時にマシンのCPU特性をサンプル・プログラムでチェックしてパラメタを最適にチューニングしてくれる優れものだ.しかしBLASに含まれる関数はvector演算程度で,計算量子化学ソフトウェアが要求するような高級な行列演算ではない((正確にはATLASはBLASに留まらずLAPACKの一部も提供している. http://math-atlas.sourceforge.net/faq.html#lprouts を見よ.しかしそれだけではPSI3やMPQCのコンパイルには不足で,具体的にはPSI3のconfigure段階で「Double型の一般の (GEneral) 行列の固有値 (EigenValue) 問題を解く DGEEV という関数が足りない」とエラーが出て止まってしまう.MPQCのconfigure段階ではDouble型のGEneralな行列の特異値分解 (Singular Value Deconposition) を行う DGESVD という関数が足りない」とエラーが出て止まってしまう.)).行列演算の標準関数はLAPACKに含まれ,LAPACKの関数はBLASの関数を組み合わせて実装されているのが普通だ.LAPACKの一実装が(昔のLAPACK実装が使っていたFORTRANでなく)C言語で書かれたCLAPACKであり,これはコンパイル時に指示することでATLASのBLAS関数を使うようにできる.よくチューニングされたATLASのBLAS関数に基づくCLAPACKのLAPACK関数ならそれも性能がよいことを期待できる.
ATLASのインストールはcygwinでも割と楽で,マニュアルの指示に従えばよい.ただし電力節約のためにCPUの速度低下を行うIntel SpeedStep機能に注意しておく必要があった.常にCPUが最高速度で動いてくれないとATLASの自動チューニングが働かないのだそうな.Dell Inspiron 9400のBIOSでは「SpeedStepを有効にする」と「無効にして常に遅いモードに固定する」の選択肢しか無く(そういうもの?)常に高速で使うモードが無かった.CrystalCPUIDという,PC自作マニアがCPUの状態を観察するのに使うソフトウェアをダウンロードし,どうやら常に最高速度になっていることを確認(?)した.これはWindowsのコントロールパネルの電力設定で「常にオン」を選んだことが効いてるのか効いてないのか,よく分からん.

その後はお決まりの make で((bashなら make >& makelog1.txt と打つことでmake中の出力メッセージが全てmakelog1.txtに保存される.左のコマンドの行末に & を付ければビルドと並行して他の作業ができるし,その間リアルタイムで出力メッセージを見たいなら tail -f makelog1.txt と打てばよい(これの終了は Ctrl-C).)),さらに make check をやった後 make install でインストール.私は最初のconfigure時に --prefix=$HOME/local としておいたのでホームディレクトリ下の local/lib/ に libatlas.a, libcblas.a, libf77blas.a, liblapack.a が入り, local/include/ には atlas/, cblas.h, clapack.h が入った.
実はCygwinインストーラを見るとLAPACKの項目があってどうやらATLASをインストールできるようだが,それは明らかに「このマシン」に最適化されたものではない.実際以下のように書かれている:

... Cygwin binary distribution includes a non-optimized reference blas library. Cygwin source distribution includes atlas, allowing a locally optimzed blas library to be compiled and installed from source. ...

つまり関数として同じ処理はするけどスピードは期待できないようなやつがインストールされる訳ですね.ソースコードのパッケージをCygwinインストーラ経由でダウンロードして手元でコンパイルするなら自動チューニングが効くけど,それだとのダウンロードの手間がわずかに楽になるだけ,と.

さてCLAPACK 3.1.1をNetlibから落としてビルドしよう.アーカイヴ中のmake.inc.exampleをmake.incとしてコピーし,その中の PLAT = _LINUXPLAT = _CYGWIN に変えておく(特に意味は無さそうだけど).この次が重要で,

# Using reference BLAS
BLASLIB      = ../../blas$(PLAT).a

BLASLIB の行をコメントアウト(行頭に # を書く).せっかくビルドしたATLASのBLASでなく遅い方を使う指定なので.代わりに

# Using Fortran BLAS interface of ATLAS without wrapper (CLAPACK has to be compiled with -DNO_BLAS_WRAP)
BLASLIB = -lf77blas -latlas

の方を有効にしておく( BLASLIB の行の行頭の # を削除).これでマニュアルによればlibf2cとやらのビルドに移るのが普通の手順なんだが,普通にやるとビルドできない.Makefileが,gccの出力する実行ファイルのデフォルト値を "a.out" だと仮定しているから.Cygwingccだとこれが "a.exe" なんだよね... だから F2CBLAS/libf2c/Makefile

arith.h: arithchk.c
	$(CC) $(CFLAGS) -DNO_FPINIT arithchk.c -lm ||\
	 $(CC) -DNO_LONG_LONG $(CFLAGS) -DNO_FPINIT arithchk.c -lm
	./a.out >arith.h
	rm -f a.out arithchk.o

の部分で,最後の2行にある "a.out" を "a.exe" に修正.この後はマニュアル通り make f2clib と打てばOK.
(続く)

追記: ここに私がうだうだ書いたものなんて,ちょっとした小細工tipsを除けば,単に

を見れば済む内容のような気がしてきた... あまり書いた意味なかったかな.