FORTRAN プログラミング 第4回...

13
木村拓馬 FORTRAN プログラミング 第4回 数値計算ライブラリ木村拓馬 2014 10 14 17:14 FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014 10 14 17:14 ) 1/12

Transcript of FORTRAN プログラミング 第4回...

木村拓馬

FORTRANプログラミング–第4回 数値計算ライブラリ–

木村拓馬

2014年10月 14日 17:14

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 1/12

木村拓馬

.本日は........ BLASと LAPACKを例に数値計算ライブラリを使ってみる

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 2/12

木村拓馬

BLASと LAPACK.BLAS(ぶらす)..

......

Basic Linear Algebra Subprograms:基本的な線形代数計算の副プログラム

Level 1:ベクトルの足し算,内積,ノルムなど

Level 2:行列-ベクトル積

Level 3:行列-行列積(ATLAS(Automatically Tuned Linear Algebra Software):使用する CPUに合わせて最適化.高速に動作する BLAS

).LAPACK(れいぱっく)..

......

Linear Algebra PACKage:線形代数の計算を行うためのサブルーチンからなるライブラリ

数値計算の専門家が開発・一般に高速で信頼できる(と思う)

現代の高性能コンピュータで効率よく計算できるように設計してある(はず)

連立一次方程式,線形の最小二乗法,固有値問題,特異値問題…

BLASを使用.速い BLASがあれば全部速くなる

詳しくは netlib(http://www.netlib.org/lapack/)

1g95 で動く library・package のリストは [3] を見よ.

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 3/12

木村拓馬

BLASと LAPACK.BLAS(ぶらす)..

......

Basic Linear Algebra Subprograms:基本的な線形代数計算の副プログラム

Level 1:ベクトルの足し算,内積,ノルムなど

Level 2:行列-ベクトル積

Level 3:行列-行列積(ATLAS(Automatically Tuned Linear Algebra Software):使用する CPUに合わせて最適化.高速に動作する BLAS

).LAPACK(れいぱっく)..

......

Linear Algebra PACKage:線形代数の計算を行うためのサブルーチンからなるライブラリ

数値計算の専門家が開発・一般に高速で信頼できる(と思う)

現代の高性能コンピュータで効率よく計算できるように設計してある(はず)

連立一次方程式,線形の最小二乗法,固有値問題,特異値問題…

BLASを使用.速い BLASがあれば全部速くなる

詳しくは netlib(http://www.netlib.org/lapack/)

1g95 で動く library・package のリストは [3] を見よ.

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 3/12

木村拓馬

LAPACKの命名規則.

......

例)DGESV:倍精度実数の係数行列をもつ線型方程式の解を計算する

最初の一文字は「データ型」

S:REAL(単精度実数)D:DOUBLE PRECISION(倍精度実数)C:COMPLEX(複素数)Z:DOUBLE COMPLEX(倍精度複素数)

次の二文字は「行列の種類」

GE:一般行列(GEneral)SY:対称行列(SYmmetric)TR:三角行列(TRiangular)...

残りは「何を計算するか」

SV:線形方程式の解(Solve)EV:固有値(Eigenvalue)TRF:行列の三角分解(TRiangularFactorization,GEのときは LU分解)...

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 4/12

木村拓馬

使い方は Users Guide

・ LAPACK Users’ Guide(http://www.netlib.org/lapack/lug/)

・和訳が図書館にあります

(E.Anderson [ほか] 著 ;小国力訳,行列計算パッケージ LAPACK 利用の手引,丸善, 1995)

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 5/12

木村拓馬

連立一次方程式を解かせてみよう

.DGESV..

......

実係数行列を持つ連立一次方程式 AX = Bの解を計算ここに A ∈ RN×N, X, B ∈ RN×NRHS

CALL DGESV( N, NRHS, A, LDA, IPIV, B, LDB, INFO )で Bは解 Xで上書きされるさらに Aは LU分解の計算結果で上書きされる

整数型の変数 LDA,LDBは,それぞれ行列 Aと Bの Leading Dimension.配列の格納形式に依存.

普通 Fortranでは行数 N(C言語等では列数).

変数 IPIVは出力専用の整数型 N次ベクトル.ガウス消去法の部分軸選択 (pivot)を表現.適当な整数型の 1次元配列でOK.

変数 INFOは出力専用の整数.CALLの後,正常終了ならば INFO=0,引数が変ならば INFO<0,解が求まらないとき INFO>0.

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 6/12

木村拓馬

ライブラリを選んでコンパイルライブラリがどこにあるかわからない場合,.......[user@host␣˜]$locate␣blas........[user@host␣˜]$locate␣lapack.

のようにすれば,それらしいのがいくつか見つかる.

無い場合はインストール(LAPACKは netlib:http://www.netlib.org/lapack/).

今回は,

/usr/lib64/libblas.so.3.2.1

/usr/lib64/liblapack.so.3.2.1

を使用2.

 ・libはライブラリ(library)を意味する. ・拡張子 soは共有オブジェクトファイル(Shared Object). ・3.2.1はバージョン(最新版は 3.5.0).

コンパイルは,入門で扱った分割コンパイルと同様に使うファイルを全部書けばよい3

.

......[user@host␣˜]$g95␣ex4.1.f90␣/usr/lib64/liblapack.so.3.2.1

等で,実行ファイル a.outが生成されるはず

2 この BLAS はあまり速くない様子 (the reference BLAS).速いのをインストールして差し替えれば速くなる3 他にもいろいろ方法があるが,それは「分割コンパイル」の回で扱う予定.

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 7/12

木村拓馬

dgesv の例.演習 3.3(pr3.3.f90)の線形連立方程式を解いてみる (ex4.1.f90 .. Download ).

......

!======================================================

! dgesv を使ってみる

!======================================================

program ex

implicit none

real(8), allocatable:: M(:,:),v(:),M0(:,:),v0(:),x(:)

integer, allocatable:: p(:)

real(8):: a,b,c,d,e,f,g, pii=acos(-1.0), h, temp, T

integer:: i, n, info

!------------------------------------------------------

! input problem --

write(*,*) ’Input a integer’

read(*,*) n

! write(*,*) ’Input 7 real numbers’

! read(*,*) a, b, c, d, e, f, g

a= 1.0

b=-1.0

c=-1.0

d= 2.0

e=-1.0

f= 0.0

g= 1.0

T= 3.0

allocate(M(n,n),v(n),M0(n,n),v0(n),x(n),p(n))

call MakeMatrix(M,n,a,b,c,d,e,f,g)

h=T*pii/dble(n-1)

v(1)=-cos(0.0d0)*h

temp=h*h

do i=2,n-1

v(i)=sin((i-1)*h)*temp

end do

v(n)=sin(T*pii)

if (n<=20) write(*,*) ’v=\n’,v

.

......

!------------------------------------------------------

! solve Mx=v

M0=M

v0=v

p=0

call dgesv(n,1,M,n,p,v,n,info)

!------------------------------------------------------

! residual

if (n<=20) write(*,*) ’x=\n’, v

write(*,*) ’residual=’

write(*,*) maxval(abs(matmul(M0,v)-v0))

!------------------------------------------------------

end program ex

!======================================================

!======================================================

subroutine MakeMatrix(M,n,a,b,c,d,e,f,g)

integer:: n, i

real(8):: M(n,n)

real(8):: a, b, c, d, e, f, g

M=0.0

M(1 ,1 )=a

M(1 ,2 )=b

do i=2,n-1

M(i,i-1)=c

M(i,i )=d

M(i,i+1)=e

end do

M(n ,n-1)=f

M(n ,n )=g

return

end subroutine

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 8/12

木村拓馬

.DGEMV(レベル2 BLASサブルーチン)..

......

倍精度実数の行列とベクトルの積を計算

A ∈ RM×N, α, β ∈ R, x ∈ RN, y ∈ RM に対し,

yを αAx+ βyで上書きする

CALL DGEMV(TRANS, M, N, ALPHA, A, LDA, X, INCX, BETA, Y, INCY)

文字型の変数 TRANSは通常 ’N’.

(Aの代わりに AT を使用するときは’T’)

整数型の変数 LDAは,普通 Fortranでは行数 M.

整数型の変数 INCX,INCYはそれぞれ Xと Yの increment.

通常1を入力すればよい.

(インクリメントは「DO I=1,N,K」でいうところの K.増分)

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 9/12

木村拓馬

DGEMVの使用例.

......

!------------------------------------------------------

! residual

if (n<=20) write(*,*) ’x=\n’, v

write(*,*) ’residual=’

write(*,*) maxval(abs(matmul(M0,v)-v0))

!------------------------------------------------------

end program ex

の部分を,以下のように変更して,比較してみよう(ex4.2.f90 .. Download )..

......

!------------------------------------------------------

! residual

if (n<=20) write(*,*) ’x=\n’, v

v0=-v0

call DGEMV(’n’, n, n, 1.0d0, M0, n, v, 1, 1.0d0, v0, 1)

write(*,*) ’residual=’

write(*,*) maxval(abs(v0))

!------------------------------------------------------

end program ex

※ v0は M0*v+v0で上書きされます

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 10/12

木村拓馬

.演習..

......

 自分で作成したガウス消去法 (pr3.2.f90~pr3.3.f90)と,LAPACKの線型方程式の解法を,

計算時間

残差

について比較してみよう.また,MATMULと BLASについても比較してみよう........  LAPACKに勝てた人は木村に知らせてください..計算時間の計測 (ex4.3.f90 .. Download )..

......

program cputime

implicit none

real :: t1, t2

call cpu_time( t1 )

処理

call cpu_time( t2 )

write(*,*) "CPU time= ", t2-t1, " seconds"

end program cputime

※ cpu timeは Fortran 95の組込サブルーチン.Fortran 90では環境によっては使用できないかも.使用できない場合,date and time,dtime,etimeを調べてみてください.

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 11/12

木村拓馬

参考文献

[1] JIS X 3001-1:2009 (プログラム言語 Fortran –第 1部:基底言語)

[2] 戸川隼人: 「ザ・Fortran90/95」,サイエンス社 (1999)

[3] http://www.g95.org

[4] LAPACK Users’ Guide(http://www.netlib.org/lapack/lug/)

[5] E.Anderson [ほか]著 ;小国力訳,行列計算パッケージ LAPACK利用の手引,丸善, 1995

FORTRAN プログラミング,–第4回 数値計算ライブラリ– ( 2014年10月14日 17:14 ) 12/12