Joshua Hursey wrote on Tue, 31 Aug 2010 at 12:59:58
I think I see what is getting confused. We are not changing MPI_Recv_init or MPI_Irecv from the current standard. So the status object is only available on a call to one of the completion functions.
I was running with the assumption that if a process is known to be failed at the call to either of these functions then they will return MPI_ERR_IN_STATUS (even though these functions don't have a status object, this tells the user to call a completion call to access the status object). Further, if the process is not known to be failed until the call to MPI_Start{all}, then the start function would return MPI_ERR_IN_STATUS. Then the application should use one of the completion calls to access the error code from the returned status object.
I'd much rather see the functions return MPI_SUCCESS here - the user needs to call the completion function to get actual completion status, and at that point the error can be reported. Returning MPI_ERR_IN_STATUS when no status is returned and requiring a user to call a completion function to get the actual error is the exact same code flow as the MPI_SUCCESS case, so not sure the MPI_ERR_IN_STATUS return value buys you anything.
Thinking about this some more and rereading the standard, both MPI_Irecv, MPI_Recv_init, MPI_Start{all} should return immediately since they are local operations. Their return code should -not- be determined by the other processes. I say this after reading the following sentence in the introduction to section 3.7: "In all cases, the send start call is local: it returns immediately, irrespective of the status of other processes."
So for MPI_Startall, it will start all of the requests and return MPI_SUCCESS (unless one of the arguments is bad). It will not be until the user calls a completion function that they will be notified of an error, even if it was known at the time of the call to MPI_Startall.
How do people feel about this?
I like this much better, but this should be applied to MPI_Irecv and MPI_Recv_init too. It wasn't clear if you intended this to apply only to MPI_Startall or not. -Fab