4. 1対1通信

MPI_Send / MPI_Recv / MPI_Isend / MPI_Irecv / MPI_Wait

MPI_Send - 送信(ブロッキング通信)

      call MPI_Send(buffer, count, datatype, dest,
     &              tag, comm, ierror)

引数        データ型          入力or出力  内容
------------------------------------------------------------
buffer      任意              入力        送信するデータ(の先頭アドレス)
count       整数              入力        データの個数
datatype    MPIデータ型       入力        データ型
dest        整数              入力        送信先プロセスのランク
tag         整数              入力        タグ(メッセージ識別番号)
comm        MPIコミュニケータ 入力        コミュニケータ
ierror      整数              出力        エラーコード

bufferの位置からcount個のメッセージに、識別番号tagをつけて、destプロセスへ送信する。送信するプロセスのみが、このMPI_Sendをコールする。受信するプロセスは、MPI_Recvをコールする。MPI_Sendはブロッキング通信であるため、一度コールすると、送受信が正常に完了するまで次の作業には進めない。

例1:
全プロセスのxの値をプロセス0に送信して、その総和を求めたいときは次のようにすればよい。なお、これはMPI_Reduceと同じ操作である(MPI_Reduceの方が高速)。MPI_Recvの項も参照。

      allocate(ista(MPI_STATUS_SIZE))
      call MPI_Comm_rank(MPI_COMM_WORLD, myrank, ierr)
      call MPI_Comm_size(MPI_COMM_SIZE, n, ierr)
      if(myrank.ne.0) then
         MPI_Send(x, 1, MPI_REAL8, 0, myrank, MPI_COMM_WORLD, ierr)
      else
         ans=x
         do i=1,n-1
            MPI_Recv(x, 1, MPI_REAL8, i, i, MPI_COMM_WORLD, ista, ierr)
            ans=ans+x
         enddo
         write(*,*) ans
      endif

戻る

MPI_Recv - 受信(ブロッキング通信)

      call MPI_Recv(buffer, count, datatype, source,
     &              tag, comm, status, ierror)

引数        データ型          入力or出力  内容
------------------------------------------------------------
buffer      任意              出力        受信するデータ(の先頭アドレス)
count       整数              入力        データの個数
datatype    MPIデータ型       入力        データ型
source      整数              入力        送信元プロセスのランク
tag         整数              入力        タグ(メッセージ識別番号)
comm        MPIコミュニケータ 入力        コミュニケータ
status      整数(配列)      出力        送信プロセスの情報
ierror      整数              出力        エラーコード

sourceプロセスから送られてきた、識別番号tag、count個のメッセージをbufferに受信する。そのメッセージを受信するプロセスのみが、このMPI_Recvをコールする。送信するプロセスは、MPI_Sendをコールする。識別番号tagは、送信時に指定されたものと同じ値でなければ受信できない。statusは、長さがMPI_STATUS_SIZEの配列をあらかじめ用意しておけばよい。MPI_Recvはブロッキング通信であるため、一度コールすると、送受信が正常に完了するまで次の作業には進めない。

例1:
MPI_Sendの項で示した例を参照。

戻る

MPI_Isend - 送信(ノンブロッキング通信)

      call MPI_Isend(buffer, count, datatype, dest,
     &               tag, comm, request, ierror)

引数        データ型          入力or出力  内容
------------------------------------------------------------
buffer      任意              入力        送信するデータ(の先頭アドレス)
count       整数              入力        データの個数
datatype    MPIデータ型       入力        データ型
dest        整数              入力        送信先プロセスのランク
tag         整数              入力        タグ(メッセージ識別番号)
comm        MPIコミュニケータ 入力        コミュニケータ
request     整数              出力        通信リクエスト
ierror      整数              出力        エラーコード

基本的な動作はMPI_Sendと同じである。MPI_Sendと違う点は、MPI_Isendはノンブロッキング通信であるため、送受信が完了しなくても、送受信とは関係のない別の作業を再開できるという点である。ただし、送受信を完了するには、完了したい時点で、MPI_Waitをコールしなければならない。MPI_IrecvMPI_Waitの項も参照。

例1:
MPI_Isendをコールし、送信が完了しなくても、送信と関係ない作業を続けることができるが、MPI_Waitをコールしないと、送信は完了しない。

      call MPI_Isend(x, 1, MPI_REAL8, 0, 0,
     &               MPI_COMM_WORLD, ireq, ierr)

C ★この間、送信とは関係のない作業ができる。

      call MPI_Wait(ireq, ista, ierr)

C ★MPI_Waitをコールすると、送信完了待ち状態となり、
C ★正常に送信できれば、この時点で送信が完了。

戻る

MPI_Irecv - 受信(ノンブロッキング通信)

      call MPI_Irecv(buffer, count, datatype, source,
     &               tag, comm, request, ierror)

引数        データ型          入力or出力  内容
------------------------------------------------------------
buffer      任意              出力        受信するデータ(の先頭アドレス)
count       整数              入力        データの個数
datatype    MPIデータ型       入力        データ型
source      整数              入力        送信元プロセスのランク
tag         整数              入力        タグ(メッセージ識別番号)
comm        MPIコミュニケータ 入力        コミュニケータ
request     整数              出力        通信リクエスト
ierror      整数              出力        エラーコード

基本的な動作はMPI_Recvと同じである。MPI_Recvと違う点は、MPI_Irecvはノンブロッキング通信であるため、送受信が完了しなくても、送受信とは関係のない別の作業を再開できるという点である。ただし、送受信を完了するには、完了したい時点で、MPI_Waitをコールしなければならない。MPI_IsendMPI_Waitの項も参照。

例1:
MPI_Irecvをコールし、受信が完了しなくても、受信と関係ない作業を続けることができるが、MPI_Waitをコールしないと、受信は完了しない。

      call MPI_Irecv(x, 1, MPI_REAL8, 0, 0,
     &               MPI_COMM_WORLD, ireq, ierr)

C ★この間、受信とは関係のない作業ができる。

      call MPI_Wait(ireq, ista, ierr)

C ★MPI_Waitをコールすると、受信完了待ち状態となり、
C ★正常に受信できれば、この時点で受信が完了。

戻る

MPI_Wait - 確認(ノンブロッキング通信)

      call MPI_Wait(request, status, ierror)

引数        データ型          入力or出力  内容
------------------------------------------------------------
request     整数              出力        通信リクエスト
status      整数(配列)      出力        送信プロセスの情報
ierror      整数              出力        エラーコード

ノンブロッキング通信であるMPI_IsendMPI_Irecvを用いた後に使用する。MPI_Waitをコールすると、送受信を完了するまでプロセスは待機状態となる。また、MPI_Waitをコールしないと、送受信は完了できない。requestには、確認したいMPI_IsendやMPI_Irecvをコールしたときに受け取ったrequestと同じ値を指定する。MPI_IsendMPI_Irecvの項も参照。

例1:
MPI_IsendMPI_Irecvの項で示した例を参照。

戻る