スライド 1

MPIを使った加算
齋藤グループ
小林直樹
2003.5.16
概念図
1
配列A
2500
2501
5000 5001
7500 7501
10000
プロセス0
プロセス1
プロセス2
プロセス3
部分和SUM
部分和SUM
部分和SUM
部分和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)
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=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)
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環境を終了する
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
意味
OPの値
MIP_MAX
最大値
MIP_MIN
最小値
MIP_SUM
和
MIP_PROD
積
MIP_LAND
論理積
MIP_BAND
ビット演算の積
MPI_INTEGER
INTEGER
MIP_LOR
論理和
MPI_REAL
REAL
MIP_BOR
ビット演算の和
MPI_DOUBLE_PRECISION
DOUBLE PRECISION
MIP_LXOR
排他的論理和
MPI_COMPLEX
COMPLEX
MIP_BXOR
ビット演算の
排他的論理和
MPI_LOGICAL
LOGICAL
最大値と位置
MPI_CHARACTER
CHARACTER(1)
MIP_MAXLOC
MIP_MINLOC
最小値と位置
実行結果
[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