doc: Add serial to list of ci file reserved words
[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 *metisLBString = "MetisLB";
28   char *commRefineLBString = "CommAwareRefineLB";
29
30   LBAllocFn fn = getLBAllocFn(greedyLBString);
31   if (fn == NULL) {
32     CkPrintf("LB> Invalid load balancer: %s.\n", greedyLBString);
33     CmiAbort("");
34   }
35   BaseLB *glb = fn();
36   greedyLB = (CentralLB*)glb;
37
38   fn = getLBAllocFn(refineLBString);
39   if (fn == NULL) {
40     CkPrintf("LB> Invalid load balancer: %s.\n", refineLBString);
41     CmiAbort("");
42   }
43   BaseLB *rlb = fn();
44   refineLB = (CentralLB*)rlb;
45
46   fn = getLBAllocFn(metisLBString);
47   if (fn == NULL) {
48     CkPrintf("LB> Invalid load balancer: %s.\n", metisLBString);
49     CmiAbort("");
50   }
51   BaseLB *slb = fn();
52   metisLB = (CentralLB*)slb;
53
54   fn = getLBAllocFn(commRefineLBString);
55   if (fn == NULL) {
56     CkPrintf("LB> Invalid load balancer: %s.\n", commRefineLBString);
57     CmiAbort("");
58   }
59   BaseLB *crlb = fn();
60   commRefineLB = (CentralLB*)crlb;
61 }
62
63 void AdaptiveLB::work(LDStats* stats)
64 {
65
66   ProcArray *parr = new ProcArray(stats);
67   ObjGraph *ogr = new ObjGraph(stats);
68   CkPrintf("Adaptive work\n");
69
70   //bool isComm = theLbdb->isStrategyComm();
71
72   // Calculate the load and total messages
73   double totalLoad = 0.0;
74   long totalMsgs = 0;
75   long long totalBytes = 0;
76   int vertnbr = ogr->vertices.size();
77
78   /** the object load is normalized to an integer between 0 and 256 */
79   for(int i = 0; i < vertnbr; i++) {
80     totalLoad += ogr->vertices[i].getVertexLoad();
81   }
82
83   for(int i = 0; i < vertnbr; i++) {
84     for(int j = 0; j < ogr->vertices[i].sendToList.size(); j++) {
85       totalMsgs += ogr->vertices[i].sendToList[j].getNumMsgs();
86       totalBytes += ogr->vertices[i].sendToList[j].getNumBytes();
87     }
88   }
89   double commOverhead = (totalMsgs * alpha) + (totalBytes * beta);
90
91   CkPrintf("AdaptiveLB> Total load %E\n", totalLoad);
92   CkPrintf("AdaptiveLB> Total Msgs %d\n", totalMsgs);
93   CkPrintf("AdaptiveLB> Total Bytes %ld\n", totalBytes);
94   CkPrintf("AdaptiveLB> Total Comm Overhead %E Total Load %E\n", commOverhead, totalLoad);
95
96   double tmp;
97   double refine_max_avg_ratio, lb_max_avg_ratio;
98   double greedy_max_avg_ratio;
99   int lb_type;
100   double comm_ratio, comm_refine_ratio;
101
102 //  GetPrevLBData(lb_type, lb_max_avg_ratio, tmp);
103 //  GetLBDataForLB(1, refine_max_avg_ratio, tmp);
104 //  GetLBDataForLB(0, greedy_max_avg_ratio, tmp);
105 //  GetLBDataForLB(2, tmp, comm_ratio);
106 //  GetLBDataForLB(3, tmp, comm_refine_ratio);
107
108   CkPrintf("AdaptiveLB> Previous LB %d\n", lb_type);
109
110   // Choose the right LB
111   //
112   // If communication overhead is 10% computation, then choose Scotch LB
113   //if (isComm || (commOverhead > (totalLoad * percent_overhead / 100))) {
114   if ((commOverhead > (totalLoad * percent_overhead / 100))) {
115     if(lb_type == -1) {
116       lb_type = 2;
117       metisLB->work(stats);
118       CkPrintf("---METIS LB\n");
119     } else if (comm_refine_ratio <= 1.01) {
120       lb_type = 3;
121       commRefineLB->work(stats);
122       CkPrintf("---CommAwareRefineLB\n");
123     } else if (comm_ratio <= 1.01) {
124       lb_type = 2;
125       metisLB->work(stats);
126       CkPrintf("---METIS LB\n");
127     } else {
128       lb_type = 3;
129       commRefineLB->work(stats);
130       CkPrintf("---CommAwareRefineLB\n");
131     }
132
133   } else {
134     if (lb_type == -1) {
135       lb_type = 0;
136       greedyLB->work(stats);
137       CkPrintf("---GREEDY LB\n");
138     } else if (refine_max_avg_ratio <= 1.01) {
139       lb_type = 1;
140       refineLB->work(stats);
141       CkPrintf("---REFINE LB\n");
142     } else if (greedy_max_avg_ratio <= 1.01) {
143       lb_type = 0;
144       greedyLB->work(stats);
145       CkPrintf("---GREEDY LB\n");
146     } else {
147       lb_type = 1;
148       refineLB->work(stats);
149       CkPrintf("---REFINE LB\n");
150     }
151   }
152 //  UpdateLBDBWithData(lb_type, stats->after_lb_max, stats->after_lb_avg,
153 //      stats->local_comm, stats->remote_comm);
154
155   delete parr;
156   delete ogr;
157
158 }
159
160 #include "AdaptiveLB.def.h"
161
162
163 /*@}*/