完成单个非阻塞通信
MPI_WAIT(request, status)
INOUTrequest非阻塞通信对象 (句柄)
OUTstatus 返回的状态 (状态类型)
int MPI_Wait(MPI_Request *request, MPI_Status *status)
MPI_WAIT(REQUEST, STATUS, IERROR)
INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR

讲解:
MPI_WAIT以非阻塞通信对象为参数,一直等到与该非阻塞通信对象相应的非阻塞通信完成后才返回,同时释放该阻塞通信对象,因此程序员就不需要再显式释放该对象。与该非阻塞通信完成有关的信息放在返回的状态参数status中。

MPI_TEST(request, flag, status)
INOUTrequest非阻塞通信对象(句柄)
OUTflag 操作是否完成标志(逻辑型)
OUTstatus 返回的状态 (状态类型)
int MPI_Test(MPI_Request*request, int *flag, MPI_Status *status)
MPI_TEST(REQUEST, FLAG, STATUS, IERROR)
LOGICAL FLAG
INTEGER REQUEST, STATUS(MPI_STATUS_SIZE), IERROR

讲解:
与MPI_WAIT类似,MPI_TEST也以非阻塞通信对象为参数,但是它的返回不一定等到与非阻塞通信对象相联系的非阻塞通信的结束。若在调用MPI_TEST时,该非阻塞通信已经结束,则它和MPI_WAIT的效果完全相同,完成标志flag=true;若在调用MPI_TEST时,该非阻塞通信还没有完成,则它和MPI_WAIT不同,它不必等待该非阻塞通信的完成,可以直接返回,但是完成标志flag=false,同时也不释放相应的非阻塞通信对象。

例子
CALL MPI_COMM_RANK(comm, rank, ierr)
IF(rank.EQ.0) THEN
CALL MPI_ISEND(a(1), 10, MPI_REAL, 1, tag, comm, request, ierr)
C 非阻塞标准发送
CALL MPI_WAIT(request, status, ierr)
C 等待该发送的完成
ELSE IF (rank .EQ. 1) THEN
CALL MPI_IRECV(a(1), 15, MPI_REAL, 0, tag, comm, request, ierr)
C 标准非阻塞接收
CALL MPI_WAIT(request, status, ierr)
C 等待该接收操作的完成
END IF


完成多个非阻塞通信
MPI_WAITANY(count, array_of_requests, index, status)
INcount 非阻塞通信对象的个数(整型)
INOUT array_of_requests 非阻塞通信完成对象数组(句柄数组)
OUT index 完成对象对应的句柄索引(整型)
OUT status返回的状态(状态类型)
int MPI_Waitany(int count, MPI_Request *array_of_requests, int *index,
MPI_Status *status)
MPI_WAITANY(COUNT, ARRAY_OF_REQUESTS, INDEX, STATUS, IERROR)
INTEGER COUNT, ARRAY_OF_REQUESTS(*), INDEX,
STATUS(MPI_STATUS_SIZE),IERROR

讲解:
与一次完成一个非阻塞通信的MPI_WAIT相对应,MPI_WAITANY用于等待非阻塞通信对象表中任何一个非阻塞通信对象的完成,释放已完成的非阻塞通信对象,然后返回,MPI_WAITANY返回后index=I,即MPI_WAITANY完成的是非阻塞通信对象表中的第I个对象对应的非阻塞通信,则其效果等价于调用了MPI_WAIT(array_of_requests[I],status)。

MPI_WAITALL( count, array_of_requests, array_of_statuses)
INcount 非阻塞通信对象的个数(整型)
INOUT array_of_requests 非阻塞通信完成对象数组(句柄数组)
OUT array_of_statuses 状态数组(状态数组类型)
int MPI_Waitall(int count, MPI_Request *array_of_requests,
MPI_Status *array_of_statuses)
MPI_WAITALL(COUNT, ARRAY_OF_REQUESTS, ARRAY_OF_STATUSES,
IERROR)
INTEGER COUNT, ARRAY_OF_REQUESTS(*)
INTEGER ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*), IERROR

讲解:
MPI_WAITALL必须等到非阻塞通信对象表中所有的非阻塞通信对象相应的非阻塞操作都完成后才返回,它在效果上等价于
DO I=1,COUNT
MPI_WAIT(array_of_requests[I],status)
END DO
这里的调用是有序的,而实际上是可以以任意次序调用的,不管以什么样的次序,其最终效果应该是一样的。

MPI_WAITSOME(incount,array_of_requests,outcount,array_of_indices,array_of_statuses)
INincount 非阻塞通信对象的个数(整型)
INOUT array_of_requests 非阻塞通信对象数组(句柄数组)
OUT outcount已完成对象的数目(整型)
OUT array_of_indices已完成对象的下标数组(整型数组)
OUT array_of_statuses 已完成对象的状态数组(状态数组)
int MPI_Waitsome(int incount,MPI_Request *array_of_request, int *outcount,
int *array_of_indices, MPI_Status *array_of_statuses)
MPI_WAITSOME(INCOUNT, ARRAY_OF_REQUESTS, OUTCOUNT,
ARRAY_OF_INDICES,ARRAY_OF_STATUSES, IERROR)
INTEGER INCOUNT, ARRAY_OF_REQUESTS(*), OUTCOUNT,
ARRAY_OF_INDICES(*),
ARRAY_OF_STATUSES(MPI_STATUS_SIZE,*), IERROR

讲解:
MPI_WAITSOME介于MPI_WAITANY和MPI_WAITALL之间,只要有一个或多个非阻塞通信完成,则该调用就返回。完成非阻塞通信的对象的个数记录在outcount中,相应的对象在array_of_requests中的下标记录在下表数组array_of_indices中,完成对象的状态记录在状态数组array_of_statuses中。

此外还有MPI_TESTANY, MPI_TESTSOME和MPI_TESTALL,与MPI_WAIT???十分类似,留给读者自学。