Added the language-specific load estimator API.
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 4 May 1999 17:36:03 +0000 (17:36 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Tue, 4 May 1999 17:36:03 +0000 (17:36 +0000)
src/conv-core/converse.h
src/conv-ldb/cldb.c
src/conv-ldb/cldb.graph.c
src/conv-ldb/cldb.rand.c
src/conv-ldb/cldb.spray.c
src/conv-ldb/cldb.test.c

index 8dad299f08482e6e01ce54d803e2a175b88ffda3..3507109b54b039dfd44b13c4f8878168560ed65b 100644 (file)
@@ -888,8 +888,13 @@ typedef void (*CldInfoFn)(void *msg,
                           int *priobits, 
                           unsigned int **prioptr);
 
+typedef int (*CldEstimator)(void);
+
 int CldRegisterInfoFn(CldInfoFn fn);
 int CldRegisterPackFn(CldPackFn fn);
+void CldRegisterEstimator(CldEstimator fn);
+int CldEstimate(void);
+char *CldGetStrategy(void);
 
 void CldEnqueue(int pe, void *msg, int infofn);
 
index 6198d8e00f9f085ae954490e68c8385fd4f6c797..aeee7a1fa1037e64aee8ae08ec2b5ca51fe1e6c1 100644 (file)
  * CldCountTokens tells you how many tokens are currently retreivable.
  */
 
+typedef struct {
+  int count;
+  CldEstimator fns[16];
+} CldEstimatorTable;
+CpvStaticDeclare(CldEstimatorTable, _estfns);
+
+void CldRegisterEstimator(CldEstimator fn)
+{
+  CpvAccess(_estfns).fns[CpvAccess(_estfns).count++] = fn;
+}
+
+int CldEstimate(void)
+{
+  CldEstimatorTable *estab = &(CpvAccess(_estfns));
+  int i, load=0;
+  for(i=0; i<estab->count; i++)
+    load += (*(estab->fns[i]))();
+  return load;
+}
+
+static int CsdEstimator(void)
+{
+  return CsdLength();
+}
+
 int CldRegisterInfoFn(CldInfoFn fn)
 {
   return CmiRegisterHandler((CmiHandler)fn);
@@ -116,6 +142,9 @@ void CldModuleGeneralInit()
   CldProcInfo proc;
 
   CpvInitialize(CldProcInfo, CldProc);
+  CpvInitialize(CldEstimatorTable, _estfns);
+  CpvAccess(_estfns).count = 0;
+  CldRegisterEstimator(CsdEstimator);
   CpvAccess(CldProc) = (CldProcInfo)CmiAlloc(sizeof(struct CldProcInfo_s));
   proc = CpvAccess(CldProc);
   proc->load = 0;
index 25329b18ed48d96d2d7509ede9697352e7c22139..2d43945f5eabb508b4d5f7de55cfeb95ac0006d7 100644 (file)
@@ -3,13 +3,18 @@
 #define PERIODE 100
 #define THRESHOLD 20.0
 
+char *CldGetStrategy(void)
+{
+  return "graph";
+}
+
 CpvDeclare(int, CldRecycle);
 CpvDeclare(int, CldLoadResponseHandlerIndex);
 CpvDeclare(int, CldRequestResponseHandlerIndex);
 
 int CldAvgNeighborLoad()
 {
-  int sum=CsdLength(), i;
+  int sum=CldEstimate(), i;
   
   for (i=0; i<CpvAccess(numNeighbors); i++)
     sum += CpvAccess(neighbors)[i].load;
@@ -21,7 +26,7 @@ void CldSendLoad()
   loadmsg msg;
 
   msg.pe = CmiMyPe();
-  msg.load = CsdLength();
+  msg.load = CldEstimate();
   CmiSetHandler(&msg, CpvAccess(CldLoadResponseHandlerIndex));
   CmiSyncMulticast(CpvAccess(neighborGroup), sizeof(loadmsg), &msg);
   CpvAccess(CldLoadBalanceMessages) += CpvAccess(numNeighbors);
@@ -90,7 +95,7 @@ void CldBalance()
   int totalUnderAvg=0, numUnderAvg=0, maxUnderAvg=0;
 
   avgLoad = CldAvgNeighborLoad();
-  overload = CsdLength() - avgLoad;
+  overload = CldEstimate() - avgLoad;
   if (overload > CldCountTokens())
     overload = CldCountTokens();
   
index eafef80316d95ea06ee6974f2fa236947b8e3065..958e633e6711c5b0d336ff68ca3a5e08757b1f8a 100644 (file)
@@ -1,5 +1,10 @@
 #include "converse.h"
 
+char *CldGetStrategy(void)
+{
+  return "rand";
+}
+
 CpvDeclare(int, CldRelocatedMessages);
 CpvDeclare(int, CldLoadBalanceMessages);
 CpvDeclare(int, CldMessageChunks);
index 9b63a78f7486db423e1f8a75d69ec4571b848a6b..828565ff1bfe33a33c5595d690a63c4572e1b003 100644 (file)
@@ -1,6 +1,11 @@
 #include "converse.h"
 #include <math.h>
 
+char *CldGetStrategy(void)
+{
+  return "spray";
+}
+
 #define CYCLE_MILLISECONDS 500
 #define DEBUGGING_OUTPUT 0
 
@@ -36,7 +41,7 @@ void CldPropagateLoad(double load);
 
 void CldInitiateReduction()
 {
-  double load = CsdLength();
+  double load = CldEstimate();
   peinfo *pinf = &(CpvAccess(peinf));
   pinf->load_reported = load;
   CldPropagateLoad(load);
@@ -71,14 +76,14 @@ void CldReduceHandler(struct loadmsg *msg)
 void CldAverageHandler(struct loadmsg *msg)
 {
   peinfo *pinf = &(CpvAccess(peinf));
-  double load = CsdLength();
+  double load = CldEstimate();
   double average = (msg->load_total / CmiNumPes());
   int rebalance;
   if (load < (average+10) * 1.2) rebalance=0;
   else rebalance = (load - average);
   if (DEBUGGING_OUTPUT)
     CmiPrintf("PE %d load=%6d average=%6d rebalance=%d\n", 
-             CmiMyPe(), CsdLength(), (int)average, rebalance);
+             CmiMyPe(), CldEstimate(), (int)average, rebalance);
   pinf->rebalance = rebalance;
   CcdCallFnAfter((CcdVoidFn)CldInitiateReduction, 0, CYCLE_MILLISECONDS);
 }
index ff226502fa111bb0aa42e7218ee45f09e7b3fa75..3184638b1532d8cbfaa198bd70c46b47e499fa07 100644 (file)
@@ -3,6 +3,11 @@
 #define PERIOD 100
 #define MAXMSGBFRSIZE 100000
 
+char *CldGetStrategy(void)
+{
+  return "test";
+}
+
 CpvDeclare(int, CldHandlerIndex);
 CpvDeclare(int, CldBalanceHandlerIndex);
 CpvDeclare(int, CldRelocatedMessages);
@@ -71,7 +76,7 @@ void CldDistributeTokens()
   int destPe = (CmiMyPe()+1)%CmiNumPes();
   int numToSend;
 
-  numToSend = CsdLength() / 2;
+  numToSend = CldEstimate() / 2;
   if (numToSend > CldCountTokens())
     numToSend = CldCountTokens() / 2;