[mpi3-coll] Non-blocking Collectives Proposal Draft
Torsten Hoefler
htor at cs.indiana.edu
Fri Oct 17 08:47:53 CDT 2008
Hello,
> Thanks. You probably meant Recv(0) in Proc 1. I also miss a Wait for
> req_r. So, a complete example would probably look like:
>
> Proc 0 Proc 1
>
> Irecv(1,req_r) Irecv(0,req_r)
> Isend(1,req_s) Isend(0,req_s)
> Waitall(req_s, req_r) Recv(0)
> Send(1) Waitall(req_s,req_r)
>
> This would work. However, let's do one change, replacing Isend by
> Issend. Will this still work?
>
> Irecv(1,req_r) Irecv(0,req_r)
> Issend(1,req_s) Issend(0,req_s)
> Waitall(req_s, req_r) Recv(0)
> Send(1) Waitall(req_s,req_r)
sorry for joining in so late - it was night here. So I would still say
that it doesn't deadlock - in the send/recv as well as in the collective
case.
Actually, from a correctness perspective, I see no difference between
Rich's Isend() and your Issend() example because an MPI implementation
is free to implement Isend() with Issend() (rendezvous protocol). Thus,
implementers have to assume the worst case.
To your example:
- the process 1 is required to progress *all* outstanding operations
while it is in Recv(0)
- this enables the Waitall(req_s, req_r) on proc 0 to complete and proc
0 postes the send
This is required by the MPI-2.1 standard afaik.
> Another possible complication: let's swap the Send and Recv, and make
> Send synchronous (or rendezvous):
>
> Irecv(1,req_r) Irecv(0,req_r)
> Issend(1,req_s) Issend(0,req_s)
> Waitall(req_s, req_r) Ssend(0)
> Recv(1) Waitall(req_s,req_r)
>
> Here I have rather strong doubts that this will work. Do you?
It's the same thing, Ssend will also have to progress the other
requests.
Best,
Torsten
--
bash$ :(){ :|:&};: --------------------- http://www.unixer.de/ -----
Torsten Hoefler | Postdoctoral Researcher
Open Systems Lab | Indiana University
150 S. Woodlawn Ave. | Bloomington, IN, 474045, USA
Lindley Hall Room 135 | +01 (812) 855-3608
More information about the mpiwg-coll
mailing list