intel fortran + PARDISO → gfortran + SuperLU

Screenshot from 2015-11-30 00-49-08

疎行列連立一次方程式(Ax=B)の計算には,MKLに収録されている”PARDISO”を使っていたが,環境をintel fortran + MKL からgfortran + Lapack95 に移行したのに合わせて,”SuperLU”に移行したのでメモ.(OSは,fedora 22)

まず,SuperLUをインストール.

#dnf install SuperLU

次に,正常にインストールできていることを確認する.

サンプルコードを入手するため,まずSuperLU本体をココ(http://crd-legacy.lbl.gov/~xiaoye/SuperLU/)からダウンロードする.

次に/SuperLU_*/EXAMPLE (*はSuperLUのver.)の中に入っている,”superlu.c”を以下コマンドでコンパイル/実行する.(ここで,superlu.cの冒頭を”int main(int argc, char *argv[]”と書き換えないとコンパイルは通らないので注意.)

$gcc -lsuperlu -I/usr/include/SuperLU superlu.c

$./a.out

正常なら上記コンパイル及び実行ができるはず.

 

C言語からはSuperLUを直接利用できる.しかし,FortranからSuperLUを使用する場合,ラッパーを書いてあげる必要がある.(/SuperLU_*/FORTRAN 内のファイルを参考にすると良い)

そこで,ラッパーとなるCプログラム(dgssv.c)と,SuperLUを呼び出すFortranプログラム(test.f90)を書いてみた.

なお,test.f90では例として,

A =
1 2 3 0
0 0 0 1
2 0 0 2
0 1 0 1

B =
2
3
1
2

の疎行列連立方程式を解くこととしている.

SuperLUでは,CRS形式またはCCS形式(疎行列の格納方法はココを参照)等の疎行列格納方法を使用できる.今回はCRS形式を使用することとしている.

もし,CCSなど別の形式を使用したい場合は,dgssv.cの中身を書き換える必要がある.(superlu.cはCCS形式で計算しているので,比較すればどのあたりを変えればいいかわかるはず.)

また,FortranからC言語で書いたプログラムを呼ぶ場合は,配列の処理等々注意する必要がある.(ココを参考)

dgssv.c と test.f90をコンパイルするには,以下コマンドを叩く.

$gcc -c -I/usr/include/SuperLU dgssv.c

$gfortran -lsuperlu -lblas dgssv.o test.f90

うまくコンパイルできていれば,”a.out”ができているので,実行すれば以下が表示されるはず.

$./a.out

Success dgssv
-2.5000000000000000
-1.0000000000000000
2.1666666666666665
3.0000000000000000

 

参考だがSuperLUでは,様々な設定ができる.具体的にはdgssv.cの中の以下で設定している.

set_default_options(&options);
options.ColPerm = NATURAL;

上記では,まずすべての設定をデフォルトとし,そのうち”ColPerm”の内容だけ,”NATURAL”に変更している.

なお設定項目の詳細は,/SuperLU_*/DOC 内のSuperLUのマニュアルに記載してあるので参照のこと.

 

参考

http://www.yolinux.com/TUTORIALS/LinuxTutorialMixingFortranAndC.html

http://netlib.org/linalg/html_templates/node91.html