4. void sender(void) { void receiver(void) {
MPI_Request request; int ack;
int ack; /* … */
/* … */ MPI_Recv(buffer, …);
MPI_Isend(buffer, …, MPI_Send(&ack, …);
&request); }
MPI_Recv(&ack, …);
}
Must (eventually) use an MPI TEST or WAIT operation
on the pending request, even if you “know” that it
has already completed
11. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
MPI allocates a request
12. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
MPI allocates a request
MPI performs the send
13. Consider what happens
when you Isend…
resources
MPI_Isend(buffer, …, &request);
isend_request
MPI allocates a request
MPI performs the send
…which may include allocating additional resources
14. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
MPI allocates a request
MPI performs the send
…which may include allocating additional resources
Those resources are attached to the request
15. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
The send eventually done
16. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
The send eventually finishes
The request is marked complete
17. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
…but it’s still there!
18. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
…but it’s still there!
Eating valuable memory!
19. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
isend_request
resources
…but it’s still there!
Eating valuable memory!
And possibly still holding on to valuable resources!
20. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …); isend_request
resources
…until you invoke a TEST
or WAIT operation that
completes the request
21. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …);
resources
Then the request is freed
22. Consider what happens
when you Isend…
MPI_Isend(buffer, …, &request);
MPI_Wait(&request, …);
Then the request is freed
…including any resources that
weren’t previously released
37. void sender(void) { void receiver(void) {
MPI_Request request; int ack;
int ack; /* … */
/* … */ MPI_Recv(buffer, …);
MPI_Isend(buffer, …, MPI_Send(&ack, …);
&request); }
MPI_Recv(&ack, …);
MPI_Wait(&request, …);
}
If you “know” the send is already complete, the WAIT
will likely be fast