Changing function name
[charm.git] / src / ck-ldb / MetaBalancer.h
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #ifndef METABALANCER_H
7 #define METABALANCER_H
8
9 #include "LBDatabase.h"
10
11 #include <vector>
12
13 #include "MetaBalancer.decl.h"
14
15 extern CkGroupID _metalb;
16
17 CkpvExtern(int, metalbInited);
18
19 void _MetaLBInit();
20
21 // main chare
22 class MetaLBInit : public Chare {
23   public:
24     MetaLBInit(CkArgMsg*);
25     MetaLBInit(CkMigrateMessage *m):Chare(m) {}
26 };
27
28 class MetaBalancer : public CBase_MetaBalancer {
29 public:
30   MetaBalancer(void)  { init(); }
31   MetaBalancer(CkMigrateMessage *m)  { init(); }
32   ~MetaBalancer()  {}
33   
34 private:
35   void init();
36 public:
37   inline static MetaBalancer * Object() { return CkpvAccess(metalbInited)?(MetaBalancer *)CkLocalBranch(_metalb):NULL; }
38
39   static void initnodeFn(void);
40
41   void pup(PUP::er& p);
42
43   void ResumeClients();
44
45   void ResetAdaptive();
46   int get_iteration();
47   bool AddLoad(int iteration, double load);
48   void ReceiveMinStats(CkReductionMsg *);
49   void TriggerSoon(int iteration_no, double imbalance_ratio, double tolerate_imb);
50   void LoadBalanceDecision(int, int);
51   void LoadBalanceDecisionFinal(int, int);
52   void ReceiveIterationNo(int, int); // Receives the current iter no
53   static void periodicCall(void *ad);
54   static void checkForNoObj(void *ad);
55   void HandleAdaptiveNoObj();
56   void RegisterNoObjCallback(int index);
57   void TriggerAdaptiveReduction();
58
59   bool generatePlan(int& period, double& ratio_at_t);
60   bool getLineEq(double new_load_percent, double& aslope, double& ac,
61       double& mslope, double& mc);
62   bool getPeriodForLinear(double a, double b, double c, int& period);
63   bool getPeriodForStrategy(double new_load, double overhead_percent,
64       int& period, double& ratio_at_t);
65   int getPredictedLBPeriod(bool& is_tentative);
66
67   bool isStrategyComm();
68
69   void UpdateAfterLBData(int is_lb_refine, double lb_max, double lb_avg, double
70       local_comm, double remote_comm);
71
72   void UpdateAfterLBData(double max_load, double max_cpu, double avg_load);
73   void UpdateAfterLBComm(double alpha_beta_cost);
74   void GetPrevLBData(int& lb_type, double& lb_max_avg_ratio, double&
75       local_remote_comm_ratio);
76   void GetLBDataForLB(int lb_type, double& lb_max_avg_ratio, double&
77       local_remote_comm_ratio);
78
79   void SetMigrationCost(double lb_migration_cost);
80   void SetStrategyCost(double lb_strategy_cost);
81
82 private:
83   //CProxy_MetaBalancer thisProxy;
84   LBDatabase* lbdatabase;
85   std::vector<double> total_load_vec;
86   // Keeps track of how many local chares contributed
87   std::vector<int> total_count_vec;
88   std::vector<int> lbdb_no_obj_callback;
89
90   double prev_idle;
91   double alpha_beta_cost_to_load;
92   int is_prev_lb_refine;
93
94   struct AdaptiveData {
95     double iteration;
96     double max_load;
97     double avg_load;
98     double utilization;
99     double idle_time;
100   };
101
102   struct AdaptiveMetaBalancer {
103     CkVec<AdaptiveData> history_data;
104     int lb_iter_no;
105   } adaptive_lbdb;
106
107   struct AdaptiveLBInfo {
108     AdaptiveLBInfo() {
109       max_avg_ratio = 1;
110       remote_local_ratio = 1;
111     }
112     double max_avg_ratio;
113     double remote_local_ratio;
114   };
115
116   // TODO: Separate out the datastructure required by just the central and on all
117   // processors
118   struct AdaptiveLBStructure {
119     int tentative_period;
120     int final_lb_period;
121     // This is based on the linear extrapolation
122     int lb_calculated_period;
123     int lb_iteration_no;
124     // This is set when all the processor sends the maximum iteration no
125     int global_max_iter_no;
126     // This keeps track of what was the max iteration no we had previously
127     // received. TODO: Mostly global_max_iter_no should be sufficied.
128     int tentative_max_iter_no;
129     // TODO: Use reduction to collect max iteration. Then we don't need this
130     // counter.
131     int global_recv_iter_counter;
132     // true indicates it is in Inform->ReceiveMaxIter->FinalLBPeriod stage.
133     bool in_progress;
134     double lb_strategy_cost;
135     double lb_migration_cost;
136     bool doCommStrategy;
137     int lb_msg_send_no;
138     int lb_msg_recv_no;
139     // Total AtSync calls from all the chares residing on the processor
140     int total_syncs_called;
141     int last_lb_type;
142     AdaptiveLBInfo greedy_info;
143     AdaptiveLBInfo refine_info;
144     AdaptiveLBInfo comm_info;
145     AdaptiveLBInfo comm_refine_info;
146   } adaptive_struct;
147
148 public:
149   bool lb_in_progress;
150
151 public:
152 };
153
154 inline MetaBalancer* MetaBalancerObj() { return MetaBalancer::Object(); }
155
156 #endif /* LDATABASE_H */
157
158 /*@}*/