doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / WSLB.h
1 /**
2  * \addtogroup CkLdb
3  * This load balancer is a neighborLB and should inherit from NborBaseLB
4  * instead of incorrectly inheriting from BaseLB.
5  *
6  * Also struct LDStats in here should be removed and merged with the one
7  * in NborBaseLB. -- ASB
8  */
9
10 /*@{*/
11
12 #ifndef _WSLB_H_
13 #define _WSLB_H_
14
15 #include "BaseLB.h"
16 #include "WSLB.decl.h"
17
18 #include "topology.h"
19
20 void CreateWSLB();
21
22 class WSLBStatsMsg;
23
24 class WSLB : public BaseLB
25 {
26 public:
27   WSLB(const CkLBOptions &);
28   WSLB(CkMigrateMessage *m):BaseLB(m) {}
29   ~WSLB();
30   static void staticAtSync(void*);
31   void AtSync(void); // Everything is at the PE barrier
32
33   void ReceiveStats(WSLBStatsMsg *);            // Receive stats on PE 0
34   void ResumeClients();
35   void ReceiveMigration(LBMigrateMsg *);        // Receive migration data
36
37   // Migrated-element callback
38   static void staticMigrated(void* me, LDObjHandle h, int waitBarrier);
39   void Migrated(LDObjHandle h, int waitBarrier);
40
41   void MigrationDone(void);  // Call when migration is complete
42   int step() { return mystep; };
43
44   struct LDStats {  // Passed to Strategy
45     int from_pe;
46     double total_walltime;
47     double total_cputime;
48     double idletime;
49     double bg_walltime;
50     double bg_cputime;
51     double obj_walltime;
52     double obj_cputime;
53     double usage;
54     int proc_speed;
55     CmiBool vacate_me;
56   };
57
58 protected:
59   virtual CmiBool QueryBalanceNow(int);
60   virtual LBMigrateMsg* Strategy(LDStats* stats,int count);
61 #if 0
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 #endif
82
83   struct {
84     int proc_speed;
85     double total_walltime;
86     double total_cputime;
87     double idletime;
88     double bg_walltime;
89     double bg_cputime;
90     int obj_data_sz;
91     LDObjData* objData;
92     int comm_data_sz;
93     LDCommData* commData;
94     double obj_walltime;
95     double obj_cputime;
96   } myStats;
97
98 private:
99   void FindNeighbors();
100   WSLBStatsMsg* AssembleStats();
101
102   CProxy_WSLB   thisProxy;
103   LBTopology    *topo;
104   int mystep;
105   int stats_msg_count;
106   WSLBStatsMsg** statsMsgsList;
107   LDStats* statsDataList;
108   int migrates_completed;
109   int migrates_expected;
110   LBMigrateMsg** mig_msgs;
111   int mig_msgs_received;
112   int mig_msgs_expected;
113   int* neighbor_pes;
114   int receive_stats_ready;
115   double start_lb_time;
116   double first_step_time;
117   double usage;
118   double usage_int_err;
119   CmiBool vacate;
120 };
121
122 class WSLBStatsMsg : public CMessage_WSLBStatsMsg {
123 public:
124   int from_pe;
125   int serial;
126   int proc_speed;
127   double total_walltime;
128   double total_cputime;
129   double idletime;
130   double bg_walltime;
131   double bg_cputime;
132   double obj_walltime;
133   double obj_cputime;
134   double usage;
135   CmiBool vacate_me;
136 }; 
137
138
139 #endif /* _WSLB_H_ */
140
141
142 /*@}*/