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