separate table for local obj
authorXiang Ni <xiangni2@illinois.edu>
Sun, 20 Jan 2013 07:39:10 +0000 (01:39 -0600)
committerXiang Ni <xiangni2@illinois.edu>
Sun, 20 Jan 2013 07:39:10 +0000 (01:39 -0600)
src/ck-core/cklocation.C
src/ck-core/cklocation.h
src/ck-core/ckmemcheckpoint.C

index 5fb4c435114696061eee925ca4383816bbd2eb50..33f41c1e07a063df5c2b35e4f4fa96d9829baf42 100644 (file)
@@ -2088,6 +2088,7 @@ inline void CkLocMgr::springCleaning(void)
     if (rec->isObsolete(nSprings,idx)) {
       //This record is obsolete-- remove it from the table
       DEBK((AA"Cleaning out old record %s\n"AB,idx2str(idx)));
     if (rec->isObsolete(nSprings,idx)) {
       //This record is obsolete-- remove it from the table
       DEBK((AA"Cleaning out old record %s\n"AB,idx2str(idx)));
+      CkPrintf("[%d][%d]Cleaning out old record %s\n",CmiMyPartition(),CkMyPe(),idx2str(idx));
       hash.remove(*(CkArrayIndex *)&idx);
       delete rec;
       it->seek(-1);//retry this hash slot
       hash.remove(*(CkArrayIndex *)&idx);
       delete rec;
       it->seek(-1);//retry this hash slot
@@ -2100,16 +2101,26 @@ void CkLocMgr::staticSpringCleaning(void *forWhom,double curWallTime) {
        DEBK((AA"Starting spring cleaning at %.2f\n"AB,CkWallTimer()));
        ((CkLocMgr *)forWhom)->springCleaning();
 }
        DEBK((AA"Starting spring cleaning at %.2f\n"AB,CkWallTimer()));
        ((CkLocMgr *)forWhom)->springCleaning();
 }
+static const char *rec2str[]={
+    "base (INVALID)",//Base class (invalid type)
+    "local",//Array element that lives on this Pe
+    "remote",//Array element that lives on some other Pe
+    "buffering",//Array element that was just created
+    "dead"//Deleted element (for debugging)
+};
+
 //doesn't delete if there is extra pe
 void CkLocMgr::flushLocalRecs(void)
 {
   void *objp;
   void *keyp;
 //doesn't delete if there is extra pe
 void CkLocMgr::flushLocalRecs(void)
 {
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
     CkArrayIndex &idx=*(CkArrayIndex *)keyp;
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
     CkArrayIndex &idx=*(CkArrayIndex *)keyp;
+    //if(CmiMyPartition()==1)
+      //CkPrintf("[%d][%d] flush home object %s %p %p\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec,hash.get(*(CkArrayIndex *)&idx));
     if (rec->type() == CkLocRec::local) {
         callMethod((CkLocRec_local*)rec, &CkMigratable::ckDestroy);
         it->seek(-1);//retry this hash slot
     if (rec->type() == CkLocRec::local) {
         callMethod((CkLocRec_local*)rec, &CkMigratable::ckDestroy);
         it->seek(-1);//retry this hash slot
@@ -2123,7 +2134,7 @@ void CkLocMgr::recvChkpIter(int iter)
 {
   void *objp;
   void *keyp;
 {
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
@@ -2139,7 +2150,7 @@ void CkLocMgr::recvChkpIter(int iter)
 void CkLocMgr::resumeFromChkp(){
   void *objp;
   void *keyp;
 void CkLocMgr::resumeFromChkp(){
   void *objp;
   void *keyp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
   CmiImmediateLock(hashImmLock);
   while (NULL!=(objp=it->next(&keyp))) {
     CkLocRec *rec=*(CkLocRec **)objp;
@@ -2316,30 +2327,35 @@ void CkLocMgr::pup(PUP::er &p){
         void *keyp;
         CkVec<int> pe_list;
         CkVec<CkArrayIndex> idx_list;
         void *keyp;
         CkVec<int> pe_list;
         CkVec<CkArrayIndex> idx_list;
-        CkHashtableIterator *it = hash.iterator();
-      while (NULL!=(objp=it->next(&keyp))) {
+        //CkHashtableIterator *it = hash.iterator();
+        CkHashtableIterator *it = homeObjHash.iterator();
+      while (homeObjHash.numObjects()!=0&&NULL!=(objp=it->next(&keyp))) {
           CkLocRec *rec=*(CkLocRec **)objp;
           CkArrayIndex &idx=*(CkArrayIndex *)keyp;
           CkLocRec *rec=*(CkLocRec **)objp;
           CkArrayIndex &idx=*(CkArrayIndex *)keyp;
-            if(rec->type() != CkLocRec::local){
-                if(homePe(idx) == CmiMyPe()){
-                  int pe;
-                  CkArrayIndex max = idx;
-                  pe = rec->lookupProcessor();
-                  idx_list.push_back(max);
-                  pe_list.push_back(pe);
-                    count++;
-                }
-            }
-        }
-        p | count;
 
 
-               // releasing iterator memory
-               delete it;
+          //if(CmiMyPartition()==0&&CkMyPe()==0)
+            //CkPrintf("[%d][%d] pup home object %s rec %s\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec2str[rec->type()]);
+            //CkPrintf("[%d][%d] pup home object %s rec %p\n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec);
+          if(rec!=NULL&&rec->type() != CkLocRec::local){
+              if(homePe(idx) == CmiMyPe()){
+                int pe;
+                CkArrayIndex max = idx;
+                pe = rec->lookupProcessor();
+                idx_list.push_back(max);
+                pe_list.push_back(pe);
+                  count++;
+              }
+          }
+      }
+      p | count;
+
+              // releasing iterator memory
+              delete it;
 
 
-      for(int i=0;i<pe_list.length();i++){
-        CkArrayIndex max = idx_list[i];
-        max.pup(p);
-        p|pe_list[i];
+    for(int i=0;i<pe_list.length();i++){
+      CkArrayIndex max = idx_list[i];
+      max.pup(p);
+      p|pe_list[i];
       }
     /*    it = hash.iterator();
       while (NULL!=(objp=it->next(&keyp))) {
       }
     /*    it = hash.iterator();
       while (NULL!=(objp=it->next(&keyp))) {
@@ -2496,7 +2512,6 @@ CmiBool CkLocMgr::addElement(CkArrayID id,const CkArrayIndex &idx,
                   thisProxy.updateLocation(idx, CkMyPe());  
                 }
 #endif
                   thisProxy.updateLocation(idx, CkMyPe());  
                 }
 #endif
-                
        } else 
        { //rec is *already* local-- must not be the first insertion    
                rec=((CkLocRec_local *)oldRec);
        } else 
        { //rec is *already* local-- must not be the first insertion    
                rec=((CkLocRec_local *)oldRec);
@@ -2591,6 +2606,10 @@ void CkLocMgr::removeFromTable(const CkArrayIndex &idx) {
                CkAbort("CkLocMgr::removeFromTable called on invalid index!");
 #endif
         CmiImmediateLock(hashImmLock);
                CkAbort("CkLocMgr::removeFromTable called on invalid index!");
 #endif
         CmiImmediateLock(hashImmLock);
+       CkLocRec *old=elementNrec(idx);
+        if(old->type()==CkLocRec::local){
+          localHash.remove(*(CkArrayIndex *)&idx);
+        }
        hash.remove(*(CkArrayIndex *)&idx);
         CmiImmediateUnlock(hashImmLock);
 #if CMK_ERROR_CHECKING
        hash.remove(*(CkArrayIndex *)&idx);
         CmiImmediateUnlock(hashImmLock);
 #if CMK_ERROR_CHECKING
@@ -2854,11 +2873,27 @@ void CkLocMgr::iterate(CkLocIterator &dest) {
   delete it;
 }
 
   delete it;
 }
 
+void CkLocMgr::iterateLocal(CkLocIterator &dest) {
+  //Poke through the hash table for local ArrayRecs.
+  void *objp;
+  CkHashtableIterator *it=localHash.iterator();
+  CmiImmediateLock(hashImmLock);
+
+  while (NULL!=(objp=it->next())) {
+    CkLocRec *rec=*(CkLocRec **)objp;
+    if (rec->type()==CkLocRec::local) {
+      CkLocation loc(this,(CkLocRec_local *)rec);
+      dest.addLocation(loc);
+    }
+  }
+  CmiImmediateUnlock(hashImmLock);
+  delete it;
+}
 
 void CkLocMgr::iterateChkpSync(CkLocIterator &dest) {
   //Poke through the hash table for local ArrayRecs.
   void *objp;
 
 void CkLocMgr::iterateChkpSync(CkLocIterator &dest) {
   //Poke through the hash table for local ArrayRecs.
   void *objp;
-  CkHashtableIterator *it=hash.iterator();
+  CkHashtableIterator *it=localHash.iterator();
   CmiImmediateLock(hashImmLock);
 
   while (NULL!=(objp=it->next())) {
   CmiImmediateLock(hashImmLock);
 
   while (NULL!=(objp=it->next())) {
@@ -3330,13 +3365,6 @@ bool CkLocMgr::isRemote(const CkArrayIndex &idx,int *onPe) const
        }
 }
 
        }
 }
 
-static const char *rec2str[]={
-    "base (INVALID)",//Base class (invalid type)
-    "local",//Array element that lives on this Pe
-    "remote",//Array element that lives on some other Pe
-    "buffering",//Array element that was just created
-    "dead"//Deleted element (for debugging)
-};
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
 void CkLocMgr::setDuringMigration(CmiBool _duringMigration){
 
 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
 void CkLocMgr::setDuringMigration(CmiBool _duringMigration){
@@ -3351,6 +3379,8 @@ void CkLocMgr::insertRec(CkLocRec *rec,const CkArrayIndex &idx) {
        insertRecN(rec,idx);
        if (old!=NULL) {
                DEBC((AA"  replaces old rec(%s) for %s\n"AB,rec2str[old->type()],idx2str(idx)));
        insertRecN(rec,idx);
        if (old!=NULL) {
                DEBC((AA"  replaces old rec(%s) for %s\n"AB,rec2str[old->type()],idx2str(idx)));
+       //      if(CmiMyPartition()==1)
+        //          CkPrintf("[%d][%d]replaces old rec(%s) for %s %p new type %s\n",CmiMyPartition(),CkMyPe(),rec2str[old->type()],idx2str(idx),old,rec2str[rec->type()]);
                //There was an old element at this location
                if (old->type()==CkLocRec::local && rec->type()==CkLocRec::local) {
                    if (!CkInRestarting()) {    // ok if it is restarting
                //There was an old element at this location
                if (old->type()==CkLocRec::local && rec->type()==CkLocRec::local) {
                    if (!CkInRestarting()) {    // ok if it is restarting
@@ -3359,6 +3389,10 @@ void CkLocMgr::insertRec(CkLocRec *rec,const CkArrayIndex &idx) {
                    }
                }
                old->beenReplaced();
                    }
                }
                old->beenReplaced();
+                //need to remove it from homeObjHash
+               if (old->type()!=CkLocRec::local && rec->type()==CkLocRec::local) {
+                  homeObjHash.remove(*(CkArrayIndex *)&idx);
+                }
                delete old;
        }
 }
                delete old;
        }
 }
@@ -3368,6 +3402,14 @@ void CkLocMgr::insertRecN(CkLocRec *rec,const CkArrayIndex &idx) {
        DEBC((AA"  adding new rec(%s) for %s\n"AB,rec2str[rec->type()],idx2str(idx)));
         CmiImmediateLock(hashImmLock);
        hash.put(*(CkArrayIndex *)&idx)=rec;
        DEBC((AA"  adding new rec(%s) for %s\n"AB,rec2str[rec->type()],idx2str(idx)));
         CmiImmediateLock(hashImmLock);
        hash.put(*(CkArrayIndex *)&idx)=rec;
+        if(rec->type()==CkLocRec::local){
+          //if(CmiMyPartition()==1)
+            //CkPrintf("[%d][%d] put home object %s type %s %p \n",CmiMyPartition(),CkMyPe(),idx2str(idx),rec2str[rec->type()],rec);
+          localHash.put(*(CkArrayIndex *)&idx)=rec;
+        }
+        if(rec->type()!=CkLocRec::local&&homePe(idx)==CkMyPe()){
+          homeObjHash.put(*(CkArrayIndex *)&idx)=rec;
+        }
         CmiImmediateUnlock(hashImmLock);
 }
 
         CmiImmediateUnlock(hashImmLock);
 }
 
index 106bc93f37a500d20fd5e73e0414d0aca550cc29..45a382047fba70b30e023d6af4abf0e4c6cf7549 100644 (file)
@@ -663,6 +663,7 @@ public:
 
        /// Pass each of our locations (each separate array index) to this destination.
        void iterate(CkLocIterator &dest);
 
        /// Pass each of our locations (each separate array index) to this destination.
        void iterate(CkLocIterator &dest);
+       void iterateLocal(CkLocIterator &dest);
        
        void iterateChkpSync(CkLocIterator &dest);
 
        
        void iterateChkpSync(CkLocIterator &dest);
 
@@ -773,6 +774,10 @@ public:
        CProxyElement_CkLocMgr thislocalproxy;
        /// The core of the location manager: map array index to element representative
        CkHashtableT<CkArrayIndex,CkLocRec *> hash;
        CProxyElement_CkLocMgr thislocalproxy;
        /// The core of the location manager: map array index to element representative
        CkHashtableT<CkArrayIndex,CkLocRec *> hash;
+        //TODO for quick iterating during checkpoint/restart,don't handle if objects migration in load balancing 
+       CkHashtableT<CkArrayIndex,CkLocRec *> localHash;
+        //TODO for quick iterating objects am home pe to but not on the local processor,don't handle if objects migration in load balancing 
+       CkHashtableT<CkArrayIndex,CkLocRec *> homeObjHash;
        CmiImmediateLockType hashImmLock;
 
        /// This flag is set while we delete an old copy of a migrator
        CmiImmediateLockType hashImmLock;
 
        /// This flag is set while we delete an old copy of a migrator
index 26da67f9ed6878182f316eb20c62cd6926f8375f..bbfc9d22c2ded47111c7a48b5b3f8c97d22b2210 100644 (file)
@@ -391,8 +391,8 @@ CkMemCheckPT::CkMemCheckPT(int w)
 #if CMK_CONVERSE_MPI
   void pingBuddy();
   void pingCheckHandler();
 #if CMK_CONVERSE_MPI
   void pingBuddy();
   void pingCheckHandler();
-  //CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
-  //CcdCallOnCondition(CcdPERIODIC_1s,(CcdVoidFn)pingCheckHandler,NULL);
+  CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
+  CcdCallOnCondition(CcdPERIODIC_1s,(CcdVoidFn)pingCheckHandler,NULL);
 #endif
   chkpTable[0] = NULL;
   chkpTable[1] = NULL;
 #endif
   chkpTable[0] = NULL;
   chkpTable[1] = NULL;
@@ -424,8 +424,8 @@ void CkMemCheckPT::pup(PUP::er& p)
 #if CMK_CONVERSE_MPI
     void pingBuddy();
     void pingCheckHandler();
 #if CMK_CONVERSE_MPI
     void pingBuddy();
     void pingCheckHandler();
-    //CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
-    //CcdCallOnCondition(CcdPERIODIC_1s,(CcdVoidFn)pingCheckHandler,NULL);
+    CcdCallOnCondition(CcdPERIODIC_100ms,(CcdVoidFn)pingBuddy,NULL);
+    CcdCallOnCondition(CcdPERIODIC_1s,(CcdVoidFn)pingCheckHandler,NULL);
 #endif
     maxIter = -1;
     recvIterCount = 0;
 #endif
     maxIter = -1;
     recvIterCount = 0;
@@ -661,7 +661,7 @@ void pupAllElements(PUP::er &p){
   p | numElements;
   if(!p.isUnpacking()){
     MemElementPacker packer(p);
   p | numElements;
   if(!p.isUnpacking()){
     MemElementPacker packer(p);
-    CKLOCMGR_LOOP(mgr->iterate(packer););
+    CKLOCMGR_LOOP(mgr->iterateLocal(packer););
     packer.writeCheckpoint();
   }
 #endif
     packer.writeCheckpoint();
   }
 #endif
@@ -2265,7 +2265,7 @@ void CkMemCheckPT::RollBack(){
     {
 #if CMK_MEM_CHECKPOINT
       double now = CmiWallTimer();
     {
 #if CMK_MEM_CHECKPOINT
       double now = CmiWallTimer();
-      if (lastPingTime > 0 && now - lastPingTime > 2 && !CkInLdb() && !CkInRestarting() && !CkInCheckpointing()) {
+      if (lastPingTime > 0 && now - lastPingTime > 4 && !CkInLdb() && !CkInRestarting() && !CkInCheckpointing()) {
         //if (lastPingTime > 0 && now - lastPingTime > 2 && !CkInLdb()) {
         int i, pe, buddy;
         // tell everyone the buddy dies
         //if (lastPingTime > 0 && now - lastPingTime > 2 && !CkInLdb()) {
         int i, pe, buddy;
         // tell everyone the buddy dies