when picking buddy processors, always find a processor on next *physical* processors...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 28 Oct 2009 20:43:31 +0000 (20:43 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 28 Oct 2009 20:43:31 +0000 (20:43 +0000)
src/ck-core/ckmemcheckpoint.C
src/ck-core/ckmemcheckpoint.h

index 66c3e1e33969de029d2e24aeaa530faa61320d4e..db6175914f92bdd33b3d709529d489c318955c4e 100644 (file)
@@ -47,12 +47,15 @@ TODO:
 #include "conv-ccs.h"
 #include <signal.h>
 
-#define DEBUGF      // CkPrintf
+// pick buddy processor from a different physical node
+#define NODE_CHECKPOINT                        1
 
 // assume NO extra processors--1
 // assume extra processors--0
 #define CK_NO_PROC_POOL                                1
 
+#define DEBUGF      // CkPrintf
+
 // static, so that it is accessible from Converse part
 int CkMemCheckPT::inRestarting = 0;
 double CkMemCheckPT::startTime;
@@ -83,6 +86,32 @@ CpvDeclare(CkProcCheckPTMessage*, procChkptBuf);
 // FIXME: avoid crashed processors
 inline int ChkptOnPe() { return (CkMyPe()+1)%CkNumPes(); }
 
+inline int CkMemCheckPT::BuddyPE(int pe)
+{
+  int budpe;
+#if NODE_CHECKPOINT
+    // buddy is the processor with same rank on next physical node
+  int r1 = CmiPhysicalRank(pe);
+  int budnode = CmiPhysicalNodeID(pe);
+printf("CmiPhysicalNodeID %d rank: %d\n", CmiPhysicalNodeID(pe), CmiPhysicalRank(pe));
+  do {
+    budnode = (budnode+1)%CmiNumPhysicalNodes();
+    budpe = (CmiGetFirstPeOnPhysicalNode(budnode) + r1) % 
+                                   CmiNumPesOnPhysicalNode(budnode);
+printf("CmiGetFirstPeOnPhysicalNode: %d CmiNumPesOnPhysicalNode: %d\n", CmiGetFirstPeOnPhysicalNode(budnode), CmiNumPesOnPhysicalNode(budnode));
+  } while (isFailed(budpe));
+  if (budpe == pe) {
+    CmiPrintf("[%d] Error: failed to find a buddy processor on a different node.\n", pe);
+    CmiAbort("Failed to a buddy processor");
+  }
+#else
+  budpe = pe;
+  while (budpe == pe || isFailed(budPe)) 
+          budPe = (budPe+1)%CkNumPes();
+#endif
+  return budpe;
+}
+
 // called in array element constructor
 // choose and register with 2 buddies for checkpoiting 
 #if CMK_MEM_CHECKPOINT
@@ -92,7 +121,7 @@ void ArrayElement::init_checkpt() {
         if (thisArray->getLocMgr()->firstManager->mgr!=thisArray) return;
 
         budPEs[0] = CkMyPe();
-        budPEs[1] = (CkMyPe()+1)%CkNumPes();
+        budPEs[1] = CProxy_CkMemCheckPT(ckCheckPTGroupID).ckLocalBranch()->BuddyPE(CkMyPe());
        CmiAssert(budPEs[0] != budPEs[1]);
         // inform checkPTMgr
         CProxy_CkMemCheckPT checkptMgr(ckCheckPTGroupID);
@@ -587,7 +616,7 @@ void CkMemCheckPT::restart(int diePe)
   double curTime = CmiWallTimer();
   if (CkMyPe() == diePe)
     CkPrintf("[%d] Process data restored in %f seconds\n", CkMyPe(), curTime - startTime);
-  stage = "resetLB";
+  stage = (char*)"resetLB";
   startTime = curTime;
   CkPrintf("[%d] CkMemCheckPT ----- restart.\n",CkMyPe());
 
@@ -616,7 +645,7 @@ void CkMemCheckPT::removeArrayElements()
   int len = ckTable.length();
   double curTime = CmiWallTimer();
   CkPrintf("[%d] CkMemCheckPT ----- %s len:%d in %f seconds.\n",CkMyPe(),stage,len,curTime-startTime);
-  stage = "removeArrayElements";
+  stage = (char*)"removeArrayElements";
   startTime = curTime;
 
   if (cpCallback.isInvalid()) CkAbort("Didn't set restart callback\n");;
index 98c155b82033a6dbb74120f72596739c405f41a9..3459c9f3fb70290dc85cc05b1dc4938589f60288 100644 (file)
@@ -60,6 +60,7 @@ public:
   CkMemCheckPT(CkMigrateMessage *m):CBase_CkMemCheckPT(m) {}
   virtual ~CkMemCheckPT();
   void pup(PUP::er& p);
+  inline int BuddyPE(int pe);
   void doItNow(int sp, CkCallback &);
   void restart(int failedPe);
   void removeArrayElements();