changeset 2365e9e396f7 in /z/repo/gem5 details: http://repo.gem5.org/gem5?cmd=changeset;node=2365e9e396f7 description: config: add port directions and per-router delay in topology. This patch adds port direction names to the links during topology creation, which can be used for better printed names for the links or for users to code up their own adaptive routing algorithms. It also adds support for every router to have an independent latency value to support heterogeneous topologies with the subsequent garnet2.0 patch.
diffstat: configs/topologies/Mesh_XY.py | 8 +++++ src/mem/ruby/network/BasicLink.py | 8 ++++- src/mem/ruby/network/BasicRouter.cc | 1 + src/mem/ruby/network/BasicRouter.hh | 1 + src/mem/ruby/network/BasicRouter.py | 1 + src/mem/ruby/network/Network.hh | 4 ++- src/mem/ruby/network/Topology.cc | 15 ++++++++-- src/mem/ruby/network/Topology.hh | 7 ++++- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc | 4 ++- src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh | 4 ++- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc | 4 ++- src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh | 4 ++- src/mem/ruby/network/simple/SimpleNetwork.cc | 4 ++- src/mem/ruby/network/simple/SimpleNetwork.hh | 4 ++- 14 files changed, 57 insertions(+), 12 deletions(-) diffs (271 lines): diff -r cf870cd20cfc -r 2365e9e396f7 configs/topologies/Mesh_XY.py --- a/configs/topologies/Mesh_XY.py Thu Oct 06 14:35:18 2016 -0400 +++ b/configs/topologies/Mesh_XY.py Thu Oct 06 14:35:20 2016 -0400 @@ -109,6 +109,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[east_out], dst_node=routers[west_in], + src_outport="East", + dst_inport="West", weight=1)) link_count += 1 @@ -121,6 +123,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[west_out], dst_node=routers[east_in], + src_outport="West", + dst_inport="East", weight=1)) link_count += 1 @@ -133,6 +137,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[north_out], dst_node=routers[south_in], + src_outport="North", + dst_inport="South", weight=2)) link_count += 1 @@ -145,6 +151,8 @@ int_links.append(IntLink(link_id=link_count, src_node=routers[south_out], dst_node=routers[north_in], + src_outport="South", + dst_inport="North", weight=2)) link_count += 1 diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/BasicLink.py --- a/src/mem/ruby/network/BasicLink.py Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/BasicLink.py Thu Oct 06 14:35:20 2016 -0400 @@ -46,11 +46,17 @@ cxx_header = "mem/ruby/network/BasicLink.hh" ext_node = Param.RubyController("External node") int_node = Param.BasicRouter("ID of internal node") - bandwidth_factor = 16 + bandwidth_factor = 16 # only used by simple network class BasicIntLink(BasicLink): type = 'BasicIntLink' cxx_header = "mem/ruby/network/BasicLink.hh" src_node = Param.BasicRouter("Router on src end") dst_node = Param.BasicRouter("Router on dst end") + + # only used by Garnet. + src_outport = Param.String("", "Outport direction at src router") + dst_inport = Param.String("", "Inport direction at dst router") + + # only used by simple network bandwidth_factor = 16 diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/BasicRouter.cc --- a/src/mem/ruby/network/BasicRouter.cc Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.cc Thu Oct 06 14:35:20 2016 -0400 @@ -32,6 +32,7 @@ : ClockedObject(p) { m_id = p->router_id; + m_latency = p->latency; } void diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/BasicRouter.hh --- a/src/mem/ruby/network/BasicRouter.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.hh Thu Oct 06 14:35:20 2016 -0400 @@ -51,6 +51,7 @@ // ID in relation to other routers in the system // uint32_t m_id; + uint32_t m_latency; }; inline std::ostream& diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/BasicRouter.py --- a/src/mem/ruby/network/BasicRouter.py Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/BasicRouter.py Thu Oct 06 14:35:20 2016 -0400 @@ -34,3 +34,4 @@ type = 'BasicRouter' cxx_header = "mem/ruby/network/BasicRouter.hh" router_id = Param.Int("ID in relation to other routers") + latency = Param.Cycles(1, "number of cycles inside router") diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/Network.hh --- a/src/mem/ruby/network/Network.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/Network.hh Thu Oct 06 14:35:20 2016 -0400 @@ -85,7 +85,9 @@ virtual void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry) = 0; virtual void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) = 0; + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) = 0; virtual void collateStats() = 0; virtual void print(std::ostream& out) const = 0; diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/Topology.cc --- a/src/mem/ruby/network/Topology.cc Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/Topology.cc Thu Oct 06 14:35:20 2016 -0400 @@ -88,6 +88,9 @@ BasicRouter *router_src = int_link->params()->src_node; BasicRouter *router_dst = int_link->params()->dst_node; + PortDirection src_outport = int_link->params()->src_outport; + PortDirection dst_inport = int_link->params()->dst_inport; + // Store the IntLink pointers for later m_int_link_vector.push_back(int_link); @@ -95,7 +98,7 @@ int dst = router_dst->params()->router_id + 2*m_nodes; // create the internal uni-directional link from src to dst - addLink(src, dst, int_link); + addLink(src, dst, int_link, src_outport, dst_inport); } } @@ -153,7 +156,9 @@ } void -Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link) +Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link, + PortDirection src_outport_dirn, + PortDirection dst_inport_dirn) { assert(src <= m_number_of_switches+m_nodes+m_nodes); assert(dest <= m_number_of_switches+m_nodes+m_nodes); @@ -164,6 +169,8 @@ src_dest_pair.first = src; src_dest_pair.second = dest; link_entry.link = link; + link_entry.src_outport_dirn = src_outport_dirn; + link_entry.dst_inport_dirn = dst_inport_dirn; m_link_map[src_dest_pair] = link_entry; } @@ -199,7 +206,9 @@ link_entry = m_link_map[src_dest]; net->makeInternalLink(src - (2 * m_nodes), dest - (2 * m_nodes), link_entry.link, - routing_table_entry); + routing_table_entry, + link_entry.src_outport_dirn, + link_entry.dst_inport_dirn); } } diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/Topology.hh --- a/src/mem/ruby/network/Topology.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/Topology.hh Thu Oct 06 14:35:20 2016 -0400 @@ -52,11 +52,14 @@ class Network; typedef std::vector<std::vector<int> > Matrix; +typedef std::string PortDirection; struct LinkEntry { BasicLink *link; LinkDirection direction; + PortDirection src_outport_dirn; + PortDirection dst_inport_dirn; }; typedef std::map<std::pair<SwitchID, SwitchID>, LinkEntry> LinkMap; @@ -72,7 +75,9 @@ void print(std::ostream& out) const { out << "[Topology]"; } private: - void addLink(SwitchID src, SwitchID dest, BasicLink* link); + void addLink(SwitchID src, SwitchID dest, BasicLink* link, + PortDirection src_outport_dirn = "", + PortDirection dest_inport_dirn = ""); void makeLink(Network *net, SwitchID src, SwitchID dest, const NetDest& routing_table_entry); diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc Thu Oct 06 14:35:20 2016 -0400 @@ -175,7 +175,9 @@ void GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { GarnetIntLink_d* garnet_link = safe_cast<GarnetIntLink_d*>(link); NetworkLink_d* net_link = garnet_link->m_network_links[0]; diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh --- a/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh Thu Oct 06 14:35:20 2016 -0400 @@ -74,7 +74,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); //! Function for performing a functional write. The return value //! indicates the number of messages that were written. diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc Thu Oct 06 14:35:20 2016 -0400 @@ -128,7 +128,9 @@ void GarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { GarnetIntLink* garnet_link = safe_cast<GarnetIntLink*>(link); NetworkLink *net_link = garnet_link->m_network_links[0]; diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh Thu Oct 06 14:35:20 2016 -0400 @@ -65,7 +65,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); //! Function for performing a functional read. The return value //! indicates if a message was found that had the required address. diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/simple/SimpleNetwork.cc --- a/src/mem/ruby/network/simple/SimpleNetwork.cc Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/simple/SimpleNetwork.cc Thu Oct 06 14:35:20 2016 -0400 @@ -104,7 +104,9 @@ // From a switch to a switch void SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry) + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport) { // Create a set of new MessageBuffers std::vector<MessageBuffer*> queues(m_virtual_networks); diff -r cf870cd20cfc -r 2365e9e396f7 src/mem/ruby/network/simple/SimpleNetwork.hh --- a/src/mem/ruby/network/simple/SimpleNetwork.hh Thu Oct 06 14:35:18 2016 -0400 +++ b/src/mem/ruby/network/simple/SimpleNetwork.hh Thu Oct 06 14:35:20 2016 -0400 @@ -64,7 +64,9 @@ void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, const NetDest& routing_table_entry); void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, - const NetDest& routing_table_entry); + const NetDest& routing_table_entry, + PortDirection src_outport, + PortDirection dst_inport); void print(std::ostream& out) const; _______________________________________________ gem5-dev mailing list gem5-dev@gem5.org http://m5sim.org/mailman/listinfo/gem5-dev