summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNilay Vaish <nilay@cs.wisc.edu>2015-09-14 10:14:50 -0500
committerNilay Vaish <nilay@cs.wisc.edu>2015-09-14 10:14:50 -0500
commit6bee1d912482ee57ed79bb557afdad25563e9955 (patch)
tree9cc2afe33fabc498c8d2058cffd2c5ee5dd30519
parent4e898be76299f72605fd1624f04917edb2bba3c4 (diff)
downloadgem5-6bee1d912482ee57ed79bb557afdad25563e9955.tar.xz
ruby: topology: refactor code.
-rw-r--r--src/mem/ruby/network/Topology.cc83
-rw-r--r--src/mem/ruby/network/Topology.hh26
2 files changed, 42 insertions, 67 deletions
diff --git a/src/mem/ruby/network/Topology.cc b/src/mem/ruby/network/Topology.cc
index 7c0e31ba6..8118770ea 100644
--- a/src/mem/ruby/network/Topology.cc
+++ b/src/mem/ruby/network/Topology.cc
@@ -46,35 +46,15 @@ const int INFINITE_LATENCY = 10000; // Yes, this is a big hack
// the second m_nodes set of SwitchIDs represent the the output queues
// of the network.
-// Helper functions based on chapter 29 of Cormen et al.
-void extend_shortest_path(Matrix& current_dist, Matrix& latencies,
- Matrix& inter_switches);
-Matrix shortest_path(const Matrix& weights, Matrix& latencies,
- Matrix& inter_switches);
-bool link_is_shortest_path_to_node(SwitchID src, SwitchID next,
- SwitchID final, const Matrix& weights, const Matrix& dist);
-NetDest shortest_path_to_node(SwitchID src, SwitchID next,
- const Matrix& weights, const Matrix& dist);
-
-Topology::Topology(uint32_t num_routers, vector<BasicExtLink *> ext_links,
- vector<BasicIntLink *> int_links)
- : m_number_of_switches(num_routers)
+Topology::Topology(uint32_t num_routers,
+ const vector<BasicExtLink *> &ext_links,
+ const vector<BasicIntLink *> &int_links)
+ : m_nodes(ext_links.size()), m_number_of_switches(num_routers),
+ m_ext_link_vector(ext_links), m_int_link_vector(int_links)
{
-
- // initialize component latencies record
- m_component_latencies.resize(0);
- m_component_inter_switches.resize(0);
-
// Total nodes/controllers in network
- // Must make sure this is called after the State Machine constructors
- m_nodes = MachineType_base_number(MachineType_NUM);
assert(m_nodes > 1);
- if (m_nodes != ext_links.size()) {
- fatal("m_nodes (%d) != ext_links vector length (%d)\n",
- m_nodes, ext_links.size());
- }
-
// analyze both the internal and external links, create data structures
// Note that the python created links are bi-directional, but that the
// topology and networks utilize uni-directional links. Thus each
@@ -85,9 +65,6 @@ Topology::Topology(uint32_t num_routers, vector<BasicExtLink *> ext_links,
AbstractController *abs_cntrl = ext_link->params()->ext_node;
BasicRouter *router = ext_link->params()->int_node;
- // Store the ExtLink pointers for later
- m_ext_link_vector.push_back(ext_link);
-
int machine_base_idx = MachineType_base_number(abs_cntrl->getType());
int ext_idx1 = machine_base_idx + abs_cntrl->getVersion();
int ext_idx2 = ext_idx1 + m_nodes;
@@ -133,28 +110,13 @@ Topology::createLinks(Network *net)
}
// Initialize weight, latency, and inter switched vectors
- Matrix topology_weights;
int num_switches = max_switch_id+1;
- topology_weights.resize(num_switches);
- m_component_latencies.resize(num_switches);
- m_component_inter_switches.resize(num_switches);
-
- for (int i = 0; i < topology_weights.size(); i++) {
- topology_weights[i].resize(num_switches);
- m_component_latencies[i].resize(num_switches);
- m_component_inter_switches[i].resize(num_switches);
-
- for (int j = 0; j < topology_weights[i].size(); j++) {
- topology_weights[i][j] = INFINITE_LATENCY;
-
- // initialize to invalid values
- m_component_latencies[i][j] = -1;
-
- // initially assume direct connections / no intermediate
- // switches between components
- m_component_inter_switches[i][j] = 0;
- }
- }
+ Matrix topology_weights(num_switches,
+ vector<int>(num_switches, INFINITE_LATENCY));
+ Matrix component_latencies(num_switches,
+ vector<int>(num_switches, -1));
+ Matrix component_inter_switches(num_switches,
+ vector<int>(num_switches, 0));
// Set identity weights to zero
for (int i = 0; i < topology_weights.size(); i++) {
@@ -168,13 +130,14 @@ Topology::createLinks(Network *net)
BasicLink* link = (*i).second.link;
int src = src_dest.first;
int dst = src_dest.second;
- m_component_latencies[src][dst] = link->m_latency;
+ component_latencies[src][dst] = link->m_latency;
topology_weights[src][dst] = link->m_weight;
}
// Walk topology and hookup the links
- Matrix dist = shortest_path(topology_weights, m_component_latencies,
- m_component_inter_switches);
+ Matrix dist = shortest_path(topology_weights, component_latencies,
+ 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];
@@ -243,8 +206,8 @@ Topology::makeLink(Network *net, SwitchID src, SwitchID dest,
// The following all-pairs shortest path algorithm is based on the
// discussion from Cormen et al., Chapter 26.1.
void
-extend_shortest_path(Matrix& current_dist, Matrix& latencies,
- Matrix& inter_switches)
+Topology::extend_shortest_path(Matrix &current_dist, Matrix &latencies,
+ Matrix &inter_switches)
{
bool change = true;
int nodes = current_dist.size();
@@ -281,7 +244,8 @@ extend_shortest_path(Matrix& current_dist, Matrix& latencies,
}
Matrix
-shortest_path(const Matrix& weights, Matrix& latencies, Matrix& inter_switches)
+Topology::shortest_path(const Matrix &weights, Matrix &latencies,
+ Matrix &inter_switches)
{
Matrix dist = weights;
extend_shortest_path(dist, latencies, inter_switches);
@@ -289,15 +253,16 @@ shortest_path(const Matrix& weights, Matrix& latencies, Matrix& inter_switches)
}
bool
-link_is_shortest_path_to_node(SwitchID src, SwitchID next, SwitchID final,
- const Matrix& weights, const Matrix& dist)
+Topology::link_is_shortest_path_to_node(SwitchID src, SwitchID next,
+ SwitchID final, const Matrix &weights,
+ const Matrix &dist)
{
return weights[src][next] + dist[next][final] == dist[src][final];
}
NetDest
-shortest_path_to_node(SwitchID src, SwitchID next, const Matrix& weights,
- const Matrix& dist)
+Topology::shortest_path_to_node(SwitchID src, SwitchID next,
+ const Matrix &weights, const Matrix &dist)
{
NetDest result;
int d = 0;
diff --git a/src/mem/ruby/network/Topology.hh b/src/mem/ruby/network/Topology.hh
index 1a11156e7..7fa0914a1 100644
--- a/src/mem/ruby/network/Topology.hh
+++ b/src/mem/ruby/network/Topology.hh
@@ -64,28 +64,38 @@ typedef std::map<std::pair<SwitchID, SwitchID>, LinkEntry> LinkMap;
class Topology
{
public:
- Topology(uint32_t num_routers, std::vector<BasicExtLink *> ext_links,
- std::vector<BasicIntLink *> int_links);
+ Topology(uint32_t num_routers, const std::vector<BasicExtLink *> &ext_links,
+ const std::vector<BasicIntLink *> &int_links);
uint32_t numSwitches() const { return m_number_of_switches; }
void createLinks(Network *net);
void print(std::ostream& out) const { out << "[Topology]"; }
- protected:
+ private:
void addLink(SwitchID src, SwitchID dest, BasicLink* link,
LinkDirection dir);
void makeLink(Network *net, SwitchID src, SwitchID dest,
const NetDest& routing_table_entry);
- NodeID m_nodes;
- uint32_t m_number_of_switches;
+ // Helper functions based on chapter 29 of Cormen et al.
+ void extend_shortest_path(Matrix &current_dist, Matrix &latencies,
+ Matrix &inter_switches);
+
+ std::vector<std::vector<int>> shortest_path(const Matrix &weights,
+ Matrix &latencies, Matrix &inter_switches);
+
+ bool link_is_shortest_path_to_node(SwitchID src, SwitchID next,
+ SwitchID final, const Matrix &weights, const Matrix &dist);
+
+ NetDest shortest_path_to_node(SwitchID src, SwitchID next,
+ const Matrix &weights, const Matrix &dist);
+
+ const uint32_t m_nodes;
+ const uint32_t m_number_of_switches;
std::vector<BasicExtLink*> m_ext_link_vector;
std::vector<BasicIntLink*> m_int_link_vector;
- Matrix m_component_latencies;
- Matrix m_component_inter_switches;
-
LinkMap m_link_map;
};