阻塞检查

MPI_PROBE (source,tag,cmm,status)
INsource源进程标识或任意进程标识MPI_ANY_SOURCE(整型)
INtag 特定tag值或任意tag值MPI_ANY_TAG(整型)
INcomm通信域(句柄)
OUT status返回的状态(状态类型)
int MPI_Probe(int source,int tag,MPI_Comm comm,MPI_Status *status)
MPI_PROBE(SOURCE,TAG,COMM,STATUS,IERROR)
INTEGER SOURCE,TAG,COMM,STATUS(MPI_STATUS_SIZE),IERROR

讲解:
MPI_PROBE和MPI_IPROBE相似,只不过它是一个阻塞调用,只有找到一个匹配的消息到达之后它才会返回.

非阻塞检查

MPI_IPROBE(source,tag,comm,flag,status)
INsource源进程标识或任意进程标识MPI_ANY_SOURCE(整型)
INtag 特定tag值或任意tag值MPI_ANY_TAG(整型)
INcomm通信域(句柄)
OUT flag是否有消息到达标志(逻辑)
OUT status返回的状态(状态类型)
int MPI_Iprobe(int source,int tag,MPI_Comm comm,int *flag, MPI_Status *status)
MPI_IPROBE(SOURCE,TAG,COMM,FLAG,STATUS,TERROR)
LOGICAL FLAG
INTEGER SOURCE,TAG,COMM,STATUS(MPI_STATUS_SIZE),IERROR

讲解:
当非阻塞的消息到达检查函数MPI_IPROBE(source,tag,comm,flag,status)被调用时,如果存在一个消息可被接收,并且该消息的消息信封和MPI_IPROBE的消息信封<source, tag, comm>相匹配,则该调用返回flag=true,返回状态status如同在调用了MPI_RECV(..., source, tag,cmm,status)后得到的status一样,即MPI_IPROBE的status和MPI_RECV的status的返回值安全相同。若没有消息到达或到达的消息的消息信封和MPI_IPROBE的消息信封不匹配,则MPI_IPROBE调用立即返回,返回结果flag=false并且不对status定义。
如果MPI_IPROBE返回结果flag=true,则可以从返回的状态status中获取source,tag和检查消息的长度。然后就可以使用相匹配的接收语句接收该消息。
MPI_IPROBE的source参数可以是MPI_ANY_SOURCE,tag参数可以是MPI_ANY_TAG,以便用户可以检查来自不确定的源source以及不确定的标识tag。不过,必须指定一个通信域comm来指明通信的上下文。一个消息被检查后并不一定会被立即接收,同样,一个消息在被接收以前可能会被检查多次。

例子
CALL MPI_COMM_RANK(comm,rank,ierr)
IF (rank .EQ. 0) THEN
CALL MPI_SEND(i,1,MPI_INTEGER,2,0,comm,ierr)
C 进程0向进程2发送一个整型数
ELSE IF (rank.EQ.1) THEN
CALL MPI_SEND(x,1,MPI_REAL,2,0,comm,ierr)
C 进程1向进程2发送一个实型数
ELSE IF (rank .EQ.2 ) THEN
DO i=1,2
CALL MPI_PROBE(MPI_ANY_SOURCE,0, comm,status,ierr)
C 进程2检查消息的到达
IF (status(MPI_SOURCE) = 0) THEN
C 若到达的消息是进程0发送的,则按整型接收
CALL MPI_RECV(i,1,MPI_INTEGER,0,0,status,ierr)
ELSE
C 否则(是进程1发送的)按实型接收
CALL MPI_RECV(x,1,MPI_REAL,1,0,status,ierr)
END IF
END DO
END IF