MPI を使った加算
齋藤グループ 小林直樹
2003.5.16
プロセス
0プロセス
1プロセス
2プロセス
3配列 A
2500 2501 5000 5001 7500 7501 10000
1
部分和
SUM部分和
SUM部分和
SUM部分和
SUM総和
GSUM概念図
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)
MPI プログラム (1 / 3)
mpif.h
:
MPIで利用する定数などの型宣言がなされている定義ファイル
MPI_INIT
:
MPI環境の初期化
MPI_COMM_RANK
: プロセス情報取得
MPI_COMM_SIZE
: プロセス数情報取得する
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
MPI プログラム (2 / 3)
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
tnode=4
myrank=0,1,2,3 tnode=4
myrank=0,1,2,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 プログラム (3 / 3)
各プロセスで実行
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 戻り値(エラーコード)
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)
OP の値 意味
MIP_MAX 最大値 MIP_MIN 最小値 MIP_SUM 和 MIP_PROD 積 MIP_LAND 論理積
MIP_BAND ビット演算の 積
MIP_LOR 論理和
MIP_BOR ビット演算の 和
MIP_LXOR 排他的論理和 MIP_BXOR ビット演算の
排他的論理和 MIP_MAXLOC 最大値と位置
実行結果
[kobayasi@tube sum]# mpirun -np 1 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 2 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 3 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 4 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 5 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 6 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 7 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 8 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 9 ./a.out 5.000500E+07
[kobayasi@tube sum]# mpirun -np 10 ./a.out 5.000500E+07