r10772 - mpich2/trunk/test/mpi/errors/comm
Author: dinan Date: 2012-12-17 13:53:30 -0600 (Mon, 17 Dec 2012) New Revision: 10772 Added: mpich2/trunk/test/mpi/errors/comm/too_many_comms.c mpich2/trunk/test/mpi/errors/comm/too_many_comms2.c mpich2/trunk/test/mpi/errors/comm/too_many_comms3.c Modified: mpich2/trunk/test/mpi/errors/comm/Makefile.am mpich2/trunk/test/mpi/errors/comm/testlist Log: Error tests: Handling of context ID exhaustion These tests create a lot of communicators, in an effort to check that MPI handles context ID exhaustion gracefully. Reviewer: buntinas Modified: mpich2/trunk/test/mpi/errors/comm/Makefile.am =================================================================== --- mpich2/trunk/test/mpi/errors/comm/Makefile.am 2012-12-17 19:53:29 UTC (rev 10771) +++ mpich2/trunk/test/mpi/errors/comm/Makefile.am 2012-12-17 19:53:30 UTC (rev 10772) @@ -12,5 +12,5 @@ ## for all programs that are just built from the single corresponding source ## file, we don't need per-target _SOURCES rules, automake will infer them ## correctly -noinst_PROGRAMS = cfree ccreate1 manysplit userdup +noinst_PROGRAMS = cfree ccreate1 manysplit userdup too_many_comms too_many_comms2 too_many_comms3 Modified: mpich2/trunk/test/mpi/errors/comm/testlist =================================================================== --- mpich2/trunk/test/mpi/errors/comm/testlist 2012-12-17 19:53:29 UTC (rev 10771) +++ mpich2/trunk/test/mpi/errors/comm/testlist 2012-12-17 19:53:30 UTC (rev 10772) @@ -2,3 +2,6 @@ ccreate1 8 userdup 4 manysplit 4 +too_many_comms 4 strict=FALSE +too_many_comms2 4 strict=FALSE +too_many_comms3 4 strict=FALSE Added: mpich2/trunk/test/mpi/errors/comm/too_many_comms.c =================================================================== --- mpich2/trunk/test/mpi/errors/comm/too_many_comms.c (rev 0) +++ mpich2/trunk/test/mpi/errors/comm/too_many_comms.c 2012-12-17 19:53:30 UTC (rev 10772) @@ -0,0 +1,61 @@ +/* -*- mode: c; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (c) 2012 by argonne national laboratory. + * see copyright in top-level directory. + */ + +/* This test attempts to create a large number of communicators, in an effort + * to exceed the number of communicators that the MPI implementation can + * provide. It checks that the implementation detects this error correctly + * handles it. + */ + +/* In this version, we duplicate MPI_COMM_WORLD until we run out of context + * IDs. */ + +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> +#include "mpitest.h" + +#define MAX_NCOMM 100000 + +static const int verbose = 0; + +int main(int argc, char **argv) { + int rank, nproc, mpi_errno; + int i, ncomm; + int errors = 1; + MPI_Comm *comm_hdls; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN); + comm_hdls = malloc(sizeof(MPI_Comm) * MAX_NCOMM); + + ncomm = 0; + for (i = 0; i < MAX_NCOMM; i++) { + /* Note: the comms we create are all dups of MPI_COMM_WORLD */ + mpi_errno = MPI_Comm_dup(MPI_COMM_WORLD, &comm_hdls[i]); + + if (mpi_errno == MPI_SUCCESS) { + ncomm++; + } else { + if (verbose) printf("%d: Error creating comm %d\n", rank, i); + errors = 0; + break; + } + } + + for (i = 0; i < ncomm; i++) + MPI_Comm_free(&comm_hdls[i]); + + free(comm_hdls); + MTest_Finalize(errors); + MPI_Finalize(); + + return 0; +} Added: mpich2/trunk/test/mpi/errors/comm/too_many_comms2.c =================================================================== --- mpich2/trunk/test/mpi/errors/comm/too_many_comms2.c (rev 0) +++ mpich2/trunk/test/mpi/errors/comm/too_many_comms2.c 2012-12-17 19:53:30 UTC (rev 10772) @@ -0,0 +1,78 @@ +/* -*- mode: c; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (c) 2012 by argonne national laboratory. + * see copyright in top-level directory. + */ + +/* This test attempts to create a large number of communicators, in an effort + * to exceed the number of communicators that the MPI implementation can + * provide. It checks that the implementation detects this error correctly + * handles it. + */ + +/* In this version, we create communicators that contain ranks {0}, {0,1}, ..., + * {0..P-1} from MPI_COMM_WORLD until we run out of context IDs. */ + +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> +#include "mpitest.h" + +#define MAX_NCOMM 100000 + +static const int verbose = 0; + +int main(int argc, char **argv) { + int rank, nproc, mpi_errno; + int i, ncomm, *ranks; + int errors = 1; + MPI_Comm *comm_hdls; + MPI_Group world_group; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + MPI_Comm_group(MPI_COMM_WORLD, &world_group); + + MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN); + comm_hdls = malloc(sizeof(MPI_Comm) * MAX_NCOMM); + ranks = malloc(sizeof(int) * nproc); + + for (i = 0; i < nproc; i++) + ranks[i] = i; + + ncomm = 0; + for (i = 0; i < MAX_NCOMM; i++) { + MPI_Group comm_group; + + /* Comms include ranks: 0; 0,1; 0,1,2; ...; 0; 0,1; 0,1,2; ... */ + MPI_Group_incl(world_group, (i+1) % (nproc+1), /* Adding 1 yields counts of 1..nproc */ + ranks, &comm_group); + + /* Note: the comms we create are all varying subsets of MPI_COMM_WORLD */ + mpi_errno = MPI_Comm_create(MPI_COMM_WORLD, comm_group, &comm_hdls[i]); + + if (mpi_errno == MPI_SUCCESS) { + ncomm++; + } else { + if (verbose) printf("%d: Error creating comm %d\n", rank, i); + MPI_Group_free(&comm_group); + errors = 0; + break; + } + + MPI_Group_free(&comm_group); + } + + for (i = 0; i < ncomm; i++) + MPI_Comm_free(&comm_hdls[i]); + + free(comm_hdls); + MPI_Group_free(&world_group); + + MTest_Finalize(errors); + MPI_Finalize(); + + return 0; +} Added: mpich2/trunk/test/mpi/errors/comm/too_many_comms3.c =================================================================== --- mpich2/trunk/test/mpi/errors/comm/too_many_comms3.c (rev 0) +++ mpich2/trunk/test/mpi/errors/comm/too_many_comms3.c 2012-12-17 19:53:30 UTC (rev 10772) @@ -0,0 +1,79 @@ +/* -*- mode: c; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */ +/* + * (c) 2012 by argonne national laboratory. + * see copyright in top-level directory. + */ + +/* This test attempts to create a large number of communicators, in an effort + * to exceed the number of communicators that the MPI implementation can + * provide. It checks that the implementation detects this error correctly + * handles it. + */ + +/* In this version, we create communicators that contain ranks {0}, {0}, ..., + * {P} from MPI_COMM_WORLD until we run out of context IDs. This test + * fragments the context ID space, resulting in a context ID allocation that + * fails because there is no common free ID, even though all processes have + * unused context IDs. */ + +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> +#include "mpitest.h" + +#define MAX_NCOMM 100000 + +static const int verbose = 0; + +int main(int argc, char **argv) { + int rank, nproc, mpi_errno; + int i, ncomm, *ranks; + int errors = 1; + MPI_Comm *comm_hdls; + MPI_Group world_group; + + MPI_Init(&argc, &argv); + + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + MPI_Comm_group(MPI_COMM_WORLD, &world_group); + + MPI_Comm_set_errhandler(MPI_COMM_WORLD, MPI_ERRORS_RETURN); + comm_hdls = malloc(sizeof(MPI_Comm) * MAX_NCOMM); + ranks = malloc(sizeof(int) * nproc); + + ncomm = 0; + for (i = 0; i < MAX_NCOMM; i++) { + int incl = i % nproc; + MPI_Group comm_group; + + /* Comms include ranks: 0; 1; 2; ...; 0; 1; ... */ + MPI_Group_incl(world_group, 1, &incl, &comm_group); + + /* Note: the comms we create all contain one rank from MPI_COMM_WORLD */ + mpi_errno = MPI_Comm_create(MPI_COMM_WORLD, comm_group, &comm_hdls[i]); + + if (mpi_errno == MPI_SUCCESS) { + if (verbose) printf("%d: Created comm %d\n", rank, i); + ncomm++; + } else { + if (verbose) printf("%d: Error creating comm %d\n", rank, i); + MPI_Group_free(&comm_group); + errors = 0; + break; + } + + MPI_Group_free(&comm_group); + } + + for (i = 0; i < ncomm; i++) + MPI_Comm_free(&comm_hdls[i]); + + free(comm_hdls); + MPI_Group_free(&world_group); + + MTest_Finalize(errors); + MPI_Finalize(); + + return 0; +}
participants (1)
-
dinan@mcs.anl.gov