change CldSimpleMultipleSend to work within immediate handler.
authorGengbin Zheng <gzheng@illinois.edu>
Mon, 14 Mar 2011 05:37:20 +0000 (00:37 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Mon, 14 Mar 2011 05:37:20 +0000 (00:37 -0500)
also fixed a bug in getting the CldBalanceHandlerIndex in CldSimpleMultipleSend()

13 files changed:
src/arch/net-linux-ppc/cc-xlc64.sh
src/ck-core/cklocation.C
src/ck-ldb/LBDBManager.C
src/ck-ldb/LBDBManager.h
src/ck-ldb/LBDatabase.h
src/ck-ldb/LBOM.h
src/ck-ldb/OrbLB.C
src/ck-ldb/lbdb.C
src/ck-ldb/lbdb.h
src/conv-ldb/cldb.c
src/conv-ldb/cldb.h
src/conv-ldb/cldb.neighbor.c
src/libs/ck-libs/ampi/ampi.C

index 0dc10ffe6e1d4ce1cab124e5f6367ed60b9791ba..85abf7f6c91fbb5424c9353fe18671838e41dd67 100644 (file)
@@ -7,7 +7,7 @@ CMK_CXX_OPTIMIZE='-O3 -qstrict -Q! '
 CMK_LD="$CMK_CC "
 CMK_LDXX="$CMK_CXX "
 
-CMK_QT="aix"
+CMK_QT="aix64-light"
 
 CMK_NATIVE_CC='xlc_r -q64'
 CMK_NATIVE_LD='xlc_r -q64'
index 859d148b35e7de7787b72f93316f86b49b9e77ba..bba8924fddbb537cca5324ed3e4ce33acc7b54dc 100644 (file)
@@ -64,12 +64,13 @@ the same size as ArrayIndices.
 LDObjid idx2LDObjid(const CkArrayIndex &idx)
 {
   LDObjid r;
-  int i;
+  int i=0;
   const int *data=idx.data();
-  if (OBJ_ID_SZ>=idx.nInts) {
+  if (OBJ_ID_SZ>idx.nInts) {
+    r.id[0] = idx.dimension;
     for (i=0;i<idx.nInts;i++)
-      r.id[i]=data[i];
-    for (i=idx.nInts;i<OBJ_ID_SZ;i++)
+      r.id[i+1]=data[i];
+    for (i=idx.nInts+1;i<OBJ_ID_SZ;i++)
       r.id[i]=0;
   } else {
     //Must hash array index into LBObjid
@@ -83,6 +84,17 @@ LDObjid idx2LDObjid(const CkArrayIndex &idx)
   }
   return r;
 }
+
+int LDObjid2idx(const LDObjHandle &h, int dim)
+{
+  const LDObjid &r = h.objID();
+  int ndims = r.id[0];
+  CkAssert(dim>=0 && dim<ndims);
+  if (ndims <= 3)
+    return r.id[dim+1];
+  else
+    return 0;              // fixme
+}
 #endif
 
 /************************* Array Index *********************
@@ -2941,6 +2953,7 @@ void CkLocMgr::initLB(CkGroupID lbdbID_)
        myCallbacks.migrate = (LDMigrateFn)CkLocRec_local::staticMigrate;
        myCallbacks.setStats = NULL;
        myCallbacks.queryEstLoad = NULL;
+       myCallbacks.dimInfo = LDObjid2idx;
        myLBHandle = the_lbdb->RegisterOM(myId,this,myCallbacks);
 
        // Tell the lbdb that I'm registering objects
index 0cebbffe67ed10773bd5828ed053920bd1e01306..4d5f424fe84edb42d4a93599a77d14d6caaf5aca 100644 (file)
@@ -356,6 +356,12 @@ void LBDB::RemoveNotifyMigrated(int handle)
   delete callbk;
 }
 
+int LBDB::DimInfo(const LDObjHandle &h, int dim)
+{
+  LBOM* om = oms[h.omhandle.handle];
+  return om->DimInfo(h, dim);
+}
+
 int LBDB::AddStartLBFn(LDStartLBFn fn, void* data)
 {
   // Save startLB function
index 689f2295fd23cab863cc8c7a051afdd63455ea04..c236eacd76dc302dbe4950d5dbccc9d1d673fc49 100644 (file)
@@ -152,6 +152,8 @@ public:
        { migrateCBList[handle]->on = 0; }
   void RemoveNotifyMigrated(int handle);
 
+  int  DimInfo(const LDObjHandle &h, int dim);
+
   inline void TurnManualLBOn() 
        { useBarrier = CmiFalse; }
   inline void TurnManualLBOff() 
index 40638158a8beaf42fc1027322be265d3e1f778ad..c2864e99d9c7142effd173caa1e6980387d25f22 100644 (file)
@@ -305,6 +305,7 @@ public:
 
   inline void ClearLoads(void) { LDClearLoads(myLDHandle); };
   inline int Migrate(LDObjHandle h, int dest) { return LDMigrate(h,dest); };
+  inline int DimInfo(const LDObjHandle &h, int dim) { return LDDimInfo(h,dim); };
 
   inline void Migrated(LDObjHandle h, int waitBarrier=1) { LDMigrated(h, waitBarrier); };
 
index e4300bca3994935210505af6e653f7db2a5c1097..406d609e9867d9e3286badb7b5e20dc55ebff4d6 100644 (file)
@@ -42,6 +42,7 @@ private:
 
   void DepositHandle(LDOMHandle _h) { myhandle = _h; };
   void Migrate(LDObjHandle _h, int dest) { callbacks.migrate(_h,dest); };
+  int DimInfo(const LDObjHandle &_h, int dim) { callbacks.dimInfo(_h,dim); };
   CmiBool RegisteringObjs() { return registering_objs; };
   void SetRegisteringObjs(CmiBool _set) { registering_objs = _set; };
 
index 36cf06e50afb7b4885e28d9fdbed532d5068eabb..6bbe06b3e16bda04cb11b1c35ddaf8dce2a6b983 100644 (file)
@@ -320,14 +320,16 @@ void OrbLB::work(LDStats* stats)
 
   // v[0] = XDIR  v[1] = YDIR v[2] = ZDIR
   // vArray[XDIR] is an array holding the x vector for all computes
+  LBDatabase *lbdb = LBDatabase::Object();
   int objIdx = 0;
   for (i=0; i<stats->n_objs; i++) {
     LDObjData &odata = stats->objData[i];
     if (odata.migratable == 0) continue;
     computeLoad[objIdx].id = objIdx;
-    computeLoad[objIdx].v[XDIR] = odata.objID().id[0];
-    computeLoad[objIdx].v[YDIR] = odata.objID().id[1];
-    computeLoad[objIdx].v[ZDIR] = odata.objID().id[2];
+    computeLoad[objIdx].v[XDIR] = lbdb->getLBDB()->DimInfo(odata.handle, 0); // odata.objID().id[0];
+    computeLoad[objIdx].v[YDIR] = lbdb->getLBDB()->DimInfo(odata.handle, 1); // odata.objID().id[1];
+    computeLoad[objIdx].v[ZDIR] = lbdb->getLBDB()->DimInfo(odata.handle, 2); // odata.objID().id[2];
+    // CkPrintf("[%d] %d %d %d\n", i, computeLoad[objIdx].v[XDIR], computeLoad[objIdx].v[YDIR], computeLoad[objIdx].v[ZDIR]);
 #if CMK_LB_CPUTIMER
     computeLoad[objIdx].load = _lb_args.useCpuTime()?odata.cpuTime:odata.wallTime;
 #else
index 772609a46017af2bebb06cfc365350d6d838fb6d..09dc9db985e1797a3c61b52b3982737e0be980b2 100644 (file)
@@ -499,6 +499,13 @@ extern "C" void LDQueryEstLoad(LDHandle bdb)
 {
 }
 
+extern "C" int LDDimInfo(const LDObjHandle &_h, int dim)
+{
+  LBDB *const db = (LBDB*)(_h.omhandle.ldb.handle);
+
+  return db->DimInfo(_h,dim);
+}
+
 extern "C" int LDMemusage(LDHandle _db) 
 {
   LBDB *const db = (LBDB*)(_db.handle);
index 198c8c8e667dd93c7dab7e0a8d399d2b8c6cc535..31a96a30c66e57d1013df2ceac05b37044336447 100644 (file)
@@ -226,11 +226,15 @@ void LBCollectStatsOff(void);
 typedef void (*LDMigrateFn)(LDObjHandle handle, int dest);
 typedef void (*LDStatsFn)(LDOMHandle h, int state);
 typedef void (*LDQueryEstLoadFn)(LDOMHandle h);
+typedef void (*LDStatsFn)(LDOMHandle h, int state);
+typedef int (*LDDimInfoFn)(const LDObjHandle &h, int dim);
 
-typedef struct {
+typedef struct _LDCallbacks {
   LDMigrateFn migrate;
   LDStatsFn setStats;
   LDQueryEstLoadFn queryEstLoad;
+  LDDimInfoFn  dimInfo;
+  _LDCallbacks(): migrate(NULL), setStats(NULL), queryEstLoad(NULL), dimInfo(NULL) {} 
 } LDCallbacks;
 
 /*
@@ -294,6 +298,7 @@ void LDCollectStatsOn(LDHandle _lbdb);
 void LDCollectStatsOff(LDHandle _lbdb);
 int  CLDCollectingStats(LDHandle _lbdb);
 void LDQueryEstLoad(LDHandle bdb);
+int  LDDimInfo(const LDObjHandle &_h, int dim);
 void LDGetObjLoad(LDObjHandle &h, LBRealType *wallT, LBRealType *cpuT);
 void LDQueryKnownObjLoad(LDObjHandle &h, LBRealType *wallT, LBRealType *cpuT);
 
index f3d59888a251df4d3e37d0faec8a99de419951ee..07d7eaf5809ec037e44b8b5e845b63272ea31caf 100644 (file)
@@ -365,7 +365,7 @@ void CldMultipleSend(int pe, int numToSend, int rank, int immed)
 }
 
 /* simple scheme - just send one by one. useful for multicore */
-void CldSimpleMultipleSend(int pe, int numToSend)
+void CldSimpleMultipleSend(int pe, int numToSend, int rank)
 {
   char *msg;
   int len, queueing, priobits, *msgSizes, i, numSent, done=0;
@@ -379,13 +379,13 @@ void CldSimpleMultipleSend(int pe, int numToSend)
   numSent = 0;
   while (!done) {
     for (i=0; i<numToSend; i++) {
-      CldGetToken(&msg);
+      CldGetTokenFromRank(&msg, rank);
       if (msg != 0) {
        done = 1;
        numToSend--;
        ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
        ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
-       CldSwitchHandler(msg, CpvAccessOther(CldBalanceHandlerIndex, pe));
+       CldSwitchHandler(msg, CpvAccessOther(CldBalanceHandlerIndex, rank));
         CmiSyncSendAndFree(pe, len, msg);
         if (numToSend == 0) done = 1;
       }
index 19e0eb2a70f06289a0a98b97f9391840e07b91fd..fe32a496e41f5351af682d34016ef58483272e24 100644 (file)
@@ -14,7 +14,7 @@ CpvExtern(int, CldLoadNotify);
 CpvExtern(CmiNodeLock, cldLock);
 
 void CldMultipleSend(int pe, int numToSend, int rank, int immed);
-void CldSimpleMultipleSend(int pe, int numToSend);
+void CldSimpleMultipleSend(int pe, int numToSend, int rank);
 void CldSetPEBitVector(const char *);
 
 int  CldLoad(void);
index 9446c7053efb9f1477e5cef7e87ea1e95c2e9e00..3eaf653bd32494168329384a87fe8f2d00465e44 100644 (file)
@@ -284,20 +284,21 @@ void CldBalance(void *dummy, double curT)
           maxUnderAvg = avgLoad - CpvAccess(neighbors)[i].load;
         numUnderAvg++;
       }
-    if (numUnderAvg > 0)
+    if (numUnderAvg > 0)  {
+      int myrank = CmiMyRank();
       for (i=0; ((i<nNeighbors) && (overload>0)); i++) {
-          j = (i+CpvAccess(Mindex))%CpvAccess(numNeighbors);
-          if (CpvAccess(neighbors)[j].load < avgLoad) {
-              numToMove = (avgLoad - CpvAccess(neighbors)[j].load);
+        j = (i+CpvAccess(Mindex))%CpvAccess(numNeighbors);
+        if (CpvAccess(neighbors)[j].load < avgLoad) {
+          numToMove = (avgLoad - CpvAccess(neighbors)[j].load);
           if (numToMove > overload)
-            numToMove = overload;
+              numToMove = overload;
           overload -= numToMove;
          CpvAccess(neighbors)[j].load += numToMove;
 #if CMK_MULTICORE
-          CldSimpleMultipleSend(CpvAccess(neighbors)[j].pe, numToMove);
+          CldSimpleMultipleSend(CpvAccess(neighbors)[j].pe, numToMove, myrank);
 #else
           CldMultipleSend(CpvAccess(neighbors)[j].pe, 
-                         numToMove, CmiMyRank()
+                         numToMove, myrank
 #if CMK_SMP
                          0
 #else
@@ -307,6 +308,7 @@ void CldBalance(void *dummy, double curT)
 #endif
         }
       }
+    }             /* end of numUnderAvg > 0 */
   }
   CldSendLoad();
 #if CMK_TRACE_ENABLED && TRACE_USEREVENTS
index 474bb203b5c4bdae2cb600060f622938214ac421..b266c8e434638c3c41c0642c420b89e4683bfcd0 100644 (file)
@@ -523,7 +523,7 @@ static void ampiProcInit(void){
   }
 #endif
 
-  // initBigSimTrace(1,outtiming);
+   initBigSimTrace(1,1);
 }
 
 #if AMPIMSGLOG