moved fortran reduction operation table initialization into ampi.C, so that if writin...
authorGengbin Zheng <gzheng@illinois.edu>
Fri, 9 Dec 2005 22:04:40 +0000 (22:04 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Fri, 9 Dec 2005 22:04:40 +0000 (22:04 +0000)
src/libs/ck-libs/ampi/ampi.C
src/libs/ck-libs/ampi/ampif.C

index 98ac8b3182d0916d2a92a25e0f752a33932a321d..8a79b11d0e07cebf1cee9b533201895f6797de17 100644 (file)
@@ -390,10 +390,19 @@ static void EndIdle(void *dummy,double curWallTime)
 }
 #endif
 
+/* for fortran reduction operation table to handle mapping */
+typedef MPI_Op  MPI_Op_Array[128];
+CtvDeclare(int, mpi_opc);
+CtvDeclare(MPI_Op_Array, mpi_ops);
+
 static void ampiProcInit(void){
   CtvInitialize(ampiParent*, ampiPtr);
   CtvInitialize(int,ampiInitDone);
   CtvInitialize(int,ampiFinalized);
+
+  CtvInitialize(MPI_Op_Array, mpi_ops);
+  CtvInitialize(int, mpi_opc);
+
   CkpvInitialize(int, argvExtracted);
   CkpvAccess(argvExtracted) = 0;
   REGISTER_AMPI
@@ -464,6 +473,27 @@ void ampiCreateMain(MPI_MainFn mainFn, const char *name,int nameLen)
 
 static CProxy_ampiWorlds ampiWorldsGroup;
 
+static void init_operations()
+{
+  CtvInitialize(MPI_Op_Array, mpi_ops);
+  register int i = 0;
+  CtvAccess(mpi_ops)[i++] = MPI_MAX;
+  CtvAccess(mpi_ops)[i++] = MPI_MIN;
+  CtvAccess(mpi_ops)[i++] = MPI_SUM;
+  CtvAccess(mpi_ops)[i++] = MPI_PROD;
+  CtvAccess(mpi_ops)[i++] = MPI_LAND;
+  CtvAccess(mpi_ops)[i++] = MPI_BAND;
+  CtvAccess(mpi_ops)[i++] = MPI_LOR;
+  CtvAccess(mpi_ops)[i++] = MPI_BOR;
+  CtvAccess(mpi_ops)[i++] = MPI_LXOR;
+  CtvAccess(mpi_ops)[i++] = MPI_BXOR;
+  CtvAccess(mpi_ops)[i++] = MPI_MAXLOC;
+  CtvAccess(mpi_ops)[i++] = MPI_MINLOC;
+
+  CtvInitialize(int, mpi_opc);
+  CtvAccess(mpi_opc) = i;
+}
+
 /*
 Called from MPI_Init, a collective initialization call:
  creates a new AMPI array and attaches it to the current
@@ -558,6 +588,8 @@ static ampi *ampiInit(char **argv)
   TRACE_BG_AMPI_START(ptr->getThread(), "AMPI_START");
 #endif
 
+  init_operations();     // initialize fortran reduction operation table
+
   return ptr;
 }
 
index 1877e25118dd2c9db61ae3cb5087ac8834083c54..a5ea9e30e58d8a01201909557680ef7c64fa2a72 100644 (file)
@@ -195,15 +195,13 @@ REDUCERF(MPI_MINLOC , mpi_minloc)
 #endif
 
 typedef MPI_Op  MPI_Op_Array[128];
-
-CkpvStaticDeclare(MPI_Op_Array, mpi_ops);
-
-CkpvStaticDeclare(int, mpi_opc);
+CtvExtern(MPI_Op_Array, mpi_ops);
+CtvExtern(int, mpi_opc);
 
 // must be consistent with mpif.h
 #define MPI_OP_FIRST   100
 
-#define GET_MPI_OP(idx)      (CmiAssert(idx - MPI_OP_FIRST >= 0 && idx - MPI_OP_FIRST < CkpvAccess(mpi_opc)), CkpvAccess(mpi_ops)[idx - MPI_OP_FIRST])
+#define GET_MPI_OP(idx)      (CmiAssert(idx - MPI_OP_FIRST >= 0 && idx - MPI_OP_FIRST < CtvAccess(mpi_opc)), CtvAccess(mpi_ops)[idx - MPI_OP_FIRST])
 
 void mpi_init_universe(int *unicomm)
 {
@@ -215,23 +213,6 @@ void mpi_init_universe(int *unicomm)
 }
 
 void mpi_init(int *ierr){
-  CkpvInitialize(MPI_Op_Array, mpi_ops);
-  register int i = 0;
-  CkpvAccess(mpi_ops)[i++] = MPI_MAX;
-  CkpvAccess(mpi_ops)[i++] = MPI_MIN;
-  CkpvAccess(mpi_ops)[i++] = MPI_SUM;
-  CkpvAccess(mpi_ops)[i++] = MPI_PROD;
-  CkpvAccess(mpi_ops)[i++] = MPI_LAND;
-  CkpvAccess(mpi_ops)[i++] = MPI_BAND;
-  CkpvAccess(mpi_ops)[i++] = MPI_LOR;
-  CkpvAccess(mpi_ops)[i++] = MPI_BOR;
-  CkpvAccess(mpi_ops)[i++] = MPI_LXOR;
-  CkpvAccess(mpi_ops)[i++] = MPI_BXOR;
-  CkpvAccess(mpi_ops)[i++] = MPI_MAXLOC;
-  CkpvAccess(mpi_ops)[i++] = MPI_MINLOC;
-
-  CkpvInitialize(int, mpi_opc);
-  CkpvAccess(mpi_opc) = i;
   *ierr = AMPI_Init(NULL,NULL);
 }
 
@@ -632,8 +613,8 @@ void mpi_scan(void* sendbuf, void* recvbuf, int* count, int* datatype, int* opc,
 void mpi_op_create(int* function, int* commute, int* opc, int* ierr){
   MPI_Op op;
   *ierr = MPI_Op_create((MPI_User_function *)function, *commute, (MPI_Op *)&op);
-  CkpvAccess(mpi_ops)[CkpvAccess(mpi_opc)++] = op;
-  *opc = CkpvAccess(mpi_opc)-1;
+  CtvAccess(mpi_ops)[CtvAccess(mpi_opc)++] = op;
+  *opc = CtvAccess(mpi_opc)-1;
 }
 
 void mpi_op_free(int* opc, int* ierr){