use CldCountTokens instead of CldLoad() to estimate the current load. CldLoad() has...
authorGengbin Zheng <gzheng@bp-login1.(none)>
Tue, 1 Mar 2011 22:35:39 +0000 (16:35 -0600)
committerGengbin Zheng <gzheng@bp-login1.(none)>
Tue, 1 Mar 2011 22:35:39 +0000 (16:35 -0600)
src/conv-ldb/cldb.workstealing.c

index bd808f173a9e91fcb9a269b70f5fd5bad2c067c3..7e07ef690480f45c0bce2652bd703dbe9acbc96d 100644 (file)
@@ -49,9 +49,12 @@ static void StealLoad()
   /* CcdRaiseCondition(CcdUSER); */
 
   if (CpvAccess(isStealing)) return;    /* already stealing, return */
-  CpvAccess(isStealing) = 1;
 
-  myload = CldLoad();
+  //myload = CldLoad();
+  myload = CldCountTokens();
+  if(myload>0) return;
+
+  CpvAccess(isStealing) = 1;
 
   mype = CmiMyPe();
   msg.from_pe = mype;
@@ -77,7 +80,7 @@ void LoadNotifyFn(int l)
 {
     if(workstealingproactive)
     {
-        if(CldLoad() < 3)
+        if(CldCountTokens() < 3)
             StealLoad();
     }
 }
@@ -86,14 +89,15 @@ void LoadNotifyFn(int l)
 static void CldBeginIdle(void *dummy)
 {
     StealLoad();
-
 }
+
 /* immediate message handler, work at node level */
 /* send some work to requested proc */
 static void CldAskLoadHandler(requestmsg *msg)
 {
   int receiver, rank, recvIdx, i;
-  int myload = CldLoad();
+  //int myload = CldLoad();
+  int myload = CldCountTokens();
 
   int sendLoad;
   sendLoad = myload / 2; 
@@ -122,15 +126,14 @@ void  CldAckNoTaskHandler(requestmsg *msg)
   int victim; 
   int notaskpe = msg->from_pe;
   int mype = CmiMyPe();
+  int numpes = CmiNumPes();
 
   /* CcdRaiseCondition(CcdUSER); */
 
-  if (CmiNumPes()==2) victim = 2-mype;
-  else
   do{
       /*victim = (((CrnRand()+notaskpe)&0x7FFFFFFF)%CmiNumPes());*/
-      victim = (((CrnRand())&0x7FFFFFFF)%CmiNumPes());
-  }while(victim == mype || victim == notaskpe);
+      victim = (((CrnRand()+mype)&0x7FFFFFFF)%numpes);
+  }while(victim == mype);
 
   /* reuse msg */
   msg->to_rank = CmiRankOf(victim);
@@ -292,8 +295,6 @@ void CldGraphModuleInit(char **argv)
   if(CmiNumPes() > 1)
     CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,
       (CcdVoidFn) CldBeginIdle, NULL);
-  if (CmiMyPe() == 0) 
-      CmiPrintf("Charm++> Work stealing is enabled. \n");
   if(workstealingproactive && CmiMyPe() == 0)
       CmiPrintf("Charm++> Steal work when load is fewer than 3. \n");
 }