2011年夏季集中講義 中島研吾 -...

Preview:

Citation preview

並列アプリケーション開発法入門(IV)

粒子間熱伝導問題解析コ ド粒子間熱伝導問題解析コード並列化並列化

2011年夏季集中講義

中島研吾中島研吾

並列計算プログラミング(616-2057)・先端計算機演習I(616-4009)

616-2057/616-4009 2

概 要概 要

• 問題設定

• 1CPU用プログラムの解説

• 並列プログラムの解説• 並列プログラムの解説

616-2057/616-4009 3

問題設定(1/5)問題設定(1/5)• 空間上に規則正しく,X,Y,Z方向にNX,NY,NZ個ずつ等, , , ,間隔(DX,DY,DZ)に配置された粒子の集合体を考える。

616-2057/616-4009 4

問題設定(2/5)粒子iに関する熱流束の/釣り合い

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

j ijij

i

Y

X

616-2057/616-4009 5

問題設定(3/5)粒子間熱伝導

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

粒子iを中心とする粒子iを中心とする,半径RADImaxの球(円)

i

Y

X

616-2057/616-4009 6

問題設定(3/5)粒子間熱伝導

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

粒子iを中心とする粒子iを中心とする,半径RADImaxの球(円)

i

粒子間の距離DELijがRADImaxのよりも小さい

粒子群とのみ熱伝導が粒 群 熱伝導ある。

Y

X

616-2057/616-4009 7

問題設定(3/5)粒子間熱伝導

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

粒子iを中心とする

断面積=AREA

粒子iを中心とする,半径RADImaxの球(円)

i

粒子間の距離DELijがRADImaxのよりも小さい

粒子群とのみ熱伝導がi熱伝導率

CO粒 群 熱伝導ある。

長さDEL 断面積AREA

CONDij

長さDEL,断面積AREA,熱伝導率CONDijの管で連結

616-2057/616-4009 8

熱伝導率:COND熱伝導率:CONDij

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

( )201010min0

DELijCONDCOND = ( )10,10min

iDELij

COND0 「基準」熱伝導率

616-2057/616-4009 9

問題設定(4/5)対流熱伝達

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

対流熱伝達率

X=0

対流熱伝達率HCONVi= HCONV if X=0= 0 otherwise

i

= 0 otherwise

熱交換面積SURFSURF

雰囲気温度Y

T0

X

616-2057/616-4009 10

問題設定(5/5)体積発熱

<RADIDEL

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

i ijij

体積発熱量 QVOL

発熱体積 V

222

21 DELQVOLCVOLCV ⋅⋅+⋅=222

iii ZYXDELQ ++=

C1, C2 定数VOL 各粒子の「基準」体積DELQ 粒子中心と原点との距離DELQ 粒子中心と原点との距離

616-2057/616-4009 11

粒子iに関するつりあい粒子 関する りあ

( ) ( ) 0/ 0

max

=⋅+−⋅⋅+−∑<

VQVOLTTSURFHCONVTTCONDDEL

AREAiiij

RADIDEL

j ijijj ijij

maxmax

⎥⎤

⎢⎡

−⎥⎤

⎢⎡

∑∑<<

TAREATAREAi

RADIDELRADIDEL

j

0

//

0 =⋅+⋅⋅−⋅⋅+

⎥⎥⎦⎢

⎢⎣⎥

⎥⎦⎢

⎢⎣

∑∑

VQVOLTSURFHCONVTSURFHCONV

TCONDDEL

TCONDDEL

iii

ij ijijj

jijij

TCONDDEL

AREATSURFHCONVCONDDEL

AREA RADIDEL

jj

ijiji

RADIDEL

ji

ijij ⎥⎥⎦

⎢⎢⎣

⎡+

⎥⎥⎦

⎢⎢⎣

⎡⋅−− ∑∑

<< maxmax

//

VQVOLTSURFHCONVi

j ijijj ijij

⋅−⋅⋅−=

⎥⎦⎢⎣⎥⎦⎢⎣

0

AMAT(i,i)(対角成分) AMAT(i,j)(非対角成分)

VQVOLTSURFHCONVi 0

RHS(右辺)

616-2057/616-4009 12

係数行列 AMAT係数行列 AMAT• 影響範囲 RADImax が小さければ,係数行列は疎影響範囲 max 小さけれ ,係数行列 疎

– 局所的な効果

• 影響範囲が大きければ 係数行列は密影響範囲が大きければ,係数行列は密

– 非ゼロ成分の割合が大きくなる

ii

616-2057/616-4009 13

疎行列と密行列: {q}=[A]{p}疎行列と密行列: {q} [A]{p}疎行列:差分法,有限要素法,有限体積法

do i= 1, Nq(i)= D(i)*p(i)d k i d (i 1) 1 i d (i)do k= index(i-1)+1, index(i)q(i)= q(i) + AMATs(k)*p(item(k))

enddoenddo

密行列 スペクトル法 分子動力学 境界要素法do i= 1, N

q(i)= 0 d0

密行列:スペクトル法,分子動力学,境界要素法

q(i)= 0.d0do j= 1, Nq(i)= q(i) + AMATd(i,j)*p(j)ddenddo

enddo

616-2057/616-4009 14

係数行列 AMAT係数行列 AMAT• 影響範囲 RADImax が小さければ,係数行列は疎影響範囲 max 小さけれ ,係数行列 疎

– 局所的な効果

• 影響範囲が大きければ 係数行列は密影響範囲が大きければ,係数行列は密

– 非ゼロ成分の割合が大きくなる

• 影響範囲が大きくなる場合のことを考えて,プログラムの中では係数行列を「密(AMATd(i j))」として扱うの中では係数行列を「密(AMATd(i,j))」として扱う。

616-2057/616-4009 15

• 問題設定

• 1CPU用プログラムの解説

• 並列プログラムの解説• 並列プログラムの解説

616-2057/616-4009 16

ファイル on ECCS2008$> cp /home03/skengon/Documents/class/EPSsummer/sphere.tar .$> t f h t$> tar xvf sphere.tar$> ls

sphere$> cd sphere ⇒ <$E SPHERE>$> cd sphere ⇒ <$E-SPHERE>$> ls

C F$> cd C$> cd C$> ls

inp1 test.c testp.c testp2.c

$> cd ../F$> ls

inp1 test.f testp.f testp2.fp p p

616-2057/616-4009 17

コンパイル,実行,実行

$> cd <$E-SPHERE>/C$ 3$> cc –O3 test.c -o sps$> ./sps$> ls -l sphere*

sphere.fld spheredata

$> cd <$SPHERE>/F$ $$> g95 –O3 test.f -o sps$> ./sps$> ls -l sphere*$> ls l sphere

sphere.fld spheredata

616-2057/616-4009 18

sps: ファイル,データp ,

sphere.fld(名称固定)

inp1

計算結果(形状)

spsinp1

(名称固定)spheredata(名称固定)

計算結果(名称固定) (温度)制御データ

616-2057/616-4009 19

制御データ:inp1制御 p10 10 10 NX, NY, NZ1.e0 1.e0 1.e0 DX, DY, DZ1.e0 10.e0 1.e0 1.e0 VOL, AREA, QVOL, COND01.e24 0.e0 10.e0 HCONV, T0, SURF, ,8.0e0 RADImax1.0e0 0.1e0 C1, C2

616-2057/616-4009 20

計算結果(形状):sphere fld計算結果(形状):sphere.fld*.fldの形式であれば名称は任意

# AVS field file 必須ndim= 3 三次元モデルであることを示すndim 3 次元 デルである とを示すdim1= 10 NXdim2= 10 NYdim3= 10 NZdim3= 10 NZnspace= 3veclen= 1data= floatdata= floatfield= uniformlabel= temperature

/ 温度フ イル名variable 1 file=./spheredata filetype=ascii 温度ファイル名

616-2057/616-4009 21

計算結果(温度):spheredata計算結果(温度):spheredata計算結果(形状)からの参照が正しければ名称は任意

1.188402E-245.388751E+009.485117E+001.311638E+011 630137E+011.630137E+01

open (22, file='spheredata', status='unknown')do i= 1, NX*XY*NZ

write (22,'(1pe16.6)') PHI(i)enddo

616-2057/616-4009 22

シリアル版の計算手順シリアル版の計算手順

• 制御データ入力• 制御デ タ入力

• 粒子生成

係数 トリク 計算• 係数マトリクス計算

– 熱伝導

– 対流熱伝達

– 発熱

• CG法による連立一次方程式求解

– 密行列

– 点ヤコビ前処理

• 出力出力

– MicroAVS用

616-2057/616-4009 23

test.f:シリアル版(1/10)初期設定

implicit REAL*8 (A-H,O-Z)

real(kind=8) :: VOL, AREA, QVOL, COND0, COND, RADImaxreal(kind=8) :: HCONV, T0, SURF, DEL, DEL0, coef1, coef2real(kind=8), dimension(:) , allocatable :: XC, YC, ZCreal(kind=8), dimension(:,:), allocatable :: AMATreal(kind=8), dimension(:) , allocatable :: RHSreal(kind=8), dimension(:) , allocatable :: PHIreal(kind=8), dimension(:,:), allocatable :: W

integer :: NX NY NZ Ninteger :: NX, NY, NZ, Ninteger :: R, Z, P, Q, DD

!C!C +------+!C | INIT |!C +------+!C===

open (11, file= 'inp1', status='unknown')read (11,*) NX, NY, NZread (11 *) DX DY DZread (11,*) DX, DY, DZread (11,*) VOL, AREA, QVOL, COND0read (11,*) HCONV, T0, SURFread (11,*) RADImaxread (11,*) coef1, coef2( , ) ,

close (11)

N= NX*NY*NZ

616-2057/616-4009 24

test.f:シリアル版(2/10)粒子中心の座標(XC,YC,ZC)

allocate (XC(N) YC(N) ZC(N))allocate (XC(N), YC(N), ZC(N))

icou= 0do k= 1, NZdo j= 1, NYdo i= 1, NX

icou= icou + 1XC(icou)= dfloat(i-1)*DXYC(icou)= dfloat(j-1)*DYZC(icou)= dfloat(k-1)*DZZC(icou)= dfloat(k-1)*DZ

enddoenddo

enddo!C===

粒子の通し番号 ii (1~N)ii=(k-1)*NX*NY + (j-1)*NX + i

616-2057/616-4009 25

test.f:シリアル版(3/10)マトリクス生成:熱伝導部分

!C!C +--------+ AREARADIDEL ⎤⎡ < max!C + +!C | MATRIX |!C +--------+!C===

allocate (AMAT(N,N), RHS(N)) AREA

TSURFHCONVCONDDEL

AREA

RADIDEL

ij

iijij

⎥⎤

⎢⎡

+⎥⎥⎦

⎢⎢⎣

⎡⋅−−

∑< max

max

/

AMAT= 0.d0RHS = 0.d0do i= 1, Ndo j= 1 N

VQVOLTSURFHCONV

TCONDDEL

AREA

i

jj

ijij

⋅−⋅⋅−=

⎥⎥⎦⎢

⎢⎣

0

/

do j= 1, Nif (j.ne.i) then

DEL= dsqrt((XC(i)-XC(j))**2 + (YC(i)-YC(j))**2 && + (ZC(i)-ZC(j))**2)

if (DEL.le.RADImax) thenCOND= COND0/(10.d0**dmin1(DEL,20.d0))coef= COND*AREA / DELAMAT(i,j)= coefAMAT(i,i)= AMAT(i,i) - coef

endif ( )201010min0

DELijCONDCOND =

endifendif

enddoenddo

( )10,10minj

616-2057/616-4009 26

test.f:シリアル版(3/10)マトリクス生成:熱伝導部分

!C!C +--------+ AREARADIDEL ⎤⎡ < max!C + +!C | MATRIX |!C +--------+!C===

allocate (AMAT(N,N), RHS(N)) AREA

TSURFHCONVCONDDEL

AREA

RADIDEL

ij

iijij

⎥⎤

⎢⎡

+⎥⎥⎦

⎢⎢⎣

⎡⋅−−

∑< max

max

/

AMAT= 0.d0RHS = 0.d0do i= 1, Ndo j= 1 N

VQVOLTSURFHCONV

TCONDDEL

AREA

i

jj

ijij

⋅−⋅⋅−=

⎥⎥⎦⎢

⎢⎣

0

/

do j= 1, Nif (j.ne.i) then

DEL= dsqrt((XC(i)-XC(j))**2 + (YC(i)-YC(j))**2 && + (ZC(i)-ZC(j))**2)

if (DEL.le.RADImax) thenCOND= COND0/(10.d0**dmin1(DEL,20.d0))coef= COND*AREA / DELAMAT(i,j)= coefAMAT(i,i)= AMAT(i,i) - coef 対角項

endifendifendif

enddoenddo

616-2057/616-4009 27

test.f:シリアル版(4/10)マトリクス生成:体積発熱

do i= 1, NDELQ= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)DELQ= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)RHS(i)= -QVOL*(coef1*VOL + coef2*DELQ*VOL)

enddo

i= 1do k= 1, NZdo j= 1, NYic= (k-1)*NX*NY + (j-1)*NX + iAMAT(ic,ic)= -HCONV*SURF + AMAT(ic,ic)RHS (ic )= -HCONV*SURF*T0 + RHS (ic)RHS (ic )= -HCONV*SURF*T0 + RHS (ic)

enddoenddo

!C===

TSURFHCONVCONDDEL

AREAi

RADIDEL

ji

ijij

+⎥⎥⎦

⎢⎢⎣

⎡⋅−− ∑

< max

/ 222

21

ZYXDELQ

DELQVOLCVOLCV

++=

⋅⋅+⋅=

TCONDDEL

AREARADIDEL

jj

ijij

j ijij

⎥⎥⎦

⎢⎢⎣

⎥⎦⎢⎣

∑< max

/

iii ZYXDELQ ++=

VQVOLTSURFHCONVi

jj

⋅−⋅⋅−=⎦⎣

0

616-2057/616-4009 28

test.f:シリアル版(4/10)マトリクス生成:対流熱伝達

do i= 1, NDELQ= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)DELQ= dsqrt(XC(i) 2 + YC(i) 2 + ZC(i) 2)RHS(i)= -QVOL*(coef1*VOL + coef2*DELQ*VOL)

enddo

i= 1do k= 1, NZdo j= 1, NYic= (k-1)*NX*NY + (j-1)*NX + iAMAT(ic,ic)= -HCONV*SURF + AMAT(ic,ic)RHS (ic )= -HCONV*SURF*T0 + RHS (ic)RHS (ic )= -HCONV*SURF*T0 + RHS (ic)

enddoenddo

!C===

TSURFHCONVCONDDEL

AREAi

RADIDEL

ji

ijij

−⎥⎥⎦

⎢⎢⎣

⎡⋅−− ∑

< max

/

TCONDDEL

AREARADIDEL

jj

ijij ⎥⎥⎦

⎢⎢⎣

⎡∑< max

/

VQVOLTSURFHCONVi ⋅−⋅⋅−= 0

616-2057/616-4009 29

前処理付き共役勾配法Preconditioned Conjugate Gradient Method (CG)

0 0Compute r(0)= b-[A]x(0)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

(i 1) (i 1)前処理:対角スケーリング

ρi-1= r(i-1) z(i-1)if i=1p(1)= z(0)

elsex(i) :ベクトル

elseβi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif

αi :スカラー

endifq(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)x x + αipr(i)= r(i-1) - αiq(i)check convergence |r|

end

616-2057/616-4009 30

test.f:シリアル版(5/10)CG法①

!C!C +---------------+ Compute r(0)= b-[A]x(0)!C + +!C | CG iterations |!C +---------------+!C===

EPS= 1.d-08

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)allocate (W(N,4), PHI(N))W = 0.d0PHI= 0.d0

R = 1

if i=1p(1)= z(0)

elseβR = 1

Z = 2Q = 2P = 3DD= 4

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif(i) [A] (i)

do i= 1, NW(i,DD)= 1.0D0 / AMAT(i,i)

enddo

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i) r(i-1) α q(i)

W(i,1)= W(i,R) ⇒ {r}W(i,2)= W(i,Z) ⇒ {z}W(i,2)= W(i,Q) ⇒ {q}

r(i)= r(i 1) - αiq(i)check convergence |r|

endW(i,2) W(i,Q) ⇒ {q}W(i,3)= W(i,P) ⇒ {p}W(i,4)= W(i,DD) ⇒ 1/DIAG

616-2057/616-4009 31

test.f:シリアル版(6/10)CG法②

!C!C-- {r0}= {b} - [A]{xini} | Compute r(0)= b-[A]x(0)!C {r0}= {b} [A]{xini} |

do i= 1, NW(i,R) = RHS(i)do j= 1, N

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)W(i,R) = W(i,R) - AMAT(i,j)*PHI(j)

enddoenddo

BNRM2= 0 0D0

if i=1p(1)= z(0)

elseβBNRM2= 0.0D0

do i= 1, NBNRM2 = BNRM2 + RHS(i)**2

enddo

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif(i) [A] (i)

!C******************************************do iter= 1, N

!C!C-- {z}= [Minv]{r}

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i) r(i-1) α q(i)

do i= 1, NW(i,Z)= W(i,DD) * W(i,R)

enddo

r(i)= r(i 1) - αiq(i)check convergence |r|

end

616-2057/616-4009 32

test.f:シリアル版(7/10)CG法③

!C!C-- RHO= {r}{z} Compute r(0)= b-[A]x(0)!C RHO= {r}{z}

RHO= 0.d0do i= 1, NRHO= RHO + W(i,R)*W(i,Z)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)enddo

!C!C-- {p} = {z} if ITER=1!C BETA= RHO / RHO1 otherwise

if i=1p(1)= z(0)

elseβ /!C BETA= RHO / RHO1 otherwise

if ( iter.eq.1 ) thendo i= 1, NW(i,P)= W(i,Z)

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif(i) [A] (i)

enddoelse

BETA= RHO / RHO1do i= 1, NW(i P) W(i Z) + BETA*W(i P)

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i) r(i-1) α q(i)W(i,P)= W(i,Z) + BETA*W(i,P)

enddoendif

r(i)= r(i 1) - αiq(i)check convergence |r|

end

616-2057/616-4009 33

test.f:シリアル版(8/10)CG法④

!C!C-- {q}= [A]{p} Compute r(0)= b-[A]x(0)!C {q}= [A]{p}

do i= 1, NW(i,Q) = 0.d0do j= 1, N

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)W(i,Q) = W(i,Q) + AMAT(i,j)*W(j,P)

enddoenddo

!C

if i=1p(1)= z(0)

elseβ!C

!C-- ALPHA= RHO / {p}{q}

C1= 0.d0do i= 1, N

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif(i) [A] (i)

C1= C1 + W(i,P)*W(i,Q)enddoALPHA= RHO / C1

!C

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i)= r(i-1) α q(i)!C

!C-- {x}= {x} + ALPHA*{p}!C {r}= {r} - ALPHA*{q}

do i= 1, N

r(i)= r(i 1) - αiq(i)check convergence |r|

end,

PHI(i) = PHI(i) + ALPHA * W(i,P)W (i,R)= W(i,R) - ALPHA * W(i,Q)

enddo

616-2057/616-4009 34

test.f:シリアル版(9/10)CG法⑤

DNRM2 = 0.0do i= 1 N Compute r(0)= b-[A]x(0)do i= 1, NDNRM2= DNRM2 + W(i,R)**2

enddo

RESID= dsqrt(DNRM2/BNRM2)

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)

write (*, 1000) iter, RESID1000 format (i5, 1pe16.6)

if ( RESID le EPS) goto 900

if i=1p(1)= z(0)

elseβif ( RESID.le.EPS) goto 900

RHO1 = RHO

enddo!C******************************************

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i-1)

endif(i) [A] (i)

IER = 1

900 continue!C

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i) r(i-1) α q(i)!C=== r(i)= r(i 1) - αiq(i)check convergence |r|

end

616-2057/616-4009 35

test.f:シリアル版(10/10)結果出力結果出力

!C!C +--------+!C | OUTPUT |!C | OUTPUT |!C +--------+!C===

N1= 1N3= 3

!C!C-- MESH

open (22, file='sphere.fld', status='unknown')write (22,'(a)') '# AVS field file'write (22 '(a i5)') 'ndim=' N3write (22, (a,i5) ) ndim , N3write (22,'(a,i5)') 'dim1=', NXwrite (22,'(a,i5)') 'dim2=', NYwrite (22,'(a,i5)') 'dim3=', NZwrite (22,'(a,i5)') 'nspace=', N3write (22,'(a,i5)') 'veclen=', N1write (22,'(a,i5)') 'data= float'write (22,'(a,i5)') 'field= uniform'write (22,'(a,i5)') 'label= temperature'write (22 '(a i5)') 'variable 1 file= /spheredata filetype=ascii'write (22, (a,i5) ) variable 1 file=./spheredata filetype=asciiclose (22)

!C!C-- RESULTS

open (22, file='spheredata', status='unknown')do i= 1, Nwrite (22,'(1pe16.6)') PHI(i)

enddo!C===

616-2057/616-4009 36

MicroAVSによる処理(1/4)

616-2057/616-4009 37

MicroAVSによる処理(2/4)

616-2057/616-4009 38

MicroAVSによる処理(3/4)

616-2057/616-4009 39

MicroAVSによる処理(4/4)

616-2057/616-4009 40

• 問題設定

• 1CPU用プログラムの解説

• 並列プログラムの解説• 並列プログラムの解説

616-2057/616-4009 41

粒子間熱伝導コードの並列化粒子間熱伝導コ ドの並列化

• 未知数をNとする。

• 有限要素法,有限体積法に必要な記憶容量

– 未知数ベクトル: O(N)

– 係数マトリクス: O(N)

• 粒子間熱伝導コードで必要な記憶容量粒子間熱伝導コ ドで必要な記憶容量

– 未知数ベクトル: O(N)

– 係数マトリクス: O(N2):Nの値は必然的に小さくなる係数マトリクス: O(N ):Nの値は必然的に小さくなる

• 本手法では,係数マトリクスが必要な記憶容量のほとんどを占めるため:んどを占めるため:

– 未知数ベクトル,形状については各PEが全体情報を記憶する:eps fvmのときのような領域分割は不要する:eps_fvmのときのような領域分割は不要。

– 係数マトリクスを各PEに分散して記憶する。

616-2057/616-4009 42

行列ベクトル積の例(1/5)行列 クトル積の例(1/5)

{q} {p}[A]

= x

616-2057/616-4009 43

行列ベクトル積の例(2/5)行列 クトル積の例(2/5)

{q} {p}[A]

#PE0

= x

#PE1

#PE2

#PE3

各PEで分散して記憶各PEで

全体を記憶

616-2057/616-4009 44

行列ベクトル積の例(3/5)行列 クトル積の例(3/5){q} {p}[A]{q} {p}[ ]

#PE0

#PE1

= x

#PE1

#PE2

#PE3

各PEで分散して記憶各PEで

全体を記憶

616-2057/616-4009 45

行列ベクトル積の例(3/5)行列 クトル積の例(3/5){q} {p}[A]{q} {p}[ ]

#PE0

#PE1

= x

#PE1

#PE2

#PE3

各PEで分散して記憶各PEで

全体を記憶MPI_ALLREDUCEALLGATHERVで一つにまとめる

616-2057/616-4009 46

行列ベクトル積の例(4/5)行列ベクトル積の例(4/5)MPI_ALLREDUCE使用(白い部分は0)

{q}PE0 {q}PE1 {q}PE2 {q}PE3 {q}{ }PE0 { }PE1 { }PE2 { }PE3 { }

#PE0

#PE1

#PE2+ + + =

#PE3

616-2057/616-4009 47

行列ベクトル積の例(5/5)行列ベクトル積の例(5/5)MPI_ALLGATHERV使用

{q}PE0 {q}PE1 {q}PE2 {q}PE3 {q}{ }PE0 { }PE1 { }PE2 { }PE3 { }

#PE0

#PE1

#PE2+ + + =

#PE3

616-2057/616-4009 48

行列ベクトル積:有限体積法等(疎行列)行列 クトル積:有限体積法等(疎行列)

{q} {p}[A]

#PE0

= x

#PE1

#PE2

#PE3

各PEで分散して記憶各PEで

分散して記憶各PEで

分散して記憶

616-2057/616-4009 49

ファイル on T2K$> cd$> cp /home/t00000/EPSsummer/sphere.tar .$> tar xvf sphere.tar$> ls$

sphere$> cd sphere ⇒ <$T-SPHERE>$> ls$> ls

C F$> cd C$> ls$> ls

inp1 test.c testp.c testp2.c

$ d /$> cd ../F$> ls

inp1 test.f testp.f testp2.f

616-2057/616-4009 50

コンパイル,実行,実行

$> cd <$T-SPHERE>/C$> mpicc –Os -noparallel testp.c -o spp[go.sh修正]$> qsub go.sh$ q g$> ls -l sphere*

sphere.fld spheredata

$> cd <$T-SPHERE>/F$> mpif90 –Oss -noparallel testp.f -o spp[go sh修正][go.sh修正]$> qsub go.sh $> ls -l sphere*

sphere.fld spheredata

616-2057/616-4009 51

spp: ファイル,データpp ,

sphere.fld(名称固定)

inp1

計算結果(形状)

sppinp1

(名称固定)spheredata(名称固定)

計算結果(名称固定) (温度)制御データ

616-2057/616-4009 52

T2K ⇒ECCS2008:ファイルコピーT2K ⇒ECCS2008:ファイルコピscpコマンドを使う

① ECCS2008にログイン

② T2K上の /home/t50000/EPSsummer/sphere/F/sphere.fld を ECCS2008へ持って来たいときは③のようにするは③のようにする

③ $> scp t50000@ha8000-2.cc.u-tokyo.ac.jp:~/EPSsummer/sphere/F/sphere.fld .

でも同じようにするPuTTY on Windowsでも同じようにする

616-2057/616-4009 53

testp.f:パラレル版(1/12)p初期設定①

implicit REAL*8 (A-H,O-Z)

include 'mpif.h'

real(kind=8) :: VOL, AREA, QVOL, COND0, COND, RADImaxreal(kind=8) :: HCONV, T0, SURF, DEL, DEL0, coef1, coef2real(kind=8), dimension(:) , allocatable :: XC, YC, ZCreal(kind=8), dimension(:,:), allocatable :: AMATreal(kind=8), dimension(:) , allocatable :: RHSreal(kind=8), dimension(:) , allocatable :: PHIreal(kind=8) dimension(: :) allocatable :: Wreal(kind=8), dimension(:,:), allocatable :: W

integer :: NX, NY, NZ, Ninteger :: R, Z, P, Q, DD, WK

integer :: PETOT, PEsmpTOT, my_rank, errnointeger, dimension(:) , allocatable :: NElocal, AGVindexinteger, dimension(:) , allocatable :: PEon

!C!C + +!C +------+!C | INIT |!C +------+!C===

call MPI INIT (ierr)_ ( )call MPI_COMM_SIZE (MPI_COMM_WORLD, PETOT , ierr)call MPI_COMM_RANK (MPI_COMM_WORLD, my_rank , ierr)

616-2057/616-4009 54

testp.f:パラレル版(2/12)p初期設定②:同じ制御データ

open (11, file= 'inp1', status='unknown')read (11 *) NX NY NZread (11,*) NX, NY, NZread (11,*) DX, DY, DZread (11,*) VOL, AREA, QVOL, COND0read (11,*) HCONV, T0, SURFread (11,*) RADImaxread (11,*) coef1, coef2

close (11)

N= NX*NY*NZ

allocate (XC(N), YC(N), ZC(N))

S1_time= MPI_WTIME()

icou= 0do k= 1, NZdo j= 1, NYdo i= 1, NX

icou icou + 1icou= icou + 1XC(icou)= dfloat(i-1)*DXYC(icou)= dfloat(j-1)*DYZC(icou)= dfloat(k-1)*DZ

enddoenddo

enddo

616-2057/616-4009 55

testp.f:パラレル版(3/12)p初期設定③:ローカルデータ設定

!C!C-- LOCAL!C LOCAL

allocate (NElocal(PETOT), AGVindex(0:PETOT))allocate (PEon(N))

NElocal = 0AGVindex= 0PEon = -1

NN= N / PETOTNElocal= NNNElocal= NNNR= N - PETOT*NNdo ip= 1, PETOTif (ip.le.NR) NElocal(ip)= NElocal(ip) + 1AGVindex(ip)= AGVindex(ip-1) + NElocal(ip)p p p

enddo

PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1)

NElocal(1) NElocal(2) NElocal(3) NElocal(m)NElocal(m-1)

AGVindex(0)=0 AGVindex(1)=AGVindex(m)=

AGVindex(0)=0 AGVindex(1)=AGVindex(0) + NElocal(1)

AGVindex(m-1) + NElocal(m)=N

616-2057/616-4009 56

ローカルデータ生成成

PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1)

NElocal(1) NElocal(2) NElocal(3) NElocal(m)NElocal(m-1)

PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1)

AGVindex(0)=0 AGVindex(1)=AGVindex(0) + NElocal(1)

AGVindex(m)=AGVindex(m-1) + NElocal(m)=N

全体ベクトル 1 ~ N全体ベクトル 1 N局所ベクトル 1 ~ NElocal(my_rank+1)

616-2057/616-4009 57

testp.f:パラレル版(3/12)p初期設定③:ローカルデータ設定

!C!C-- LOCAL!C LOCAL

allocate (NElocal(PETOT), AGVindex(0:PETOT))allocate (PEon(N))

NElocal = 0AGVindex= 0PEon = -1

PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1)

NElocal(1) NElocal(2) NElocal(3) NElocal(m)NElocal(m-1)

PE#0 PE#1 PE#2 PE#(m 2) PE#(m 1)

AGVindex(0)=0 AGVindex(1)=AGVindex(0) + NElocal(1)

AGVindex(m)=AGVindex(m-1) + NElocal(m)=N

do ip= 1, PETOTdo j= AGVindex(ip-1)+1, AGVindex(ip)

PEon(j)= ip - 1enddo

enddo!C===

616-2057/616-4009 58

オペレーションの並列化FEM,FVM FEM,FVM

do i= 1, Ndo j= 1, ICON(i)

…enddo

do i= 1, Nlocaldo j= 1, ICON(i)

…enddo

Nlocal= N/PETOT

enddoenddo

enddo

本手法

do i= 1, N

本手法

do i= 1, Nlocaldo j= 1, N

…enddo

enddo

,do j= 1, N

…enddo

enddo

Nlocal= N/PETOT

e ddo

616-2057/616-4009 59

係数行列:各PEで独立に計算,格納係数行 各 算,格納

[A][A]#PE0 NL

A(NL,N)NLは各PEで異なる可能性がある

#PE1 NL

性がある。

行に関しては局所番号#PE1 NL 行に関しては局所番号列に関しては全体番号

#PE2 NL

#PE3 NL

N

616-2057/616-4009 60

係数行列:各PEで独立に計算,格納係数行 各 算,格納

[A][A]#PE0 NL

A(NL,N)NLは各PEで異なる可能性がある

#PE1 NL

性がある。

行に関しては局所番号#PE1 NL 行に関しては局所番号列に関しては全体番号

#PE2 A(1,1)NL

#PE3 NL

N

616-2057/616-4009 61

係数行列:各PEで独立に計算,格納係数行 各 算,格納

[A][A]#PE0 NL

A(NL,N)NLは各PEで異なる可能性がある

#PE1 NL

性がある。

行に関しては局所番号#PE1 NL 行に関しては局所番号列に関しては全体番号

#PE2 A(NL,1)NL

#PE3 NL

N

616-2057/616-4009 62

係数行列:各PEで独立に計算,格納係数行 各 算,格納

[A][A]#PE0 NL

A(NL,N)NLは各PEで異なる可能性がある

#PE1 NL

性がある。

行に関しては局所番号#PE1 NL 行に関しては局所番号列に関しては全体番号

#PE2 A(NL,N)NL

#PE3 NL

N

616-2057/616-4009 63

testp.f:パラレル版(4/12)pマトリクス生成:熱伝導部分

!C!C +--------+!C + +!C | MATRIX |!C +--------+!C===

allocate (AMAT(NElocal(my_rank+1),N), RHS(N))

AMAT= 0.d0RHS = 0.d0do i0= 1, NElocal(my_rank+1)i= i0 + AGVindex(my rank)

i0:局所番号i 全体番号i= i0 + AGVindex(my_rank)

do j= 1, Nif (j.ne.i) then

DEL= dsqrt((XC(i)-XC(j))**2 + (YC(i)-YC(j))**2 && + (ZC(i)-ZC(j))**2)

i : 全体番号

if (DEL.le.RADImax) thenCOND= COND0/(10.d0**dmin1(DEL,20.d0))coef= COND*AREA / DELAMAT(i0,j)= coefAMAT(i0 i)= AMAT(i0 i) coefAMAT(i0,i)= AMAT(i0,i) - coef

endifendif

enddoenddo

616-2057/616-4009 64

testp.f:パラレル版(5/12)pマトリクス生成:体積発熱:シリアルと同じ

do i= 1, NDEL= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)DEL= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)RHS(i)= -QVOL*(coef1*VOL + coef2*DEL*VOL)

enddo

i= 1do k= 1, NZdo j= 1, NYic= (k-1)*NX*NY + (j-1)*NX + iip= PEon(ic)if (my rank eq ip) thenif (my_rank.eq.ip) thenic0= ic - AGVindex(ip)AMAT(ic0,ic)= -HCONV*SURF + AMAT(ic0,ic)

endifRHS (ic )= -HCONV*SURF*T0 + RHS (ic)

enddoenddo

!C===S2_time= MPI_WTIME()

616-2057/616-4009 65

testp.f:パラレル版(5/12)pマトリクス生成:対流熱伝達

do i= 1, NDEL= dsqrt(XC(i)**2 + YC(i)**2 + ZC(i)**2)DEL= dsqrt(XC(i) 2 + YC(i) 2 + ZC(i) 2)RHS(i)= -QVOL*(coef1*VOL + coef2*DEL*VOL)

enddo

i= 1do k= 1, NZdo j= 1, NYic= (k-1)*NX*NY + (j-1)*NX + iip= PEon(ic)if (my rank eq ip) then

ic0: 局所番号i 全体番号if (my_rank.eq.ip) then

ic0= ic - AGVindex(ip)AMAT(ic0,ic)= -HCONV*SURF + AMAT(ic0,ic)

endifRHS (ic )= -HCONV*SURF*T0 + RHS (ic)

ic : 全体番号

enddoenddo

!C===S2_time= MPI_WTIME()

616-2057/616-4009 66

testp.f:パラレル版(6/12)pCG法①

!C!C +---------------+ Compute r(0)= b-[A]x(0)!C !C | CG iterations |!C +---------------+!C===

EPS= 1.d-08ll ( ( 5) ( ))

for i= 1, 2, …solve [M]z(i-1)= r(i-1)

ρi-1= r(i-1) z(i-1)allocate (W(N,5), PHI(N))

NEL= NElocal(my_rank+1)

W = 0.d0

if i=1p(1)= z(0)

elseβW 0.d0

PHI= 0.d0

R = 1Z = 2

βi-1= ρi-1/ρi-2p(i)= z(i-1) + βi-1 p(i)

endif(i) [A] (i)Q = 2

P = 3DD= 4WK= 5

q(i)= [A]p(i)

αi = ρi-1/p(i)q(i)x(i)= x(i-1) + αip(i)r(i) r(i-1) α q(i)r(i)= r(i 1) - αiq(i)check convergence |r|

end

616-2057/616-4009 67

CG法(密行列)の並列化

• 計算量のオーダー計算量 オ ダ

– 行列ベクトル積 N2

– 前処理(対角スケーリング) N前処理(対角スケ リング) N– 内積 N– DAXPY({y}= a{x}+{y}) NDAXPY({y} a{x}+{y}) N

• Nがある程度大きくなると 行列ベクトル積が占める量• Nがある程度大きくなると,行列ベクトル積が占める量が圧倒的になる

行列ベクトル積の部分のみ並列化– 行列ベクトル積の部分のみ並列化

– 他は並列化しない(各PEで同じ計算を1~Nで実施)

• 局所デ タを使用して並列に計算することも可能であるが 計算量• 局所データを使用して並列に計算することも可能であるが,計算量に比べて通信オーバーヘッドの方が概して大きくなる。

616-2057/616-4009 68

行列ベクトル積(1/2)行列 クトル積(1/2){q} {p}[A]{q} {p}[ ]

#PE0

#PE1

= x

#PE1

#PE2

#PE3

各PEで分散して記憶各PEで

全体を記憶

616-2057/616-4009 69

行列ベクトル積(2/2)行列ベクトル積(2/2)MPI_ALLREDUCE使用(白い部分は0)

{q}PE0 {q}PE1 {q}PE2 {q}PE3 {q}{ }PE0 { }PE1 { }PE2 { }PE3 { }

#PE0

#PE1

#PE2+ + + =

#PE3

616-2057/616-4009 70

testp.f:パラレル版(7/12)pCG法②:行列の対角成分の逆数の計算

do i0= 1, NELi= i0 + AGVindex(my rank)i i0 + AGVindex(my_rank)W(i,DD)= 1.d0/AMAT(i0,i)

enddo

do i= 1, N(i ) 0 d0W(i,WK)= 0.d0

enddo

call MPI_allREDUCE && (W(1,DD), W(1,WK), N, MPI DOUBLE PRECISION, MPI SUM, && (W(1,DD), W(1,WK), N, MPI_DOUBLE_PRECISION, MPI_SUM, && MPI_COMM_WORLD, ierr)

do i= 1, NW(i,DD)= W(i,WK)

enddo

PE#0 PE#1 PE#2 PE#3

MPI_allREDUCE

各PEで担当部分計算(白い部分0)

616-2057/616-4009 71

行列の対角成分の逆数行列の対角成分の逆数

• 前処理については各PEで以下のような計算を実施したい。do i= 1, NW(i,Z)= W(i,DD) * W(i,R)

enddo

前処理については各PEで以下のような計算を実施したい。

enddo

#PE0• しかし,係数行列を右のよう

#PE0に分散して覚えているので,「対角成分」は各PEに分散

#PE1して記憶されている。

– 従って,各PEで計算した#PE2W(i,DD)を

MPI_ALLREDUCEしている。

#PE3

616-2057/616-4009 72

testp2.f:MPI_Allgathervを使用p _ g行列の対角成分の逆数の計算

do i0= 1, NELi= i0 + AGVindex(my rank)i i0 + AGVindex(my_rank)W(i0,WK)= 1.d0/AMAT(i0,i)

enddo

call MPI_allGATHERv &( (1 )& (W(1,WK), NEL, MPI_DOUBLE_PRECISION, &

& W(1,DD), NElocal, AGVindex(0), MPI_DOUBLE_PRECISION, && MPI_COMM_WORLD, ierr)

NElocal(1) NElocal(2) NElocal(3) NElocal(m)NElocal(m-1)

PE#0 PE#1 PE#2 PE#(m-2) PE#(m-1)

AGVindex(0)=0 AGVindex(1)=AGVindex(0) + NElocal(1)

AGVindex(m)=AGVindex(m-1) + NElocal(m)=N

全体ベクトル 1 ~ N局所ベクトル 1 ~ NEL

616-2057/616-4009 73

testp.f:パラレル版(8/12)pCG法③

!C!C-- {r0}= {b} - [A]{xini} |!C {r0} {b} [A]{xini} |

do i0= 1, NELi= i0 + AGVindex(my_rank)W(i,R)= RHS(i)

enddo

#PE0

#PE1

do j= 1, NXX= PHI(j)W(j,WK)= 0.d0do i0= 1, NEL

= x

#PE1

#PE2do i0 1, NELi= i0 + AGVindex(my_rank)W(i,R)= W(i,R) - AMAT(i0,j) * XX

enddoenddo

#PE3

call MPI_allREDUCE && (W(1,R), W(1,WK), N, MPI_DOUBLE_PRECISION, MPI_SUM, && MPI_COMM_WORLD, ierr)

do i= 1, NW(i,R)= W(i,WK)

enddo

BNRM2= 0.0D0do i= 1, NBNRM2 = BNRM2 + RHS(i)**2

enddo

616-2057/616-4009 74

testp.f:パラレル版(9/12)pCG法④

!C********************************************************************do iter= 1, Ndo iter 1, N

!C!C-- {z}= [Minv]{r}

do i= 1, NW(i,Z)= W(i,DD) * W(i,R)ddenddo

!C!C-- RHO= {r}{z}

RHO= 0.d0do i= 1, Ndo i 1, NRHO= RHO + W(i,R)*W(i,Z)

enddo!C!C-- {p} = {z} if ITER=1!C BETA= RHO / RHO1 otherwise

if ( iter.eq.1 ) thendo i= 1, NW(i P)= W(i Z)W(i,P) W(i,Z)

enddoelse

BETA= RHO / RHO1do i= 1, NW(i,P)= W(i,Z) + BETA*W(i,P)

enddoendif

616-2057/616-4009 75

testp.f:パラレル版(10/12)pCG法⑤

!C!C-- {q}= [A]{p}!C {q} [A]{p}

do i= 1, NW(i,Q)= 0.d0

enddo

#PE0

#PE1

do j= 1, NXX= W(j,P)W(j,WK)= 0.d0do i0= 1, NEL

= x

#PE1

#PE2do i0 1, NELi= i0 + AGVindex(my_rank)W(i,Q)= W(i,Q) + AMAT(i0,j) * XX

enddoenddo

#PE3

call MPI_allREDUCE && (W(1,Q), W(1,WK), N, MPI_DOUBLE_PRECISION, MPI_SUM, && MPI_COMM_WORLD, ierr)

do i= 1, NW(i,Q)= W(i,WK)

enddo

616-2057/616-4009 76

testp2.f:MPI_Allgatherv 使用p _ g{q}= [A]{p}:少し速い:ゼロクリア少ない

!C!C-- {q}= [A]{p}!C {q} [A]{p}

do i0= 1, NEL(i0 ) 0 d0

#PE0

#PE1W(i0,WK)= 0.d0enddo

do j= 1, NXX= W(j,P)

= x

#PE1

#PE2XX W(j,P)do i0= 1, NELW(i0,WK)= W(i0,WK) + AMAT(i0,j) * XX

enddoenddo

#PE3

call MPI_allGATHERv & & (W(1,WK), NEL, MPI_DOUBLE_PRECISION, && W(1,Q ), NElocal, AGVindex(0), MPI_DOUBLE_PRECISION, && MPI COMM WORLD ierr)& MPI_COMM_WORLD, ierr)

616-2057/616-4009 77

testp.f:パラレル版(11/12)pCG法⑥

!C!C-- ALPHA= RHO / {p}{q}!C ALPHA= RHO / {p}{q}

C1= 0.d0do i= 1, NC1= C1 + W(i,P)*W(i,Q)

enddoALPHA= RHO / C1

!C!C-- {x}= {x} + ALPHA*{p}!C {r}= {r} - ALPHA*{q}

do i= 1 Ndo i= 1, NPHI(i) = PHI(i) + ALPHA * W(i,P)W (i,R)= W(i,R) - ALPHA * W(i,Q)

enddo

DNRM2 = 0.0do i= 1, NDNRM2= DNRM2 + W(i,R)**2

enddo

RESID= dsqrt(DNRM2/BNRM2)

if ( RESID.le.EPS) goto 900RHO1 = RHO

enddo!C********************************************************************

900 continue!C===

616-2057/616-4009 78

testp.f:パラレル版(12/12)結果出力結果出力

if (my_rank.eq.0) then!C!C +--------+!C | OUTPUT |!C +--------+!C===

N1= 1N3 3N3= 3

open (22, file='sphere.fld', status='unknown')write (22,'(a)') '# AVS field file'write (22,'(a,i5)') 'ndim=', N3( , ( , ) ) ,write (22,'(a,i5)') 'dim1=', NXwrite (22,'(a,i5)') 'dim2=', NYwrite (22,'(a,i5)') 'dim3=', NZwrite (22,'(a,i5)') 'nspace=', N3it (22 '( i5)') ' l ' N1write (22,'(a,i5)') 'veclen=', N1

write (22,'(a,i5)') 'data= float'write (22,'(a,i5)') 'field= uniform'write (22,'(a,i5)') 'label= temperature'write (22,'(a,i5)') 'variable 1 file=./spheredata filetype=ascii'write (22, (a,i5) ) variable 1 file ./spheredata filetype asciiclose (22)

open (22, file='spheredata', status='unknown')do i= 1, N

i iwrite (22,'(1pe16.6)') PHI(i)enddo

!C===endif

ジョブスクリプト例:Policy-3T2K-FVM-03

ジョブスクリプト例:Policy 3go.sh numarun.sh:Policy-3相当

#@$-r sphere#@$-q lecture#@$-N 1

#!/bin/bashMYRANK=$MXMPI_IDMYVAL=$(expr $MYRANK / 4)SOCKET=$(expr $MYVAL % 4)n mactl cp nodebind $SOCKET membind $SOCKET $@#@$-J T16

#@$-e err#@$-o a1-016-2.lst#@$-lM 28GB

numactl --cpunodebind=$SOCKET --membind=$SOCKET $@

numarun.sh:Policy-4相当

# / /#@$ lM 28GB#@$-lT 00:05:00#@$

#!/bin/bashMYRANK=$MXMPI_IDMYVAL=$(expr $MYRANK / 4)SOCKET=$(expr $MYVAL % 4)numactl --cpunodebind=$SOCKET --localalloc $@

cd $PBS_O_WORKDIRmpirun ./numarun.sh ./spp

exit

p

exit

616-2057/616-4009 80

計算例: testp f:遅い方計算例: testp.f:遅い方

80 00 80 00

60.00

80.00

idealN=10^3N=20^3 60.00

80.00

ideal

N=20^3

N 30^3

1コア基準 16コア基準

40.00

peed

-Up N=30^3

40.00

peed

-Up

N=30^3

20.00

Sp

20.00

Sp

0.000 16 32 48 64

C #

0.000 16 32 48 64

C #

PC Clusterの例 N=203

4PE’s 8PE’s

Core # Core #

4PE s 8PE stestp: 9.54 5.13testp2: 9.13 4.82

616-2057/616-4009 81

自習課題(できるだけやってください)

• CG法の全てのプロセスを並列に計算するように書き換

えて見よ。現在の「行列ベクトル積」のみを並列に計算する場合と比較して見よ。

1.E+02行列ベクトル積「以外」の計算量の比率

1.E+01• 実線 完全に並列にした場合• ● 「行列ベクトル積」のみ,16PE

1.E+00

% • ○ 「行列ベクトル積」のみ,24PE• ▲ 「行列ベクトル積」のみ,32PE

1.E-0110 100 1000 10000 100000

DOF

616-2057/616-4009 82

並列分散データ構造

FVM型• FVM型

– 隣接領域

– 内点,外点,境界点

– 通信テーブル(送信,受信)

• 本手法

– 内点

– 基本的にはグローバル情報中心

– ベクトルをローカルに扱う場合とグローバルに扱う場合がある。

616-2057/616-4009 83

補足:LAPACKの利用(1PEのみ)足 用( )

$> cd$> cp /home/t00000/EPSsummer/sphere_lapack.tar .$> tar xvf sphere_lapack.tar$> ls$

sphere_lapack$> cd sphere_lapack ⇒ <$T-SPLAPACK>$> ls$> ls

C F$> cd C$> ls$> ls

inp1 test.c test_org.c

$ d /$> cd ../F$> ls

inp1 test.f test_org.f

616-2057/616-4009 84

PGIコンパイラの利用(1/2)ラ 用( )

$> source /opt/itc/mpi/mpiswitch.sh mpich-mx-pgi$> which mpif90$> which mpif90/opt/itc/mpi/mpich-mx-pgi/bin/mpif90

日立にもどす日立にもどす$> source /opt/itc/mpi/mpiswitch.sh mpich-mx-hitachi $> which mpif90/opt/itc/mpi/mpich-mx-hitachi/bin/mpif90

オリジナル版$> pgf95 –fast test_org.f –o test_org$> pgcc -fast test_org.c –o test_org

616-2057/616-4009 85

PGIコンパイラの利用(2/2)ラ 用( )

$> cd <$T-SLAPACK>$> make$> makepgf95 -o test -fast test.f -lacmltest.f:

pgcc -o test -fast test.c -lacml -lpgftnrtl -pgf90libs -lmtest.c:

$> qsub go.sh (./test でもOK)$ q g

• ACML: AMD Core Math LibraryACML: AMD Core Math Library– AMD向けに 適化されたBLAS,LAPACK,FFT提供

– PGIコンパイラ– PGIコンパイラ

– http://www.softek.co.jp/SPG/Pgi/TIPS/acml.html

616-2057/616-4009 86

LAPACKの呼び方:FORTRANCGの替わりにDGESVを呼ぶだけ

!C!C + +!C +---------------+!C | LAPACK Call |!C +---------------+!C===

INC = 1ALLOCATE(PIV(N))

call system_clock(t1)

call DGESV(N,INC,AMAT,N,PIV,RHS,N,INFO)

call system_clock(t2, t_rate, t_max)if ( t2 < t1 ) then

diff = t_max - t1 + t2else

diff = t2 - t1endiftw = dble(diff)/dble(t_rate)

PRINT *, "TIME[sec] =",tw

DFLOPS = 2.0d0/3.0d0*DBLE(N)*DBLE(N)*DBLE(N)DFLOPS 2.0d0/3.0d0 DBLE(N) DBLE(N) DBLE(N)DFLOPS = DFLOPS + 7.0d0/2.0d0*DBLE(N)*DBLE(N)DFLOPS = DFLOPS + 4.0d0/3.0d0*DBLE(N)DFLOPS = DFLOPS / DBLE(TW) / 1.0E6PRINT *, "MFLOPS =",DFLOPS

DEALLOCATE(PIV)DEALLOCATE(AMAT)

616-2057/616-4009 87

計算結果:test.out, test_org.out, _ g

• ソルバー部分の計算時間

• N=103

• FORTRANO i i l 0 141– Original 0.141 sec.

– LAPACK 0.183 sec., 3661.6 MFLOPS(ピークの40%)

• C– Original 0.225 sec.– LAPACK 0.178 sec., 3765.5 MFLOPS(ピークの41%)

616-2057/616-4009 88

ScaLAPACK:並列版係数行列をブロック分割する

12月21日・22日に講習会月 講習会

お試しアカウント付き講習会(2011年度)89

http://www.cc.u-tokyo.ac.jp/publication/kosyu/schedule_kosyu.html

名称名称 期間期間 時期(予定)時期(予定) 内容内容名称名称 期間期間 時期(予定)時期(予定) 内容内容

MPI基礎1日半~2日

2011年6月8・9日2011年9月6・7日2012年3月13・14日

• MPIによる並列プログラミングの基礎に関する講習,実習 並列化の基礎知識• MPIのAPI説明• 行列積の並列化実習• makeを使った分割コンパイルと並列処理2012年3月13・14日 • makeを使った分割コンパイルと並列処理• T2K(東大)による実習

2011年5月19・20日

• MPIを使用した並列アプリケーション開発手法に関する講習,実習 有限体積法によるポアソン方程式ソルバーの概要

• 並列データ構造の考え方MPI応用 1日半 2011年10月下旬(未定)

• 並列データ構造の考え方• 領域分割手法• 並列化手法• T2K(東大)による実習

• OpenMPによるマルチコアプロセッサ向け並列プログラミング 適化手法に

OpenMP(基礎+応用)

1日半~2日

2011年6月30日・7月1日2011年12月上旬(未定)

• OpenMPによるマルチコアプロセッサ向け並列プログラミング, 適化手法に関する,実アプリケーションに基づく講習,実習 有限体積法によるポアソン方程式ソルバー,ICCG法の概要

• OpenMPの基礎• リオーダリングによる並列化, 適化

(東大) る実習• T2K(東大)による実習

ライブラリ利用 2日 2011年12月21・22日2012年 2月21・22日

• 密行列ライブラリBLAS, LAPACK, ScaLAPACK、および、疎行列ライブラリPETsc, Lisの利用法に関する講習,実習 数値解法の原理と特徴の説明

• 数理的モデリング,離散化,データ格納ブ ク デ タ分散 考 方

2012年 2月21 22日 • ブロック化、データ分散の考え方• T2K(東大)による実習