/************************************************************************** ** Instantiate and initialize the PE_Data[] data structure. ** ** While doing this... ** - ensure that there is at least one available PE ** - ensure that all PEs are mapped to a cluster ** - determine the maximum cluster number (gives the number of clusters) ** - determine the minimum speed PE (used to compute relative PE speeds) */ void GridCommRefineLB::Initialize_PE_Data (CentralLB::LDStats *stats) { int min_speed; int i; PE_Data = new PE_Data_T[Num_PEs]; min_speed = MAXINT; for (i = 0; i < Num_PEs; i++) { (&PE_Data[i])->available = stats->procs[i].available; (&PE_Data[i])->cluster = Get_Cluster (i); (&PE_Data[i])->num_objs = 0; (&PE_Data[i])->num_lan_objs = 0; (&PE_Data[i])->num_lan_msgs = 0; (&PE_Data[i])->num_wan_objs = 0; (&PE_Data[i])->num_wan_msgs = 0; (&PE_Data[i])->relative_speed = 0.0; (&PE_Data[i])->scaled_load = 0.0; if (stats->procs[i].pe_speed < min_speed) { min_speed = stats->procs[i].pe_speed; } } // Compute the relative PE speeds. // Also add background CPU time to each PE's scaled load. for (i = 0; i < Num_PEs; i++) { (&PE_Data[i])->relative_speed = (double) (stats->procs[i].pe_speed / min_speed); (&PE_Data[i])->scaled_load += stats->procs[i].bg_walltime; } }
void GridCommLB::Initialize_Object_Data (CentralLB::LDStats *stats) { int i; Object_Data = new Object_Data_T[Num_Objects]; for (i = 0; i < Num_Objects; i++) { (&Object_Data[i])->migratable = (&stats->objData[i])->migratable; (&Object_Data[i])->cluster = Get_Cluster (stats->from_proc[i]); (&Object_Data[i])->from_pe = stats->from_proc[i]; (&Object_Data[i])->to_pe = -1; (&Object_Data[i])->num_lan_msgs = 0; (&Object_Data[i])->num_wan_msgs = 0; (&Object_Data[i])->load = (&stats->objData[i])->wallTime; } }
void GridCommRefineLB::Initialize_Object_Data (CentralLB::LDStats *stats) { int i; Object_Data = new Object_Data_T[Num_Objects]; for (i = 0; i < Num_Objects; i++) { (&Object_Data[i])->migratable = (&stats->objData[i])->migratable; (&Object_Data[i])->cluster = Get_Cluster (stats->from_proc[i]); (&Object_Data[i])->from_pe = stats->from_proc[i]; (&Object_Data[i])->to_pe = stats->from_proc[i]; (&Object_Data[i])->num_lan_msgs = 0; (&Object_Data[i])->num_wan_msgs = 0; (&Object_Data[i])->load = (&stats->objData[i])->wallTime; //(&PE_Data[(&Object_Data[i])->from_pe])->num_objs += 1; //(&PE_Data[(&Object_Data[i])->from_pe])->scaled_load += (&Object_Data[i])->load / (&PE_Data[(&Object_Data[i])->from_pe])->relative_speed; } }
void GridCommRefineLB::Examine_InterObject_Messages (CentralLB::LDStats *stats) { int i; int j; LDCommData *com_data; int send_object; int send_pe; int send_cluster; int recv_object; int recv_pe; int recv_cluster; LDObjKey *recv_objects; int num_objects; for (i = 0; i < stats->n_comm; i++) { com_data = &(stats->commData[i]); if ((!com_data->from_proc()) && (com_data->recv_type() == LD_OBJ_MSG)) { send_object = stats->getHash (com_data->sender); recv_object = stats->getHash (com_data->receiver.get_destObj()); if ((send_object < 0) || (send_object > Num_Objects) || (recv_object < 0) || (recv_object > Num_Objects)) { continue; } send_pe = (&Object_Data[send_object])->from_pe; recv_pe = (&Object_Data[recv_object])->from_pe; send_cluster = Get_Cluster (send_pe); recv_cluster = Get_Cluster (recv_pe); if (send_cluster == recv_cluster) { (&Object_Data[send_object])->num_lan_msgs += com_data->messages; } else { (&Object_Data[send_object])->num_wan_msgs += com_data->messages; } } else if (com_data->receiver.get_type() == LD_OBJLIST_MSG) { send_object = stats->getHash (com_data->sender); if ((send_object < 0) || (send_object > Num_Objects)) { continue; } send_pe = (&Object_Data[send_object])->from_pe; send_cluster = Get_Cluster (send_pe); recv_objects = com_data->receiver.get_destObjs (num_objects); // (num_objects is passed by reference) for (j = 0; j < num_objects; j++) { recv_object = stats->getHash (recv_objects[j]); if ((recv_object < 0) || (recv_object > Num_Objects)) { continue; } recv_pe = (&Object_Data[recv_object])->from_pe; recv_cluster = Get_Cluster (recv_pe); if (send_cluster == recv_cluster) { (&Object_Data[send_object])->num_lan_msgs += com_data->messages; } else { (&Object_Data[send_object])->num_wan_msgs += com_data->messages; } } } } }