[mpich2-commits] r7739 - mpich2/trunk/src/mpi/coll

buntinas at mcs.anl.gov buntinas at mcs.anl.gov
Tue Jan 18 14:28:14 CST 2011


Author: buntinas
Date: 2011-01-18 14:28:14 -0600 (Tue, 18 Jan 2011)
New Revision: 7739

Modified:
   mpich2/trunk/src/mpi/coll/alltoall.c
   mpich2/trunk/src/mpi/coll/alltoallv.c
   mpich2/trunk/src/mpi/coll/alltoallw.c
Log:
Fix alltoalls to not send zero-byte messages.  Reviewed by balaji@

Modified: mpich2/trunk/src/mpi/coll/alltoall.c
===================================================================
--- mpich2/trunk/src/mpi/coll/alltoall.c	2011-01-18 19:57:44 UTC (rev 7738)
+++ mpich2/trunk/src/mpi/coll/alltoall.c	2011-01-18 20:28:14 UTC (rev 7739)
@@ -623,6 +623,10 @@
             sendaddr = (char *)sendbuf + dst*sendcount*sendtype_extent;
         }
 
+        if (sendcount == 0)
+            dst = MPI_PROC_NULL;
+        if (recvcount == 0)
+            src = MPI_PROC_NULL;
         mpi_errno = MPIC_Sendrecv(sendaddr, sendcount, sendtype, dst, 
                                   MPIR_ALLTOALL_TAG, recvaddr,
                                   recvcount, recvtype, src,

Modified: mpich2/trunk/src/mpi/coll/alltoallv.c
===================================================================
--- mpich2/trunk/src/mpi/coll/alltoallv.c	2011-01-18 19:57:44 UTC (rev 7738)
+++ mpich2/trunk/src/mpi/coll/alltoallv.c	2011-01-18 20:28:14 UTC (rev 7739)
@@ -103,7 +103,7 @@
         for (i = 0; i < comm_size; ++i) {
             /* start inner loop at i to avoid re-exchanging data */
             for (j = i; j < comm_size; ++j) {
-                if (rank == i) {
+                if (rank == i && recvcnts[j]) {
                     /* also covers the (rank == i && rank == j) case */
                     mpi_errno = MPIC_Sendrecv_replace(((char *)recvbuf + rdispls[j]*recv_extent),
                                                       recvcnts[j], recvtype,
@@ -112,7 +112,7 @@
                                                       comm, &status);
                     if (mpi_errno) MPIU_ERR_POP(mpi_errno);
                 }
-                else if (rank == j) {
+                else if (rank == j && recvcnts[i]) {
                     /* same as above with i/j args reversed */
                     mpi_errno = MPIC_Sendrecv_replace(((char *)recvbuf + rdispls[i]*recv_extent),
                                                       recvcnts[i], recvtype,
@@ -275,6 +275,10 @@
             sendcount = sendcnts[dst];
         }
 
+        if (sendcount == 0)
+            dst = MPI_PROC_NULL;
+        if (recvcount == 0)
+            src = MPI_PROC_NULL;
         mpi_errno = MPIC_Sendrecv(sendaddr, sendcount, sendtype, dst, 
                                   MPIR_ALLTOALLV_TAG, recvaddr, recvcount, 
                                   recvtype, src, MPIR_ALLTOALLV_TAG,

Modified: mpich2/trunk/src/mpi/coll/alltoallw.c
===================================================================
--- mpich2/trunk/src/mpi/coll/alltoallw.c	2011-01-18 19:57:44 UTC (rev 7738)
+++ mpich2/trunk/src/mpi/coll/alltoallw.c	2011-01-18 20:28:14 UTC (rev 7739)
@@ -94,7 +94,7 @@
         for (i = 0; i < comm_size; ++i) {
             /* start inner loop at i to avoid re-exchanging data */
             for (j = i; j < comm_size; ++j) {
-                if (rank == i) {
+                if (rank == i && recvcnts[j]) {
                     /* also covers the (rank == i && rank == j) case */
                     mpi_errno = MPIC_Sendrecv_replace(((char *)recvbuf + rdispls[j]),
                                                       recvcnts[j], recvtypes[j],
@@ -107,7 +107,7 @@
                         MPIU_ERR_ADD(mpi_errno_ret, mpi_errno);
                     }
                 }
-                else if (rank == j) {
+                else if (rank == j && recvcnts[i]) {
                     /* same as above with i/j args reversed */
                     mpi_errno = MPIC_Sendrecv_replace(((char *)recvbuf + rdispls[i]),
                                                       recvcnts[i], recvtypes[i],
@@ -300,6 +300,10 @@
             sendtype = sendtypes[dst];
         }
 
+        if (sendcount == 0)
+            dst = MPI_PROC_NULL;
+        if (recvcount == 0)
+            src = MPI_PROC_NULL;
         mpi_errno = MPIC_Sendrecv(sendaddr, sendcount, sendtype, 
                                   dst, MPIR_ALLTOALLW_TAG, recvaddr, 
                                   recvcount, recvtype, src,



More information about the mpich2-commits mailing list