bug fix (static varaible), optimizations (no copying for in-node msg) for SMP.
authorGengbin Zheng <gzheng@upcrc2.cs.uiuc.edu>
Mon, 26 Apr 2010 16:28:09 +0000 (11:28 -0500)
committerGengbin Zheng <gzheng@upcrc2.cs.uiuc.edu>
Mon, 26 Apr 2010 16:28:09 +0000 (11:28 -0500)
src/conv-ldb/cldb.neighbor.c

index 1dc078d2436b444fb0fb6d58b02657c037f81bdb..2b3cba49a41230bcae4d11b6f25fd980c31202ae 100644 (file)
@@ -31,6 +31,7 @@ CpvStaticDeclare(int, CldAskLoadHandlerIndex);
 CpvStaticDeclare(int, MinLoad);
 CpvStaticDeclare(int, MinProc);
 CpvStaticDeclare(int, Mindex);
+CpvStaticDeclare(int, start);
 
 void LoadNotifyFn(int l)
 {
@@ -54,7 +55,7 @@ static void CldEndIdle(void *dummy)
   CpvAccess(CldData)->lastCheck = -1;
 }
 
-static void CldStillIdle(void *dummy)
+static void CldStillIdle(void *dummy, double curT)
 {
   int i;
   double startT;
@@ -62,7 +63,7 @@ static void CldStillIdle(void *dummy)
   int myload;
   CldProcInfo  cldData = CpvAccess(CldData);
 
-  double now = CmiWallTimer();
+  double now = curT;
   double lt = cldData->lastCheck;
   /* only ask for work every 20ms */
   if (cldData->sent && (lt!=-1 && now-lt< PERIOD*0.001)) return;
@@ -170,11 +171,10 @@ void CldSendLoad()
 int CldMinAvg()
 {
   int sum=0, i;
-  static int start=-1;
 
   int nNeighbors = CpvAccess(numNeighbors);
-  if (start == -1)
-    start = CmiMyPe() % nNeighbors;
+  if (CpvAccess(start) == -1)
+    CpvAccess(start) = CmiMyPe() % nNeighbors;
 
 #if 0
     /* update load from neighbors for multicore */
@@ -182,20 +182,20 @@ int CldMinAvg()
     CpvAccess(neighbors)[i].load = CldLoadRank(CpvAccess(neighbors)[i].pe);
   }
 #endif
-  CpvAccess(MinProc) = CpvAccess(neighbors)[start].pe;
-  CpvAccess(MinLoad) = CpvAccess(neighbors)[start].load;
-  sum = CpvAccess(neighbors)[start].load;
-  CpvAccess(Mindex) = start;
+  CpvAccess(MinProc) = CpvAccess(neighbors)[CpvAccess(start)].pe;
+  CpvAccess(MinLoad) = CpvAccess(neighbors)[CpvAccess(start)].load;
+  sum = CpvAccess(neighbors)[CpvAccess(start)].load;
+  CpvAccess(Mindex) = CpvAccess(start);
   for (i=1; i<nNeighbors; i++) {
-    start = (start+1) % nNeighbors;
-    sum += CpvAccess(neighbors)[start].load;
-    if (CpvAccess(MinLoad) > CpvAccess(neighbors)[start].load) {
-      CpvAccess(MinLoad) = CpvAccess(neighbors)[start].load;
-      CpvAccess(MinProc) = CpvAccess(neighbors)[start].pe;
-      CpvAccess(Mindex) = start;
+    CpvAccess(start) = (CpvAccess(start)+1) % nNeighbors;
+    sum += CpvAccess(neighbors)[CpvAccess(start)].load;
+    if (CpvAccess(MinLoad) > CpvAccess(neighbors)[CpvAccess(start)].load) {
+      CpvAccess(MinLoad) = CpvAccess(neighbors)[CpvAccess(start)].load;
+      CpvAccess(MinProc) = CpvAccess(neighbors)[CpvAccess(start)].pe;
+      CpvAccess(Mindex) = CpvAccess(start);
     }
   }
-  start = (start+2) % nNeighbors;
+  CpvAccess(start) = (CpvAccess(start)+2) % nNeighbors;
   sum += CldLoad();
   if (CldLoad() < CpvAccess(MinLoad)) {
     CpvAccess(MinLoad) = CldLoad();
@@ -205,13 +205,13 @@ int CldMinAvg()
   return i;
 }
 
-void CldBalance()
+void CldBalance(void *dummy, double curT)
 {
   int i, j, overload, numToMove=0, avgLoad;
   int totalUnderAvg=0, numUnderAvg=0, maxUnderAvg=0;
 
 #ifndef CMK_OPTIMIZE
-  double startT = CmiWallTimer();
+  double startT = curT;
 #endif
 
 /*CmiPrintf("[%d] CldBalance %f\n", CmiMyPe(), startT);*/
@@ -288,6 +288,7 @@ void CldHandler(void *msg)
   ifn = (CldInfoFn)CmiHandlerToFunction(CmiGetInfo(msg));
   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
   CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
+  /*CsdEnqueueGeneral(msg, queueing, priobits, prioptr);*/
 }
 
 void CldEnqueueGroup(CmiGroup grp, void *msg, int infofn)
@@ -339,6 +340,12 @@ void CldEnqueue(int pe, void *msg, int infofn)
       pe = CmiMyPe();
     else
       pe = CpvAccess(MinProc);
+#if CMK_NODE_QUEUE_AVAILABLE
+    if (CmiNodeOf(pe) == CmiMyNode()) {
+      CldNodeEnqueue(CmiMyNode(), msg, infofn);
+      return;
+    }
+#endif
     /* always pack the message because the message may be move away
        to a different processor later by CldGetToken() */
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
@@ -361,12 +368,13 @@ void CldEnqueue(int pe, void *msg, int infofn)
   } 
   else if ((pe == CmiMyPe()) || (CmiNumPes() == 1)) {
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
-    CmiSetInfo(msg,infofn);
+    /*CmiSetInfo(msg,infofn);*/
     CsdEnqueueGeneral(msg, CQS_QUEUEING_LIFO, priobits, prioptr);
+    /*CsdEnqueueGeneral(msg, queueing, priobits, prioptr);*/
   }
   else {
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
-    if (pfn) {
+    if (pfn && CmiNodeOf(pe) != CmiMyNode()) {
       pfn(&msg);
       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
     }
@@ -406,13 +414,14 @@ void CldNodeEnqueue(int node, void *msg, int infofn)
     }
     else {
       ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
-      CmiSetInfo(msg,infofn);
-      CldPutToken(msg);
+      /* CmiSetInfo(msg,infofn);
+       CldPutToken(msg); */
+      CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
     }
   }
   else if ((node == CmiMyNode()) || (CmiNumPes() == 1)) {
     ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
-    CmiSetInfo(msg,infofn);
+//    CmiSetInfo(msg,infofn);
     CsdNodeEnqueueGeneral(msg, queueing, priobits, prioptr);
   } 
   else {
@@ -510,12 +519,14 @@ void CldGraphModuleInit(char **argv)
   CpvInitialize(int, MinLoad);
   CpvInitialize(int, Mindex);
   CpvInitialize(int, MinProc);
+  CpvInitialize(int, start);
   CpvInitialize(CmiGroup, neighborGroup);
   CpvInitialize(CldNeighborData, neighbors);
   CpvInitialize(int, CldBalanceHandlerIndex);
   CpvInitialize(int, CldLoadResponseHandlerIndex);
   CpvInitialize(int, CldAskLoadHandlerIndex);
 
+  CpvAccess(start) = -1;
   CpvAccess(CldData) = (CldProcInfo)CmiAlloc(sizeof(struct CldProcInfo_s));
   CpvAccess(CldData)->lastCheck = -1;
   CpvAccess(CldData)->sent = 0;
@@ -566,7 +577,7 @@ void CldGraphModuleInit(char **argv)
 #if CMK_MULTICORE
     CmiNodeBarrier();
 #endif
-    CldBalance();
+    CldBalance(NULL, CmiWallTimer());
   }
 
 #if 1