all load balancers inherit from BaseLB now.
[charm.git] / src / ck-ldb / WSLB.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 #ifndef NEIGHBORLB_H
9 #define NEIGHBORLB_H
10
11 #include <BaseLB.h>
12 #include "WSLB.decl.h"
13
14 void CreateWSLB();
15
16 class WSLBStatsMsg;
17 class WSLBMigrateMsg;
18
19 class WSLB : public CBase_WSLB
20 {
21 public:
22   WSLB();
23   WSLB(CkMigrateMessage *m) {}
24   ~WSLB();
25   static void staticAtSync(void*);
26   void AtSync(void); // Everything is at the PE barrier
27
28   void ReceiveStats(WSLBStatsMsg *);            // Receive stats on PE 0
29   void ResumeClients();
30   void ReceiveMigration(WSLBMigrateMsg *);      // Receive migration data
31
32   // Migrated-element callback
33   static void staticMigrated(void* me, LDObjHandle h);
34   void Migrated(LDObjHandle h);
35
36   void MigrationDone(void);  // Call when migration is complete
37   int step() { return mystep; };
38
39   struct MigrateInfo {  // Used in WSLBMigrateMsg
40     LDObjHandle obj;
41     int from_pe;
42     int to_pe;
43   };
44
45   struct LDStats {  // Passed to Strategy
46     int from_pe;
47     double total_walltime;
48     double total_cputime;
49     double idletime;
50     double bg_walltime;
51     double bg_cputime;
52     double obj_walltime;
53     double obj_cputime;
54     double usage;
55     int proc_speed;
56     CmiBool vacate_me;
57   };
58
59 protected:
60   virtual CmiBool QueryBalanceNow(int);
61   virtual WSLBMigrateMsg* Strategy(LDStats* stats,int count);
62   virtual int num_neighbors() {
63     return (CkNumPes() > 5) ? 4 : (CkNumPes()-1);
64   };
65   virtual void neighbors(int* _n) {
66     const int me = CkMyPe();
67     const int npe = CkNumPes();
68     if (npe > 1)
69       _n[0] = (me + npe - 1) % npe;
70     if (npe > 2)
71       _n[1] = (me + 1) % npe;
72
73     int bigstep = (npe - 1) / 3 + 1;
74     if (bigstep == 1) bigstep++;
75
76     if (npe > 3)
77       _n[2] = (me + bigstep) % npe;
78     if (npe > 4)
79       _n[3] = (me + npe - bigstep) % npe;
80   };
81
82   struct {
83     int proc_speed;
84     double total_walltime;
85     double total_cputime;
86     double idletime;
87     double bg_walltime;
88     double bg_cputime;
89     int obj_data_sz;
90     LDObjData* objData;
91     int comm_data_sz;
92     LDCommData* commData;
93     double obj_walltime;
94     double obj_cputime;
95   } myStats;
96
97 private:
98   void FindNeighbors();
99   WSLBStatsMsg* AssembleStats();
100
101   int mystep;
102   int stats_msg_count;
103   WSLBStatsMsg** statsMsgsList;
104   LDStats* statsDataList;
105   int migrates_completed;
106   int migrates_expected;
107   WSLBMigrateMsg** mig_msgs;
108   int mig_msgs_received;
109   int mig_msgs_expected;
110   int* neighbor_pes;
111   int receive_stats_ready;
112   double start_lb_time;
113   double first_step_time;
114   double usage;
115   double usage_int_err;
116   CmiBool vacate;
117 };
118
119 class WSLBStatsMsg : public CMessage_WSLBStatsMsg {
120 public:
121   int from_pe;
122   int serial;
123   int proc_speed;
124   double total_walltime;
125   double total_cputime;
126   double idletime;
127   double bg_walltime;
128   double bg_cputime;
129   double obj_walltime;
130   double obj_cputime;
131   double usage;
132   CmiBool vacate_me;
133 }; 
134
135 class WSLBMigrateMsg : public CMessage_WSLBMigrateMsg {
136 public:
137   int n_moves;
138   WSLB::MigrateInfo* moves;
139
140   // Other methods & data members 
141   
142   static void* alloc(int msgnum, size_t size, int* array, int priobits); 
143   static void* pack(WSLBMigrateMsg* in); 
144   static WSLBMigrateMsg* unpack(void* in); 
145 }; 
146
147 #endif /* NEIGHBORLB_H */