プロセス間データ通信 齋藤グループ 小林 直樹 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(対角化プログラム) の実行
© Copyright 2025 ExpyDoc