Hey there, The documentation of boost::mpi says the following about the mpi::status object returned from a wait_all(..) on a prior stash of irecv()s, i.e. non-blocking receives (version 1.55, taken from boost/mpi/status.hpp, did not check later version as revision history is unchanged since 1.36):
> This structure contains status information about messages that > have been received (with @c communicator::recv) or can be received > (returned from @c communicator::probe or @c > communicator::iprobe). It permits access to the source of the > message, message tag, error code (rarely used), or the number of > elements that have been transmitted. Hence, calling error() should give me the error_code returned by MPI_Irecv. However, this "rarely used" is a strange formulation ... Thus, we take the example contained in the tutorial on non-blocking communication, modify it slightly to store the resulting status objects, and inspect their error() return values. #include <boost/mpi.hpp> #include <iostream> #include <string> #include <boost/serialization/string.hpp> #include <boost/mpi.hpp> namespace mpi = boost::mpi; int main() { mpi::environment env; mpi::communicator world; if (world.rank() == 0) { mpi::request reqs[2]; std::string msg, out_msg = "Hello"; reqs[0] = world.isend(1, 0, out_msg); reqs[1] = world.irecv(1, 1, msg); mpi::wait_all(reqs, reqs + 2); std::cout << msg << "!" << std::endl; } else { mpi::request reqs[2]; std::string msg, out_msg = "world"; reqs[0] = world.isend(0, 1, out_msg); reqs[1] = world.irecv(0, 0, msg); std::vector<mpi::status> status; mpi::wait_all(reqs, reqs + 2, std::back_inserter(status)); std::cout << "error code: send - " << status[0].error() << ", receive - " << status[1].error() << std::endl; std::cout << msg << ", "; } return 0; } The result then is error code: send - 0, receive - 331828272 world! I.e. the error code of isend's status is fine, while the one of irecv's status just shows a probably uninitialized value. I know that boost::mpi internally checks the return code from MPI via its macro BOOST_MPI_CHECK_RESULT and it would throw an exception in case of an error. However, this can be switched off via BOOST_NO_EXCEPTIONS. Therefore, I would feel better if I were able to check that what I just received is really ok. Is this a bug (at least in the documentation) or am I missing something here? Kind regards, Frederik Heber
_______________________________________________ Boost-mpi mailing list Boost-mpi@lists.boost.org http://lists.boost.org/mailman/listinfo.cgi/boost-mpi