Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Update mpich comm tests
[simgrid.git] / teshsuite / smpi / mpich3-test / comm / cmsplit_type.c
index 75d3e4b..819812a 100644 (file)
 
 int main(int argc, char *argv[])
 {
-    int rank, size, verbose=0;
+    int rank, size, verbose = 0, errs=0, tot_errs=0;
     int wrank;
     MPI_Comm comm;
+    MPI_Info info;
 
     MPI_Init(&argc, &argv);
 
     if (getenv("MPITEST_VERBOSE"))
         verbose = 1;
 
-    MPI_Comm_rank( MPI_COMM_WORLD, &wrank );
+    MPI_Comm_rank(MPI_COMM_WORLD, &wrank);
 
     /* Check to see if MPI_COMM_TYPE_SHARED works correctly */
     MPI_Comm_split_type(MPI_COMM_WORLD, MPI_COMM_TYPE_SHARED, 0, MPI_INFO_NULL, &comm);
-    if (comm == MPI_COMM_NULL)
+    if (comm == MPI_COMM_NULL) {
         printf("Expected a non-null communicator, but got MPI_COMM_NULL\n");
+       errs++;
+    }
+    else {
+        MPI_Comm_rank(comm, &rank);
+        MPI_Comm_size(comm, &size);
+        if (rank == 0 && verbose)
+            printf("Created shared subcommunicator of size %d\n", size);
+        MPI_Comm_free(&comm);
+    }
+
+#ifdef MPIX_COMM_TYPE_NEIGHBORHOOD
+    /* the MPICH-specific MPIX_COMM_TYPE_NEIGHBORHOOD*/
+    /* test #1: expected behavior -- user provided a directory, and we
+     * determine which processes share access to it */
+    MPI_Info_create(&info);
+    if (argc == 2)
+           MPI_Info_set(info, "nbhd_common_dirname", argv[1]);
+    else
+       MPI_Info_set(info, "nbhd_common_dirname", ".");
+    MPI_Comm_split_type(MPI_COMM_WORLD, MPIX_COMM_TYPE_NEIGHBORHOOD, 0,
+           info, &comm);
+    if (comm == MPI_COMM_NULL) {
+        printf("Expected a non-null communicator, but got MPI_COMM_NULL\n");
+       errs++;
+    }
     else {
         MPI_Comm_rank(comm, &rank);
         MPI_Comm_size(comm, &size);
         if (rank == 0 && verbose)
-            printf("Created subcommunicator of size %d\n", size);
+            printf("Correctly created common-file subcommunicator of size %d\n", size);
         MPI_Comm_free(&comm);
     }
 
+    /* test #2: a hint we don't know about */
+    MPI_Info_delete(info, "nbhd_common_dirname");
+    MPI_Info_set(info, "mpix_tooth_fairy", "enable");
+    MPI_Comm_split_type(MPI_COMM_WORLD, MPIX_COMM_TYPE_NEIGHBORHOOD, 0,
+           info, &comm);
+    if (comm != MPI_COMM_NULL) {
+        printf("Expected a NULL communicator, but got something else\n");
+       errs++;
+        MPI_Comm_free(&comm);
+    }
+    else {
+        if (rank == 0 && verbose)
+            printf("Unknown hint correctly resulted in NULL communicator\n");
+    }
+
+
+    MPI_Info_free(&info);
+#endif
+
     /* Check to see if MPI_UNDEFINED is respected */
     MPI_Comm_split_type(MPI_COMM_WORLD, (wrank % 2 == 0) ? MPI_COMM_TYPE_SHARED : MPI_UNDEFINED,
                         0, MPI_INFO_NULL, &comm);
-    if ((wrank % 2) && (comm != MPI_COMM_NULL))
+    if ((wrank % 2) && (comm != MPI_COMM_NULL)) {
         printf("Expected MPI_COMM_NULL, but did not get one\n");
+       errs++;
+    }
     if (wrank % 2 == 0) {
-        if (comm == MPI_COMM_NULL)
+        if (comm == MPI_COMM_NULL) {
             printf("Expected a non-null communicator, but got MPI_COMM_NULL\n");
+           errs++;
+       }
         else {
             MPI_Comm_rank(comm, &rank);
             MPI_Comm_size(comm, &size);
             if (rank == 0 && verbose)
-                printf("Created subcommunicator of size %d\n", size);
+                printf("Created shared subcommunicator of size %d\n", size);
             MPI_Comm_free(&comm);
         }
     }
+    MPI_Reduce(&errs, &tot_errs, 1, MPI_INT, MPI_SUM, 0, MPI_COMM_WORLD);
 
     /* Use wrank because Comm_split_type may return more than one communicator
-       across the job, and if so, each will have a rank 0 entry.  Test 
-       output rules are for a single process to write the successful 
-       test (No Errors) output. */
-    if (wrank == 0)
+     * across the job, and if so, each will have a rank 0 entry.  Test
+     * output rules are for a single process to write the successful
+     * test (No Errors) output. */
+    if (wrank == 0 && errs == 0)
         printf(" No errors\n");
 
     MPI_Finalize();