Changes for out-of-core emulation in BigSim. Details could be referred to Chao Mei...
authorChao Mei <chaomei2@illinois.edu>
Tue, 30 Dec 2008 16:55:29 +0000 (16:55 +0000)
committerChao Mei <chaomei2@illinois.edu>
Tue, 30 Dec 2008 16:55:29 +0000 (16:55 +0000)
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-core/ckcheckpoint.C
src/ck-core/ckcheckpoint.h
src/ck-core/cklocation.C
src/ck-core/cklocation.h

index fca3a835ade61e56f5127a155efbba4d9603d50b..a37dede755048a3ffddb853b255b07975e210d6b 100644 (file)
@@ -238,14 +238,21 @@ void ArrayElement::ckJustMigrated(void) {
              if (!l->ckElementArriving(this)) return;);
 }
 
+void ArrayElement::ckJustRestored(void) {
+    CkMigratable::ckJustRestored();
+    //empty for out-of-core emulation
+}
+
 CK_REDUCTION_CONTRIBUTE_METHODS_DEF(ArrayElement,thisArray,
    *(contributorInfo *)&listenerData[thisArray->reducer->ckGetOffset()],true);
 
 /// Remote method: calls destructor
 void ArrayElement::ckDestroy(void)
 {
-       CK_ARRAYLISTENER_LOOP(thisArray->listeners,
+       if(BgOutOfCoreFlag!=1){ //in case of taking core out of memory
+           CK_ARRAYLISTENER_LOOP(thisArray->listeners,
                           l->ckElementDied(this));
+       }
        CkMigratable::ckDestroy();
 }
 
index cd6a8c0e59ff8c073dc56d9d682bdb65062891b7..d0a6739351ca820237be7ac3e66577e872f422ec 100644 (file)
@@ -479,6 +479,9 @@ public:
   /// Called by the system just before and after migration to another processor:
   virtual void ckAboutToMigrate(void);
   virtual void ckJustMigrated(void);
+  
+  virtual void ckJustRestored(void);
+  
   virtual void ckDestroy(void);
   virtual char *ckDebugChareName(void);
   virtual int ckDebugChareID(char*, int);
index 7824733b238d62423c486ffcf1c1c67f52510dc5..92da1a3f6fdca55dfe84ba87fa74064ae06dbd8c 100644 (file)
@@ -329,16 +329,19 @@ void CkPupArrayElementsData(PUP::er &p, int notifyListeners)
         }
        else {
          // loop and create all array elements ourselves
+         //CkPrintf("total chare array cnts: %d\n", numElements);
          for (int i=0; i<numElements; i++) {
                CkGroupID gID;
                CkArrayIndexMax idx;
                p|gID;
                 p|idx;
                CkLocMgr *mgr = (CkLocMgr*)CkpvAccess(_groupTable)->find(gID).getObj();
-               if (notifyListeners)
+               if (notifyListeners){
                  mgr->resume(idx,p);
-                else
+               }
+                else{
                  mgr->restore(idx,p);
+               }
          }
        }
        // finish up
@@ -406,8 +409,30 @@ void CkRemoveArrayElements()
   int i;
   int numGroups = CkpvAccess(_groupIDTable)->size();
   CKLOCMGR_LOOP(mgr->flushAllRecs(););
+/*  GroupTable *gTbl = CkpvAccess(_groupTable);
+  for(i=0; i<numGroups; i++){
+    IrrGroup *obj = CkpvAccess(_groupTable)->find((*CkpvAccess(_groupIDTable))[i]).getObj();
+    if(obj->isLocMgr()) {
+       CkLocMgr *mgr = (CkLocMgr *)obj;
+       mgr->flushAllRecs();
+    }
+  }*/
 }
 
+/*
+void CkTestArrayElements()
+{
+  int i;
+  int numGroups = CkpvAccess(_groupIDTable)->size();
+  //CKLOCMGR_LOOP(mgr->flushAllRecs(););
+  GroupTable *gTbl = CkpvAccess(_groupTable);
+  for(i=0; i<numGroups; i++){
+    IrrGroup *obj = CkpvAccess(_groupTable)->find((*CkpvAccess(_groupIDTable))[i]).getObj();
+    CkPrintf("An object at [%d]: %p | isLocMgr: %d\n", i, obj, obj->isLocMgr());
+  }
+}
+*/
+
 void CkStartCheckpoint(char* dirname,const CkCallback& cb)
 {
        CkPrintf("[%d] Checkpoint starting in %s\n", CkMyPe(), dirname);
index 2e39dccc760edce78f0497761bf968414d442ef7..a3beff96c77905b2377e9db663bf35f82d75a13f 100644 (file)
@@ -64,6 +64,7 @@ void CkPupNodeGroupData(PUP::er &p);
 void CkPupArrayElementsData(PUP::er &p, int notifyListeners=1);
 void CkPupProcessorData(PUP::er &p);
 void CkRemoveArrayElements();
+//void CkTestArrayElements();
 
 void CkStartCheckpoint(char* dirname,const CkCallback& cb);
 void CkRestartMain(const char* dirname, CkArgMsg *args);
index 2d938cd3fb8b85621ee9055990d8f0d250b02c35..71c031835842c1669c0ee054f5f9bdd752a16a59 100644 (file)
@@ -672,6 +672,7 @@ void CkMigratable::ckDestroy(void) {
 
 void CkMigratable::ckAboutToMigrate(void) { }
 void CkMigratable::ckJustMigrated(void) { }
+void CkMigratable::ckJustRestored(void) { }
 
 CkMigratable::~CkMigratable() {
        DEBC((AA"In CkMigratable::~CkMigratable %s\n"AB,idx2str(thisIndexMax)));
@@ -854,6 +855,8 @@ CkLocRec_local::CkLocRec_local(CkLocMgr *mgr,CmiBool fromMigration,
 {
 #if CMK_LBDB_ON
        DEBL((AA"Registering element %s with load balancer\n"AB,idx2str(idx)));
+       //BIGSIM_OOC DEBUGGING
+       //CkPrintf("LocMgr on %d: Registering element %s with load balancer\n", CkMyPe(), idx2str(idx));
        nextPe = -1;
        asyncMigrate = CmiFalse;
        readyMigrate = CmiTrue;
@@ -1386,9 +1389,14 @@ void CkLocMgr::flushAllRecs(void)
     CkLocRec *rec=*(CkLocRec **)objp;
     CkArrayIndex &idx=*(CkArrayIndex *)keyp;
     if (rec->type() != CkLocRec::local) {
-      hash.remove(*(CkArrayIndexMax *)&idx);
-      delete rec;
-      it->seek(-1);//retry this hash slot
+      //In the case of taking core out of memory (in BigSim's emulation)
+      //the meta data in the location manager are not deleted so we need
+      //this condition
+      if(BgOutOfCoreFlag!=1){
+        hash.remove(*(CkArrayIndexMax *)&idx);
+        delete rec;
+        it->seek(-1);//retry this hash slot
+      }
     }
     else {
         callMethod((CkLocRec_local*)rec, &CkMigratable::ckDestroy);
@@ -1546,6 +1554,8 @@ CkLocRec_local *CkLocMgr::createLocal(const CkArrayIndex &idx,
        DEBC((AA"Adding new record for element %s at local index %d\n"AB,idx2str(idx),localIdx));
        CkLocRec_local *rec=new CkLocRec_local(this,forMigration,ignoreArrival,idx,localIdx);
        insertRec(rec,idx); //Add to global hashtable
+
+
        if (notifyHome) informHome(idx,CkMyPe());
        return rec;
 }
@@ -1613,8 +1623,20 @@ void CkLocMgr::reclaim(const CkArrayIndex &idx,int localIdx) {
        //Link local index into free list
        freeList[localIdx]=firstFree;
        firstFree=localIdx;
+       
+               
        if (!duringMigration) 
        { //This is a local element dying a natural death
+           #if CMK_BLUEGENE_CHARM
+               //After migration, reclaimRemote will be called through 
+               //the CkRemoveArrayElement in the pupping routines for those 
+               //objects that are not on the home processors. However,
+               //those remote records should not be deleted since the corresponding
+               //objects are not actually deleted but on disk. If deleted, msgs
+               //that seeking where is the object will be accumulated (a circular
+               //msg chain) and causes the program no progress
+               if(BgOutOfCoreFlag==1) return; 
+           #endif
                int home=homePe(idx);
                if (home!=CkMyPe())
                        thisProxy[home].reclaimRemote(idx,CkMyPe());
@@ -1873,6 +1895,7 @@ void CkLocMgr::iterate(CkLocIterator &dest) {
   void *objp;
   CkHashtableIterator *it=hash.iterator();
   CmiImmediateLock(hashImmLock);
+
   while (NULL!=(objp=it->next())) {
     CkLocRec *rec=*(CkLocRec **)objp;
     if (rec->type()==CkLocRec::local) {
@@ -1919,7 +1942,7 @@ void CkLocMgr::pupElementsFor(PUP::er &p,CkLocRec_local *rec,
        for (m=firstManager;m!=NULL;m=m->next) {
                CkMigratable *elt=m->element(localIdx);
                if (elt!=NULL) 
-                {
+                {      
                        elt->pup(p);
                 }
        }
@@ -2098,10 +2121,22 @@ void CkLocMgr::immigrate(CkArrayElementMigrateMessage *msg)
 
 void CkLocMgr::restore(const CkArrayIndex &idx, PUP::er &p)
 {
-       CkLocRec_local *rec=createLocal(idx,CmiFalse,CmiFalse,CmiTrue /* home doesn't know yet */ );
+       //This is in broughtIntoMem during out-of-core emulation in BigSim,
+       //informHome should not be called since such information is already
+       //immediately updated real migration
+#ifndef CMK_OPTIMIZE
+       if(BgOutOfCoreFlag!=2)
+           CmiAbort("CkLocMgr::restore should only be used in out-of-core emulation for BigSim and be called when object is brought into memory!\n");
+#endif
+       CkLocRec_local *rec=createLocal(idx,CmiFalse,CmiFalse,CmiFalse);
+       
+       //BIGSIM_OOC DEBUGGING
+       //CkPrintf("Proc[%d]: Registering element %s with LDB\n", CkMyPe(), idx2str(idx));
 
        //Create the new elements as we unpack the message
        pupElementsFor(p,rec,CkElementCreation_restore);
+
+       callMethod(rec,&CkMigratable::ckJustRestored);
 }
 
 
index c6a7be029bbadf33813143f0e6d2e04f1fb1d01e..027e2ed302b12757d2728d533b222bdc2913023d 100644 (file)
@@ -297,6 +297,9 @@ public:
   virtual void ckAboutToMigrate(void); /*default is empty*/
   virtual void ckJustMigrated(void); /*default is empty*/
 
+  //used for out-of-core emulation
+  virtual void ckJustRestored(void); /*default is empty*/
+
   /// Delete this object
   virtual void ckDestroy(void);