I Rearranged the load balancer, so WSLB->NeighborLB, NeighborLB->NborBaseLB,
[charm.git] / src / ck-ldb / NborBaseLB.h
1 #ifndef NBORBASELB_H
2 #define NBORBASELB_H
3
4 #include <LBDatabase.h>
5 #include "NborBaseLB.decl.h"
6
7
8 void CreateNborBaseLB();
9
10 class NLBStatsMsg;
11 class NLBMigrateMsg;
12
13 class NborBaseLB : public Group
14 {
15 public:
16   NborBaseLB();
17   ~NborBaseLB();
18   static void staticAtSync(void*);
19   void AtSync(void); // Everything is at the PE barrier
20
21   void ReceiveStats(NLBStatsMsg *);             // Receive stats on PE 0
22   void ResumeClients();
23   void ReceiveMigration(NLBMigrateMsg *);       // Receive migration data
24
25   // Migrated-element callback
26   static void staticMigrated(void* me, LDObjHandle h);
27   void Migrated(LDObjHandle h);
28
29   void MigrationDone(void);  // Call when migration is complete
30   int step() { return mystep; };
31
32   struct MigrateInfo {  // Used in NLBMigrateMsg
33     LDObjHandle obj;
34     int from_pe;
35     int to_pe;
36   };
37
38   struct LDStats {  // Passed to Strategy
39     int from_pe;
40     double total_walltime;
41     double total_cputime;
42     double idletime;
43     double bg_walltime;
44     double bg_cputime;
45     double obj_walltime;
46     double obj_cputime;
47     int proc_speed;
48   };
49
50 protected:
51   virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
52   virtual NLBMigrateMsg* Strategy(LDStats* stats,int count);
53
54   virtual int num_neighbors() {
55     if (CmiNumPes() > 2) return 2;
56     else return (CmiNumPes()-1);
57   };
58
59   virtual void neighbors(int* _n) {
60     _n[0] = (CmiMyPe() + CmiNumPes() -1) % CmiNumPes();
61     _n[1] = (CmiMyPe() + 1) % CmiNumPes();
62   };
63
64   LBDatabase* theLbdb;
65   struct {
66     int proc_speed;
67     double total_walltime;
68     double total_cputime;
69     double idletime;
70     double bg_walltime;
71     double bg_cputime;
72     int obj_data_sz;
73     LDObjData* objData;
74     int comm_data_sz;
75     LDCommData* commData;
76     double obj_walltime;
77     double obj_cputime;
78   } myStats;
79
80 private:
81   void FindNeighbors();
82   NLBStatsMsg* AssembleStats();
83
84   int mystep;
85   int stats_msg_count;
86   NLBStatsMsg** statsMsgsList;
87   LDStats* statsDataList;
88   int migrates_completed;
89   int migrates_expected;
90   NLBMigrateMsg** mig_msgs;
91   int mig_msgs_received;
92   int mig_msgs_expected;
93   int* neighbor_pes;
94   int receive_stats_ready;
95   double start_lb_time;
96 };
97
98 class NLBStatsMsg : public CMessage_NLBStatsMsg {
99 public:
100   int from_pe;
101   int serial;
102   int proc_speed;
103   double total_walltime;
104   double total_cputime;
105   double idletime;
106   double bg_walltime;
107   double bg_cputime;
108   double obj_walltime;
109   double obj_cputime;
110 }; 
111
112 class NLBMigrateMsg : public CMessage_NLBMigrateMsg {
113 public:
114   int n_moves;
115   NborBaseLB::MigrateInfo* moves;
116
117   // Other methods & data members 
118   
119   static void* alloc(int msgnum, size_t size, int* array, int priobits); 
120   static void* pack(NLBMigrateMsg* in); 
121   static NLBMigrateMsg* unpack(void* in); 
122 }; 
123
124 #endif /* NBORBASELB_H */