Upload
others
View
0
Download
0
Embed Size (px)
Citation preview
LU分解法(3)
東京大学情報基盤センター 准教授 塙 敏博
スパコンプログラミング(1)、(Ⅰ) 1
2016年7月5日(火) 10:25-12:10
2016/7/5
!"
!
#$%& ' ( %$)#(*%#)%$
#$%&+'+(
講義日程(工学部共通科目)
1. 4月19日(今日): ガイダンス2. 4月26日
l 並列数値処理の基本演算(座学)
3. 5月10日:スパコン利用開始l ログイン作業、テストプログラム実行
4. 5月17日l 高性能プログラミング技法の基礎1(階層メモリ、ループアンローリング)
5. 5月24日l 高性能プログラミング技法の基礎2(キャッシュブロック化)
6. 5月31日l 行列-ベクトル積の並列化
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 2
7. 6月7日(8:30-10:15)★大演習室2l べき乗法の並列化
8. 6月7日(10:25-12:10)l 行列-行列積の並列化(1)
9. 6月14日(8:30-10:15)★大演習室2l 行列-行列積の並列化(2)
10. 6月14日(10:25-12:10)l LU分解法(1)l コンテスト課題発表
11. 6月28日l LU分解法(2)
12. 7月5日l LU分解法(3)
13. 7月12日l 新しいスパコンの紹介・お試し、
他
レポートおよびコンテスト課題(締切:
2016年8月8日(月)24時 厳守
LU分解法の演習日程1. 今週
• 講義&並列化の検討
2. 今週• LU分解法並列化実習
3. 今週• LU分解法並列化実習
スパコンプログラミング(1)、(Ⅰ) 32016/7/5
講義の流れ
1. 並列化実習の続き
2. 並列化のヒント(その2)の説明
スパコンプログラミング(1)、(Ⅰ) 42016/7/5
LU分解並列化のヒント(2)C言語版ほぼ解答が載っています
スパコンプログラミング(1)、(Ⅰ) 52016/7/5
LU分解部分(1)• ib = n/numprocs;
istart = myid * ib;iend = (myid+1)* ib;
/* LU decomposition ---------------------- */for (k=0; k<iend; k++) {
idiagPE = k / ib;if (idiagPE == myid) { /* 枢軸列をもつPE */
dtemp = 1.0 / A[k][k];枢軸列の計算と、buf[ ]へ枢軸列をコピー;for (i=myid+1; i<numprocs; i++) { /* 枢軸列の転送 */
MPI_Send(&buf[…], … , MPI_DOUBLE, i, k, MPI_COMM_WORLD);}
istart = k+1; /* 担当範囲の縮小 */} else { /* 枢軸列を持たないPE */
MPI_Recv(&buf[…], …, MPI_DOUBLE, idiagPE, k, MPI_COMM_WORLD, &istatus);
}
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 6
LU分解部分(2)/* 共通消去部分 */
for (j=k+1; j<n; j++) {dtemp = buf[j];for (i=istart; i<iend; i++) {
A[j][i] = A[j][i] - A[k][i]*dtemp;}
}
} /* End of k-loop --------------------------------------- */
/* 前進消去にメッセージがかぶらないように同期 ---------------------------- */MPI_Barrier(MPI_COMM_WORLD);
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 7
前進代入部分(1)• istart = myid * ib; iend = (myid+1) * ib; /* 担当範囲の初期化 */
/* Forward substitution ------------------ */for (k=0; k<n; k++)
c[k] = 0.0; /* cの初期化 */
for (k=0; k<n; k+=ib) { /* 対角ブロック判定用ループ */if (k >= istart) { /* 担当するブロックがある */
idiagPE = k / ib;if (myid != 0) /* 左隣りPEからデータを受け取る */ MPI_Recv(&c[k], ib, MPI_DOUBLE, myid-1, k, MPI_COMM_WORLD,
&istatus);if (myid == idiagPE) { /* 対角ブロックをもつPE*/
/* 対角ブロックだけ先行計算し値を確定させる */ for (kk=0; kk<ib; kk++) {
c[k+kk] = b[k+kk] + c[k+kk];/* 途中結果が送られてくるため必要な変更点*/for (j=istart; j<istart+kk; j++)
c[k+kk] -= A[k+kk][ j ] * c[j];}
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 8
前進代入部分(2)} else { /* 対角ブロックを持たないPE */
/* 自分の所有範囲のデータのみ計算(まだ最終結果ではない) */for (kk=0; kk<ib; kk++)
for (j=istart; j<iend; j++)c[k+kk] -= A[k+kk][j]*c[j];
/* 右隣のPEに、自分の担当範囲のデータを用いた演算結果を送る */ if (myid != numprocs-1)
MPI_Send(&c[k], ib, MPI_DOUBLE, myid+1, k, MPI_COMM_WORLD);
}
} /* End of if(担当するブロックがある) --------------------------------- */} /* End of k-loop --------------------------------------------------- */
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 9
LU分解並列化のヒント(2)FORTRAN言語版ほぼ解答が載っています
スパコンプログラミング(1)、(Ⅰ) 102016/7/5
LU分解部分(1)• ib = n/numprocs
istart = myid * ib + 1iend = (myid+1)* ib
c --- LU decomposition ----------------------do k=1, iend
idiagPE = (k-1) / ibc ---枢軸列をもつPE
if (idiagPE .eq. myid) thendtemp = 1.0 / A(k, k)枢軸列の計算
c ---枢軸列の転送do i=myid+1, numprocs – 1
call MPI_Send(A(k,k)), … , MPI_DOUBLE_PRECISION, i, k, MPI_COMM_WORLD, ierr )
enddoc --- 担当範囲の縮小
istart = k + 1else
c ---枢軸列を持たないPEcall MPI_Recv(A(k,k)), …, MPI_DOUBLE_PRECISION idiagPE, k, MPI_COMM_WORLD,
istatus, ierr)endif
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 11
LU分解部分(2)c --- 共通消去部分
do j=istart, ienddtemp = A( k, j )do i=k+1, n
A(i , j) = A(i , j) – A(i , k) * dtempenddo
enddo
enddoc --- End of k-loop ---------------------------------------
c --- 前進消去にメッセージがかぶらないように同期 -----------------------------call MPI_Barrier(MPI_COMM_WORLD, ierr)
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 12
前進代入部分(1)c ---担当範囲の初期化
istart = myid * ib + 1iend = (myid+1) * ib
c --- Forward substitution ------------------c --- c の初期化
do k=1, nc[k] = 0.0 enddo
c ---対角ブロック判定用ループdo k=1, n, ib
if (k .le. istart) then idiagPE = (k-1) / ib
c --- 担当するブロックがあるif (myid .ne. 0) then
c ---左隣りPEからデータを受け取るcall MPI_Recv(c(k), ib,
& MPI_DOUBLE_PRECISION, & myid-1, k, MPI_COMM_WORLD, & istatus, ierr)
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 13
if (myid .eq. idiagPE) thenc ---対角ブロックをもつPE
do kk=1, ibc ---途中結果が送られてくるため必要な変更点
c(k+kk-1) = b(k+kk-1) + c(k+kk-1) c ---対角ブロックだけ先行計算し値を確定させる
do j=istart, istart+kk-2c(k+kk-1) = c(k+kk-1) - A(k+kk-1, j ) * c( j )
enddoenddo
前進代入部分(2)else
c ---対角ブロックを持たないPEdo kk=1, ib
do j=istart, iend-1c(k+kk-1) = c(k+kk-1) –A(k+kk-1, j ) * c( j )
enddoenddo
c ---自分の所有範囲のデータのみ計算(まだ最終結果ではない)if (myid .ne. numprocs-1) then
c ---右隣のPEに、自分の担当範囲のデータを用いた演算結果を送るcall MPI_Send(c(k), ib, MPI_DOUBLE_PRECISION, myid+1,
& k, MPI_COMM_WORLD, ierr)endif
endifendif
c --- End of if 担当するブロックがある ---------------------------------------enddoc --- End of k-loop --------------------------------------------------------------------
2016/7/5 スパコンプログラミング(1)、(Ⅰ) 14
おわり
お疲れ様でした
スパコンプログラミング(1)、(Ⅰ) 152016/7/5
%, - %. / 0#, - #&
!
"# $ !%!
-, ( %'!
(, ( #-! #
&, ( 1%! *
#$%&+'+( &
', & ' /2)1$*%$)%(0#
!
2, & ' /%$)#(*%#)%$0! *
., & %- /2)1$*%$)%(0#
!
%$, & %- /%$)#(*%#)%$0!
!
%%, & #2!
%#, (!
%1, ' %#!
&%!' ( ( &)
!"%,
3
#,3 !"
1,3 !"
"#$%&+'+(
%,#,
)#$%&+'+(
!"4
$#$%&+'+(
!" /%03 56 789+9:;<=>?@A5@BC=B 78;D5E F856A5G9E 78/;D5EH 0F856A
+F8!"8EG?>;<>@5B5>98********************** F+I>=8/J7$A8 8JK5G9EA88JHH08L5E5CMNO 78J8+856A5I8/5E5CMNO 778;D5E088L88+F8 NO8F+
EBG;< 78%,$8+8PQJRQJRA6:IQ R
I>=8/57;D5EH A8885K9:;<=>?@A8885HH088L88+F8 F+SNTUVG9E/W6:IQXRY8 8X8Y88SNTUZ["\!OY885Y88JY88SNTU4[SSU][^!Z0A_85@BC=B 78JH A +F8 F+_8G`@G8L888+F8 NO8F+SNTU^G?a/W6:IQXRY8 8XY88SNTUZ["\!OY885E5CMNOY88JY8SNTU4[SSU][^!ZY88
W5@BCB:@0A_
#$%&+'+( '
!" /#0+F88 F+I>=8/b7JH A8 8bK9A88bHH08LEBG;< 786:IQbRAI>=8/575@BC=BA8 85K5G9EA885HH08LPQbRQ5R878PQbRQ5R8* PQJRQ5RFEBG;<A
_8_
_8+F8O9E8>I8J*`>><8*************************************** F+
+F88 **************************** F+SNTU\C==5G=/SNTU4[SSU][^!Z0A
#$%&+'+( *
/%03 5@BC=B 78;D5E F856A 5G9E 78/;D5EH 08F856A8888+F8 F++F8c>=dC=E8@:6@B5B:B5>98****************** F+I>=8/J7$A8 JK9A88JHH08?QJR878$,$A888+F8? F+8
I>=8/J7$A88JK9A88JH756088L8 +F8 F+5I8/J8e785@BC=B088L888+F8 F+5E5CMNO 78J8+856A5I8/;D5E f78$08+F NO F+8SNTU^G?a/W?QJRY856Y8SNTUZ["\!OY8;D5E* Y8JY8SNTU4[SSU][^!ZY8
W5@BCB:@0A5I8/;D5E 7785E5CMNO088L +F8 NOF++F88 F+8I>=8/JJ7$A88JJK56A88JJHH08L?QJHJJR8786QJHJJR8H8?QJHJJRA+F8 F+I>=8/b75@BC=BA888bK5@BC=BHJJA888bHH0?QJHJJR8*788PQJHJJRQ8b8R8F8?QbRA
_
#$%&+'+( (
/#0_8G`@G8L +F8 NO8 F+
+F88 F+I>=8/JJ7$A88JJK56A88JJHH0I>=8/b75@BC=BA888bK5G9EA888bHH0?QJHJJR8*78PQJHJJRQbRF?QbRA
+F8 NO F+85I8/;D5E f789:;<=>?@* 0SNTUVG9E/W?QJRY856Y8SNTUZ["\!OY8;D5EH Y8JY8
SNTU4[SSU][^!Z0A_
_8 +F8O9E8>I85I/ 08********************************* F+_8 +F8O9E8>I8J*`>><8*************************************************** F+
#$%&+'+( +
!"c[^g^Ph
!%#$%&+'+(
!" /%03 56 789+9:;<=>?@
5@BC=B 78;D5E F856 H85G9E 78/;D5EH 0F856
?8888888*** !"8EG?>;<>@5B5>98**********************E>8J7 Y885G9E5E5CMNO 78/J* 08+856
?8888888888*** NO85I8/5E5CMNO ,Gi,88;D5E08BjG9
EBG;< 78%,$8+8P/JY8J0
?88888888888888***E>857;D5EH Y889:;<=>?@ k?C``8SNTUVG9E/P/JYJ00Y88X8Y88SNTUZ["\!OUN^O4TVT[hY8885Y88JY88SNTU4[SSU][^!ZY88
5G== 0G9EE>
?8888888888888***5@BC=B 78J8H8G`@G8
?88888888888*** NO?C``8SNTU^G?a/P/JYJ00Y88XY88SNTUZ["\!OUN^O4TVT[h885E5CMNOY88JY88SNTU4[SSU][^!ZY88
5@BCB:@Y85G==0G9E5I
#$%&+'+( !!
!" /#0?88888888888***
E>8b75@BC=BY8 85G9EEBG;< 78P/8JY8b80E>857JH Y89P/5 Y8b0878P/5 Y8b08k P/5 Y8J08F8EBG;<
G9EE>G9EE>
G9EE>?8888888888*** O9E8>I8J*`>><8***************************************
?8888888888*** *****************************?C``8SNTU\C==5G=/SNTU4[SSU][^!ZY885G==0
#$%&+'+( !&
/%0?8888***5@BC=B 78;D5E F856 H85G9E 78/;D5EH 08F856
?8888*** c>=dC=E8@:6@B5B:B5>98******************?8888*** ?8E>8J7 Y8 89?QJR878$,$ G9EE>
?888***E>8J7 Y8 89Y88565I8/J8,`G,885@BC=B08 BjG985E5CMNO 78/J* 08+856
?88888888***5I8/;D5E ,9G,8$08BjG9
?888888888888*** NO?C``8SNTU^G?a/?/J0Y8 56Y8
W888888888888SNTUZ["\!OUN^O4TVT[hY8W888888888888;D5E* Y8JY8SNTU4[SSU][^!ZY8W8888888888885@BCB:@Y85G==0
#$%&+'+( !"
5I8/;D5E ,Gi,885E5CMNO088BjG9?8888888888888*** NO
E>8JJ7 Y8 856?888888888888888***
?/JHJJ* 08786/JHJJ* 08H8?/JHJJ* 08?888888888888888***
E>8b75@BC=BY8 5@BC=BHJJ*#?/JHJJ* 0878?/JHJJ* 08* P/JHJJ* Y8 8b808F8?/8b80
G9EE>G9EE>
/#0G`@G8
?8888888888*** NOE>8JJ7 Y8856E>8b75@BC=BY885G9E*?/JHJJ* 08788?/JHJJ* 08kP/JHJJ* Y88b808F8?/8b80
G9EE>G9EE>
?8888888888***5I8/;D5E ,9G,889:;<=>?@* 08 BjG9
?88888888888888*** NO?C``8SNTUVG9E/?/J0Y856Y8SNTUZ["\!OUN^O4TVT[hY88;D5EH Y8
W8888888888888888888JY8SNTU4[SSU][^!ZY8 85G==0G9E5I
G9E5IG9E5I
?88888*** O9E8>I85I8 ***************************************G9EE>?88*** O9E8>I8J*`>><8********************************************************************
#$%&+'+( !)
!$#$%&+'+(