Intel Fortran Compiler (IFC)

LAPACK 3.1,LAPACK95をコンパイルする

LAPACKは著名な線形代数ライブラリです。たとえば,連立1次方程式を解いたり,固有値問題を解いたり,コレスキー分解をしたりできます。LAPACKは古いFORTRANで書かれているので,すこし使いにくいところがあります。これをFortran95の様式で利用できるようにしたものがLAPACK95です(いわゆる「ラッパー」です)。LAPACKもLAPACK95も無償で自由に使うことができます。

LAPACKは,機能ごとにプログラムが細分化されています。たとえば,逆行列を計算するプログラムは,内部で他のサブルーチンをいくつも呼び出しています。この場合,特定の機能に関係するサブルーチンを全て探すのは面倒です。そこで,使うかどうかに関係なく,複数のサブルーチンを1つのファイルに封入した方が扱いやすくなります。これをライブラリと呼びます。ライブラリにしておけば,コンパイル時に必要なサブルーチンだけ抜き出してくれます。

LAPACKとLAPACK95をコンパイルし,ライブラリにする手順を解説します。この解説の一部は,以下のサイトを参考にしました。

「LinuxでPCクラスタを組む」記
http://atlas.riken.jp/~shinkai/cactus/LinuxPCcluster.html

最初に LAPACK 3.1.1 をコンパイルし,その後 LAPACK95 をコンパイルします。

LAPACKのコンパイル

  1. NetlibからLAPACK 3.1.1 のパッケージ(lapack.tgz)をダウンロードし,任意のディレクトリで展開する。うまく展開できれば,lapack-3.1.1 なるディレクトリができるので,移動する。バージョンが上がっていれば,それに応じたディレクトリ名になる。
    $ tar xvzf lapack.tgz
    $ cd lapack-3.1.1
    
    なお,ドキュメント類を省いた簡易パッケージ(lapack-lite-3.1.1.tar.gz)も公開されているので,どちらか必要なほうを利用する。
  2. INSTALL/make.inc.LINUXを,make.incという名前でコピーする。
    $ cp INSTALL/make.inc.LINUX ./make.inc
    
  3. いまコピーした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を利用する場合)。
  4. 以下の順番に入力する。
    $ make blaslib
    $ make lapacklib
    $ make tmglib
    
    うまくゆけば,blas_LINUX.alapack_LINUX.aおよびtmg_LINUX.aの3つのファイル(ライブラリ)が完成している。このうち,tmg_LINUX.aは時間計測用であり,用途によっては作成する必要はない。 完成したライブラリは,任意のディレクトリに置いておく。自分用のライブラリ専用ディレクトリを作っても良い。ここでは説明のため,自作ライブラリを ~/lib に置くことにする。
    $ mkdir ~/lib
    $ cp *.a ~/lib
    
    Vine Linux 3.2では,最初から ~/lib が用意されている。

LAPACK95のコンパイル

  1. NetlibからLAPACK95のパッケージ(lapack95.tgz)をダウンロードし,任意のディレクトリで展開する。うまく展開できれば,LAPACK95 ディレクトリができるので,移動する。
    $ tar xvzf lapack95.tgz
    $ cd LAPACK95
    
  2. SRC/makefileの名前を変更する(頭文字を大文字にする)。
    $ mv SRC/makefile SRC/Makefile
    
  3. lapack95_modulesというディレクトリを作成する。
    $ mkdir lapack95_modules
    
  4. make.incの一部を以下のように修正する。
    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)を掲載しておく。
  5. SRCに移動して make single_double と入力する。複素数型のサブルーチンも含める場合には,make single_double_complex_dcomplex とする。
    $ 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
    

LAPACK95を使う

サンプルとして,逆行列を計算するプログラムをコンパイルしてみます。


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

もう少し使いやすくする

GNUツールに則ったライブラリの利用

これまでの手順から,問題なく 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

ATLASの利用

LAPACKに付属するBLASのかわりに,ATLASを利用することにより,計算速度を著しく向上させることができます。


© 2005-2007 MASUDA, Yutaka
s15274{at}st.obihiro.ac.jp