Logo AND Algorithmique Numérique Distribuée

Public GIT Repository
Fix [#17799] : have mpi_group_range_incl and mpi_group_range_excl better test some...
authorAugustin Degomme <augustin.degomme@imag.fr>
Mon, 18 Aug 2014 11:38:00 +0000 (13:38 +0200)
committerAugustin Degomme <augustin.degomme@imag.fr>
Mon, 18 Aug 2014 11:46:05 +0000 (13:46 +0200)
Two tests added : that the rank is in the right range at all times, and that we don't go after the last one wanted.
Hopefully this will be enough to cover all cases.
Test commcreate1 from mpich 3 testsuite has been confirmed to pass with one process
The test with 1 process has been added to the test suite (it was with 8 processes before)

src/smpi/smpi_pmpi.c
teshsuite/smpi/mpich3-test/comm/testlist

index 9a52cc9..ed24e85 100644 (file)
@@ -551,10 +551,12 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
       size = 0;
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];       /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
               ) {
           size++;
-
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
              if(rank > ranges[i][1])
@@ -570,11 +572,14 @@ int PMPI_Group_range_incl(MPI_Group group, int n, int ranges[][3],
       j = 0;
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];     /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
              ) {
           index = smpi_group_index(group, rank);
           smpi_group_set_mapping(*newgroup, index, j);
           j++;
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
            if(rank > ranges[i][1])
@@ -612,10 +617,12 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
       size = smpi_group_size(group);
       for (i = 0; i < n; i++) {
         for (rank = ranges[i][0];       /* First */
-             rank >= 0; /* Last */
+             rank >= 0 && rank < smpi_group_size(group); /* Last */
               ) {
           size--;
-
+          if(rank == ranges[i][1]){/*already last ?*/
+            break;
+          }
           rank += ranges[i][2]; /* Stride */
          if (ranges[i][0]<ranges[i][1]){
              if(rank > ranges[i][1])
@@ -635,14 +642,17 @@ int PMPI_Group_range_excl(MPI_Group group, int n, int ranges[][3],
         while (newrank < size) {
           add=1;
           for (i = 0; i < n; i++) {
-            for (rank = ranges[i][0];rank >= 0;){
+            for (rank = ranges[i][0];
+                rank >= 0 && rank < smpi_group_size(group);
+                ){
               if(rank==oldrank){
                   add=0;
                   break;
               }
-
+              if(rank == ranges[i][1]){/*already last ?*/
+                break;
+              }
               rank += ranges[i][2]; /* Stride */
-
               if (ranges[i][0]<ranges[i][1]){
                   if(rank > ranges[i][1])
                     break;
index 2245d58..f8b8296 100644 (file)
@@ -3,6 +3,7 @@ dup 2
 #dupic 4
 #works, but needs MPI_Comm_set_name
 commcreate1 8
+commcreate1 1
 #needs MPI_Comm_set_name and MPI_Intercomm_create
 #commname 4
 #ic1 4