void Topology::createLinks() { // Find maximum switchID SwitchID max_switch_id = 0; for (int i=0; i<m_links_src_vector.size(); i++) { max_switch_id = max(max_switch_id, m_links_src_vector[i]); max_switch_id = max(max_switch_id, m_links_dest_vector[i]); } // Initialize weight vector Matrix topology_weights; Matrix topology_bw_multis; int num_switches = max_switch_id+1; topology_weights.setSize(num_switches); topology_bw_multis.setSize(num_switches); for(int i=0; i<topology_weights.size(); i++) { topology_weights[i].setSize(num_switches); topology_bw_multis[i].setSize(num_switches); for(int j=0; j<topology_weights[i].size(); j++) { topology_weights[i][j] = INFINITE_LATENCY; topology_bw_multis[i][j] = -1; // initialize to an invalid value } } // Set identity weights to zero for(int i=0; i<topology_weights.size(); i++) { topology_weights[i][i] = 0; } // Fill in the topology weights and bandwidth multipliers for (int i=0; i<m_links_src_vector.size(); i++) { topology_weights[m_links_src_vector[i]][m_links_dest_vector[i]] = m_links_latency_vector[i]; topology_bw_multis[m_links_src_vector[i]][m_links_dest_vector[i]] = m_bw_multiplier_vector[i]; } // Walk topology and hookup the links Matrix dist = shortest_path(topology_weights); for(int i=0; i<topology_weights.size(); i++) { for(int j=0; j<topology_weights[i].size(); j++) { int weight = topology_weights[i][j]; if (weight > 0 && weight != INFINITE_LATENCY) { int bw_multiplier = topology_bw_multis[i][j]; assert(bw_multiplier > 0); NetDest destination_set = shortest_path_to_node(i, j, topology_weights, dist, m_nodes); makeLink(i, j, destination_set, weight, bw_multiplier); } } } }
void Topology::createLinks(bool isReconfiguration) { // Find maximum switchID SwitchID max_switch_id = 0; for (int i=0; i<m_links_src_vector.size(); i++) { max_switch_id = max(max_switch_id, m_links_src_vector[i]); max_switch_id = max(max_switch_id, m_links_dest_vector[i]); } //cerr << "Max switch id "<< max_switch_id<<"\n"; // Initialize weight vector //typedef Vector < Vector <int> > Matrix; Matrix topology_weights; Matrix topology_latency; Matrix topology_bw_multis; int num_switches = max_switch_id+1; topology_weights.setSize(num_switches); topology_latency.setSize(num_switches); topology_bw_multis.setSize(num_switches); m_component_latencies.setSize(num_switches); // FIXME setting the size of a member variable here is a HACK! m_component_inter_switches.setSize(num_switches); // FIXME setting the size of a member variable here is a HACK! for(int i=0; i<topology_weights.size(); i++) { topology_weights[i].setSize(num_switches); topology_latency[i].setSize(num_switches); topology_bw_multis[i].setSize(num_switches); m_component_latencies[i].setSize(num_switches); m_component_inter_switches[i].setSize(num_switches); // FIXME setting the size of a member variable here is a HACK! for(int j=0; j<topology_weights[i].size(); j++) { topology_weights[i][j] = INFINITE_LATENCY; topology_latency[i][j] = -1; // initialize to an invalid value topology_bw_multis[i][j] = -1; // initialize to an invalid value m_component_latencies[i][j] = -1; // initialize to an invalid value m_component_inter_switches[i][j] = 0; // initially assume direct connections / no intermediate switches between components } } // Set identity weights to zero for(int i=0; i<topology_weights.size(); i++) { topology_weights[i][i] = 0; } // Fill in the topology weights and bandwidth multipliers for (int i=0; i<m_links_src_vector.size(); i++) { topology_weights[m_links_src_vector[i]][m_links_dest_vector[i]] = m_links_weight_vector[i]; topology_latency[m_links_src_vector[i]][m_links_dest_vector[i]] = m_links_latency_vector[i]; m_component_latencies[m_links_src_vector[i]][m_links_dest_vector[i]] = m_links_latency_vector[i]; // initialize to latency vector topology_bw_multis[m_links_src_vector[i]][m_links_dest_vector[i]] = m_bw_multiplier_vector[i]; } // Walk topology and hookup the links Matrix dist = shortest_path(topology_weights, m_component_latencies, m_component_inter_switches); for(int i=0; i<topology_weights.size(); i++) { for(int j=0; j<topology_weights[i].size(); j++) { int weight = topology_weights[i][j]; int bw_multiplier = topology_bw_multis[i][j]; int latency = topology_latency[i][j]; if (weight > 0 && weight != INFINITE_LATENCY) { NetDest destination_set = shortest_path_to_node(i, j, topology_weights, dist); assert(latency != -1); makeLink(i, j, destination_set, latency, weight, bw_multiplier, isReconfiguration); } } } }