Thursday, April 15, 2010

Intel Visual FortranでLAPACKを使う方法

 Intel Visual FortranでMKLのFortran95インターフェイス仕様のLAPACKを使う方法についてメモしておく。マニュアルを見ただけではなかなかうまくいかず、結構試行錯誤した(汗)

 次の簡単な線形連立方程式をIntel MKL LAPACK95のdriver routineである"gesv"を使って解く:

[2 1][x_1] = [4]
[3 1][x_2] = [2]
⇔ Ax = B

(※行列による表現です。わざわざGoogle Mathematical Formulasを使うのは面倒なので。)

 次のコードは、この連立方程式をIntel MKL LAPACK95のdriver routineである"gesv"を使って解くためのコード。
program sample
use mkl95_lapack
use mkl95_precision
implicit none
real, dimension(2,2) :: A
real, dimension(2,1) :: B

a(1,:)=(/2.0, 1.0/)
a(2,:)=(/3.0, 1.0/)
b(:,1)=(/4.0, 2.0/)

call gesv( A, B )

print *, 'solution:'
print *, B(1,1)
print *, B(2,1)

end program sample


 なお、driver routineとはLU分解等を行うcomputational routineを組み合わせたもので、直接解を出力できる。driver routineを使わない場合、いくつかのcomputational routineを自前で接続しないといけない。


(注意点)
・プロジェクトの「ソースファイル」フォルダを右クリックし、「追加」->「既存の項目」を選択。"...\Intel\Compiler\11.1\048\mkl\include"から"lapack.f90"を選び、追加する。

・ソースコードの"implicit none"の前に、"use mkl95_lapack"と"mkl95_precision"(もしくは、"use lapack95"と"use f95_precision")を書き加える。

・「プロジェクト」タブの「プロパティ」を選択。「リンカー」->「入力」と進み、「追加の依存ファイル」に、アーキテクチャがia32の場合、"mkl_lapack95.lib"を書き加える(アーキテクチャがia64の場合、"mkl_lapack95_ilp64"と"mkl_lapack95_lp64"。ただ、こちらの場合は試していないのでこれは予想)。"mkl_lapack95.lib"にIntelがLAPACKを修正したものが格納されていて、企業秘密ということになっている。コンパイラー利用者はコンパイル時にそのブラックボックスにリンクすることでIntel MKL版のLAPACKを利用する。なお、"mkl_lapack95.lib"は"...\Intel\Compiler\11.1\048\mkl\ia32\lib"にある。

・同じく「プロジェクト」->「プロパティ」->「Fortran」->「ライブラリー」->「インテル(R)マス・カーネル・ライブラリーを使用する」の部分を、「並列」か「シーケンシャル」を選ぶ(「クラスター」はおそらくPCクラスター向け)。

No comments:

Post a Comment