These changes fix things that I have discovered about Grid load balancing.
[charm.git] / src / ck-ldb / GridCommLB.h
1 #ifndef _GRIDCOMMLB_H_
2 #define _GRIDCOMMLB_H_
3
4 #include <limits.h>
5 #include <stdio.h>
6
7 #include "charm++.h"
8 #include "cklists.h"
9
10 #include "CentralLB.h"
11
12 #ifndef MAXINT
13 #define MAXINT 2147483647
14 #endif
15
16 #if CONVERSE_VERSION_VMI
17 extern "C" int CmiGetCluster (int process);
18 #endif
19
20 void CreateGridCommLB ();
21
22 class PE_Data_T
23 {
24   public:
25     CmiBool available;
26     int cluster;
27     int num_objs;
28     int num_lan_objs;
29     int num_lan_msgs;
30     int num_wan_objs;
31     int num_wan_msgs;
32     double relative_speed;
33     double scaled_load;
34 };
35
36 class Object_Data_T
37 {
38   public:
39     CmiBool migratable;
40     int cluster;
41     int from_pe;
42     int to_pe;
43     int num_lan_msgs;
44     int num_wan_msgs;
45     double load;
46 };
47
48 class GridCommLB : public CentralLB
49 {
50   public:
51     GridCommLB (const CkLBOptions &);
52     GridCommLB (CkMigrateMessage *msg);
53
54     CmiBool QueryBalanceNow (int step);
55     void work (CentralLB::LDStats *stats, int count);
56     void pup (PUP::er &p) { CentralLB::pup (p); }
57
58   private:
59     int Get_Cluster (int pe);
60     void Initialize_PE_Data (CentralLB::LDStats *stats);
61     int Available_PE_Count ();
62     int Compute_Number_Of_Clusters ();
63     void Initialize_Object_Data (CentralLB::LDStats *stats);
64     void Examine_InterObject_Messages (CentralLB::LDStats *stats);
65     void Map_NonMigratable_Objects_To_PEs ();
66     void Map_Migratable_Objects_To_PEs ();
67     int Find_Maximum_WAN_Object (int cluster);
68     int Find_Minimum_WAN_PE (int cluster);
69     void Assign_Object_To_PE (int target_object, int target_pe);
70
71     int Num_PEs;
72     int Num_Objects;
73     int Num_Clusters;
74     PE_Data_T *PE_Data;
75     Object_Data_T *Object_Data;
76 };
77
78 #endif