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.
This commit is contained in:
Tushar Krishna 2016-10-06 14:35:20 -04:00
parent 003c08fa90
commit 0962d76827
14 changed files with 57 additions and 12 deletions

View file

@ -109,6 +109,8 @@ class Mesh_XY(SimpleTopology):
int_links.append(IntLink(link_id=link_count, int_links.append(IntLink(link_id=link_count,
src_node=routers[east_out], src_node=routers[east_out],
dst_node=routers[west_in], dst_node=routers[west_in],
src_outport="East",
dst_inport="West",
weight=1)) weight=1))
link_count += 1 link_count += 1
@ -121,6 +123,8 @@ class Mesh_XY(SimpleTopology):
int_links.append(IntLink(link_id=link_count, int_links.append(IntLink(link_id=link_count,
src_node=routers[west_out], src_node=routers[west_out],
dst_node=routers[east_in], dst_node=routers[east_in],
src_outport="West",
dst_inport="East",
weight=1)) weight=1))
link_count += 1 link_count += 1
@ -133,6 +137,8 @@ class Mesh_XY(SimpleTopology):
int_links.append(IntLink(link_id=link_count, int_links.append(IntLink(link_id=link_count,
src_node=routers[north_out], src_node=routers[north_out],
dst_node=routers[south_in], dst_node=routers[south_in],
src_outport="North",
dst_inport="South",
weight=2)) weight=2))
link_count += 1 link_count += 1
@ -145,6 +151,8 @@ class Mesh_XY(SimpleTopology):
int_links.append(IntLink(link_id=link_count, int_links.append(IntLink(link_id=link_count,
src_node=routers[south_out], src_node=routers[south_out],
dst_node=routers[north_in], dst_node=routers[north_in],
src_outport="South",
dst_inport="North",
weight=2)) weight=2))
link_count += 1 link_count += 1

View file

@ -46,11 +46,17 @@ class BasicExtLink(BasicLink):
cxx_header = "mem/ruby/network/BasicLink.hh" cxx_header = "mem/ruby/network/BasicLink.hh"
ext_node = Param.RubyController("External node") ext_node = Param.RubyController("External node")
int_node = Param.BasicRouter("ID of internal node") int_node = Param.BasicRouter("ID of internal node")
bandwidth_factor = 16 bandwidth_factor = 16 # only used by simple network
class BasicIntLink(BasicLink): class BasicIntLink(BasicLink):
type = 'BasicIntLink' type = 'BasicIntLink'
cxx_header = "mem/ruby/network/BasicLink.hh" cxx_header = "mem/ruby/network/BasicLink.hh"
src_node = Param.BasicRouter("Router on src end") src_node = Param.BasicRouter("Router on src end")
dst_node = Param.BasicRouter("Router on dst 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 bandwidth_factor = 16

View file

@ -32,6 +32,7 @@ BasicRouter::BasicRouter(const Params *p)
: ClockedObject(p) : ClockedObject(p)
{ {
m_id = p->router_id; m_id = p->router_id;
m_latency = p->latency;
} }
void void

View file

@ -51,6 +51,7 @@ class BasicRouter : public ClockedObject
// ID in relation to other routers in the system // ID in relation to other routers in the system
// //
uint32_t m_id; uint32_t m_id;
uint32_t m_latency;
}; };
inline std::ostream& inline std::ostream&

View file

@ -34,3 +34,4 @@ class BasicRouter(ClockedObject):
type = 'BasicRouter' type = 'BasicRouter'
cxx_header = "mem/ruby/network/BasicRouter.hh" cxx_header = "mem/ruby/network/BasicRouter.hh"
router_id = Param.Int("ID in relation to other routers") router_id = Param.Int("ID in relation to other routers")
latency = Param.Cycles(1, "number of cycles inside router")

View file

@ -85,7 +85,9 @@ class Network : public ClockedObject
virtual void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, virtual void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
const NetDest& routing_table_entry) = 0; const NetDest& routing_table_entry) = 0;
virtual void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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 collateStats() = 0;
virtual void print(std::ostream& out) const = 0; virtual void print(std::ostream& out) const = 0;

View file

@ -88,6 +88,9 @@ Topology::Topology(uint32_t num_routers,
BasicRouter *router_src = int_link->params()->src_node; BasicRouter *router_src = int_link->params()->src_node;
BasicRouter *router_dst = int_link->params()->dst_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 // Store the IntLink pointers for later
m_int_link_vector.push_back(int_link); m_int_link_vector.push_back(int_link);
@ -95,7 +98,7 @@ Topology::Topology(uint32_t num_routers,
int dst = router_dst->params()->router_id + 2*m_nodes; int dst = router_dst->params()->router_id + 2*m_nodes;
// create the internal uni-directional link from src to dst // 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 @@ Topology::createLinks(Network *net)
} }
void 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(src <= m_number_of_switches+m_nodes+m_nodes);
assert(dest <= m_number_of_switches+m_nodes+m_nodes); assert(dest <= m_number_of_switches+m_nodes+m_nodes);
@ -164,6 +169,8 @@ Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link)
src_dest_pair.first = src; src_dest_pair.first = src;
src_dest_pair.second = dest; src_dest_pair.second = dest;
link_entry.link = link; 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; m_link_map[src_dest_pair] = link_entry;
} }
@ -199,7 +206,9 @@ Topology::makeLink(Network *net, SwitchID src, SwitchID dest,
link_entry = m_link_map[src_dest]; link_entry = m_link_map[src_dest];
net->makeInternalLink(src - (2 * m_nodes), dest - (2 * m_nodes), net->makeInternalLink(src - (2 * m_nodes), dest - (2 * m_nodes),
link_entry.link, link_entry.link,
routing_table_entry); routing_table_entry,
link_entry.src_outport_dirn,
link_entry.dst_inport_dirn);
} }
} }

View file

@ -52,11 +52,14 @@ class NetDest;
class Network; class Network;
typedef std::vector<std::vector<int> > Matrix; typedef std::vector<std::vector<int> > Matrix;
typedef std::string PortDirection;
struct LinkEntry struct LinkEntry
{ {
BasicLink *link; BasicLink *link;
LinkDirection direction; LinkDirection direction;
PortDirection src_outport_dirn;
PortDirection dst_inport_dirn;
}; };
typedef std::map<std::pair<SwitchID, SwitchID>, LinkEntry> LinkMap; typedef std::map<std::pair<SwitchID, SwitchID>, LinkEntry> LinkMap;
@ -72,7 +75,9 @@ class Topology
void print(std::ostream& out) const { out << "[Topology]"; } void print(std::ostream& out) const { out << "[Topology]"; }
private: 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, void makeLink(Network *net, SwitchID src, SwitchID dest,
const NetDest& routing_table_entry); const NetDest& routing_table_entry);

View file

@ -175,7 +175,9 @@ GarnetNetwork_d::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
void void
GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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); GarnetIntLink_d* garnet_link = safe_cast<GarnetIntLink_d*>(link);
NetworkLink_d* net_link = garnet_link->m_network_links[0]; NetworkLink_d* net_link = garnet_link->m_network_links[0];

View file

@ -74,7 +74,9 @@ class GarnetNetwork_d : public BaseGarnetNetwork
void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
const NetDest& routing_table_entry); const NetDest& routing_table_entry);
void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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 //! Function for performing a functional write. The return value
//! indicates the number of messages that were written. //! indicates the number of messages that were written.

View file

@ -128,7 +128,9 @@ GarnetNetwork::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
void void
GarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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); GarnetIntLink* garnet_link = safe_cast<GarnetIntLink*>(link);
NetworkLink *net_link = garnet_link->m_network_links[0]; NetworkLink *net_link = garnet_link->m_network_links[0];

View file

@ -65,7 +65,9 @@ class GarnetNetwork : public BaseGarnetNetwork
void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
const NetDest& routing_table_entry); const NetDest& routing_table_entry);
void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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 //! Function for performing a functional read. The return value
//! indicates if a message was found that had the required address. //! indicates if a message was found that had the required address.

View file

@ -104,7 +104,9 @@ SimpleNetwork::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
// From a switch to a switch // From a switch to a switch
void void
SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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 // Create a set of new MessageBuffers
std::vector<MessageBuffer*> queues(m_virtual_networks); std::vector<MessageBuffer*> queues(m_virtual_networks);

View file

@ -64,7 +64,9 @@ class SimpleNetwork : public Network
void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link, void makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
const NetDest& routing_table_entry); const NetDest& routing_table_entry);
void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link, 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; void print(std::ostream& out) const;