a modification in LDStats database, changed pointer to array to CkVec for easier...
[charm.git] / src / ck-ldb / BaseLB.h
1 /*****************************************************************************
2  * $Source$
3  * $Author$
4  * $Date$
5  * $Revision$
6  *****************************************************************************/
7
8 /**
9  \defgroup CkLdb  Charm++ Load Balancing Framework 
10 */
11 /*@{*/
12
13 #ifndef BASELB_H
14 #define BASELB_H
15
16 #include "LBDatabase.h"
17
18 #define PER_MESSAGE_SEND_OVERHEAD_DEFAULT   3.5e-5
19 #define PER_BYTE_SEND_OVERHEAD_DEFAULT      8.5e-9
20 #define PER_MESSAGE_RECV_OVERHEAD           0.0
21 #define PER_BYTE_RECV_OVERHEAD              0.0
22
23 /// Base class for all LB strategies.
24 /**
25   BaseLB is the base class for all LB strategy class.
26   it does some tracking about how many lb strategies are created.
27   it also defines some common functions.
28 */
29 class BaseLB: public CBase_BaseLB
30 {
31 protected:
32   int  seqno;
33   char *lbname;
34   LBDatabase *theLbdb;
35   LDBarrierReceiver receiver;
36   int  notifier;
37   int  startLbFnHdl;
38 private:
39   void initLB(const CkLBOptions &);
40 public:
41   struct ProcStats {  // per processor data
42     double total_walltime;
43     double total_cputime;
44     double idletime;
45     double bg_walltime;
46     double bg_cputime;
47     int pe_speed;
48     double utilization;
49     CmiBool available;
50     int   n_objs;
51     ProcStats(): total_walltime(0.0), total_cputime(0.0), idletime(0.0),
52                  bg_walltime(0.0), bg_cputime(0.0), pe_speed(1),
53                  utilization(1.0), available(CmiTrue), n_objs(0)  {}
54     inline void pup(PUP::er &p) {
55       p|total_walltime;  p|total_cputime; p|idletime;
56       p|bg_walltime; p|bg_cputime; p|pe_speed;
57       p|utilization; p|available; p|n_objs;
58     }
59   };
60
61   struct LDStats {  // Passed to Strategy
62     ProcStats  *procs;
63     int count; 
64     
65     int   n_objs;
66     int   n_migrateobjs;
67     CkVec<LDObjData> objData;
68     int   n_comm;
69     CkVec<LDCommData> commData;
70     CkVec<int>  from_proc, to_proc;
71
72     int *objHash; 
73     int  hashSize;
74
75     LDStats();
76     void assign(int oid, int pe) { CmiAssert(procs[pe].available); to_proc[oid] = pe; }
77       // build hash table
78     void makeCommHash();
79     void deleteCommHash();
80     int getHash(const LDObjKey &);
81     int getHash(const LDObjid &oid, const LDOMid &mid);
82     int getSendHash(LDCommData &cData);
83     int getRecvHash(LDCommData &cData);
84     void clear() {
85       n_objs = n_comm = 0;
86       objData.resize(0);
87       commData.resize(0);
88       from_proc.resize(0);
89       to_proc.resize(0);
90       deleteCommHash();
91     }
92     void print();
93     double computeAverageLoad();
94     void pup(PUP::er &p);
95     int useMem();
96   };
97
98   BaseLB(const CkLBOptions &opt)  { initLB(opt); }
99   BaseLB(CkMigrateMessage *m):CBase_BaseLB(m) {}
100   virtual ~BaseLB();
101
102   void unregister(); 
103   inline char *lbName() { return lbname; }
104   virtual void turnOff() { CmiAbort("turnOff not implemented"); }
105   virtual void turnOn()  { CmiAbort("turnOn not implemented"); }
106   void pup(PUP::er &p);
107   virtual void flushStates();
108 };
109
110 /// migration decision for an obj.
111 struct MigrateInfo {  
112     int index;   // object index in objData array
113     LDObjHandle obj;
114     int from_pe;
115     int to_pe;
116     int async_arrival;      // if an object is available for immediate migrate
117     MigrateInfo():  async_arrival(0) {}
118 };
119
120 /**
121   message contains the migration decision from LB strategies.
122 */
123 class LBMigrateMsg : public CMessage_LBMigrateMsg {
124 public:
125   int n_moves;
126   MigrateInfo* moves;
127
128   char * avail_vector;
129   int next_lb;
130
131   double * expectedLoad;
132 };
133
134 // for a FooLB, the following macro defines these functions for each LB:
135 // CreateFooLB(): which register with LBDatabase with sequence ticket
136 // , 
137 // AllocateFooLB(): which only locally allocate the class
138 // static void lbinit(): which is an init call
139 #if CMK_LBDB_ON
140 #define CreateLBFunc_Def(x, str)                \
141 void Create##x(void) {  \
142   int seqno = LBDatabaseObj()->getLoadbalancerTicket(); \
143   CProxy_##x::ckNew(CkLBOptions(seqno));        \
144 }       \
145 BaseLB *Allocate##x(void) { \
146   return new x((CkMigrateMessage*)NULL);        \
147 }       \
148 static void lbinit(void) {      \
149   LBRegisterBalancer(#x,        \
150                      Create##x, \
151                      Allocate##x,       \
152                      str);      \
153 }
154 #else           /* CMK_LBDB_ON */
155 #define CreateLBFunc_Def(x, str)        \
156 void Create##x(void) {}         \
157 BaseLB *Allocate##x(void) { return NULL; }      \
158 static void lbinit(void) {}
159 #endif
160
161 #endif
162
163 /*@}*/