all load balancers inherit from BaseLB now.
[charm.git] / src / ck-ldb / CentralLB.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef CENTRALLB_H
9 #define CENTRALLB_H
10
11 #include "BaseLB.h"
12 #include "CentralLB.decl.h"
13
14 extern CkGroupID loadbalancer;
15
16 void CreateCentralLB();
17 void set_avail_vector(char * bitmap);
18
19 class CLBStatsMsg;
20 class CLBMigrateMsg;
21
22 class CentralLB : public CBase_CentralLB
23 {
24 public:
25   CentralLB();
26   ~CentralLB();
27   CentralLB(CkMigrateMessage *m) {}
28   static void staticAtSync(void*);
29   void AtSync(void); // Everything is at the PE barrier
30   void ProcessAtSync(void); // Receive a message from AtSync to avoid
31                             // making projections output look funny
32
33   void ReceiveStats(CLBStatsMsg *);             // Receive stats on PE 0
34   void ResumeClients(void);                     // Resuming clients needs
35                                                 // to be resumed via message
36   void ReceiveMigration(CLBMigrateMsg *);       // Receive migration data
37
38   // Migrated-element callback
39   static void staticMigrated(void* me, LDObjHandle h);
40   void Migrated(LDObjHandle h);
41
42   void MigrationDone(void);  // Call when migration is complete
43   int step() { return mystep; };
44
45   void set_avail_vector(char *new_vector);
46
47   struct MigrateInfo {  // Used in CLBMigrateMsg
48     LDObjHandle obj;
49     int from_pe;
50     int to_pe;
51   };
52
53   struct LDStats {  // Passed to Strategy
54     double total_walltime;
55     double total_cputime;
56     double idletime;
57     double bg_walltime;
58     double bg_cputime;
59     int pe_speed;
60     double utilization;
61     CmiBool available;
62     
63     int n_objs;
64     LDObjData* objData;
65     int n_comm;
66     LDCommData* commData;
67   };
68
69    CLBMigrateMsg* callStrategy(LDStats* stats,int count){
70         return Strategy(stats,count);
71    };
72
73   int cur_ld_balancer;
74   char *avail_vector;
75   /* for Node 0 */
76   int new_ld_balancer;
77
78 protected:
79   virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
80   virtual CLBMigrateMsg* Strategy(LDStats* stats,int count);
81
82 private:  
83
84
85
86   int mystep;
87   int myspeed;
88   int stats_msg_count;
89   CLBStatsMsg** statsMsgsList;
90   LDStats* statsDataList;
91   int migrates_completed;
92   int migrates_expected;
93   double start_lb_time;
94 };
95
96 class CLBStatsMsg : public CMessage_CLBStatsMsg {
97 public:
98   int from_pe;
99   int serial;
100   int pe_speed;
101   double total_walltime;
102   double total_cputime;
103   double idletime;
104   double bg_walltime;
105   double bg_cputime;
106   int n_objs;
107   LDObjData *objData;
108   int n_comm;
109   LDCommData *commData;
110
111   char * avail_vector;
112   int next_lb;
113 }; 
114
115 class CLBMigrateMsg : public CMessage_CLBMigrateMsg {
116 public:
117   int n_moves;
118   CentralLB::MigrateInfo* moves;
119   
120   char * avail_vector;
121   int next_lb;
122   
123   // Other methods & data members 
124
125   static void* alloc(int msgnum, size_t size, int* array, int priobits); 
126   static void* pack(CLBMigrateMsg* in); 
127   static CLBMigrateMsg* unpack(void* in); 
128 }; 
129
130 #endif /* CENTRALLB_H */
131
132
133
134
135