スライド 1

Message Passing Subroutine
齋藤グループ
小林直樹
1対1通信
ブロッキング通信
• MPI_SEND
• MPI_RECV
ノンブロッキング通信
• MPI_ISEND
• MPI_IRECV
• MPI_WATE
ブロッキング通信
受信側
送信側
1. 送信データ a を用意
2. mpi_send(a, ・・・)
待ち
1. mpi_recv(a, ・・・)
システム
(ドライバ)
システム
(ドライバ)
待ち
3. 送信完了
2. 受信完了
4. 次の処理へ
3. 次の処理へ
MPI_SEND
SUBROUTINE MPI_SEND(BUF, COUNT, DATATYPE,
ROOT, TAG,COMM, IERROR)
引数
BUF
COUNT
DATATYPE
ROOT
TAG
COMM
IERROR
送信する変数,配列名の先頭アドレス
送信するデータの数
送信するデータの型
受信プロセスのランク
メッセージ識別番号
コミュニケータ(通信グループの識別子)
戻り値(エラーコード)
MPI_RECV
SUBROUTINE MPI_RECV(BUF, COUNT, DATATYPE,
ROOT, TAG,COMM, STATUS, IERROR)
引数
BUF
COUNT
DATATYPE
ROOT
TAG
COMM
STATUS
IERROR
受信する変数,配列名の先頭アドレス
受信するデータの数
受信するデータの型
送信プロセスのランク
メッセージ識別番号
コミュニケータ(通信グループの識別子)
送信プロセスの情報
戻り値(エラーコード)
ノンブロッキング通信
送信側
受信側
1. 送信データ a を用意
1. mpi_irecv(a,・,ireq,・)
2. mpi_isend(a,・, ireq,・)
2. 次の処理
3. 次の処理
(受信完了を待たなくても
進めることが可能な処理)
(受信完了を待たなくても
進めることが可能な処理)
4. mpi_wait(ireq,・・・)
待ち
5. 送信完了
6. 次の処理へ
システム
(ドライバ)
システム
(ドライバ)
3. mpi_wait(ireq,・・・)
待ち
4. 受信完了
5. 次の処理へ
MPI_ISEND
SUBROUTINE MPI_ISEND(BUF, COUNT, DATATYPE,
ROOT, TAG,COMM, REQUEST, IERROR)
引数
BUF
COUNT
DATATYPE
ROOT
TAG
COMM
REQUEST
IERROR
送信する変数,配列名の先頭アドレス
送信するデータの数
送信するデータの型
受信プロセスのランク
メッセージ識別番号
コミュニケータ(通信グループの識別子)
通信識別番号
戻り値(エラーコード)
MPI_IRECV
SUBROUTINE MPI_IRECV(BUF, COUNT, DATATYPE,
ROOT, TAG,COMM, STATUS, IERROR)
引数
BUF
COUNT
DATATYPE
ROOT
TAG
COMM
REQUEST
IERROR
受信する変数,配列名の先頭アドレス
受信するデータの数
受信するデータの型
送信プロセスのランク
メッセージ識別番号
コミュニケータ(通信グループの識別子)
通信識別番号
戻り値(エラーコード)
MPI_WAIT
SUBROUTINE MPI_WAIT(REQUEST, STATUS, IERROR)
引数
REQUEST
STATUS
IERROR
通信識別番号
送信プロセスの情報
戻り値(エラーコード)
集団通信
• MPI_BCAST
• MPI_SCATTER
• MPI_GATHER
• MPI_ALLGATHER
• MPI_ALLTOALL
• MPI_REDUCE
• MPI_ALLREDUCE
• MPI_BARRIER
MPI_BCAST
SUBROUTINE MPI_BCAST(BUF, COUNT, DATATYPE,
引数
BUF
COUNT
DATATYPE
ROOT
COMM
IERROR
ROOT,COMM, IERROR)
送信する変数,配列名の先頭アドレス
送信するデータの数
送信するデータの型
送信プロセスのランク
コミュニケータ(通信グループの識別子)
戻り値(エラーコード)
プロセス 0
1
2
3
A
A
A
A
A
MPI_SCATTER
SUBROUTINE MPI_SCATTER(SENDBUF, SENDCOUNT,
SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE,
引数
ROOT, COMM, IERROR)
SENDBUF
送信する変数,配列名の先頭アドレス
SENDCOUNT 送信するデータの数
SENDTYPE 送信するデータの型
RECVBUF
受信する変数,配列名の先頭アドレス
RECVCOUNT 受信するデータの数
RECVTYPE 受信するデータの型
ROOT
送信プロセスのランク
COMM
コミュニケータ
プロセス0 X1 X2 X3 X4
IERROR
戻り値
X1
プロセス1
X2
プロセス2
X3
プロセス3
X4
MPI_GATHER
SUBROUTINE MPI_GATHER(SENDBUF, SENDCOUNT,
SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE,
引数
ROOT, COMM, IERROR)
SENDBUF
送信する変数,配列名の先頭アドレス
SENDCOUNT 送信するデータの数
SENDTYPE 送信するデータの型
RECVBUF
受信する変数,配列名の先頭アドレス
RECVCOUNT 受信するデータの数
RECVTYPE 受信するデータの型
ROOT
受信プロセスのランク
COMM
コミュニケータ
プロセス0 X1
IERROR
戻り値
プロセス1 X
2
プロセス2
X3
プロセス3
X4
X1 X2 X3 X4
MPI_ALLGATHER
SUBROUTINE MPI_ALLGATHER(SENDBUF, SENDCOUNT,
SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE,
引数
, COMM, IERROR)
SENDBUF
送信する変数,配列名の先頭アドレス
SENDCOUNT 送信するデータの数
SENDTYPE 送信するデータの型
RECVBUF
受信する変数,配列名の先頭アドレス
RECVCOUNT 受信するデータの数
RECVTYPE
受信するデータの型
COMM
コミュニケータ
IERROR
戻り値
プロセス0 X1
X1 X2 X3 X4
プロセス1
X2
X1 X2 X3 X4
プロセス2
X3
X1 X2 X3 X4
プロセス3
X4
X1 X2 X3 X4
MPI_ALLTOALL
SUBROUTINE MPI_ALLTOALL(SENDBUF, SENDCOUNT,
SENDTYPE, RECVBUF, RECVCOUNT,RECVTYPE,
引数
, COMM, IERROR)
SENDBUF
送信する変数,配列名の先頭アドレス
SENDCOUNT 送信するデータの数
SENDTYPE 送信するデータの型
RECVBUF
受信する変数,配列名の先頭アドレス
RECVCOUNT 受信するデータの数
RECVTYPE 受信するデータの型
COMM
コミュニケータ
IERROR
戻り値
プロセス0 A1 A2 A3 A4
A1 B1 C
D2
プロセス1
B1 B2 B3 B4
A2 B2 1C
D2
プロセス2
C1 C2 C3 C4
A3 B3 2C
D3
プロセス3
D1 D2 D3 D4
A4 B4 3C
D4
4
MPI_REDUCE
SUBROUTINE MPI_REDUCE(SENDBUF,RECVBUF,COUNT
,DATATYPE,OP,ROOT,COMM,IERROR)
引数
SENDBUF
RECVBUF
COUNT
DATATYPE
OP
ROOT
COMM
IERROR
送信する変数、配列名の先頭アドレス
受信する変数、配列名の先頭アドレス
送信するデータの数
送信するデータの型
演算
受信元のプロセスのランク
コミュニケータ(通信グループの識別子)
戻り値(エラーコード)
プロセス0
1
プロセス1
2
プロセス2
3
プロセス3
4
10
MPI_ALLREDUCE
SUBROUTINE MPI_REDUCE(SENDBUF, RECVBUF, COUNT,
DATATYPE, OP, COMM, IERROR)
引数
SENDBUF
RECVBUF
COUNT
DATATYPE
OP
COMM
IERROR
送信する変数、配列名の先頭アドレス
受信する変数、配列名の先頭アドレス
送信するデータの数
送信するデータの型
演算
コミュニケータ(通信グループの識別子)
戻り値(エラーコード)
プロセス0
1
10
プロセス1
2
10
プロセス2
3
10
プロセス3
4
10
MPI_BARRIER
SUBROUTINE MPI_BARRIER(COMM, IERROR)
引数
COMM
IERROR
コミュニケータ(通信グループの識別子)
戻り値(エラーコード)
プロセス 0
t
1
処理
A0
処理
A1
処理
B0
処理
B1
2
処理
A2
処理
B2
mpi_barrier