View
0
Download
0
Category
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
j
( )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(東大)による実習
Recommended