Greetings Jacob; sorry for the slow reply.

This is pretty subtle, but I think that your test is incorrect (I remember arguing about this a long time ago and eventually having another OMPI developer prove me wrong! :-) ).

1. You're setting MPI_ERRORS_RETURN, which, if you're using the C++ bindings, means you won't be able to see if an error occurs because they don't return the int error codes.

2. The MPI_ERROR field in the status is specifically *not* set for MPI_TEST and MPI_WAIT. It *is* set for the multi-test/wait functions (e.g., MPI_TESTANY, MPI_WAITALL). MPI-2.1 p52:44-48 says:

"Error codes belonging to the error class MPI_ERR_IN_STATUS should be returned only by the MPI completion functions that take arrays of MPI_STATUS. For the functions MPI_TEST, MPI_TESTANY, MPI_WAIT, and MPI_WAITANY, which return a single MPI_STATUS value, the normal MPI error return process should be used (not the MPI_ERROR field in the MPI_STATUS argument)."

So I think you need to use MPI::ERRORS_THROW_EXCEPTIONS to catch the error in this case, or look at the return value from the C binding for MPI_WAIT.


On May 10, 2009, at 5:51 AM, Katz, Jacob wrote:

Hi,
While trying error-related functionality of OMPI, I came across a situation where when I use MPI_ERRORS_RETURN error handler, the errors do not come out correctly from WAIT calls. The program below correctly terminates with a fatal “message truncated” error, but when the line setting the error handler to MPI_ERRORS_RETURN is uncommented, it silently completes. I expected the print out that checks the status after WAIT call to be executed, but it wasn’t.
The issue didn’t happen when using blocking recv.

A bug or my incorrect usage?

Thanks!

// mpic++ -o test test.cpp
// mpirun -np2 ./test
#include "mpi.h"
#include <iostream>
using namespace std;

int main (int argc, char *argv[])
{
    int rank;
    char buf[100] = "hmmmm";
    MPI::Status stat;

    MPI::Init(argc, argv);
    rank = MPI::COMM_WORLD.Get_rank();

//    MPI::COMM_WORLD.Set_errhandler(MPI::ERRORS_RETURN);

    if (rank == 0)
    {
MPI::Request r = MPI::COMM_WORLD.Irecv(buf, 1, MPI_CHAR, MPI::ANY_SOURCE, MPI::ANY_TAG);
        r.Wait(stat);
        if (stat.Get_error() != MPI::SUCCESS)
        {
            cout << "0: Error during recv" << endl;
        }
    }
    else
    {
        MPI::COMM_WORLD.Send(buf, 2, MPI_CHAR, 0, 0);
    }

    MPI::Finalize();
    return (0);
}

--------------------------------
Jacob M. Katz | jacob.k...@intel.com | Work: +972-4-865-5726 | iNet: (8)-465-5726

---------------------------------------------------------------------
Intel Israel (74) Limited

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.
_______________________________________________
users mailing list
us...@open-mpi.org
http://www.open-mpi.org/mailman/listinfo.cgi/users


--
Jeff Squyres
Cisco Systems


Reply via email to