3.7.4 非阻塞通信的语义 BACKWARDFORWARD


我们通过适当地扩展3.5节的定义来定义非阻塞通信的语义。   

Order(顺序) 按着调用初始化通信的执行顺序安排非阻塞通信操作的顺序。给非阻塞通信用使用顺序的定义扩展3.5节的非赶超请求。

例子3.12 非阻塞操作排序的消息。

CALL MPI_COMM_RANK(comm, rank, ierr)
IF (RANK.EQ.0) THEN
 CALL MPI_ISEND(a, 1, MPI_REAL, 1, 0, comm, r1, ierr)
 CALL MPI_ISEND(B, 1, MPI_REAL, 1, 0, comm, r2, ierr)
ELSE ! rank.EQ.1
 CALL MPI_IRECV(a, 1, MPI_REAL, 0, MPI_ANY_TAG, comm, r1, ierr)
 CALL MPI_IRECV(b, 1, MPI_REAL, 0, 0, comm, r2, ierr)
END IF
CALL MPI_WAIT(r1,status)
CALL MPI_WAIT(r2,status)

进程0的第一个发送将匹配进程1的第一个接收, 既使在进程1执行接收以前, 两个消息已被发送。

Progress(进度) 除非这个发送被另一个接收满足, 如果一个匹配发送已被开始, 那么完成一个接收的对MPI_WAIT的一个调用将最终结束并返回。特别,如果这个匹配发送是非阻塞的,那么这个接收将完成,既使完成这个发送的发送者不执行调用。类似地,除非这个接收被另一个发送满足, 如果一个匹配接收已被开始, 一个完成发送的对MPI_WAIT的一个调用将最终返回, 既使没有完成这个接收的调用执行。

例子 3.13 进度语义的一个解释。

CALL MPI_COMM_RANK(comm, rank, ierr)
IF (rank.EQ.0) THEN
 CALL MPI_SSEND(a, 1, MPI_REAL, 1, 0, comm, ierr)
 CALL MPI_SEND(b, 1, MPI_REAL, 1, 1, comm, ierr)
ELSE ! rank.EQ.1
 CALL MPI_IRECV(a, 1, MPI_REAL, 0, 0, comm, r, ierr)
 CALL MPI_RECV(b, 1, MPI_REAL, 0, 1, comm, ierr)
 CALL MPI_WAIT(r, status, ierr)
END IF

在一个正确的MPI实现中, 这个代码将不死索。进程0的第一个同步发送必须在进程1登入这个匹配接收后完成, 既使进程1还没有得到“完成等待调用”。所以,进程0将继续和执行第二个发送, 允许进程1完成执行。

如果一个完成一个接收的MPI_TEST用同一参数被重复地调用, 并且一个匹配发送已开始, 那么这个调用将最终返回flag = 真, 除非这个发送由另一个接收满足。如果完成一个发送的MPI_TEST用同一个参数重复地被调用, 并且一个匹配接收已被开始, 那么这个调用将最终返回flag = 真, 除非这个接收由另一个发送满足。


Copyright: NPACT
BACKWARDFORWARD