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