2009年1月12日月曜日

BLAS+LAPACK

VMwareのFedora10にBlas+Lapackを導入してみるテスト。
BlasとLapackってのが何かというと、線形代数の計算用のライブラリで、行列の対角化とかをサクサクやってくれる賢い子。数値計算には欠かせない。Fortranで書かれているのでFortran使いにはなんとも使いやすい。(Cからも比較的簡単に使える)ソースはF77だけどF90からもなんも変更なしに使える。

ここを参考に:http://www.obihiro.ac.jp/~suzukim/masuda/ifc_lapack31.html

ソースからビルドしなあかんような噂を聞いていたのできつそうやなぁとか思いつつまずはNetlibからソースを落としてくる。展開しててけとーなところにフォルダを置いて、まずはmake用のmake.incをいじる。フォルダ内にmake.inc.exampleがあるので
cp make.inc.example make.inc
としてmake.incを作ってやる。intel Fortran Compire用はこんな感じに


####################################################################
# LAPACK make include file. #
# LAPACK, Version 3.1.1 #
# February 2007 #
####################################################################
#
# See the INSTALL/ directory for more examples.
#
SHELL = /bin/sh
#
# The machine (platform) identifier to append to the library names
#
PLAT = _LINUX
#
# Modify the FORTRAN and OPTS definitions to refer to the
# compiler and desired compiler options for your machine. NOOPT
# refers to the compiler options desired when NO OPTIMIZATION is
# selected. Define LOADER and LOADOPTS to refer to the loader and
# desired load options for your machine.
#
FORTRAN = ifort
OPTS = -O3
DRVOPTS = $(OPTS)
NOOPT = -OO
LOADER = ifort
LOADOPTS = -L /opt/intel/Compiler/11.0/074/lib/ia32
#
# Timer for the SECOND and DSECND routines
#
# Default : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME
TIMER = EXT_ETIME
# For RS6K : SECOND and DSECND will use a call to the EXTERNAL FUNCTION ETIME_
# TIMER = EXT_ETIME_
# For gfortran compiler: SECOND and DSECND will use a call to the INTERNAL FUNCTION ETIME
# TIMER = INT_ETIME
# If your Fortran compiler does not provide etime (like Nag Fortran Compiler, etc...)
# SECOND and DSECND will use a call to the INTERNAL FUNCTION CPU_TIME
# TIMER = INT_CPU_TIME
# If neither of this works...you can use the NONE value... In that case, SECOND and DSECND will always return 0
# TIMER = NONE
#
# The archiver and the flag(s) to use when building archive (library)
# If you system has no ranlib, set RANLIB = echo.
#
ARCH = ar
ARCHFLAGS= cr
RANLIB = ranlib
#
# The location of the libraries to which you will link. (The
# machine-specific, optimized BLAS library should be used whenever
# possible.)
#
BLASLIB = ../../blas$(PLAT).a
LAPACKLIB = lapack$(PLAT).a
TMGLIB = tmglib$(PLAT).a
EIGSRCLIB = eigsrc$(PLAT).a
LINSRCLIB = linsrc$(PLAT).a

っていじるのは

FORTRAN = ifort
OPTS = -O3
DRVOPTS = $(OPTS)
NOOPT = -OO
LOADER = ifort
LOADOPTS = -L /opt/intel/Compiler/11.0/074/lib/ia32

だけですが。OPTSやNOOPTは最適化のオプションなのでOがゼロではなくオーなあたりがちょっと罠な気がする。
で、
make blaslib
make lapacklib
make tmglib
と3回いろんなブツをコンパイルする。結構大量にコンパイルするのでCore2Duo上位機種の実力とやらをみせてもらおうか、って感じだ。まぁなんとかこれで必要なblas_LINUX.a,lapack_LINUX.a,tmg_LINUX.aができたので、あとはこれをlibってなフォルダにコピーして名前変えてシンボリックリンクとやらを貼るかーってところで、Fedoraならyumでblas,lapackをインストールできることを知る。いままでの苦労は…orz
というわけで、CentOSやFedoraなら

yum install blas lapack

で一発です。まぁソースからビルドする方法は管理者権限がない場合には必要なので知っといて損はないか…。
yumでインストールすると、/usr/lib下にlibblas.so.* とか liblapack.so.*ができる。
コンパイル時にリンクさせるのにフルパスはめんどくさいので

ln -s ~/usr/lib/libblas.so.3 ~/usr/lib/libblas.so
ln -s ~/usr/lib/liblapack.so.3 ~/usr/lib/liblapack.so

とすると、GNUのライブラリの規則ってもんが働いて、コンパイル時に
ifort -llapack -lblas test.f90
と2つのオプション -llapack と -lblasをつけるだけでいいぽい。ちなみに/usr/lib/以外のところにライブラリを作った場合には
-L ~/lib
のように-Lオプションでライブラリの場所をしめさないといけないらしい。

さてこれでlapack使ってるNRGのコードが家のPCで動くぜ~ってmakeしてみるとコンパイル+リンクはうまくいって実行ファイルができるのに動かした瞬間「強制終了」ってコンソールに出る。gdbのお告げによるとSIGKILLキター→強制終了らしい。SIGKILLはプロセス強制終了のときに出すシグナル…。どうやらメモリを大量に喰うプログラムなためOOM Killerに叩かれた模様。まぁ倍精度で4400*4400の配列を10個とか用意したら1G超えてきついわな、これOKな大学の計算機ってすげーんだなぁ。配列サイズを小さくしたら無事実行された。これで家の環境だけでプログラム作る→テスト→バグ取りが完結するようになったので作業効率は上がるだろう。とりあえずDDDっていうgdbと連携するGUI付きデバッガもyumで入れてみた。今まで見たく気合いと勘だけでバグとるのもどうかと思ったので次はデバッガの使い方を…。

1 コメント:

superior さんのコメント...
このコメントはブログの管理者によって削除されました。