the load balancing with load exchange with neigbors now is also implemented in immedi...
authorGengbin Zheng <gzheng@illinois.edu>
Wed, 3 Dec 2003 03:42:15 +0000 (03:42 +0000)
committerGengbin Zheng <gzheng@illinois.edu>
Wed, 3 Dec 2003 03:42:15 +0000 (03:42 +0000)
src/conv-ldb/cldb.c
src/conv-ldb/cldb.h
src/conv-ldb/cldb.neighbor.c

index 8b56ead8eb100ffedba6f3c3cc2a4394ada04d3a..a2a631dc8d686fad84e41eb8aeb29c101e202033 100644 (file)
@@ -147,6 +147,7 @@ void CldPutToken(char *msg)
   /* add token to the scheduler */
   CmiSetHandler(tok, proc->tokenhandleridx);
   ifn(msg, &pfn, &len, &queueing, &priobits, &prioptr);
+  /* not sigio or thread safe */
   CsdEnqueueGeneral(tok, queueing, priobits, prioptr);
   CmiUnlock(CpvAccess(cldLock));
 }
@@ -259,7 +260,11 @@ void CldModuleGeneralInit(char **argv)
   registerLBTopos();
 }
 
-void CldMultipleSend(int pe, int numToSend, int rank)
+/* function can be called in an immediate handler at node level
+   rank specify the rank of processor for the node to represent
+   This function can also send as immeidate messages
+*/
+void CldMultipleSend(int pe, int numToSend, int rank, int immed)
 {
   char **msgs;
   int len, queueing, priobits, *msgSizes, i, numSent, done=0, parcelSize;
@@ -285,6 +290,7 @@ void CldMultipleSend(int pe, int numToSend, int rank)
        msgSizes[i] = len;
        parcelSize += len;
        CldSwitchHandler(msgs[i], CpvAccessOther(CldBalanceHandlerIndex, rank));
+        if (immed) CmiBecomeImmediate(msgs[i]);
       }
       else {
        done = 1;
@@ -298,15 +304,18 @@ void CldMultipleSend(int pe, int numToSend, int rank)
       }
     }
     if (numSent > 1) {
-      CmiMultipleSend(pe, numSent, msgSizes, msgs);
+      if (immed)
+        CmiMultipleIsend(pe, numSent, msgSizes, msgs);
+      else
+        CmiMultipleSend(pe, numSent, msgSizes, msgs);
       for (i=0; i<numSent; i++)
        CmiFree(msgs[i]);
       CpvAccessOther(CldRelocatedMessages, rank) += numSent;
       CpvAccessOther(CldMessageChunks, rank)++;
     }
     else if (numSent == 1) {
-      CmiSyncSend(pe, msgSizes[0], msgs[0]);
-      CmiFree(msgs[0]);
+      if (immed) CmiBecomeImmediate(msgs[0]);
+      CmiSyncSendAndFree(pe, msgSizes[0], msgs[0]);
       CpvAccessOther(CldRelocatedMessages, rank)++;
       CpvAccessOther(CldMessageChunks, rank)++;
     }
index 5b08c95676d6ed2a926eaa482d0eaa8b228dca8f..bd78e0c7e1c6757fa60a236faa6b7e8de54627e5 100644 (file)
@@ -13,7 +13,7 @@ CpvExtern(int, CldLoadNotify);
 
 CpvExtern(CmiNodeLock, cldLock);
 
-void CldMultipleSend(int pe, int numToSend, int rank);
+void CldMultipleSend(int pe, int numToSend, int rank, int immed);
 void CldSetPEBitVector(const char *);
 
 int  CldLoad(void);
index 1f7f45fc08b1a2a08baa0991866111ed7b4fe0b2..bc9f1808ab47ee5c1f0c76414492ba52cec18ba4 100644 (file)
@@ -25,11 +25,11 @@ extern char *_lbtopo;                       /* topology name string */
 void gengraph(int, int, int, int *, int *);
 
 CpvStaticDeclare(CldProcInfo, CldData);
-CpvDeclare(int, CldLoadResponseHandlerIndex);
-CpvDeclare(int, CldAskLoadHandlerIndex);
-CpvDeclare(int, MinLoad);
-CpvDeclare(int, MinProc);
-CpvDeclare(int, Mindex);
+CpvStaticDeclare(int, CldLoadResponseHandlerIndex);
+CpvStaticDeclare(int, CldAskLoadHandlerIndex);
+CpvStaticDeclare(int, MinLoad);
+CpvStaticDeclare(int, MinProc);
+CpvStaticDeclare(int, Mindex);
 
 void LoadNotifyFn(int l)
 {
@@ -64,7 +64,7 @@ static void CldStillIdle(void *dummy)
   double now = CmiWallTimer();
   double lt = cldData->lastCheck;
   /* only ask for work every 20ms */
-  if (cldData->sent && (lt!=-1 && now-lt< 0.020)) return;
+  if (cldData->sent && (lt!=-1 && now-lt< PERIOD*0.001)) return;
   cldData->lastCheck = now;
 
   myload = CldLoad();
@@ -120,7 +120,7 @@ static void CldAskLoadHandler(requestmsg *msg)
       if (CpvAccess(neighbors)[i].pe == receiver) break;
     CmiAssert(i<CpvAccess(numNeighbors));
     CpvAccess(neighbors)[i].load += sendLoad;
-    CldMultipleSend(receiver, sendLoad, rank);
+    CldMultipleSend(receiver, sendLoad, rank, 0);
 #if 0
 #if !defined(CMK_OPTIMIZE) && TRACE_USEREVENTS
     /* this is dangerous since projections logging is not thread safe */
@@ -209,7 +209,14 @@ void CldBalance()
             numToMove = overload;
           overload -= numToMove;
          CpvAccess(neighbors)[j].load += numToMove;
-          CldMultipleSend(CpvAccess(neighbors)[j].pe, numToMove, CmiMyRank());
+          CldMultipleSend(CpvAccess(neighbors)[j].pe, 
+                         numToMove, CmiMyRank(), 
+#if CMK_SMP
+                         0
+#else
+                         1
+#endif
+                          );
         }
       }
   }
@@ -218,6 +225,7 @@ void CldBalance()
   traceUserBracketEvent(CpvAccess(CldData)->balanceEvt, startT, CmiWallTimer());
 #endif
   CcdCallFnAfterOnPE((CcdVoidFn)CldBalance, NULL, PERIOD, CmiMyPe());
+
 }
 
 void CldLoadResponseHandler(loadmsg *msg)
@@ -422,7 +430,7 @@ static void CldComputeNeighborData()
 #if 0
   {
   char buf[512], *ptr;
-  sprintf(buf, "Neighors (%d) for: %d = ", npe, CmiMyPe());
+  sprintf(buf, "Neighors for PE %d (%d): ", CmiMyPe(), npe);
   ptr = buf + strlen(buf);
   for (i=0; i<npe; i++) {
     CmiAssert(pes[i] < CmiNumPes() && pes[i] != CmiMyPe());