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