more cleanup
[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   int get_finished_iteration();
48   bool AddLoad(int iteration, double load);
49   void ReceiveMinStats(CkReductionMsg *);
50   void TriggerSoon(int iteration_no, double imbalance_ratio, double tolerate_imb);
51   void LoadBalanceDecision(int, int);
52   void LoadBalanceDecisionFinal(int, int);
53   void ReceiveIterationNo(int, int); // Receives the current iter no
54   static void periodicCall(void *ad);
55   static void checkForNoObj(void *ad);
56   void HandleAdaptiveNoObj();
57   void RegisterNoObjCallback(int index);
58   void TriggerAdaptiveReduction();
59
60   bool generatePlan(int& period, double& ratio_at_t);
61   bool getLineEq(double new_load_percent, double& aslope, double& ac,
62       double& mslope, double& mc);
63   bool getPeriodForLinear(double a, double b, double c, int& period);
64   bool getPeriodForStrategy(double new_load, double overhead_percent,
65       int& period, double& ratio_at_t);
66   int getPredictedLBPeriod(bool& is_tentative);
67
68   bool isStrategyComm();
69
70   void UpdateAfterLBData(int is_lb_refine, double lb_max, double lb_avg, double
71       local_comm, double remote_comm);
72
73   void UpdateAfterLBData(double max_load, double max_cpu, double avg_load);
74   void UpdateAfterLBComm(double alpha_beta_cost);
75   void GetPrevLBData(int& lb_type, double& lb_max_avg_ratio, double&
76       local_remote_comm_ratio);
77   void GetLBDataForLB(int lb_type, double& lb_max_avg_ratio, double&
78       local_remote_comm_ratio);
79
80   void SetMigrationCost(double lb_migration_cost);
81   void SetStrategyCost(double lb_strategy_cost);
82
83 private:
84   //CProxy_MetaBalancer thisProxy;
85   LBDatabase* lbdatabase;
86   std::vector<double> total_load_vec;
87   // Keeps track of how many local chares contributed
88   std::vector<int> total_count_vec;
89   std::vector<int> lbdb_no_obj_callback;
90
91   double prev_idle;
92   double alpha_beta_cost_to_load;
93   int is_prev_lb_refine;
94
95   struct AdaptiveData {
96     double iteration;
97     double max_load;
98     double avg_load;
99     double utilization;
100     double idle_time;
101   };
102
103   struct AdaptiveMetaBalancer {
104     CkVec<AdaptiveData> history_data;
105     int lb_iter_no;
106   } adaptive_lbdb;
107
108   struct AdaptiveLBInfo {
109     AdaptiveLBInfo() {
110       max_avg_ratio = 1;
111       remote_local_ratio = 1;
112     }
113     double max_avg_ratio;
114     double remote_local_ratio;
115   };
116
117   // TODO: Separate out the datastructure required by just the central and on all
118   // processors
119   struct AdaptiveLBStructure {
120     int tentative_period;
121     int final_lb_period;
122     // This is based on the linear extrapolation
123     int lb_calculated_period;
124     // Current maximum iteration no of any chare on this processor
125     int lb_iteration_no;
126     // This corresponds to the last iteration that was contributed
127     int finished_iteration_no;
128     // This is set when all the processor sends the maximum iteration no
129     int global_max_iter_no;
130     // This keeps track of what was the max iteration no we had previously
131     // received. TODO: Mostly global_max_iter_no should be sufficied.
132     int tentative_max_iter_no;
133     // TODO: Use reduction to collect max iteration. Then we don't need this
134     // counter.
135     int global_recv_iter_counter;
136     // true indicates it is in Inform->ReceiveMaxIter->FinalLBPeriod stage.
137     bool in_progress;
138     double lb_strategy_cost;
139     double lb_migration_cost;
140     bool doCommStrategy;
141     int lb_msg_send_no;
142     int lb_msg_recv_no;
143     // Total AtSync calls from all the chares residing on the processor
144     int total_syncs_called;
145     int last_lb_type;
146     AdaptiveLBInfo greedy_info;
147     AdaptiveLBInfo refine_info;
148     AdaptiveLBInfo comm_info;
149     AdaptiveLBInfo comm_refine_info;
150   } adaptive_struct;
151
152 public:
153   bool lb_in_progress;
154
155 public:
156 };
157
158 inline MetaBalancer* MetaBalancerObj() { return MetaBalancer::Object(); }
159
160 #endif /* LDATABASE_H */
161
162 /*@}*/