supported MPI_IN_PLACE in MPI_Reduce and MPI_Allreduce
authorGengbin Zheng <gzheng@justice.(none)>
Tue, 8 Dec 2009 16:34:10 +0000 (10:34 -0600)
committerGengbin Zheng <gzheng@justice.(none)>
Tue, 8 Dec 2009 16:34:10 +0000 (10:34 -0600)
src/libs/ck-libs/ampi/ampi.C
src/libs/ck-libs/ampi/ampi.h
src/libs/ck-libs/ampi/ampif.h

index 536bb602f9775a4ba80692d861d44ecb89342a5d..d51f88368ca17630cfc34c4d2ef8719bc3289dea 100644 (file)
@@ -2739,6 +2739,10 @@ int AMPI_Reduce(void *inbuf, void *outbuf, int count, int type, MPI_Op op,
   }
 #endif
   
+  if (inbuf == MPI_IN_PLACE) inbuf = outbuf;
+  if (outbuf == MPI_IN_PLACE) outbuf = inbuf;
+  CmiAssert(inbuf != MPI_IN_PLACE && outbuf != MPI_IN_PLACE);
+
   ampi *ptr = getAmpiInstance(comm);
   int rootIdx=ptr->comm2CommStruct(comm).getIndexForRank(root);
   if(op == MPI_OP_NULL) CkAbort("MPI_Reduce called with MPI_OP_NULL!!!");
@@ -2776,6 +2780,11 @@ int AMPI_Allreduce(void *inbuf, void *outbuf, int count, int type,
 {
   AMPIAPI("AMPI_Allreduce");
   ampi *ptr = getAmpiInstance(comm);
+  if (inbuf == MPI_IN_PLACE) inbuf = outbuf;
+  if (outbuf == MPI_IN_PLACE) outbuf = inbuf;
+  CmiAssert(inbuf != MPI_IN_PLACE && outbuf != MPI_IN_PLACE);
+  
   CkDDT_DataType *ddt_type = ptr->getDDT()->getType(type);
   TRACE_BG_AMPI_SET_SIZE(count * ddt_type->getSize());
   if(comm==MPI_COMM_SELF) return copyDatatype(comm,type,count,inbuf,outbuf);
index 1183a061f342b0d82fc04d9b70ccea852a7d8498..ccfe1382597326e44ba32a4bb03810fa9341149a 100644 (file)
@@ -139,6 +139,8 @@ typedef int MPI_Fint;
 #define MPI_KEYVAL_INVALID (-1)
 #define MPI_INFO_NULL    (-1)
 
+#define MPI_IN_PLACE ((void *) -1L)
+
 #define MPI_BOTTOM      0
 #define MPI_UNDEFINED    (-32766)
 
index a1f82364bb4ced5f430be6a1beb51b2462f48ef7..4a2be33eb5cf8dad1b8bd9056da9aeae65e324ea 100644 (file)
@@ -89,6 +89,8 @@
        integer, parameter :: MPI_KEYVAL_INVALID = -1
        integer, parameter :: MPI_INFO_NULL = -1
 
+       integer*8, parameter ::  MPI_IN_PLACE = -1
+
        integer, parameter :: MPI_BOTTOM = 0
        integer, parameter :: MPI_UNDEFINED = -32766