1 A 2500 2501 5000 5001 7500 7501

  • Slides: 7
Download presentation

概念図 1 配列A 2500 2501 5000 5001 7500 7501 10000 プロセス 1 プロセス 2

概念図 1 配列A 2500 2501 5000 5001 7500 7501 10000 プロセス 1 プロセス 2 プロセス 3 部分和SUM 総和GSUM

MPIプログラム (1/3) program summation include ‘mpif. h’ integer myrank, tnode, error DIMENSION A(10000) call mpi_init(error)

MPIプログラム (1/3) program summation include ‘mpif. h’ integer myrank, tnode, error DIMENSION A(10000) call mpi_init(error) call mpi_comm_rank(MPI_COMM_WORLD, myrank, error) call mpi_comm_size(MPI_COMM_WORLD, tnode, error) mpif. h : MPIで利用する定数などの型宣言がなされている定義ファイル MPI_INIT : MPI環境の初期化 MPI_COMM_RANK : プロセス情報取得 MPI_COMM_SIZE : プロセス数情報取得する 

MPIプログラム (2/3) 10 DO 10 I = 1, 10000 A(I) = real(I) CONTINUE lb =

MPIプログラム (2/3) 10 DO 10 I = 1, 10000 A(I) = real(I) CONTINUE lb = 10000 / tnode lc = mod(10000, tnode) if(myrank+1. le. lc) then is = myrank*lb +myrank +1 ie = is + lb else is = myrank*lb+lc+1 ie = is + lb - 1 end if tnode=4 myrank=0, 1, 2, 3 myrank=0 is=0 x 2500+0+1=1 ie=1+2500 -1=2500 myrank=1 is=1 x 2500+0+1=2501 ie=2501+2500 -1=5000 myrank=2 is=5001, ie=7500 myrank=3 is=7501, ie=10000

MPIプログラム (3/3) 20 SUM = 0. 0 DO 20 I = is, ie SUM =

MPIプログラム (3/3) 20 SUM = 0. 0 DO 20 I = is, ie SUM = SUM + A(I) CONTINUE 各プロセスで実行 If( myrank. eq. 0) GSUM = 0 call MPI_REDUCE(SUM, GSUM, 1, MPI_REAL, MPI_SUM, 0, & MPI_COMM_WORLD, error) If( myrank. eq. 0) write(*, *) GSUM call mpi_finalize(error) stop end MPI_REDUCE : 総和、最大値、最小値などを求める MPI_FINALIZE : MPI環境を終了する 

実行結果 [kobayasi@tube sum]# mpirun -np 1. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun

実行結果 [kobayasi@tube sum]# mpirun -np 1. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 2. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 3. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 4. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 5. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 6. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 7. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 8. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 9. /a. out 5. 000500 E+07 [kobayasi@tube sum]# mpirun -np 10. /a. out 5. 000500 E+07