X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/blobdiff_plain/3d39ee2f8a52715e6b417575029faa8a91307f21..7842bd614301712801b9f2b4a117824333cd3e16:/teshsuite/smpi/mpich3-test/comm/iccreate.c diff --git a/teshsuite/smpi/mpich3-test/comm/iccreate.c b/teshsuite/smpi/mpich3-test/comm/iccreate.c index ef3d36334e..64ce1ed28d 100644 --- a/teshsuite/smpi/mpich3-test/comm/iccreate.c +++ b/teshsuite/smpi/mpich3-test/comm/iccreate.c @@ -13,100 +13,102 @@ * This program tests that MPI_Comm_create applies to intercommunicators; * this is an extension added in MPI-2 */ - -int TestIntercomm( MPI_Comm ); - -int main( int argc, char *argv[] ) +int main(int argc, char *argv[]) { int errs = 0; int size, isLeft, wrank; MPI_Comm intercomm, newcomm; MPI_Group oldgroup, newgroup; - MTest_Init( &argc, &argv ); + MTest_Init(&argc, &argv); - MPI_Comm_size( MPI_COMM_WORLD, &size ); + MPI_Comm_size(MPI_COMM_WORLD, &size); if (size < 4) { - printf( "This test requires at least 4 processes\n" ); - MPI_Abort( MPI_COMM_WORLD, 1 ); - exit(1); + printf("This test requires at least 4 processes\n"); + MPI_Abort(MPI_COMM_WORLD, 1); } - MPI_Comm_rank( MPI_COMM_WORLD, &wrank ); - - while (MTestGetIntercomm( &intercomm, &isLeft, 2 )) { - int ranks[10], nranks, result; - - if (intercomm == MPI_COMM_NULL) continue; - - MPI_Comm_group( intercomm, &oldgroup ); - ranks[0] = 0; - nranks = 1; - MTestPrintfMsg( 1, "Creating a new intercomm 0-0\n" ); - MPI_Group_incl( oldgroup, nranks, ranks, &newgroup ); - MPI_Comm_create( intercomm, newgroup, &newcomm ); - - /* Make sure that the new communicator has the appropriate pieces */ - if (newcomm != MPI_COMM_NULL) { - int new_rsize, new_size, flag, commok = 1; - - MPI_Comm_set_name( newcomm, (char*)"Single rank in each group" ); - MPI_Comm_test_inter( intercomm, &flag ); - if (!flag) { - errs++; - printf( "[%d] Output communicator is not an intercomm\n", - wrank ); - commok = 0; - } - - MPI_Comm_remote_size( newcomm, &new_rsize ); - MPI_Comm_size( newcomm, &new_size ); - /* The new communicator has 1 process in each group */ - if (new_rsize != 1) { - errs++; - printf( "[%d] Remote size is %d, should be one\n", - wrank, new_rsize ); - commok = 0; - } - if (new_size != 1) { - errs++; - printf( "[%d] Local size is %d, should be one\n", - wrank, new_size ); - commok = 0; - } - /* ... more to do */ - if (commok) { - errs += TestIntercomm( newcomm ); - } - } - MPI_Group_free( &newgroup ); - if (newcomm != MPI_COMM_NULL) { - MPI_Comm_free( &newcomm ); - } - - /* Now, do a sort of dup, using the original group */ - MTestPrintfMsg( 1, "Creating a new intercomm (manual dup)\n" ); - MPI_Comm_create( intercomm, oldgroup, &newcomm ); - MPI_Comm_set_name( newcomm, (char*)"Dup of original" ); - MTestPrintfMsg( 1, "Creating a new intercomm (manual dup (done))\n" ); - - MPI_Comm_compare( intercomm, newcomm, &result ); - MTestPrintfMsg( 1, "Result of comm/intercomm compare is %d\n", result ); - if (result != MPI_CONGRUENT) { - const char *rname=0; - errs++; - switch (result) { - case MPI_IDENT: rname = "IDENT"; break; - case MPI_CONGRUENT: rname = "CONGRUENT"; break; - case MPI_SIMILAR: rname = "SIMILAR"; break; - case MPI_UNEQUAL: rname = "UNEQUAL"; break; - printf( "[%d] Expected MPI_CONGRUENT but saw %d (%s)", - wrank, result, rname ); fflush(stdout); - } - } - else { - /* Try to communication between each member of intercomm */ - errs += TestIntercomm( newcomm ); - } + MPI_Comm_rank(MPI_COMM_WORLD, &wrank); + + while (MTestGetIntercomm(&intercomm, &isLeft, 2)) { + int ranks[10], nranks, result; + + if (intercomm == MPI_COMM_NULL) + continue; + + MPI_Comm_group(intercomm, &oldgroup); + ranks[0] = 0; + nranks = 1; + MTestPrintfMsg(1, "Creating a new intercomm 0-0\n"); + MPI_Group_incl(oldgroup, nranks, ranks, &newgroup); + MPI_Comm_create(intercomm, newgroup, &newcomm); + + /* Make sure that the new communicator has the appropriate pieces */ + if (newcomm != MPI_COMM_NULL) { + int new_rsize, new_size, flag, commok = 1; + + MPI_Comm_set_name(newcomm, (char *) "Single rank in each group"); + MPI_Comm_test_inter(intercomm, &flag); + if (!flag) { + errs++; + printf("[%d] Output communicator is not an intercomm\n", wrank); + commok = 0; + } + + MPI_Comm_remote_size(newcomm, &new_rsize); + MPI_Comm_size(newcomm, &new_size); + /* The new communicator has 1 process in each group */ + if (new_rsize != 1) { + errs++; + printf("[%d] Remote size is %d, should be one\n", wrank, new_rsize); + commok = 0; + } + if (new_size != 1) { + errs++; + printf("[%d] Local size is %d, should be one\n", wrank, new_size); + commok = 0; + } + /* ... more to do */ + if (commok) { + errs += MTestTestComm(newcomm); + } + } + MPI_Group_free(&newgroup); + if (newcomm != MPI_COMM_NULL) { + MPI_Comm_free(&newcomm); + } + + /* Now, do a sort of dup, using the original group */ + MTestPrintfMsg(1, "Creating a new intercomm (manual dup)\n"); + MPI_Comm_create(intercomm, oldgroup, &newcomm); + MPI_Comm_set_name(newcomm, (char *) "Dup of original"); + MTestPrintfMsg(1, "Creating a new intercomm (manual dup (done))\n"); + + MPI_Comm_compare(intercomm, newcomm, &result); + MTestPrintfMsg(1, "Result of comm/intercomm compare is %d\n", result); + if (result != MPI_CONGRUENT) { + const char *rname = 0; + errs++; + switch (result) { + case MPI_IDENT: + rname = "IDENT"; + break; + case MPI_CONGRUENT: + rname = "CONGRUENT"; + break; + case MPI_SIMILAR: + rname = "SIMILAR"; + break; + case MPI_UNEQUAL: + rname = "UNEQUAL"; + break; + printf("[%d] Expected MPI_CONGRUENT but saw %d (%s)", wrank, result, rname); + fflush(stdout); + } + } + else { + /* Try to communication between each member of intercomm */ + errs += MTestTestComm(newcomm); + } if (newcomm != MPI_COMM_NULL) { MPI_Comm_free(&newcomm); @@ -122,15 +124,16 @@ int main( int argc, char *argv[] ) MPI_Comm_create(intercomm, MPI_GROUP_EMPTY, &newcomm); } if (newcomm != MPI_COMM_NULL) { - printf("[%d] expected MPI_COMM_NULL, but got a different communicator\n", wrank); fflush(stdout); + printf("[%d] expected MPI_COMM_NULL, but got a different communicator\n", wrank); + fflush(stdout); errs++; } if (newcomm != MPI_COMM_NULL) { MPI_Comm_free(&newcomm); } - MPI_Group_free( &oldgroup ); - MPI_Comm_free( &intercomm ); + MPI_Group_free(&oldgroup); + MPI_Comm_free(&intercomm); } MTest_Finalize(errs); @@ -139,79 +142,3 @@ int main( int argc, char *argv[] ) return 0; } - -int TestIntercomm( MPI_Comm comm ) -{ - int local_size, remote_size, rank, **bufs, *bufmem, rbuf[2], j; - int errs = 0, wrank, nsize; - char commname[MPI_MAX_OBJECT_NAME+1]; - MPI_Request *reqs; - - MPI_Comm_rank( MPI_COMM_WORLD, &wrank ); - MPI_Comm_size( comm, &local_size ); - MPI_Comm_remote_size( comm, &remote_size ); - MPI_Comm_rank( comm, &rank ); - MPI_Comm_get_name( comm, commname, &nsize ); - - MTestPrintfMsg( 1, "Testing communication on intercomm '%s', remote_size=%d\n", - commname, remote_size ); - - reqs = (MPI_Request *)malloc( remote_size * sizeof(MPI_Request) ); - if (!reqs) { - printf( "[%d] Unable to allocated %d requests for testing intercomm %s\n", - wrank, remote_size, commname ); - errs++; - return errs; - } - bufs = (int **) malloc( remote_size * sizeof(int *) ); - if (!bufs) { - printf( "[%d] Unable to allocated %d int pointers for testing intercomm %s\n", - wrank, remote_size, commname ); - errs++; - return errs; - } - bufmem = (int *) malloc( remote_size * 2 * sizeof(int) ); - if (!bufmem) { - printf( "[%d] Unable to allocated %d int data for testing intercomm %s\n", - wrank, 2*remote_size, commname ); - errs++; - return errs; - } - - /* Each process sends a message containing its own rank and the - rank of the destination with a nonblocking send. Because we're using - nonblocking sends, we need to use different buffers for each isend */ - /* NOTE: the send buffer access restriction was relaxed in MPI-2.2, although - it doesn't really hurt to keep separate buffers for our purposes */ - for (j=0; j