Re: [Mpi3-ft] MPI_ANY_SOURCE
I think we can do this without a warning, just by using an error: If a wait (or wait_all, test, etc) is called with an anysource request while the req's communicator is anysource disabled, then the function will return an error (maybe something like MPI_ERR_ANYSOURCE_DISABLED). Of course in the wait_all case the app needs to be able to determine which req is the anysource on a disabled communicator. We may be able to help the user here by using the status array. -d On Oct 11, 2011, at 3:16 PM, Darius Buntinas wrote:
I think you're right Josh, the blocking version wouldn't need to be changed.
For the nonblocking version, wouldn't we only need to lock around the Wait, not between the Recv and Wait? If we're worried about hanging in a blocking Wait, I think we just need to check for all-clients-failed before calling Wait. If anysources are reenabled by another thread before this thread calls Wait, that's OK, so long as the thread checks first.
Here's a function a user could implement to use whenever waiting on an anysource:
int My_AS_MPI_Wait(MPI_Request *req, MPI_Status *status) { while(1) { reader_lock(); if (my_cnt != recognize_cnt) { /* New failures were detected */ /* check failed_group and decide if ok to continue */ if (ok_to_continue(req, failed_group) == FALSE) { reader_unlock(); return MPI_ERR_PROC_FAIL_STOP; } my_cnt == recognize_cnt; } err = MPI_Wait(req, status); if (err == MPI_WARN_PROC_FAIL_STOP) { /* Failure case */ reader_unlock(); writer_lock(); if (my_cnt != recognize_cnt) { /* another thread has already re-enabled wildcards */ writer_unlock(); continue; } MPI_Comm_reenable_any_source(comm, &failed_group); ++recognize_cnt; writer_unlock(); continue; } else { reader_unlock(); return MPI_ERR_PROC_FAIL_STOP; } reader_unlock(); } }
-d
participants (1)
-
Darius Buntinas