


The semantics of nonblocking communication is defined by suitably extending the definitions in Section Semantics of Point-to-Point Communication .
Order Nonblocking communication operations are ordered according to the execution order of the calls that initiate the communication. The non-overtaking requirement of Section Semantics of Point-to-Point Communication is extended to nonblocking communication, with this definition of order being used.
 
 Example   
  
  
  
  
  
Message ordering for nonblocking operations.  
  
 
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 IF (rank.EQ.1) THEN 
      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, ierr) 
CALL MPI_WAIT(r2, status, ierr) 
 
The first send of process zero will match the  
first receive of process one, even  
if both messages are sent before process one executes either receive.  
   
Progress A call to MPI_WAIT that completes a receive will eventually terminate and return if a matching send has been started, unless the send is satisfied by another receive. In particular, if the matching send is nonblocking, then the receive should complete even if no call is executed by the sender to complete the send. Similarly, a call to MPI_WAIT that completes a send will eventually return if a matching receive has been started, unless the receive is satisfied by another send, and even if no call is executed to complete the receive.
 
 Example   
  
  
  
  
  
  
  
An illustration of progress semantics.  
 
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 IF (rank.EQ.1) THEN 
      CALL MPI_IRECV(a, 1, MPI_REAL, 0, 0, comm, r, ierr) 
      CALL MPI_RECV(b, 1, MPI_REAL, 0, 1, comm, status, ierr) 
      CALL MPI_WAIT(r, status, ierr) 
END IF 
 
This code should not deadlock in a correct  MPI implementation.  The first  
synchronous send of process zero must complete after process one posts the  
matching (nonblocking) receive even if process one has not yet reached  
the completing wait call.  Thus, process zero will continue and execute  
the second send, allowing process one to complete execution.  
   
If an MPI_TEST that completes a receive is repeatedly called with the same arguments, and a matching send has been started, then the call will eventually return flag = true, unless the send is satisfied by another receive. If an MPI_TEST that completes a send is repeatedly called with the same arguments, and a matching receive has been started, then the call will eventually return flag = true, unless the receive is satisfied by another send.


