スライド 1

プロセス間データ通信
齋藤グループ
小林 直樹
2003.6.6
前回の問題点
問題点
各プロセスでの計算
結果が同じファイルに出力
1/8しか結果を得られず
MPIを使って8プロセスで計算した結果
解決策
各プロセスでの計算
rootプロセスに結果を集める
rootプロセスでファイルに出力
MPIを使わずに計算した結果
集積方法①
-MPI_REDUCE-
プロセス0
プロセス1
プロセス2
プロセス3
e11
0
0
0
0
e12
0
0
0
0
e13
0
0
0
0
e14
e21
0
0
0
0
e22
0
0
0
0
e23
0
0
0
0
e24
e31
0
0
0
0
e32
0
0
0
0
e33
0
0
0
0
e34
e41
0
0
0
0
e42
0
0
0
0
e43
0
0
0
0
e44
加算
e11 e12 e13 e14
e21 e22 e23 e24
e31 e32 e33 e34
e41 e42 e43 e44
call mpi_reduce(e(1,1),a(1,1),16,mpi_integer,
& mpi_sum,0,mpi_comm_world,ierr)
集積結果①
(120×100行列)×8 の加算
call mpi_reduce(eee(1,1), eee1(1,1), (nk*3)*nj,
& mpi_double_precision, mpi_sum, 0, mpi_comm_world, error)
アームチェアナノチューブ(10,10)
nk = 40, nj = 100
集積方法②
プロセス0
-MPI_GATHER-
プロセス1
プロセス2
プロセス3
e11
e12
e13
e14
e21
e22
e23
e24
e31
e32
e33
e34
e41
e42
e43
e44
送信側の引数
e11 e12 e13 e14
e21 e22 e23 e24
e31 e32 e33 e34
e41 e42 e43 e44
call mpi_gather(e(1,is),4,mpi_integer,
& e(1,1),4,mpi_integer,0,mpi_comm_world,ierr)
受信側の引数
MPI_GATHER の注意点
プログラムの抜粋
do 10 i = is, ie
a(i) = i **2
10 continue
c
if(myrank+1 .le. lc) then
call mpi_gather(a(is), lb+1, mpi_integer,
&
a(is), lb+1, MPI_INTEGER, 0, mpi_comm_world, ierr)
else
call mpi_gather(a(is), lb,MPI_INTEGER,
&
a(is), lb,mpi_integer, 0, mpi_comm_world, ierr)
end if
結果
a( 1) =
1
a( 2) =
4
a( 3) =
9
a( 4) = 16
a( 5) = 25
a( 6) = 36
a( 7) = 49
a( 8) =
0
a( 9) = 64
a(10) = 81
a(11) = 100
a(12) = 0
各プロセスから同じ個数の値をとらなければならない
集積結果②
メッセージパッシング
call mpi_gather(eee(1,is), (nk*3)*nj/tnode, mpi_double_precision,
& eee(1,1), (nk*3)*nj/tnode, mpi_double_precision, 0,
& mpi_comm_world, error)
アームチェアナノチューブ(10,10)
nk = 40, nj = 96
今後の予定
• abc-lib(対角化プログラム) の実行