00001 #ifndef _GRIDHYBRIDSEEDLB_H_
00002 #define _GRIDHYBRIDSEEDLB_H_
00003 
00004 #include "CentralLB.h"
00005 
00006 #define CK_LDB_GRIDHYBRIDSEEDLB_MODE 0
00007 #define CK_LDB_GRIDHYBRIDSEEDLB_BACKGROUND_LOAD 1
00008 #define CK_LDB_GRIDHYBRIDSEEDLB_LOAD_TOLERANCE 0.10
00009 
00010 #ifndef MAXINT
00011 #define MAXINT 2147483647
00012 #endif
00013 
00014 #ifndef MAXDOUBLE
00015 #define MAXDOUBLE 1e10
00016 #endif
00017 
00018 extern "C" void METIS_PartGraphRecursive (int*, int*, int*, int*, int*, int*,
00019                       int*, int*, int*, int*, int*);
00020 
00021 extern "C" void METIS_PartGraphKway (int*, int*, int*, int*, int*, int*,
00022                      int*, int*, int*, int*, int*);
00023 
00024 extern "C" void METIS_PartGraphVKway (int*, int*, int*, int*, int*, int*,
00025                       int*, int*, int*, int*, int*);
00026 
00027 extern "C" void METIS_WPartGraphRecursive (int*, int*, int*, int*,
00028                        int*, int*, int*, int*,
00029                        float*, int*, int*, int*);
00030 
00031 extern "C" void METIS_WPartGraphKway (int*, int*, int*, int*,
00032                       int*, int*, int*, int*,
00033                       float*, int*, int*, int*);
00034 
00035 extern "C" void METIS_mCPartGraphRecursive (int*, int*, int*, int*,
00036                         int*, int*, int*, int*,
00037                         int*, int*, int*, int*);
00038 
00039 extern "C" void METIS_mCPartGraphKway (int*, int*, int*, int*, int*,
00040                        int*, int*, int*, int*, int*,
00041                        int*, int*, int*);
00042 
00043 void CreateGridHybridSeedLB ();
00044 
00045 class PE_Data_T
00046 {
00047   public:
00048     bool available;
00049     int cluster;
00050     int num_objs;
00051     int num_lan_objs;
00052     int num_lan_msgs;
00053     int num_wan_objs;
00054     int num_wan_msgs;
00055     double relative_speed;
00056     double scaled_load;
00057 };
00058 
00059 class Object_Data_T
00060 {
00061   public:
00062     bool migratable;
00063     int cluster;
00064     int from_pe;
00065     int to_pe;
00066     int num_lan_msgs;
00067     int num_wan_msgs;
00068     double load;
00069     int secondary_index;
00070 };
00071 
00072 class Cluster_Data_T
00073 {
00074   public:
00075     int num_pes;
00076     double total_cpu_power;
00077     double scaled_cpu_power;
00078 };
00079 
00080 class GridHybridSeedLB : public CBase_GridHybridSeedLB
00081 {
00082   public:
00083     GridHybridSeedLB (const CkLBOptions &opt);
00084     GridHybridSeedLB (CkMigrateMessage *msg);
00085 
00086     bool QueryBalanceNow (int step);
00087     void work (LDStats *stats);
00088     void pup (PUP::er &p) { }
00089 
00090   private:
00091     int Get_Cluster (int pe);
00092     void Initialize_PE_Data (CentralLB::LDStats *stats);
00093     int Available_PE_Count ();
00094     int Compute_Number_Of_Clusters ();
00095     void Initialize_Object_Data (CentralLB::LDStats *stats);
00096     int Compute_Migratable_Object_Count ();
00097     void Initialize_Cluster_Data ();
00098     void Initialize_Communication_Matrix (CentralLB::LDStats *stats);
00099     void Partition_Objects_Into_Clusters (CentralLB::LDStats *stats);
00100     void Examine_InterObject_Messages (CentralLB::LDStats *stats);
00101     void Map_NonMigratable_Objects_To_PEs ();
00102     int Find_Maximum_Object (int cluster);
00103     int Find_Maximum_Border_Object (int cluster);
00104     int Find_Maximum_Object_From_Seeds (int pe);
00105     int Find_Maximum_Border_Object_From_Seeds (int pe);
00106     int Compute_Communication_Events (int obj1, int obj2);
00107     int Find_Minimum_PE (int cluster);
00108     void Assign_Object_To_PE (int target_object, int target_pe);
00109 
00110     int CK_LDB_GridHybridSeedLB_Mode;
00111     int CK_LDB_GridHybridSeedLB_Background_Load;
00112     double CK_LDB_GridHybridSeedLB_Load_Tolerance;
00113 
00114     int Num_PEs;
00115     int Num_Objects;
00116     int Num_Migratable_Objects;
00117     int Num_Clusters;
00118     PE_Data_T *PE_Data;
00119     Object_Data_T *Object_Data;
00120     Cluster_Data_T *Cluster_Data;
00121     int *Migratable_Objects;
00122     int **Communication_Matrix;
00123 };
00124 
00125 #endif