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 9a52cc9aa4ac5dafda1fa9c0081dc47eba9f36ff..ed24e855769fe282d947065adaf5e19e4927335c 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 */
       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++;
               ) {
           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])
           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 */
       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++;
              ) {
           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])
           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 */
       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--;
               ) {
           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])
           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++) {
         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==oldrank){
                   add=0;
                   break;
               }
-
+              if(rank == ranges[i][1]){/*already last ?*/
+                break;
+              }
               rank += ranges[i][2]; /* Stride */
               rank += ranges[i][2]; /* Stride */
-
               if (ranges[i][0]<ranges[i][1]){
                   if(rank > ranges[i][1])
                     break;
               if (ranges[i][0]<ranges[i][1]){
                   if(rank > ranges[i][1])
                     break;
index 2245d58c49d933af3661e67ac3e9dc783866518e..f8b8296ce82c1368173b2ada8bb152a7b09e7ea2 100644 (file)
@@ -3,6 +3,7 @@ dup 2
 #dupic 4
 #works, but needs MPI_Comm_set_name
 commcreate1 8
 #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
 #needs MPI_Comm_set_name and MPI_Intercomm_create
 #commname 4
 #ic1 4