ruby: changes to simple network

This patch makes the Switch structure inherit from BasicRouter, as is
done in two other networks.
This commit is contained in:
Nilay Vaish
2012-10-02 14:35:45 -05:00
parent b370f6a7b2
commit 4488379244
13 changed files with 74 additions and 49 deletions

View File

@@ -135,7 +135,7 @@ def create_system(options, system, piobus = None, dma_ports = []):
class NetworkClass(SimpleNetwork): pass class NetworkClass(SimpleNetwork): pass
class IntLinkClass(SimpleIntLink): pass class IntLinkClass(SimpleIntLink): pass
class ExtLinkClass(SimpleExtLink): pass class ExtLinkClass(SimpleExtLink): pass
class RouterClass(BasicRouter): pass class RouterClass(Switch): pass
# #
# Important: the topology must be instantiated before the network and after # Important: the topology must be instantiated before the network and after

View File

@@ -53,7 +53,7 @@ class BasicRouter : public SimObject
// //
// ID in relation to other routers in the system // ID in relation to other routers in the system
// //
int m_id; uint32_t m_id;
}; };
inline std::ostream& inline std::ostream&

View File

@@ -32,7 +32,6 @@
#include "mem/protocol/MachineType.hh" #include "mem/protocol/MachineType.hh"
#include "mem/ruby/common/NetDest.hh" #include "mem/ruby/common/NetDest.hh"
#include "mem/ruby/network/BasicLink.hh" #include "mem/ruby/network/BasicLink.hh"
#include "mem/ruby/network/BasicRouter.hh"
#include "mem/ruby/network/Network.hh" #include "mem/ruby/network/Network.hh"
#include "mem/ruby/network/Topology.hh" #include "mem/ruby/network/Topology.hh"
#include "mem/ruby/slicc_interface/AbstractController.hh" #include "mem/ruby/slicc_interface/AbstractController.hh"
@@ -41,8 +40,6 @@ using namespace std;
const int INFINITE_LATENCY = 10000; // Yes, this is a big hack const int INFINITE_LATENCY = 10000; // Yes, this is a big hack
class BasicRouter;
// Note: In this file, we use the first 2*m_nodes SwitchIDs to // Note: In this file, we use the first 2*m_nodes SwitchIDs to
// represent the input and output endpoint links. These really are // represent the input and output endpoint links. These really are
// not 'switches', as they will not have a Switch object allocated for // not 'switches', as they will not have a Switch object allocated for

View File

@@ -46,6 +46,7 @@
#include "mem/protocol/LinkDirection.hh" #include "mem/protocol/LinkDirection.hh"
#include "mem/ruby/common/TypeDefines.hh" #include "mem/ruby/common/TypeDefines.hh"
#include "mem/ruby/network/BasicRouter.hh"
#include "params/Topology.hh" #include "params/Topology.hh"
#include "sim/sim_object.hh" #include "sim/sim_object.hh"

View File

@@ -39,5 +39,3 @@ class GarnetRouter(BasicRouter):
"virtual channels per virtual network") "virtual channels per virtual network")
virt_nets = Param.Int(Parent.number_of_virtual_networks, virt_nets = Param.Int(Parent.number_of_virtual_networks,
"number of virtual networks") "number of virtual networks")

View File

@@ -43,7 +43,6 @@ using m5::stl_helpers::deletePointers;
Router::Router(const Params *p) Router::Router(const Params *p)
: BasicRouter(p), FlexibleConsumer(this) : BasicRouter(p), FlexibleConsumer(this)
{ {
m_id = p->router_id;
m_virtual_networks = p->virt_nets; m_virtual_networks = p->virt_nets;
m_vc_per_vnet = p->vcs_per_vnet; m_vc_per_vnet = p->vcs_per_vnet;
m_round_robin_inport = 0; m_round_robin_inport = 0;

View File

@@ -75,7 +75,6 @@ class Router : public BasicRouter, public FlexibleConsumer
} }
private: private:
int m_id;
int m_virtual_networks, m_num_vcs, m_vc_per_vnet; int m_virtual_networks, m_num_vcs, m_vc_per_vnet;
GarnetNetwork *m_net_ptr; GarnetNetwork *m_net_ptr;
std::vector<int> m_vc_round_robin; // For scheduling of out source queues std::vector<int> m_vc_round_robin; // For scheduling of out source queues

View File

@@ -33,9 +33,8 @@
#include "mem/ruby/buffers/MessageBuffer.hh" #include "mem/ruby/buffers/MessageBuffer.hh"
#include "mem/ruby/network/simple/PerfectSwitch.hh" #include "mem/ruby/network/simple/PerfectSwitch.hh"
#include "mem/ruby/network/simple/SimpleNetwork.hh" #include "mem/ruby/network/simple/SimpleNetwork.hh"
#include "mem/ruby/profiler/Profiler.hh" #include "mem/ruby/network/simple/Switch.hh"
#include "mem/ruby/slicc_interface/NetworkMessage.hh" #include "mem/ruby/slicc_interface/NetworkMessage.hh"
#include "mem/ruby/system/System.hh"
using namespace std; using namespace std;
@@ -48,14 +47,19 @@ operator<(const LinkOrder& l1, const LinkOrder& l2)
return (l1.m_value < l2.m_value); return (l1.m_value < l2.m_value);
} }
PerfectSwitch::PerfectSwitch(SwitchID sid, SimpleNetwork* network_ptr) PerfectSwitch::PerfectSwitch(SwitchID sid, Switch *sw, uint32_t virt_nets)
: Consumer(network_ptr) : Consumer(sw)
{ {
m_virtual_networks = network_ptr->getNumberOfVirtualNetworks();
m_switch_id = sid; m_switch_id = sid;
m_round_robin_start = 0; m_round_robin_start = 0;
m_network_ptr = network_ptr;
m_wakeups_wo_switch = 0; m_wakeups_wo_switch = 0;
m_virtual_networks = virt_nets;
}
void
PerfectSwitch::init(SimpleNetwork *network_ptr)
{
m_network_ptr = network_ptr;
for(int i = 0;i < m_virtual_networks;++i) for(int i = 0;i < m_virtual_networks;++i)
{ {

View File

@@ -41,11 +41,11 @@
#include <vector> #include <vector>
#include "mem/ruby/common/Consumer.hh" #include "mem/ruby/common/Consumer.hh"
#include "mem/ruby/common/Global.hh"
class MessageBuffer; class MessageBuffer;
class NetDest; class NetDest;
class SimpleNetwork; class SimpleNetwork;
class Switch;
struct LinkOrder struct LinkOrder
{ {
@@ -56,12 +56,13 @@ struct LinkOrder
class PerfectSwitch : public Consumer class PerfectSwitch : public Consumer
{ {
public: public:
PerfectSwitch(SwitchID sid, SimpleNetwork* network_ptr); PerfectSwitch(SwitchID sid, Switch *, uint32_t);
~PerfectSwitch(); ~PerfectSwitch();
std::string name() std::string name()
{ return csprintf("PerfectSwitch-%i", m_switch_id); } { return csprintf("PerfectSwitch-%i", m_switch_id); }
void init(SimpleNetwork *);
void addInPort(const std::vector<MessageBuffer*>& in); void addInPort(const std::vector<MessageBuffer*>& in);
void addOutPort(const std::vector<MessageBuffer*>& out, void addOutPort(const std::vector<MessageBuffer*>& out,
const NetDest& routing_table_entry); const NetDest& routing_table_entry);
@@ -90,9 +91,11 @@ class PerfectSwitch : public Consumer
std::vector<std::vector<MessageBuffer*> > m_out; std::vector<std::vector<MessageBuffer*> > m_out;
std::vector<NetDest> m_routing_table; std::vector<NetDest> m_routing_table;
std::vector<LinkOrder> m_link_order; std::vector<LinkOrder> m_link_order;
int m_virtual_networks;
uint32_t m_virtual_networks;
int m_round_robin_start; int m_round_robin_start;
int m_wakeups_wo_switch; int m_wakeups_wo_switch;
SimpleNetwork* m_network_ptr; SimpleNetwork* m_network_ptr;
std::vector<int> m_pending_message_count; std::vector<int> m_pending_message_count;
}; };

View File

@@ -78,6 +78,15 @@ SimpleNetwork::SimpleNetwork(const Params *p)
new MessageBuffer(csprintf("fromNet node %d j %d", node, j)); new MessageBuffer(csprintf("fromNet node %d j %d", node, j));
} }
} }
// record the routers
for (vector<BasicRouter*>::const_iterator i =
m_topology_ptr->params()->routers.begin();
i != m_topology_ptr->params()->routers.end(); ++i) {
Switch* s = safe_cast<Switch*>(*i);
m_switch_ptr_vector.push_back(s);
s->init_net_ptr(this);
}
} }
void void
@@ -88,11 +97,6 @@ SimpleNetwork::init()
// The topology pointer should have already been initialized in // The topology pointer should have already been initialized in
// the parent class network constructor. // the parent class network constructor.
assert(m_topology_ptr != NULL); assert(m_topology_ptr != NULL);
int number_of_switches = m_topology_ptr->numSwitches();
for (int i = 0; i < number_of_switches; i++) {
m_switch_ptr_vector.push_back(new Switch(i, this));
}
// false because this isn't a reconfiguration // false because this isn't a reconfiguration
m_topology_ptr->createLinks(this, false); m_topology_ptr->createLinks(this, false);
} }
@@ -282,15 +286,14 @@ SimpleNetwork::printStats(ostream& out) const
if (total_msg_counts[type] > 0) { if (total_msg_counts[type] > 0) {
out << "total_msg_count_" << type << ": " << total_msg_counts[type] out << "total_msg_count_" << type << ": " << total_msg_counts[type]
<< " " << total_msg_counts[type] * << " " << total_msg_counts[type] *
uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type)) uint64(MessageSizeType_to_int(type))
<< endl; << endl;
total_msgs += total_msg_counts[type]; total_msgs += total_msg_counts[type];
total_bytes += total_msg_counts[type] * total_bytes += total_msg_counts[type] *
uint64(RubySystem::getNetwork()->MessageSizeType_to_int(type)); uint64(MessageSizeType_to_int(type));
} }
} }

View File

@@ -28,7 +28,9 @@
# Brad Beckmann # Brad Beckmann
from m5.params import * from m5.params import *
from m5.proxy import *
from Network import RubyNetwork from Network import RubyNetwork
from BasicRouter import BasicRouter
class SimpleNetwork(RubyNetwork): class SimpleNetwork(RubyNetwork):
type = 'SimpleNetwork' type = 'SimpleNetwork'
@@ -36,3 +38,9 @@ class SimpleNetwork(RubyNetwork):
"default buffer size; 0 indicates infinite buffering"); "default buffer size; 0 indicates infinite buffering");
endpoint_bandwidth = Param.Int(1000, "bandwidth adjustment factor"); endpoint_bandwidth = Param.Int(1000, "bandwidth adjustment factor");
adaptive_routing = Param.Bool(False, "enable adaptive routing"); adaptive_routing = Param.Bool(False, "enable adaptive routing");
class Switch(BasicRouter):
type = 'Switch'
cxx_class = 'Switch'
virt_nets = Param.Int(Parent.number_of_virtual_networks,
"number of virtual networks")

View File

@@ -41,10 +41,9 @@ using namespace std;
using m5::stl_helpers::deletePointers; using m5::stl_helpers::deletePointers;
using m5::stl_helpers::operator<<; using m5::stl_helpers::operator<<;
Switch::Switch(SwitchID sid, SimpleNetwork* network_ptr) Switch::Switch(const Params *p) : BasicRouter(p)
{ {
m_perfect_switch_ptr = new PerfectSwitch(sid, network_ptr); m_perfect_switch_ptr = new PerfectSwitch(m_id, this, p->virt_nets);
m_switch_id = sid;
} }
Switch::~Switch() Switch::~Switch()
@@ -58,6 +57,13 @@ Switch::~Switch()
deletePointers(m_buffers_to_free); deletePointers(m_buffers_to_free);
} }
void
Switch::init()
{
BasicRouter::init();
m_perfect_switch_ptr->init(m_network_ptr);
}
void void
Switch::addInPort(const vector<MessageBuffer*>& in) Switch::addInPort(const vector<MessageBuffer*>& in)
{ {
@@ -68,14 +74,10 @@ void
Switch::addOutPort(const vector<MessageBuffer*>& out, Switch::addOutPort(const vector<MessageBuffer*>& out,
const NetDest& routing_table_entry, int link_latency, int bw_multiplier) const NetDest& routing_table_entry, int link_latency, int bw_multiplier)
{ {
Throttle* throttle_ptr = NULL;
SimpleNetwork* net_ptr =
safe_cast<SimpleNetwork*>(RubySystem::getNetwork());
// Create a throttle // Create a throttle
throttle_ptr = new Throttle(m_switch_id, m_throttles.size(), link_latency, Throttle* throttle_ptr = new Throttle(m_id, m_throttles.size(),
bw_multiplier, net_ptr->getEndpointBandwidth(), link_latency, bw_multiplier, m_network_ptr->getEndpointBandwidth(),
net_ptr); this);
m_throttles.push_back(throttle_ptr); m_throttles.push_back(throttle_ptr);
// Create one buffer per vnet (these are intermediaryQueues) // Create one buffer per vnet (these are intermediaryQueues)
@@ -84,12 +86,12 @@ Switch::addOutPort(const vector<MessageBuffer*>& out,
MessageBuffer* buffer_ptr = new MessageBuffer; MessageBuffer* buffer_ptr = new MessageBuffer;
// Make these queues ordered // Make these queues ordered
buffer_ptr->setOrdering(true); buffer_ptr->setOrdering(true);
if (net_ptr->getBufferSize() > 0) { if (m_network_ptr->getBufferSize() > 0) {
buffer_ptr->resize(net_ptr->getBufferSize()); buffer_ptr->resize(m_network_ptr->getBufferSize());
} }
intermediateBuffers.push_back(buffer_ptr); intermediateBuffers.push_back(buffer_ptr);
m_buffers_to_free.push_back(buffer_ptr); m_buffers_to_free.push_back(buffer_ptr);
} }
// Hook the queues to the PerfectSwitch // Hook the queues to the PerfectSwitch
m_perfect_switch_ptr->addOutPort(intermediateBuffers, routing_table_entry); m_perfect_switch_ptr->addOutPort(intermediateBuffers, routing_table_entry);
@@ -137,9 +139,9 @@ Switch::getThrottles() const
void void
Switch::printStats(std::ostream& out) const Switch::printStats(std::ostream& out) const
{ {
ccprintf(out, "switch_%d_inlinks: %d\n", m_switch_id, ccprintf(out, "switch_%d_inlinks: %d\n", m_id,
m_perfect_switch_ptr->getInLinks()); m_perfect_switch_ptr->getInLinks());
ccprintf(out, "switch_%d_outlinks: %d\n", m_switch_id, ccprintf(out, "switch_%d_outlinks: %d\n", m_id,
m_perfect_switch_ptr->getOutLinks()); m_perfect_switch_ptr->getOutLinks());
// Average link utilizations // Average link utilizations
@@ -157,13 +159,13 @@ Switch::printStats(std::ostream& out) const
throttle_count == 0 ? 0 : average_utilization / throttle_count; throttle_count == 0 ? 0 : average_utilization / throttle_count;
// Individual link utilizations // Individual link utilizations
out << "links_utilized_percent_switch_" << m_switch_id << ": " out << "links_utilized_percent_switch_" << m_id << ": "
<< average_utilization << endl; << average_utilization << endl;
for (int link = 0; link < m_throttles.size(); link++) { for (int link = 0; link < m_throttles.size(); link++) {
Throttle* throttle_ptr = m_throttles[link]; Throttle* throttle_ptr = m_throttles[link];
if (throttle_ptr != NULL) { if (throttle_ptr != NULL) {
out << " links_utilized_percent_switch_" << m_switch_id out << " links_utilized_percent_switch_" << m_id
<< "_link_" << link << ": " << "_link_" << link << ": "
<< throttle_ptr->getUtilization() << " bw: " << throttle_ptr->getUtilization() << " bw: "
<< throttle_ptr->getLinkBandwidth() << throttle_ptr->getLinkBandwidth()
@@ -187,9 +189,9 @@ Switch::printStats(std::ostream& out) const
if (sum == 0) if (sum == 0)
continue; continue;
out << " outgoing_messages_switch_" << m_switch_id out << " outgoing_messages_switch_" << m_id
<< "_link_" << link << "_" << type << ": " << sum << " " << "_link_" << link << "_" << type << ": " << sum << " "
<< sum * RubySystem::getNetwork()->MessageSizeType_to_int(type) << sum * m_network_ptr->MessageSizeType_to_int(type)
<< " "; << " ";
out << mct; out << mct;
out << " base_latency: " out << " base_latency: "
@@ -215,3 +217,9 @@ Switch::print(std::ostream& out) const
// FIXME printing // FIXME printing
out << "[Switch]"; out << "[Switch]";
} }
Switch *
SwitchParams::create()
{
return new Switch(this);
}

View File

@@ -42,18 +42,23 @@
#include <iostream> #include <iostream>
#include <vector> #include <vector>
#include "mem/ruby/network/BasicRouter.hh"
#include "params/Switch.hh"
class MessageBuffer; class MessageBuffer;
class PerfectSwitch; class PerfectSwitch;
class NetDest; class NetDest;
class SimpleNetwork; class SimpleNetwork;
class Throttle; class Throttle;
class Switch class Switch : public BasicRouter
{ {
public: public:
Switch(SwitchID sid, SimpleNetwork* network_ptr); typedef SwitchParams Params;
Switch(const Params *p);
~Switch(); ~Switch();
void init();
void addInPort(const std::vector<MessageBuffer*>& in); void addInPort(const std::vector<MessageBuffer*>& in);
void addOutPort(const std::vector<MessageBuffer*>& out, void addOutPort(const std::vector<MessageBuffer*>& out,
const NetDest& routing_table_entry, int link_latency, const NetDest& routing_table_entry, int link_latency,
@@ -67,6 +72,7 @@ class Switch
void printStats(std::ostream& out) const; void printStats(std::ostream& out) const;
void clearStats(); void clearStats();
void print(std::ostream& out) const; void print(std::ostream& out) const;
void init_net_ptr(SimpleNetwork* net_ptr) { m_network_ptr = net_ptr; }
private: private:
// Private copy constructor and assignment operator // Private copy constructor and assignment operator
@@ -77,7 +83,6 @@ class Switch
SimpleNetwork* m_network_ptr; SimpleNetwork* m_network_ptr;
std::vector<Throttle*> m_throttles; std::vector<Throttle*> m_throttles;
std::vector<MessageBuffer*> m_buffers_to_free; std::vector<MessageBuffer*> m_buffers_to_free;
SwitchID m_switch_id;
}; };
inline std::ostream& inline std::ostream&