Modifying global location update scheme to work correctly when some of the migration...
authorLukasz Wesolowski <wesolwsk@illinois.edu>
Tue, 25 Sep 2012 21:35:45 +0000 (21:35 +0000)
committerLukasz Wesolowski <wesolwsk@illinois.edu>
Tue, 25 Sep 2012 21:35:45 +0000 (21:35 +0000)
src/ck-core/cklocation.C
src/ck-ldb/BaseLB.h
src/ck-ldb/lbdb.h

index b8c5b5e97ab96ae9e261d3d1bd341562d855fff6..c33807bab89b9e469e81b8b42ac708b42b2d4927 100644 (file)
@@ -20,6 +20,7 @@
 #include "LBDatabase.h"
 #if CMK_GLOBAL_LOCATION_UPDATE
 #include "BaseLB.h"
+#include "init.h"
 #endif
 #endif // CMK_LBDB_ON
 
@@ -89,6 +90,7 @@ LDObjid idx2LDObjid(const CkArrayIndex &idx)
 #if CMK_GLOBAL_LOCATION_UPDATE
   r.dimension = idx.dimension;
   r.nInts = idx.nInts; 
+  r.isArrayElement = 1; 
 #endif
 
   return r;
@@ -97,6 +99,10 @@ LDObjid idx2LDObjid(const CkArrayIndex &idx)
 #if CMK_GLOBAL_LOCATION_UPDATE
 void UpdateLocation(MigrateInfo& migData) {
 
+  if (migData.obj.id.isArrayElement == 0) {
+    return;
+  }
+
   CkArrayIndex idx; 
   idx.dimension = migData.obj.id.dimension; 
   idx.nInts = migData.obj.id.nInts; 
@@ -105,8 +111,9 @@ void UpdateLocation(MigrateInfo& migData) {
     idx.data()[i] = migData.obj.id.id[i];    
   }
 
-  CkLocMgr *localLocMgr = 
-    (CkLocMgr *) CkLocalBranch(migData.obj.omhandle.id.id); 
+  CkGroupID locMgrGid;
+  locMgrGid.idx = migData.obj.id.locMgrGid;
+  CkLocMgr *localLocMgr = (CkLocMgr *) CkLocalBranch(locMgrGid);
   localLocMgr->updateLocation(idx, migData.to_pe); 
 }
 #endif
@@ -1301,8 +1308,12 @@ CkLocRec_local::CkLocRec_local(CkLocMgr *mgr,CmiBool fromMigration,
         enable_measure = CmiTrue;
        bounced  = CmiFalse;
        the_lbdb=mgr->getLBDB();
+        LDObjid ldid = idx2LDObjid(idx);
+#if CMK_GLOBAL_LOCATION_UPDATE
+        ldid.locMgrGid = mgr->getGroupID().idx;
+#endif        
        ldHandle=the_lbdb->RegisterObj(mgr->getOMHandle(),
-               idx2LDObjid(idx),(void *)this,1);
+               ldid,(void *)this,1);
        if (fromMigration) {
                DEBL((AA"Element %s migrated in\n"AB,idx2str(idx)));
                if (!ignoreArrival)  {
@@ -2155,9 +2166,11 @@ CmiBool CkLocMgr::addElement(CkArrayID id,const CkArrayIndex &idx,
        { //This is the first we've heard of that element-- add new local record
                rec=createLocal(idx,CmiFalse,CmiFalse,CmiTrue);
 #if CMK_GLOBAL_LOCATION_UPDATE
-                DEBC((AA"Global location broadcast for new element idx %s "
-                      "assigned to %d \n"AB, idx2str(idx), CkMyPe()));
-                thisProxy.updateLocation(idx, CkMyPe());                        
+                if (homePe(idx) != CkMyPe()) {
+                  DEBC((AA"Global location broadcast for new element idx %s "
+                        "assigned to %d \n"AB, idx2str(idx), CkMyPe()));
+                  thisProxy.updateLocation(idx, CkMyPe());  
+                }
 #endif
                 
        } else 
@@ -2284,10 +2297,15 @@ int CkLocMgr::deliver(CkMessage *m,CkDeliver_t type,int opts) {
 //#if (!defined(_FAULT_MLOG_) && !defined(_FAULT_CAUSAL_))
 //#if !defined(_FAULT_MLOG_)
 #if CMK_LBDB_ON
+
+        LDObjid ldid = idx2LDObjid(idx);
+#if CMK_GLOBAL_LOCATION_UPDATE
+        ldid.locMgrGid = thisgroup.idx;
+#endif        
        if (type==CkDeliver_queue) {
                if (!(opts & CK_MSG_LB_NOTRACE) && the_lbdb->CollectingCommStats()) {
-               if(rec!=NULL) the_lbdb->Send(myLBHandle,idx2LDObjid(idx),UsrToEnv(msg)->getTotalsize(), rec->lookupProcessor(), 1);
-               else /*rec==NULL*/ the_lbdb->Send(myLBHandle,idx2LDObjid(idx),UsrToEnv(msg)->getTotalsize(),homePe(msg->array_index()), 1);
+               if(rec!=NULL) the_lbdb->Send(myLBHandle,ldid,UsrToEnv(msg)->getTotalsize(), rec->lookupProcessor(), 1);
+               else /*rec==NULL*/ the_lbdb->Send(myLBHandle,ldid,UsrToEnv(msg)->getTotalsize(),homePe(msg->array_index()), 1);
                }
        }
 #endif
@@ -2719,9 +2737,7 @@ void CkLocMgr::emigrate(CkLocRec_local *rec,int toPe)
        inform(idx,toPe);
 //#if (!defined(_FAULT_MLOG_) && !defined(_FAULT_CAUSAL_))    
 //#if !defined(_FAULT_MLOG_)    
-#if !CMK_GLOBAL_LOCATION_UPDATE
        informHome(idx,toPe);
-#endif
 //#endif
 
 #if !CMK_LBDB_ON && CMK_GLOBAL_LOCATION_UPDATE
index 36456dc750116c7dac1e95bdac18fcbd482d990a..3171d4ebf31b233f12922ffec0baf581c9e7a1d7 100644 (file)
@@ -163,7 +163,12 @@ struct MigrateInfo {
     int from_pe;
     int to_pe;
     int async_arrival;     // if an object is available for immediate migrate
-    MigrateInfo():  async_arrival(0) {}
+    MigrateInfo():  async_arrival(0) {
+#if CMK_GLOBAL_LOCATION_UPDATE
+      obj.id.isArrayElement = 0; 
+#endif
+    }
+
     void pup(PUP::er &p) {
       p | index;
       p | obj;
index dc304fd5a4b54b4983430555467d5fa834e0f29f..ae7957f155b94a48b27e2458830c7e6a143cbfb7 100644 (file)
@@ -66,8 +66,10 @@ typedef struct {
 typedef struct _LDObjid {
   int id[OBJ_ID_SZ];
 #if CMK_GLOBAL_LOCATION_UPDATE
-  short dimension; 
-  short nInts;
+  char dimension;
+  char nInts;
+  char isArrayElement;
+  char locMgrGid; 
 #endif
   CmiBool operator==(const struct _LDObjid& objid) const {
     for (int i=0; i<OBJ_ID_SZ; i++) if (id[i] != objid.id[i]) return CmiFalse;
@@ -370,6 +372,8 @@ inline void LDObjid::pup(PUP::er &p) {
 #if CMK_GLOBAL_LOCATION_UPDATE
   p|dimension;
   p|nInts;
+  p|isArrayElement;
+  p|locMgrGid;
 #endif
 }
 PUPmarshall(LDObjid)