fix a bug in seed load balancer about begin idle
authorYanhua YanhuaSunLaptop <yanhuasun@yanhua-suns-macbook-pro-313.local>
Fri, 11 Feb 2011 06:37:29 +0000 (00:37 -0600)
committerYanhua YanhuaSunLaptop <yanhuasun@yanhua-suns-macbook-pro-313.local>
Fri, 11 Feb 2011 06:37:29 +0000 (00:37 -0600)
src/conv-ldb/cldb.c
src/conv-ldb/cldb.neighbor.c
src/conv-ldb/cldb.workstealing.c

index 0ecb57a8adcdf7f9d013f86e208c4b265e73641a..a3d89e2feb0889e36eb315b7f1edc5f54c19d52a 100644 (file)
@@ -176,7 +176,7 @@ void CldPutToken(char *msg)
 }
 
 
-static void * _CldGetTokenMsg(CldProcInfo proc)
+static inline void * _CldGetTokenMsg(CldProcInfo proc)
 {
   CldToken tok;
   void *msg;
@@ -205,7 +205,7 @@ void CldGetToken(char **msg)
 
 /* called at node level */
 /* get token from processor of rank pe */
-static void CldGetTokenFromRank(char **msg, int rank)
+static inline void CldGetTokenFromRank(char **msg, int rank)
 {
   CldProcInfo proc = CpvAccessOther(CldProc, rank);
   CmiNodeLock cldlock = CpvAccessOther(cldLock, rank);
@@ -301,9 +301,6 @@ void CldMultipleSend(int pe, int numToSend, int rank, int immed)
   CldInfoFn ifn;
   CldPackFn pfn;
 
-  if (numToSend == 0)
-    return;
-
   msgs = (char **)calloc(numToSend, sizeof(char *));
   msgSizes = (int *)calloc(numToSend, sizeof(int));
 
index 3ed96802c36819903c825400d43f227a904a27e5..f7ea6b04447590d82da1fecf4efdc493afde9e58 100644 (file)
@@ -590,7 +590,7 @@ void CldGraphModuleInit(char **argv)
   if (_lbsteal) {
   /* register idle handlers - when idle, keep asking work from neighbors */
   CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,
-      (CcdVoidFn) CldStillIdle, NULL);
+      (CcdVoidFn) CldBeginIdle, NULL);
   CcdCallOnConditionKeep(CcdPROCESSOR_STILL_IDLE,
       (CcdVoidFn) CldStillIdle, NULL);
     if (CmiMyPe() == 0) 
index d63567b7ab674bdbf5a6ce3f321fc7c7adb3b1fd..ed87ca32c0144e8bed9751a4cf6df15a8f38d0b3 100644 (file)
@@ -42,17 +42,9 @@ char *CldGetStrategy(void)
 }
 
 /* since I am idle, ask for work from neighbors */
-static void CldBeginIdle(void *dummy)
-{
-  CpvAccess(CldData)->lastCheck = CmiWallTimer();
-}
 
-static void CldEndIdle(void *dummy)
-{
-  CpvAccess(CldData)->lastCheck = -1;
-}
 
-static void CldStillIdle(void *dummy, double curT)
+static void CldBeginIdle(void *dummy)
 {
   int i;
   double startT;
@@ -61,29 +53,25 @@ static void CldStillIdle(void *dummy, double curT)
   CldProcInfo  cldData = CpvAccess(CldData);
   int  victim;
   int mype;
-
-  double now = curT;
-  double lt = cldData->lastCheck;
-  /* only ask for work every 20ms */
-  if (cldData->sent && (lt!=-1 && now-lt< PERIOD*0.001)) return;
-  cldData->lastCheck = now;
+  int numpes;
 
   myload = CldLoad();
   if (myload > 0) return;
 
-  msg.from_pe = CmiMyPe();
   mype = CmiMyPe();
-
+  msg.from_pe = mype;
+  numpes = CmiNumPes();
   do{
-      victim = (((CrnRand()+mype)&0x7FFFFFFF)%CmiNumPes());
+      victim = (((CrnRand()+mype)&0x7FFFFFFF)%numpes);
   }while(victim == mype);
 
   CmiSetHandler(&msg, CpvAccess(CldAskLoadHandlerIndex));
+#if IDLE_IMMEDIATE
   /* fixme */
-  //CmiBecomeImmediate(&msg);
+  CmiBecomeImmediate(&msg);
+#endif
   msg.to_rank = CmiRankOf(victim);
   CmiSyncSend(victim, sizeof(requestmsg),(char *)&msg);
-  cldData->sent = 1;
 
 #if CMK_TRACE_ENABLED && TRACE_USEREVENTS
   traceUserBracketEvent(cldData->idleEvt, now, CmiWallTimer());
@@ -103,7 +91,7 @@ static void CldAskLoadHandler(requestmsg *msg)
   sendLoad = myload / 2; 
   receiver = msg->from_pe;
   /* only give you work if I have more than 1 */
-  if (sendLoad>0) {
+  if (myload>LOADTHRESH) {
       if(_stealonly1) sendLoad = 1;
       rank = CmiMyRank();
       if (msg->to_rank != -1) rank = msg->to_rank;
@@ -296,9 +284,7 @@ void CldGraphModuleInit(char **argv)
 #if 1
   /* register idle handlers - when idle, keep asking work from neighbors */
   CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,
-      (CcdVoidFn) CldStillIdle, NULL);
-  CcdCallOnConditionKeep(CcdPROCESSOR_STILL_IDLE,
-      (CcdVoidFn) CldStillIdle, NULL);
+      (CcdVoidFn) CldBeginIdle, NULL);
     if (CmiMyPe() == 0) 
       CmiPrintf("Charm++> Work stealing is enabled. \n");
 #endif