MPIを使った加算 齋藤グループ 小林直樹 2003.5.16
概念図 配列A プロセス0 プロセス1 プロセス2 プロセス3 2500 2501 5000 5001 7500 7501 10000 1 部分和SUM 総和GSUM
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) tnode=4 myrank=0,1,2,3 DO 10 I = 1, 10000 A(I) = real(I) 10 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 myrank=0 is=0x2500+0+1=1 ie=1+2500-1=2500 myrank=1 is=1x2500+0+1=2501 ie=2501+2500-1=5000 myrank=2 is=5001, ie=7500 myrank=3 is=7501, ie=10000
MPIプログラム (3/3) 各プロセスで実行 SUM = 0.0 DO 20 I = is, ie SUM = SUM + A(I) 20 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環境を終了する
MPI_REDUCE SUBROUTINE MPI_REDUCE(SENDBUF,RECVBUF,COUNT ,DATATYPE,OP,ROOT,COMM,IERROR) SENDBUF 送信する変数、配列名の先頭アドレス RECVBUF 受信する変数、配列名の先頭アドレス COUNT 送信するデータの数 DATATYPE 送信するデータの型 OP 演算 ROOT 受信元のプロセスのランク COMM コミュニケータ(通信グループの識別子) IERROR 戻り値(エラーコード) OPの値 意味 MIP_MAX 最大値 MIP_MIN 最小値 MIP_SUM 和 MIP_PROD 積 MIP_LAND 論理積 MIP_BAND ビット演算の積 MIP_LOR 論理和 MIP_BOR ビット演算の和 MIP_LXOR 排他的論理和 MIP_BXOR ビット演算の MIP_MAXLOC 最大値と位置 MIP_MINLOC 最小値と位置 MPI DATATYPE Fortran DATATYPE MPI_INTEGER INTEGER MPI_REAL REAL MPI_DOUBLE_PRECISION DOUBLE PRECISION MPI_COMPLEX COMPLEX MPI_LOGICAL LOGICAL MPI_CHARACTER CHARACTER(1)
実行結果 [kobayasi@tube sum]# mpirun -np 1 ./a.out 5.000500E+07