この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
fortran:ifort [2013/12/25 11:12] saito [概要] |
fortran:ifort [2017/10/03 12:55] (現在) |
||
---|---|---|---|
ライン 69: | ライン 69: | ||
ifort sample.f90 -mkl | ifort sample.f90 -mkl | ||
</code> | </code> | ||
- | ===== 概要 ===== | + | ====== CSRへの変換 ====== |
- | ^パッケージ名^^ | + | pardisoはCSRフォーマットを用いるが,coordinateフォーマットから変換するサブルーチンが用意されている. |
- | |[[ifort#lapack]] |密行列やバンド行列を直説法で解く | | + | |
- | |[[ifort#lapack95]] |密行列やバンド行列を直説法で解く | | + | |
- | |[[ifort#blas95]] |マトベク演算や内積演算を行う | | + | |
- | |[[ifort#sparse_blas95]] |疎行列のマトベク演算行う | | + | |
- | |[[ifort#pardiso]] |疎行列を直説法で解く。(条件数の大きい問題向き) | | + | |
- | |[[ifort#fgmres]] |疎行列をFlexibleGMRESで解く。 | | + | |
+ | https://software.intel.com/en-us/node/468628 | ||
- | ===== lapack ===== | + | フォーマットについてはこちらから. |
- | * ifortと一緒にインストールされる. | + | |
- | * 環境変数の設定をしておけばパスを通す必要はない. | + | |
- | ifort Version 12.0では以下のようにすれば動いた.FIXME | + | https://software.intel.com/en-us/node/471374 |
- | <code bash> | + | |
- | ifort hoge.f90 -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread | + | |
- | </code> | + | |
- | ver 11くらい | + | Fortranの場合,job(1:8)に与える数値は以下の通りで(だいたい)OK. |
- | <code> | + | |job(1)=1|the matrix in the coordinate format is converted to the CSR format.| |
- | ifort file.f90 -lmkl -lmkl_lapack -lmkl_em64t -lguide -lmkl_solver | + | |job(2)=1|one-based indexing for the matrix in CSR format is used.| |
- | </code> | + | |job(3)=1|one-based indexing for the matrix in coordinate format is used.| |
- | ===== lapack95 ===== | + | |job(4)|特に設定不要| |
+ | |job(5)=nnz| sets number of the non-zero elements of the matrix A if job(1)=1.| | ||
+ | |job(6)=0| all arrays acsr, ja, ia are filled in for the output storage.| | ||
- | * [[http://www.netlib.org/lapack95/|lapack95]] | ||
- | * [[http://www.netlib.org/lapack95/lug95/|lapack95のhtmlドキュメント]] | ||
- | * 線形方程式を解くパッケージ。 | ||
- | * 固有値の計算や特異値分解も可能。 | ||
- | * mklのlapack95はlapack90のラッパーらしい。 | ||
- | * 自分でmakeする必要あり。 | ||
- | |||
- | ==== ライブラリの作成 ==== | ||
- | * libem64t, intel64の部分は環境に応じて適当に。オプションも適当に。デフォルトで十分そうなので、オプションはなくても良さそう。 | ||
- | <code> | ||
- | $ cd /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/ | ||
- | $ sudo gnome-terminal | ||
- | </code> | ||
- | 新しく開いた端末で作業((sudo make libem64tとすると、「ifort: コマンドが見つかりませんでした」と怒られる。そのため、スーパーユーザー用の端末を開き、パスを通してから作業。sudoで端末を開くのは、ちょっとお行儀悪いかも。sudoに環境変数を引き継ぐやり方もありそう…))。 | ||
- | <code> | ||
- | # . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 | ||
- | # make libem64t | ||
- | # exit | ||
- | </code> | ||
- | |||
- | ==== サンプルコード ==== | ||
- | |||
- | コードのサンプルは /opt/intel/mkl/10.1.0.015/examples/lapack95/source/ にあり。ここではgesv.f90を参考にしながら説明。 | ||
- | === コンパイルオプション(intel64) === | ||
- | |||
- | (2010.06.22追記)最近のver.はライブラリの場所が変わったようだ.(というか今まで間違ったファイルを使ってだけかも....) | ||
- | Fortran90でLapack95使ったときのコンパイルコマンド.file.f90のところは適当に修正して下さい. | ||
- | <code bash> | ||
- | ifort file.f90 -L/opt/intel/Compiler/11.1/069/mkl/lib/em64t/ -I /opt/intel/Compiler/11.1/069/mkl/include/em64t/lp64/ -lmkl_lapack95_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread -O2 | ||
- | </code> | ||
- | |||
- | 以下,古い情報 | ||
- | <code bash> | ||
- | $ ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t/ -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/em64t -lmkl_lapack95 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -lguide -lpthread | ||
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d | ||
- | </code> | ||
- | === コンパイルオプション(ia32) === | ||
- | <code bash> | ||
- | ifort /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/source/gesv.f90 -L/opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32 -I /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/lib/32/ -lmkl_lapack95 -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | ||
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/lapack95/data/gesv.d | ||
- | </code> | ||
- | === 使い方 === | ||
- | /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の最初 | ||
<code fortran> | <code fortran> | ||
- | USE MKL95_PRECISION, ONLY: WP => SP | ||
- | USE MKL95_LAPACK, ONLY: GESV | ||
- | </code> | ||
- | * 単精度はSP、倍精度はDPを使用する。 | ||
- | * 呼び出すサブルーチン名をONLYの後に書く。 | ||
- | /opt/intel/mkl/10.1.0.015/examples/lapack95/source/gesv.f90 の中頃 | ||
- | <code fortran> | ||
- | CALL GESV( A, B ) | ||
</code> | </code> | ||
- | <code fortran> | + | ====== pardiso の使い方====== |
- | CALL GESV( AA, BB(:,1), IPIV, INFO ) | + | pardisoを用いた連立一時方程式の解き方. |
- | </code> | + | |
- | * 引数の数が違うのはfortran90のoptional属性によるもの。 | + | |
- | + | ||
- | * LIBRARY_PATHやINCLUDEの環境変数を追加するか,libやmodを適切な位置に動かすのが良いかも.(makeほげほげで設定できないのかしら.未確認.FIXME) | + | |
- | + | ||
- | ===== blas95 ===== | + | |
- | + | ||
- | * マトベク演算やらをしてくれるパッケージ。 | + | |
- | * matmulよりも高速。(多分) | + | |
- | * 自分でmakeする必要あり。 | + | |
- | ==== ライブラリの作成 ==== | + | スパコンの |
- | * libem64t, intel64の部分は環境に応じて適当に。オプションも適当に。デフォルトで十分そうなので、オプションはなくても良さそう。 | + | |
- | * ライブラリの作成方法はlapack95と同じ。 | + | |
<code> | <code> | ||
- | $ cd /opt/intel/Compiler/11.0/074/mkl/interfaces/blas95 | + | /opt/app/intel/composer_xe_2013.5.192/mkl/examples/solverf/source/ |
- | $ sudo gnome-terminal | + | |
</code> | </code> | ||
- | <code> | + | に入っているサンプルデータを参考に,走らせたいプログラムを作成する. |
- | # . /opt/intel/Compiler/11.0/074/bin/ifortvars.sh intel64 | + | include文が大事. |
- | # make libem64t | + | 自分のプログラムに |
- | # exit | + | <code fortran> |
+ | include 'mkl_pardiso.f77' | ||
</code> | </code> | ||
- | + | か | |
- | ==== サンプルコード ==== | + | |
- | === コンパイルオプション === | + | |
- | コードのサンプルは /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/ にあり。ここでは dgemmx.f90を参考にしながら説明。 | + | |
- | <code> | + | |
- | $ ifort /opt/intel/Compiler/11.0/074/mkl/include/mkl_blas.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/common_func.f -lmkl_blas95 -lmkl_intel_lp64 -lmkl_sequential -lmkl_core -lpthread | + | |
- | $ ./a.out < /opt/intel/Compiler/11.0/074/mkl/examples/blas/data/dgemmx.d | + | |
- | </code> | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/include/mkl_blas.f90 はインターフェース | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 がメインプログラム | + | |
- | * /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/common_func.f はdgemmxが使用している副プログラム(サブルーチン) | + | |
- | + | ||
- | === コード === | + | |
- | /opt/intel/Compiler/11.0/074/mkl/examples/blas95/source/dgemmx.f90 のはじめのあたり。 | + | |
<code fortran> | <code fortran> | ||
- | use mkl95_precision, only: wp => dp | + | include 'mkl_pardiso.f90' |
- | use mkl95_blas, only: gemm | + | |
</code> | </code> | ||
- | * lapack95と同様にspで単精度、dpで倍精度。 | + | を入れる. |
- | * gemmは呼び出すルーチン名 | + | |
- | ===== sparse_blas95 ===== | + | |
- | ===== pardiso/MKL ===== | + | 配列の設定に注意が必要,詳しくは以下を参照 |
+ | [http://www.pardiso-project.org/manual/manual.pdf] | ||
- | * [[http://www.pardiso-project.org]] | ||
- | * 疎行列で解く。 | ||
- | * 直接法で解く。-> 条件数の大きい問題に使える。 | ||
- | * [[http://dx.doi.org/10.1016/S0167-739X(00)00076-5|理論については論文を参照]]\\ | ||
- | + | コンパイラオプションは | |
- | ==== コンパイルオプション ==== | + | |
- | * 77でも90でもコンパイル方法は同じ。(ファイルの拡張子が異なるだけ) | + | |
- | * includeする場合はパスの設定が必要.(ifortvars.*shを読み込んでいる場合は,設定済み) | + | |
- | === intel64の場合 === | + | |
<code> | <code> | ||
- | $ ifort hoge.f90 -lmkl_solver_lp64 -lmkl_intel_lp64 -lmkl_intel_thread -lmkl_core -liomp5 -lpthread | + | -mkl |
</code> | </code> | ||
- | + | でお手軽♪ | |
- | === ia32の場合 === | + | |
- | <code> | + | |
- | $ ifort hoge.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | </code> | + | |
- | + | ||
- | === コメント === | + | |
- | * mkl_pardiso.f90をincludeせずに,mkl_pardiso.f90と一緒にコンパイルするやり方もあり。 | + | |
- | <code> | + | |
- | $ifort pardiso.f90 /opt/intel/Compiler/11.0/074/mkl/include/mkl_pardiso.f90 -lmkl_solver -lmkl_intel -lmkl_intel_thread -lmkl_core -lguide -lpthread | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | + | ||
- | ==== サンプル コード ==== | + | |
- | f77のコードは /opt/intel/Compiler/11.0/074/mkl/examples/solver/source/ 内にあり。 | + | |
- | + | ||
- | === fortran90 === | + | |
- | <code fortran> | + | |
- | include 'mkl_pardiso.f90' | + | |
- | + | ||
- | program pardiso_test | + | |
- | use MKL_PARDISO | + | |
- | implicit none | + | |
- | real(8),allocatable::a(:),b(:),x(:) | + | |
- | integer::maxfct=1,mnum=1,mtype,phase=13,n,nzero,nrhs=1,iparm(64),msglvl=0,error | + | |
- | type(mkl_pardiso_handle) :: pt(64) | + | |
- | integer i,j | + | |
- | integer,allocatable::ia(:),ja(:),perm(:) | + | |
- | !!! this matrix is quoted by slatec document... | + | |
- | ! |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 | + | |
- | ! |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 | + | |
- | ! | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 | + | |
- | ! | 0 0 0 44 0| | + | |
- | ! |51 0 53 0 55| | + | |
- | !!! set parameter of pardiso | + | |
- | pt(:)=mkl_pardiso_handle(0) | + | |
- | iparm(1)=0 | + | |
- | mtype=11 | + | |
- | !!! assign values to variables | + | |
- | n=5 | + | |
- | nzero=11 | + | |
- | allocate(a(nzero),b(n),x(n),ia(n+1),ja(nzero),perm(n)) | + | |
- | ia(:)=(/1,4,6,8,9,12/) | + | |
- | a(:)=(/11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0,44.d0,51.d0,53.d0,55.d0/) | + | |
- | ja(:)=(/1,2,5,1,2,3,5,4,1,3,5/) | + | |
- | !!! calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) | + | |
- | b(:)=0.d0 | + | |
- | do i=1,5 | + | |
- | do j=ia(i),ia(i+1)-1 | + | |
- | b(i)=b(i)+a(j)*ja(j) | + | |
- | end do | + | |
- | end do | + | |
- | !!! solve linear equation by pardiso | + | |
- | call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs,iparm,msglvl,b,x,error) | + | |
- | if(error /= 0) then | + | |
- | write(*,*) error | + | |
- | stop | + | |
- | end if | + | |
- | write(*,*) x | + | |
- | end program pardiso_test | + | |
- | </code> | + | |
- | + | ||
- | === fortran77 === | + | |
- | fortran90のサンプルを書き換え。 | + | |
- | <code fortran> | + | |
- | program pardiso_test | + | |
- | implicit none | + | |
- | integer lzero,l | + | |
- | parameter (lzero=11,l=5) | + | |
- | real*8 a(lzero),b(l),x(l) | + | |
- | integer maxfct,mnum,mtype,phase,n,nzero,nrhs,iparm(64), | + | |
- | $ msglvl,error,pt(64),ia(l+1),ja(lzero),perm(l),i,j | + | |
- | data ia /1,4,6,8,9,12/ | + | |
- | data ja /1,2,5,1,2,3,5,4,1,3,5/ | + | |
- | data a /11.d0,12.d0,15.d0,21.d0,22.d0,33.d0,35.d0, | + | |
- | $ 44.d0,51.d0,53.d0,55.d0/ | + | |
- | ccc this matrix is quoted by slatec document... | + | |
- | c |11 12 0 0 15| A: 11 12 15 | 21 22 | 33 35 | 44 | 51 53 55 | + | |
- | c |21 22 0 0 0| IA: 1 | 4 | 6 | 8 | 9 | 12 | + | |
- | c | 0 0 33 0 35| JA: 1 2 5 | 1 2 | 3 5 | 4 | 1 3 5 | + | |
- | c | 0 0 0 44 0| | + | |
- | c |51 0 53 0 55| | + | |
- | ccc set parameter of pardiso | + | |
- | do i=1,64 | + | |
- | pt(i)=0 | + | |
- | end do | + | |
- | iparm(1)=0 | + | |
- | mtype=11 | + | |
- | maxfct=1 | + | |
- | mnum=1 | + | |
- | phase=13 | + | |
- | nrhs=1 | + | |
- | msglvl=0 | + | |
- | ccc assign values to variables | + | |
- | n=5 | + | |
- | nzero=11 | + | |
- | ccc calculate b when x=(/1.d0,2.d0,3.d0,4.d0,5.d0/) | + | |
- | b(:)=0.d0 | + | |
- | do i=1,5 | + | |
- | do j=ia(i),ia(i+1)-1 | + | |
- | b(i)=b(i)+a(j)*ja(j) | + | |
- | end do | + | |
- | end do | + | |
- | ccc solve linear equation by pardiso | + | |
- | call pardiso(pt,maxfct,mnum,mtype,phase,n,a,ia,ja,perm,nrhs, | + | |
- | $ iparm,msglvl,b,x,error) | + | |
- | if(error /= 0) then | + | |
- | write(*,*) error | + | |
- | stop | + | |
- | end if | + | |
- | write(*,*) x | + | |
- | end program | + | |
- | </code> | + | |
- | + | ||
- | + | ||
- | ===== fgmres ===== | + | |
- | 前処理を効率的に行えるようGMRESを改良したもの。前処理に反復解法が使える。 | + | |
- | + | ||
- | FIXME | + |