LAPACKは著名な線形代数ライブラリです。たとえば,連立1次方程式を解いたり,固有値問題を解いたり,コレスキー分解をしたりできます。LAPACKは古いFORTRANで書かれているので,すこし使いにくいところがあります。これをFortran95の様式で利用できるようにしたものがLAPACK95です(いわゆる「ラッパー」です)。LAPACKもLAPACK95も無償で自由に使うことができます。
LAPACKは,機能ごとにプログラムが細分化されています。たとえば,逆行列を計算するプログラムは,内部で他のサブルーチンをいくつも呼び出しています。この場合,特定の機能に関係するサブルーチンを全て探すのは面倒です。そこで,使うかどうかに関係なく,複数のサブルーチンを1つのファイルに封入した方が扱いやすくなります。これをライブラリと呼びます。ライブラリにしておけば,コンパイル時に必要なサブルーチンだけ抜き出してくれます。
LAPACKとLAPACK95をコンパイルし,ライブラリにする手順を解説します。この解説の一部は,以下のサイトを参考にしました。
最初に LAPACK 3.1.1 をコンパイルし,その後 LAPACK95 をコンパイルします。
$ tar xvzf lapack.tgz $ cd lapack-3.1.1なお,ドキュメント類を省いた簡易パッケージ(lapack-lite-3.1.1.tar.gz)も公開されているので,どちらか必要なほうを利用する。
$ cp INSTALL/make.inc.LINUX ./make.inc
FORTRAN = ifort OPTS = -O3 DRVOPTS = $(OPTS) NOOPT = -O0 LOADER = ifort LOADOPTS = -L /opt/intel/fc/10.1.018/libここで LOADOPTS には,ifortをインストールしたディレクトリ以下の lib を指定する(上の例は,ifort 10.1.18を利用する場合)。
$ make blaslib $ make lapacklib $ make tmglibうまくゆけば,blas_LINUX.a,lapack_LINUX.aおよびtmg_LINUX.aの3つのファイル(ライブラリ)が完成している。このうち,tmg_LINUX.aは時間計測用であり,用途によっては作成する必要はない。 完成したライブラリは,任意のディレクトリに置いておく。自分用のライブラリ専用ディレクトリを作っても良い。ここでは説明のため,自作ライブラリを ~/lib に置くことにする。
$ mkdir ~/lib $ cp *.a ~/libVine Linux 3.2では,最初から ~/lib が用意されている。
$ tar xvzf lapack95.tgz $ cd LAPACK95
$ mv SRC/makefile SRC/Makefile
$ mkdir lapack95_modules
FC = ifort FC1 = ifort
OPTS0 = -O3 MODLIB = -I ./../lapack95_modules OPTS1 = -c $(OPTS0) OPTS3 = $(OPTS1) $(MODLIB) OPTL = -o OPTLIB = -L /opt/intel/fc/10.1.018/lib
LAPACK_PATH = ~/lib
LAPACK95 = ../lapack95.a LAPACK77 = $(LAPACK_PATH)/lapack_LINUX.a TMG77 = $(LAPACK_PATH)/tmglib_LINUX.a BLAS = $(LAPACK_PATH)/blas_LINUX.a確認のため,書き換えた後のファイル(make.inc)を掲載しておく。
$ cd SRC $ make single_double または $ make single_double_complex_dcomplexコンパイルが終了すると LAPACK95 ディレクトリに lapack95.a が完成している。また,LAPACK95/lapack95_modules には,関連する mod ファイルができている。これらのファイルは,任意のディレクトリに置いておく。今回は説明のため,LAPACKと同様に ~/lib に配置する。
$ cd .. $ cp lapack95.a ~/lib $ cp lapack95_modules/* ~/lib
サンプルとして,逆行列を計算するプログラムをコンパイルしてみます。
program inv
use f95_lapack
implicit none
integer,parameter :: n=2
integer :: i,j
integer :: ipiv(1:n)
real(8) :: r(1:n,1:n)
write(*,'(A)') 'Input real matrix :'
do i=1,n
read(*,*) r(i,:)
end do
! LU分解後に逆行列を計算する
call LA_GETRF(r,ipiv)
call LA_GETRI(r,ipiv)
do i=1,n
write(*,*) (r(i,j), j=1,n)
end do
end program inv
コマンドラインから,以下のように入力します。
$ ifort -module ~/lib test.f90 ~/lib/lapack95.a ~/lib/lapack_LINUX.a ~/lib/blas_LINUX.a
呼び出すライブラリは,上に示す順に並べる必要があります。コンパイルが終了したら,実行してみます。適当な 2行 2列の行列を入力し,その逆行列が計算できることを確認します。
$ a.out Input real matrix : 2 1 1 2 0.666666666666667 -0.333333333333333 -0.333333333333333 0.666666666666667
これまでの手順から,問題なく LAPACK95 を利用することができるようになりました。 しかし,コンパイルのたびにライブラリのファイル名を全て入力するのは,手間がかかります。 そこで,Linuxの一般的なライブラリ指定に従うように設定します。
Linux(一般にはGNUの開発ツール)では,ライブラリには lib で始まるファイル名をつけることになっています。すでに作成したライブラリについては,ファイル名を変更するよりも,シンボリックリンクをはるほうが簡単です。
$ ln -s ~/lib/lapack_LINUX.a ~/lib/liblapack.a $ ln -s ~/lib/blas_LINUX.a ~/lib/libblas.a $ ln -s ~/lib/tmglib_LINUX.a ~/lib/libtmglib.a $ ln -s ~/lib/lapack95.a ~/lib/liblapack95.a
コンパイル時にライブラリを利用するには,2種類のオプションを利用します。
$ ifort -module ~/lib test.f90 -L ~/lib -llapack95 -llapack -lblas
LAPACKに付属するBLASのかわりに,ATLASを利用することにより,計算速度を著しく向上させることができます。