added a command line option +lb_gvt_pose to set the gvt intervals between load balancing.
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 31 Mar 2010 03:07:46 +0000 (22:07 -0500)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 31 Mar 2010 03:07:46 +0000 (22:07 -0500)
modified etrans.pl to set usesAtSync in sim array.

src/libs/ck-libs/pose/etrans.pl
src/libs/ck-libs/pose/gvt.C
src/libs/ck-libs/pose/gvt.ci
src/libs/ck-libs/pose/gvt.h
src/libs/ck-libs/pose/pose.C
src/libs/ck-libs/pose/pose_config.h

index 9509574714c792ceb724aa7aa2f64e712d0bd696..92df9b3f8660d788b4aa0117ce9eda309a0ebe20 100755 (executable)
@@ -629,6 +629,7 @@ foreach my $incfile ($inC,@otherfiles)
        #create the wrapper parent class constructor
        $outChandle->print($returntype." ") if($returntype);
        $outChandle->print(join('',$class,"::",$method,'(',$message,' *',$messagename,"){\n"));
+       $outChandle->print("  usesAtSync=true;\n");
        $outChandle->print("#ifndef CMK_OPTIMIZE\n");
        $outChandle->print("  if(pose_config.stats)\n");
        $outChandle->print("    {localStats->TimerStart(SIM_TIMER);}\n");
index d69279d06aa5157f4dfe817839b06241348fcd01..c0cafced605ba7b12e2ef84136cc4f6806113289 100644 (file)
@@ -75,6 +75,8 @@ PVT::PVT()
   parCheckpointInProgress = 0;
   parLastCheckpointGVT = 0;
   parLastCheckpointTime = parStartTime = CmiWallTimer();
+  parLBInProgress = 0;
+  parLastLBGVT = 0;
 #ifndef CMK_OPTIMIZE
   if(pose_config.stats)
     localStats->TimerStop();
@@ -89,6 +91,7 @@ void PVT::pup(PUP::er &p) {
   p|gvtTurn; p|specEventCount; p|eventCount;
   p|startPhaseActive; p|parStartTime; p|parCheckpointInProgress;
   p|parLastCheckpointGVT; p|parLastCheckpointTime;
+  p|parLBInProgress; p|parLastLBGVT;
   p|optGVT; p|conGVT; p|rdone;
 
   if (p.isUnpacking()) {
@@ -264,6 +267,13 @@ void PVT::setGVT(GVTMsg *m)
     parCheckpointInProgress = 1;
     parLastCheckpointTime = CmiWallTimer();
     CkStartQD(cb);
+  } else if ((CkMyPe() == 0) && (parLBInProgress == 0) && 
+      (((pose_config.lb_gvt_interval > 0) && (estGVT >= (parLastLBGVT + pose_config.lb_gvt_interval))))) {
+    // wait for quiescence to occur before checkpointing
+    eventMsg *dummyMsg = new eventMsg();
+    CkCallback cb(CkIndex_PVT::beginLoadbalancing(dummyMsg), CkMyPe(), ThePVT);
+    parLBInProgress = 1;
+    CkStartQD(cb);
   } else {
     // skip checkpointing
     eventMsg *dummyMsg = new eventMsg();
@@ -285,7 +295,7 @@ void PVT::beginCheckpoint(eventMsg *m) {
 
 void PVT::beginLoadbalancing(eventMsg *m) {
   CkFreeMsg(m);
-  if (parCheckpointInProgress) {  // ensure this only happens once
+  if (parLBInProgress) {  // ensure this only happens once
     CProxy_PVT p(ThePVT);
     p.callAtSync();
   }
@@ -330,6 +340,26 @@ void PVT::resumeAfterCheckpoint(eventMsg *m) {
 #endif
 }
 
+void PVT::resumeAfterLB(eventMsg *m) {
+  if (parLBInProgress) {
+    CkPrintf("POSE: load balancing complete on processor %d at GVT=%lld time=%.1f sec\n", CkMyPe(), estGVT, CmiWallTimer() - parStartTime);
+    parLBInProgress = 0;
+    parLastLBGVT = estGVT;
+  }
+  CkFreeMsg(m);
+  CProxy_PVT p(ThePVT);
+  startPhaseActive = 0;
+  prioBcMsg *startMsg = new (8*sizeof(int)) prioBcMsg;
+  startMsg->bc = 1;
+  *((int *)CkPriorityPtr(startMsg)) = 0;
+  CkSetQueueing(startMsg, CK_QUEUEING_IFIFO); 
+  p[CkMyPe()].startPhase(startMsg);
+#ifndef CMK_OPTIMIZE
+  if(pose_config.stats)
+    localStats->TimerStop();
+#endif
+}
+
 /// Register poser with PVT
 int PVT::objRegister(int arrIdx, POSE_TimeType safeTime, int sync, sim *myPtr)
 {
index c35fb4751bebdfd60a0c1488c051f6c0ecb2468f..a1c6b051bae9c01e884f1933117a7fdae3b02673 100644 (file)
@@ -19,6 +19,7 @@ module gvt {
     entry void beginCheckpoint(eventMsg *);
     entry void resumeAfterCheckpoint(eventMsg *);
     entry void beginLoadbalancing(eventMsg *);
+    entry void resumeAfterLB(eventMsg *);
     entry void callAtSync();
     entry [expedited] void setGVT(GVTMsg *);
     entry [expedited] void reportReduce(UpdateMsg *);
index 54b26fe2f5fd28c7b4d8799ac7b9ea80c60141e2..4c6610f9eb315fbc17de76a61445acb74362283f 100644 (file)
@@ -101,6 +101,10 @@ class PVT : public Group {
   int parCheckpointInProgress;
   /// GVT at which the last checkpoint was performed
   POSE_TimeType parLastCheckpointGVT;
+  /// indicates if load balancing is in progress
+  int parLBInProgress;
+  /// GVT at which the last load balancing was performed
+  POSE_TimeType parLastLBGVT;
   /// Time at which the last checkpoint was performed
   double parLastCheckpointTime;
   /* things which used to be member function statics */
@@ -135,6 +139,7 @@ class PVT : public Group {
   /// ENTRY: resume after checkpointing, restarting, or if checkpointing doesn't occur
   void resumeAfterCheckpoint(eventMsg *m);
   void beginLoadbalancing(eventMsg *m);
+  void resumeAfterLB(eventMsg *m);
   void callAtSync();
   void doneLB();
 
index ae888da21cbb976b03bba1613ca983c3eba035d7..5c08ced9649f36f998efd957ffcc35738adbbe23 100644 (file)
@@ -336,6 +336,12 @@ void POSEreadCmdLine()
     CmiPrintf("WARNING: checkpoint GVT and time values both set; ignoring time value\n");
     pose_config.checkpoint_time_interval = 0;
   }
+  /* load balancing */
+  CmiGetArgIntDesc(argv, "+lb_gvt_pose", &pose_config.lb_gvt_interval, 
+                  "Load balancing approximately every <gvt #> of GVT ticks; default = 0 = no lb");
+  if (pose_config.lb_gvt_interval < 0) {
+    CmiAbort("+lb_gvt_pose value must be >= 0; 0 = no load balancing\n");
+  }
   /* max_iteration seems to be defunct */
   //  CmiGetArgIntDesc(argv, "+FEmax_pose", &pose_config.max_iter , "Sets max events executed in single forward execution step.  Default to 100.");
   CmiGetArgIntDesc(argv, "+leash_specwindow_pose", &pose_config.spec_window , "Sets speculative window behavior.");
index 9b0aed88e4db99c4548466def85afb53aec8cc22..52517703dfb5da3052d6ef03623ae5bfea1ec3c0 100644 (file)
@@ -125,6 +125,7 @@ class POSE_Config
   bool deterministic;
   int checkpoint_gvt_interval;
   int checkpoint_time_interval;
+  int lb_gvt_interval;
   /* one very long initializer line */
   POSE_Config() :
 #ifdef POSE_STATS_ON                   //w
@@ -180,7 +181,8 @@ class POSE_Config
     deterministic(false),
 #endif
     checkpoint_gvt_interval(0),
-    checkpoint_time_interval(0)
+    checkpoint_time_interval(0),
+    lb_gvt_interval(0)
     {// all handled in initializer
     }
 };