diff --git a/src/mem/ruby/network/Network.cc b/src/mem/ruby/network/Network.cc index aad6574fb..b7f025eeb 100644 --- a/src/mem/ruby/network/Network.cc +++ b/src/mem/ruby/network/Network.cc @@ -36,9 +36,6 @@ Network::Network(const Params *p) { m_virtual_networks = p->number_of_virtual_networks; m_topology_ptr = p->topology; - m_buffer_size = p->buffer_size; - m_endpoint_bandwidth = p->endpoint_bandwidth; - m_adaptive_routing = p->adaptive_routing; m_link_latency = p->link_latency; m_control_msg_size = p->control_msg_size; diff --git a/src/mem/ruby/network/Network.hh b/src/mem/ruby/network/Network.hh index a33360e6a..2208c0e72 100644 --- a/src/mem/ruby/network/Network.hh +++ b/src/mem/ruby/network/Network.hh @@ -66,10 +66,7 @@ class Network : public SimObject virtual void init(); - int getBufferSize() { return m_buffer_size; } int getNumberOfVirtualNetworks() { return m_virtual_networks; } - int getEndpointBandwidth() { return m_endpoint_bandwidth; } - bool getAdaptiveRouting() {return m_adaptive_routing; } int getLinkLatency() { return m_link_latency; } int MessageSizeType_to_int(MessageSizeType size_type); @@ -110,10 +107,7 @@ class Network : public SimObject const std::string m_name; int m_nodes; int m_virtual_networks; - int m_buffer_size; - int m_endpoint_bandwidth; Topology* m_topology_ptr; - bool m_adaptive_routing; int m_link_latency; int m_control_msg_size; int m_data_msg_size; diff --git a/src/mem/ruby/network/Network.py b/src/mem/ruby/network/Network.py index c539f7191..55c049081 100644 --- a/src/mem/ruby/network/Network.py +++ b/src/mem/ruby/network/Network.py @@ -47,10 +47,6 @@ class RubyNetwork(SimObject): abstract = True number_of_virtual_networks = Param.Int(10, ""); topology = Param.Topology(""); - buffer_size = Param.Int(0, - "default buffer size; 0 indicates infinite buffering"); - endpoint_bandwidth = Param.Int(10000, ""); - adaptive_routing = Param.Bool(False, "enable adaptive routing"); link_latency = Param.Int(1, "local memory latency ?? NetworkLinkLatency"); control_msg_size = Param.Int(8, ""); diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc index 16c56e95e..551e83fa3 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc @@ -48,6 +48,8 @@ using m5::stl_helpers::deletePointers; GarnetNetwork::GarnetNetwork(const Params *p) : BaseGarnetNetwork(p) { + m_buffer_size = p->buffer_size; + m_ruby_start = 0; m_flits_received = 0; m_flits_injected = 0; diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh index a89a70ba7..943739041 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh @@ -56,6 +56,8 @@ class GarnetNetwork : public BaseGarnetNetwork void init(); + int getBufferSize() { return m_buffer_size; } + // returns the queue requested for the given component MessageBuffer* getToNetQueue(NodeID id, bool ordered, int network_num); MessageBuffer* getFromNetQueue(NodeID id, bool ordered, int network_num); @@ -122,6 +124,7 @@ class GarnetNetwork : public BaseGarnetNetwork std::vector m_ni_ptr_vector; // All NI's in Network Time m_ruby_start; + int m_buffer_size; }; inline std::ostream& diff --git a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py index 0f57d5be7..0844fe3b4 100644 --- a/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py +++ b/src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.py @@ -33,4 +33,6 @@ from BaseGarnetNetwork import BaseGarnetNetwork class GarnetNetwork(BaseGarnetNetwork): type = 'GarnetNetwork' + buffer_size = Param.Int(0, + "default buffer size; 0 indicates infinite buffering"); diff --git a/src/mem/ruby/network/simple/SimpleNetwork.cc b/src/mem/ruby/network/simple/SimpleNetwork.cc index 8829b2eb5..eb561b612 100644 --- a/src/mem/ruby/network/simple/SimpleNetwork.cc +++ b/src/mem/ruby/network/simple/SimpleNetwork.cc @@ -62,6 +62,10 @@ Network::createNetwork(int nodes) SimpleNetwork::SimpleNetwork(const Params *p) : Network(p) { + m_buffer_size = p->buffer_size; + m_endpoint_bandwidth = p->endpoint_bandwidth; + m_adaptive_routing = p->adaptive_routing; + // Note: the parent Network Object constructor is called before the // SimpleNetwork child constructor. Therefore, the member variables // used below should already be initialized. diff --git a/src/mem/ruby/network/simple/SimpleNetwork.hh b/src/mem/ruby/network/simple/SimpleNetwork.hh index 13a4b173e..093ed959e 100644 --- a/src/mem/ruby/network/simple/SimpleNetwork.hh +++ b/src/mem/ruby/network/simple/SimpleNetwork.hh @@ -53,6 +53,10 @@ class SimpleNetwork : public Network void init(); + int getBufferSize() { return m_buffer_size; } + int getEndpointBandwidth() { return m_endpoint_bandwidth; } + bool getAdaptiveRouting() {return m_adaptive_routing; } + void printStats(std::ostream& out) const; void clearStats(); void printConfig(std::ostream& out) const; @@ -107,6 +111,10 @@ class SimpleNetwork : public Network std::vector m_switch_ptr_vector; std::vector m_buffers_to_free; std::vector m_endpoint_switches; + + int m_buffer_size; + int m_endpoint_bandwidth; + bool m_adaptive_routing; }; inline std::ostream& diff --git a/src/mem/ruby/network/simple/SimpleNetwork.py b/src/mem/ruby/network/simple/SimpleNetwork.py index d8bf55a22..e9a3a1987 100644 --- a/src/mem/ruby/network/simple/SimpleNetwork.py +++ b/src/mem/ruby/network/simple/SimpleNetwork.py @@ -32,3 +32,7 @@ from Network import RubyNetwork class SimpleNetwork(RubyNetwork): type = 'SimpleNetwork' + buffer_size = Param.Int(0, + "default buffer size; 0 indicates infinite buffering"); + endpoint_bandwidth = Param.Int(10000, ""); + adaptive_routing = Param.Bool(False, "enable adaptive routing"); diff --git a/src/mem/ruby/network/simple/Switch.cc b/src/mem/ruby/network/simple/Switch.cc index 391e08724..bcc1347a3 100644 --- a/src/mem/ruby/network/simple/Switch.cc +++ b/src/mem/ruby/network/simple/Switch.cc @@ -33,9 +33,9 @@ #include "mem/protocol/Protocol.hh" #include "mem/ruby/buffers/MessageBuffer.hh" #include "mem/ruby/network/simple/PerfectSwitch.hh" +#include "mem/ruby/network/simple/SimpleNetwork.hh" #include "mem/ruby/network/simple/Switch.hh" #include "mem/ruby/network/simple/Throttle.hh" -#include "mem/ruby/network/Network.hh" using namespace std; using m5::stl_helpers::deletePointers; @@ -69,10 +69,12 @@ Switch::addOutPort(const vector& out, const NetDest& routing_table_entry, int link_latency, int bw_multiplier) { Throttle* throttle_ptr = NULL; + SimpleNetwork* net_ptr = + safe_cast(RubySystem::getNetwork()); // Create a throttle throttle_ptr = new Throttle(m_switch_id, m_throttles.size(), link_latency, - bw_multiplier); + bw_multiplier, net_ptr->getEndpointBandwidth()); m_throttles.push_back(throttle_ptr); // Create one buffer per vnet (these are intermediaryQueues) @@ -81,7 +83,6 @@ Switch::addOutPort(const vector& out, MessageBuffer* buffer_ptr = new MessageBuffer; // Make these queues ordered buffer_ptr->setOrdering(true); - Network* net_ptr = RubySystem::getNetwork(); if (net_ptr->getBufferSize() > 0) { buffer_ptr->resize(net_ptr->getBufferSize()); } diff --git a/src/mem/ruby/network/simple/Switch.hh b/src/mem/ruby/network/simple/Switch.hh index 6e80c8642..c7630f200 100644 --- a/src/mem/ruby/network/simple/Switch.hh +++ b/src/mem/ruby/network/simple/Switch.hh @@ -49,7 +49,6 @@ class PerfectSwitch; class NetDest; class SimpleNetwork; class Throttle; -class Network; class Switch { @@ -79,7 +78,7 @@ class Switch Switch& operator=(const Switch& obj); PerfectSwitch* m_perfect_switch_ptr; - Network* m_network_ptr; + SimpleNetwork* m_network_ptr; std::vector m_throttles; std::vector m_buffers_to_free; SwitchID m_switch_id; diff --git a/src/mem/ruby/network/simple/Throttle.cc b/src/mem/ruby/network/simple/Throttle.cc index 905a7aa28..108dd843d 100644 --- a/src/mem/ruby/network/simple/Throttle.cc +++ b/src/mem/ruby/network/simple/Throttle.cc @@ -49,21 +49,22 @@ const int PRIORITY_SWITCH_LIMIT = 128; static int network_message_to_size(NetworkMessage* net_msg_ptr); Throttle::Throttle(int sID, NodeID node, int link_latency, - int link_bandwidth_multiplier) + int link_bandwidth_multiplier, int endpoint_bandwidth) { - init(node, link_latency, link_bandwidth_multiplier); + init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth); m_sID = sID; } Throttle::Throttle(NodeID node, int link_latency, - int link_bandwidth_multiplier) + int link_bandwidth_multiplier, int endpoint_bandwidth) { - init(node, link_latency, link_bandwidth_multiplier); + init(node, link_latency, link_bandwidth_multiplier, endpoint_bandwidth); m_sID = 0; } void -Throttle::init(NodeID node, int link_latency, int link_bandwidth_multiplier) +Throttle::init(NodeID node, int link_latency, int link_bandwidth_multiplier, + int endpoint_bandwidth) { m_node = node; m_vnets = 0; @@ -71,6 +72,7 @@ Throttle::init(NodeID node, int link_latency, int link_bandwidth_multiplier) assert(link_bandwidth_multiplier > 0); m_link_bandwidth_multiplier = link_bandwidth_multiplier; m_link_latency = link_latency; + m_endpoint_bandwidth = endpoint_bandwidth; m_wakeups_wo_switch = 0; clearStats(); diff --git a/src/mem/ruby/network/simple/Throttle.hh b/src/mem/ruby/network/simple/Throttle.hh index 0a1fc9a30..09eac79a8 100644 --- a/src/mem/ruby/network/simple/Throttle.hh +++ b/src/mem/ruby/network/simple/Throttle.hh @@ -54,8 +54,9 @@ class Throttle : public Consumer { public: Throttle(int sID, NodeID node, int link_latency, - int link_bandwidth_multiplier); - Throttle(NodeID node, int link_latency, int link_bandwidth_multiplier); + int link_bandwidth_multiplier, int endpoint_bandwidth); + Throttle(NodeID node, int link_latency, int link_bandwidth_multiplier, + int endpoint_bandwidth); ~Throttle() {} std::string name() @@ -73,8 +74,7 @@ class Throttle : public Consumer int getLinkBandwidth() const { - return RubySystem::getNetwork()->getEndpointBandwidth() * - m_link_bandwidth_multiplier; + return m_endpoint_bandwidth * m_link_bandwidth_multiplier; } int getLatency() const { return m_link_latency; } @@ -89,7 +89,8 @@ class Throttle : public Consumer void print(std::ostream& out) const; private: - void init(NodeID node, int link_latency, int link_bandwidth_multiplier); + void init(NodeID node, int link_latency, int link_bandwidth_multiplier, + int endpoint_bandwidth); void addVirtualNetwork(MessageBuffer* in_ptr, MessageBuffer* out_ptr); void linkUtilized(double ratio) { m_links_utilized += ratio; } @@ -107,6 +108,7 @@ class Throttle : public Consumer int m_link_bandwidth_multiplier; int m_link_latency; int m_wakeups_wo_switch; + int m_endpoint_bandwidth; // For tracking utilization Time m_ruby_start;