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 #if CONVERSE_VERSION_VMI
00044 extern "C" int CmiGetCluster (int process);
00045 #endif
00046
00047 void CreateGridHybridSeedLB ();
00048
00049 class PE_Data_T
00050 {
00051 public:
00052 CmiBool available;
00053 int cluster;
00054 int num_objs;
00055 int num_lan_objs;
00056 int num_lan_msgs;
00057 int num_wan_objs;
00058 int num_wan_msgs;
00059 double relative_speed;
00060 double scaled_load;
00061 };
00062
00063 class Object_Data_T
00064 {
00065 public:
00066 CmiBool migratable;
00067 int cluster;
00068 int from_pe;
00069 int to_pe;
00070 int num_lan_msgs;
00071 int num_wan_msgs;
00072 double load;
00073 int secondary_index;
00074 };
00075
00076 class Cluster_Data_T
00077 {
00078 public:
00079 int num_pes;
00080 double total_cpu_power;
00081 double scaled_cpu_power;
00082 };
00083
00084 class GridHybridSeedLB : public CentralLB
00085 {
00086 public:
00087 GridHybridSeedLB (const CkLBOptions &opt);
00088 GridHybridSeedLB (CkMigrateMessage *msg);
00089
00090 CmiBool QueryBalanceNow (int step);
00091 void work (LDStats *stats);
00092 void pup (PUP::er &p) { CentralLB::pup (p); }
00093
00094 private:
00095 int Get_Cluster (int pe);
00096 void Initialize_PE_Data (CentralLB::LDStats *stats);
00097 int Available_PE_Count ();
00098 int Compute_Number_Of_Clusters ();
00099 void Initialize_Object_Data (CentralLB::LDStats *stats);
00100 int Compute_Migratable_Object_Count ();
00101 void Initialize_Cluster_Data ();
00102 void Initialize_Communication_Matrix (CentralLB::LDStats *stats);
00103 void Partition_Objects_Into_Clusters (CentralLB::LDStats *stats);
00104 void Examine_InterObject_Messages (CentralLB::LDStats *stats);
00105 void Map_NonMigratable_Objects_To_PEs ();
00106 int Find_Maximum_Object (int cluster);
00107 int Find_Maximum_Border_Object (int cluster);
00108 int Find_Maximum_Object_From_Seeds (int pe);
00109 int Find_Maximum_Border_Object_From_Seeds (int pe);
00110 int Compute_Communication_Events (int obj1, int obj2);
00111 int Find_Minimum_PE (int cluster);
00112 void Assign_Object_To_PE (int target_object, int target_pe);
00113
00114 int CK_LDB_GridHybridSeedLB_Mode;
00115 int CK_LDB_GridHybridSeedLB_Background_Load;
00116 double CK_LDB_GridHybridSeedLB_Load_Tolerance;
00117
00118 int Num_PEs;
00119 int Num_Objects;
00120 int Num_Migratable_Objects;
00121 int Num_Clusters;
00122 PE_Data_T *PE_Data;
00123 Object_Data_T *Object_Data;
00124 Cluster_Data_T *Cluster_Data;
00125 int *Migratable_Objects;
00126 int **Communication_Matrix;
00127 };
00128
00129 #endif