doc: Add serial to list of ci file reserved words
[charm.git] / src / ck-ldb / HbmLB.h
1 /**
2  * \addtogroup CkLdb
3 */
4 /*@{*/
5
6 #ifndef HBMLB_H
7 #define HBMLB_H
8
9 #include "CentralLB.h"
10 #include "HbmLB.decl.h"
11
12 #include "topology.h"
13
14 void CreateHbmLB();
15
16 /// for backward compatibility
17 typedef LBMigrateMsg NLBMigrateMsg;
18
19 // base class
20 class MyHmbHierarchyTree {
21 public:
22   MyHmbHierarchyTree() {}
23   virtual ~MyHmbHierarchyTree() {}
24   virtual int numLevels() = 0;
25   virtual int parent(int mype, int level) = 0;
26   virtual int isroot(int mype, int level) = 0;
27   virtual int numChildren(int mype, int level) = 0;
28   virtual void getChildren(int mype, int level, int *children, int &count) = 0;
29 };
30
31 // a simple 3 layer tree, fat at level 1
32 //        1
33 //     ---+---
34 //     0  4  8
35 //  ---+--
36 //  0 1 2 3
37 class HypercubeTree: public MyHmbHierarchyTree {
38 private:
39   int toproot;
40   int nLevels;
41 public:
42   HypercubeTree() {
43     nLevels = 0;
44     int npes = CkNumPes();
45     while ( npes != (1 << nLevels)) { nLevels++; }
46     nLevels++;
47     toproot = 0;
48   }
49   virtual ~HypercubeTree() {}
50   virtual int numLevels() { return nLevels; }
51   virtual int parent(int mype, int level) {
52     if (level == nLevels-1) return -1;
53     return (mype & ~(1<<level));
54   }
55   virtual int isroot(int mype, int level) {
56     if (level == 0) return 0;
57     return (mype & ((1<<level)-1)) == 0;
58   }
59   virtual int numChildren(int mype, int level) {
60     return 2;
61   }
62   virtual void getChildren(int mype, int level, int *children, int &count) {
63     CmiAssert(isroot(mype, level));
64     count = numChildren(mype, level);
65     children[0] = mype;
66     children[1] = mype | (1<<(level-1));
67   }
68 };
69
70 class HbmLB : public BaseLB
71 {
72 public:
73   HbmLB(const CkLBOptions &);
74   HbmLB(CkMigrateMessage *m):BaseLB(m) {}
75   ~HbmLB();
76
77   static void staticAtSync(void*);
78   void AtSync(void); // Everything is at the PE barrier
79   void ProcessAtSync(void);
80
81   void ReceiveStats(double t, int frompe, int fromlevel); 
82   void ResumeClients(CkReductionMsg *msg);
83   void ResumeClients(int balancing);
84   void ReceiveMigrationCount(int, int lblevel);       // Receive migration count
85   void ReceiveMigrationDelta(double t, int lblevel, int level);   // Receive migration amount
86
87   // Migrated-element callback
88   static void staticMigrated(void* me, LDObjHandle h, int waitBarrier);
89   void Migrated(LDObjHandle h, int waitBarrier);
90   void ObjMigrated(LDObjData data, LDCommData *cdata, int n);
91   void collectCommData(int objIdx, CkVec<LDCommData> &comms);
92
93   void MigrationDone(int balancing);  // Call when migration is complete
94   void NotifyObjectMigrationDone(int level, int lblevel);       
95   virtual void Loadbalancing(int level);        // start load balancing
96   void LoadbalancingDone(int level);    // start load balancing
97   void ReceiveResumeClients(int fromlevel, int balancing);
98   void reportLBQulity(double mload, double mCpuLoad, double totalload, int nmsgs, double bytesentry );
99
100   struct MigrationRecord {
101     LDObjHandle handle;
102     int      fromPe;            // real from pe
103     int      toPe;
104     MigrationRecord(): fromPe(-1), toPe(-1) {}
105     MigrationRecord(LDObjHandle &k, int f, int t): handle(k), fromPe(f), toPe(t) {}
106     void pup(PUP::er &p) { p|handle; p|fromPe; p|toPe; }
107   };
108
109 private:
110   CProxy_HbmLB  thisProxy;
111   int              foundNeighbors;
112   LDStats myStats;
113
114 protected:
115   virtual CmiBool QueryBalanceNow(int) { return CmiTrue; };  
116   virtual CmiBool QueryMigrateStep(int) { return CmiTrue; };  
117   //virtual LBMigrateMsg* Strategy(LDStats* stats);
118   virtual void work(LDStats* stats);
119
120   virtual int     useMem();
121   int NeighborIndex(int pe, int atlevel);   // return the neighbor array index
122
123   MyHmbHierarchyTree  *tree;
124
125   class LevelData {
126   public:
127     int parent;
128     int*  children;
129     int nChildren;
130     double statsList[2];                // bianry tree
131     int stats_msg_count;
132     LDStats *statsData;
133     int obj_expected, obj_completed;
134     int migrates_expected, migrates_completed;
135     int mig_reported;           // for NotifyObjectMigrationDone
136     int info_recved;            // for CollectInfo()
137     int vector_expected, vector_completed;
138     int resumeAfterMigration;
139     CkVec<MigrationRecord> outObjs;
140     CkVec<Location> unmatchedObjs;
141     CkVec<Location> matchedObjs;         // don't need to be sent up
142   public:
143     LevelData(): parent(-1), children(NULL), nChildren(0), stats_msg_count(0),
144                  statsData(NULL), obj_expected(-1), obj_completed(0),
145                  migrates_expected(-1), migrates_completed(0),
146                  mig_reported(0), info_recved(0), 
147                  vector_expected(-1), vector_completed(0),
148                  resumeAfterMigration(0)
149                  { statsList[0] = statsList[1] = 0.0; }
150     ~LevelData() {
151       if (children) delete [] children;
152       if (statsData) delete statsData;
153     }
154     int migrationDone() {
155 //CkPrintf("[%d] checking migrates_expected: %d migrates_completed: %d obj_completed: %d\n", CkMyPe(), migrates_expected, migrates_completed, obj_completed);
156       return migrates_expected == 0 || migrates_completed == migrates_expected && obj_completed == migrates_expected;
157     }
158     int vectorReceived() {
159       return vector_expected==0 || vector_expected == vector_completed;
160     }
161     void clear() {
162       obj_expected = -1;
163       obj_completed = 0;
164       migrates_expected = -1;
165       migrates_completed = 0;
166       mig_reported = 0;
167       info_recved = 0;
168       vector_expected = -1;
169       vector_completed = 0;
170       resumeAfterMigration = 0;
171       statsList[0] = statsList[1] = 0.0;
172       if (statsData) statsData->clear();
173       outObjs.free();
174       matchedObjs.free();
175       unmatchedObjs.free();
176     }
177     int useMem() {
178       int memused = sizeof(LevelData);
179       if (statsData) memused += statsData->useMem();
180       memused += outObjs.size() * sizeof(MigrationRecord);
181       memused += (unmatchedObjs.size()+matchedObjs.size()) * sizeof(Location);
182       return memused;
183     }
184   };
185
186   CkVec<LevelData *>  levelData;
187
188   int currentLevel;
189   int lbLevel;
190
191 private:
192   void FindNeighbors();
193
194   int migrate_expected;
195   LBMigrateMsg** mig_msgs;
196   int mig_msgs_received;
197   int cur_ld_balancer;
198   double start_lb_time;
199
200   double maxLoad;
201   double maxCpuLoad;                // on level = 1
202   double maxCommBytes;      // on level = 1
203   int    maxCommCount;      // on level = 1
204   double totalLoad;
205   double maxMem;                    // on level = max - 1
206
207   int vector_n_moves;
208
209   CkVec<LDObjHandle> newObjs;
210 };
211
212 /*
213 class NLBStatsMsg {
214 public:
215   int from_pe;
216   int serial;
217   int pe_speed;
218   double total_walltime;
219   double total_cputime;
220   double idletime;
221   double bg_walltime;
222   double bg_cputime;
223   double obj_walltime;   // may not needed
224   double obj_cputime;   // may not needed
225   int n_objs;
226   LDObjData *objData;
227   int n_comm;
228   LDCommData *commData;
229 public:
230   NLBStatsMsg(int osz, int csz);
231   NLBStatsMsg(NLBStatsMsg *s);
232   NLBStatsMsg()  {}
233   ~NLBStatsMsg();
234   void pup(PUP::er &p);
235 }; 
236 */
237
238 #endif /* NBORBASELB_H */
239
240 /*@}*/