X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/db17323a11a3089f492c2cae1be7913673689d5c..c81c99a491282f76757c2673961e3cdee6853539:/teshsuite/smpi/mpich3-test/pt2pt/rqstatus.c diff --git a/teshsuite/smpi/mpich3-test/pt2pt/rqstatus.c b/teshsuite/smpi/mpich3-test/pt2pt/rqstatus.c new file mode 100644 index 0000000000..102e9f8acd --- /dev/null +++ b/teshsuite/smpi/mpich3-test/pt2pt/rqstatus.c @@ -0,0 +1,114 @@ +/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * + * (C) 2003 by Argonne National Laboratory. + * See COPYRIGHT in top-level directory. + */ +#include "mpi.h" +#include +#include "mpitest.h" + +/* +static char MTEST_Descrip[] = "Test Request_get_status"; +*/ + +int main( int argc, char *argv[] ) +{ + int errs = 0; + int rank, size, source, dest; + int buf[2], flag, count; + MPI_Comm comm; + MPI_Status status, status2; + MPI_Request req; + + MTest_Init( &argc, &argv ); + + comm = MPI_COMM_WORLD; + /* Determine the sender and receiver */ + MPI_Comm_rank( comm, &rank ); + MPI_Comm_size( comm, &size ); + source = 0; + dest = size - 1; + + + /* Handling MPI_REQUEST_NULL in MPI_Request_get_status was only required + starting with MPI-2.2. */ +#if MTEST_HAVE_MIN_MPI_VERSION(2,2) + MPI_Request_get_status( MPI_REQUEST_NULL, &flag, &status ); + if (!flag) { + errs++; + fprintf( stderr, "flag not true for MPI_REQUEST_NULL, flag=%d\n", flag ); + } + if ((status.MPI_SOURCE != MPI_ANY_SOURCE) || + (status.MPI_TAG != MPI_ANY_TAG) || + (status.MPI_ERROR != MPI_SUCCESS)) + { + errs++; + fprintf( stderr, "non-empty MPI_Status returned for MPI_REQUEST_NULL\n" ); + } + + /* also pass MPI_STATUS_IGNORE to make sure the implementation doesn't + * blow up when it is passed as the status argument */ + MPI_Request_get_status( MPI_REQUEST_NULL, &flag, MPI_STATUS_IGNORE ); + if (!flag) { + errs++; + fprintf( stderr, "flag not true for MPI_REQUEST_NULL with MPI_STATUS_IGNORE, flag=%d\n", flag ); + } +#endif + + if (rank == source) { + buf[0] = size; + buf[1] = 3; + MPI_Ssend( buf, 2, MPI_INT, dest, 10, comm ); + } + if (rank == dest) { + MPI_Irecv( buf, 2, MPI_INT, source, 10, comm, &req ); + } + MPI_Barrier( comm ); + /* At this point, we know that the receive has at least started, + because of the Ssend. Check the status on the request */ + if (rank == dest) { + status.MPI_SOURCE = -1; + status.MPI_TAG = -1; + MPI_Request_get_status( req, &flag, &status ); + if (flag) { + if (status.MPI_TAG != 10) { + errs++; + fprintf( stderr, "Tag value %d should be 10\n", status.MPI_TAG ); + } + if (status.MPI_SOURCE != source) { + errs++; + fprintf( stderr, "Source value %d should be %d\n", status.MPI_SOURCE, source ); + } + MPI_Get_count( &status, MPI_INT, &count ); + if (count != 2) { + errs++; + fprintf( stderr, "Count value %d should be 2\n", count ); + } + } + else { + errs++; + fprintf( stderr, "Unexpected flag value from get_status\n" ); + } + /* Now, complete the request */ + MPI_Wait( &req, &status2 ); + /* Check that the status is correct */ + if (status2.MPI_TAG != 10) { + errs++; + fprintf( stderr, "(wait)Tag value %d should be 10\n", status2.MPI_TAG ); + } + if (status2.MPI_SOURCE != source) { + errs++; + fprintf( stderr, "(wait)Source value %d should be %d\n", status2.MPI_SOURCE, source ); + } + MPI_Get_count( &status2, MPI_INT, &count ); + if (count != 2) { + errs++; + fprintf( stderr, "(wait)Count value %d should be 2\n", count ); + } + } + + MTest_Finalize( errs ); + MPI_Finalize(); + return 0; +}