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