2687d4e4662da307b232db04d1dffd3daf1a55bd
[charm.git] / src / ck-ldb / AdaptiveLB.C
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #include "AdaptiveLB.h"
7 #include "ckgraph.h"
8
9 #define alpha 4.0e-6
10 #define beta 2.67e-9
11 #define percent_overhead 10
12
13 extern LBAllocFn getLBAllocFn(char *lbname);
14
15 CreateLBFunc_Def(AdaptiveLB, "Allow multiple strategies to work serially")
16
17 AdaptiveLB::AdaptiveLB(const CkLBOptions &opt): CentralLB(opt)
18 {
19   lbname = "AdaptiveLB";
20   const char *lbs = theLbdb->loadbalancer(opt.getSeqNo());
21   if (CkMyPe() == 0)
22     CkPrintf("[%d] AdaptiveLB created with %s\n",CkMyPe(), lbs);
23
24   char *lbcopy = strdup(lbs);
25   char *greedyLBString = "GreedyLB";
26   char *refineLBString = "RefineLB";
27 //  char *scotchLBString = "ScotchLB";
28
29   LBAllocFn fn = getLBAllocFn(greedyLBString);
30   if (fn == NULL) {
31     CkPrintf("LB> Invalid load balancer: %s.\n", greedyLBString);
32     CmiAbort("");
33   }
34   BaseLB *glb = fn();
35   greedyLB = (CentralLB*)glb;
36
37   fn = getLBAllocFn(refineLBString);
38   if (fn == NULL) {
39     CkPrintf("LB> Invalid load balancer: %s.\n", refineLBString);
40     CmiAbort("");
41   }
42   BaseLB *rlb = fn();
43   refineLB = (CentralLB*)rlb;
44
45 //  fn = getLBAllocFn(scotchLBString);
46 //  if (fn == NULL) {
47 //    CkPrintf("LB> Invalid load balancer: %s.\n", scotchLBString);
48 //    CmiAbort("");
49 //  }
50 //  BaseLB *slb = fn();
51 //  scotchLB = (CentralLB*)slb;
52 }
53
54 void AdaptiveLB::work(LDStats* stats)
55 {
56
57   ProcArray *parr = new ProcArray(stats);
58   ObjGraph *ogr = new ObjGraph(stats);
59   CkPrintf("Adaptive work\n");
60
61   // Calculate the load and total messages
62 //  double totalLoad = 0.0;
63 //  long totalMsgs = 0;
64 //  long long totalBytes = 0;
65 //  int vertnbr = ogr->vertices.size();
66 //
67 //  /** the object load is normalized to an integer between 0 and 256 */
68 //  for(int i = 0; i < vertnbr; i++) {
69 //    totalLoad += ogr->vertices[i].getVertexLoad();
70 //  }
71 //
72 //  for(int i = 0; i < vertnbr; i++) {
73 //    for(int j = 0; j < ogr->vertices[i].sendToList.size(); j++) {
74 //      totalMsgs += ogr->vertices[i].sendToList[j].getNumMsgs();
75 //      totalBytes += ogr->vertices[i].sendToList[j].getNumBytes();
76 //    }
77 //  }
78 //  double commOverhead = (totalMsgs * alpha) + (totalBytes * beta);
79 //
80 //  CkPrintf("AdaptiveLB> Total load %E\n", totalLoad);
81 //  CkPrintf("AdaptiveLB> Total Msgs %d\n", totalMsgs);
82 //  CkPrintf("AdaptiveLB> Total Bytes %ld\n", totalBytes);
83 //  CkPrintf("AdaptiveLB> Total Comm %E\n", commOverhead);
84 //
85 //  // Choose the right LB
86 //  //
87 //  // If communication overhead is 10% computation, then choose Scotch LB
88 //  if (commOverhead > (totalLoad * percent_overhead / 100)) {
89 //    scotchLB->work(stats);
90 //  } else {
91 //    refineLB->work(stats);
92 //  }
93   delete parr;
94   delete ogr;
95
96 }
97
98 #include "AdaptiveLB.def.h"
99
100
101 /*@}*/