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:
parent
003c08fa90
commit
0962d76827
14 changed files with 57 additions and 12 deletions
|
@ -109,6 +109,8 @@ class Mesh_XY(SimpleTopology):
|
|||
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 @@ class Mesh_XY(SimpleTopology):
|
|||
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 @@ class Mesh_XY(SimpleTopology):
|
|||
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 @@ class Mesh_XY(SimpleTopology):
|
|||
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
|
||||
|
||||
|
|
|
@ -46,11 +46,17 @@ class BasicExtLink(BasicLink):
|
|||
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
|
||||
|
|
|
@ -32,6 +32,7 @@ BasicRouter::BasicRouter(const Params *p)
|
|||
: ClockedObject(p)
|
||||
{
|
||||
m_id = p->router_id;
|
||||
m_latency = p->latency;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -51,6 +51,7 @@ class BasicRouter : public ClockedObject
|
|||
// ID in relation to other routers in the system
|
||||
//
|
||||
uint32_t m_id;
|
||||
uint32_t m_latency;
|
||||
};
|
||||
|
||||
inline std::ostream&
|
||||
|
|
|
@ -34,3 +34,4 @@ class BasicRouter(ClockedObject):
|
|||
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")
|
||||
|
|
|
@ -85,7 +85,9 @@ class Network : public ClockedObject
|
|||
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;
|
||||
|
|
|
@ -88,6 +88,9 @@ Topology::Topology(uint32_t num_routers,
|
|||
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 @@ Topology::Topology(uint32_t num_routers,
|
|||
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 @@ Topology::createLinks(Network *net)
|
|||
}
|
||||
|
||||
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 @@ Topology::addLink(SwitchID src, SwitchID dest, BasicLink* link)
|
|||
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 @@ Topology::makeLink(Network *net, SwitchID src, SwitchID dest,
|
|||
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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -52,11 +52,14 @@ class NetDest;
|
|||
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 @@ class Topology
|
|||
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);
|
||||
|
||||
|
|
|
@ -175,7 +175,9 @@ GarnetNetwork_d::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
|
|||
|
||||
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];
|
||||
|
|
|
@ -74,7 +74,9 @@ class GarnetNetwork_d : public BaseGarnetNetwork
|
|||
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.
|
||||
|
|
|
@ -128,7 +128,9 @@ GarnetNetwork::makeExtOutLink(SwitchID src, NodeID dest, BasicLink* link,
|
|||
|
||||
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];
|
||||
|
|
|
@ -65,7 +65,9 @@ class GarnetNetwork : public BaseGarnetNetwork
|
|||
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.
|
||||
|
|
|
@ -104,7 +104,9 @@ SimpleNetwork::makeExtInLink(NodeID src, SwitchID dest, BasicLink* link,
|
|||
// 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);
|
||||
|
|
|
@ -64,7 +64,9 @@ class SimpleNetwork : public Network
|
|||
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;
|
||||
|
||||
|
|
Loading…
Reference in a new issue