Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Add mpich3 test suite, to replace older one.
[simgrid.git] / teshsuite / smpi / mpich3-test / comm / ctxsplit.c
diff --git a/teshsuite/smpi/mpich3-test/comm/ctxsplit.c b/teshsuite/smpi/mpich3-test/comm/ctxsplit.c
new file mode 100644 (file)
index 0000000..4e73dc5
--- /dev/null
@@ -0,0 +1,80 @@
+/* -*- 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 <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "mpitest.h"
+
+/*
+ * This check is intended to fail if there is a leak of context ids.  
+ * Because this is trying to exhaust the number of context ids, it needs
+ * to run for a longer time than many tests.  The for loop uses 100,000 
+ * iterations, which is adequate for MPICH (with only about 1k context ids
+ * available).
+ */
+
+int main(int argc, char** argv) {
+
+   int      i=0;
+   int      randval;
+   int      rank;
+   int      errs = 0;
+   MPI_Comm newcomm;
+   double   startTime;
+   int      nLoop = 100000;
+   
+   MTest_Init(&argc,&argv);
+
+   for (i=1; i<argc; i++) {
+       if (strcmp( argv[i], "--loopcount" ) == 0)  {
+          i++;
+          nLoop = atoi( argv[i] );
+       }
+       else {
+          fprintf( stderr, "Unrecognized argument %s\n", argv[i] );
+       }
+   }
+
+   MPI_Comm_rank(MPI_COMM_WORLD,&rank);
+
+   startTime = MPI_Wtime();
+   for (i=0; i<nLoop; i++) {
+       
+       if ( rank == 0 && (i%100 == 0) ) {
+          double rate = MPI_Wtime() - startTime;
+          if (rate > 0) {
+              rate = i / rate;
+              MTestPrintfMsg( 10, "After %d (%f)\n", i, rate );
+          }
+          else {
+              MTestPrintfMsg( 10, "After %d\n", i );
+          }
+       }
+       
+       /* FIXME: Explain the rationale behind rand in this test */
+       randval=rand();
+       
+       if (randval%(rank+2) == 0) {
+          MPI_Comm_split(MPI_COMM_WORLD,1,rank,&newcomm);
+          MPI_Comm_free( &newcomm );
+       }
+       else {
+          MPI_Comm_split(MPI_COMM_WORLD,MPI_UNDEFINED,rank,&newcomm);
+          if (newcomm != MPI_COMM_NULL) {
+              errs++;
+              printf( "Created a non-null communicator with MPI_UNDEFINED\n" );
+          }
+       }
+       
+   }
+   
+   MTest_Finalize( errs );
+   MPI_Finalize();
+   
+   return 0;
+}