network: basic link bw for garnet and simple networks
authorBrad Beckmann <Brad.Beckmann@amd.com>
Fri, 29 Apr 2011 00:18:14 +0000 (17:18 -0700)
committerBrad Beckmann <Brad.Beckmann@amd.com>
Fri, 29 Apr 2011 00:18:14 +0000 (17:18 -0700)
This patch ensures that both Garnet and the simple networks use the bw value
specified in the topology.  To do so, the patch generalizes the specification
of bw for basic links.  This value is then translated to the specific value
used by the simple and Garnet networks.  Since Garent does not support
non-uniformed link bandwidth, the patch also adds a check to ensure all bws are
equal.

--HG--
rename : src/mem/ruby/network/BasicLink.cc => src/mem/ruby/network/simple/SimpleLink.cc
rename : src/mem/ruby/network/BasicLink.hh => src/mem/ruby/network/simple/SimpleLink.hh
rename : src/mem/ruby/network/BasicLink.py => src/mem/ruby/network/simple/SimpleLink.py

18 files changed:
configs/ruby/Ruby.py
src/mem/ruby/network/BasicLink.cc
src/mem/ruby/network/BasicLink.hh
src/mem/ruby/network/BasicLink.py
src/mem/ruby/network/garnet/BaseGarnetNetwork.cc
src/mem/ruby/network/garnet/BaseGarnetNetwork.hh
src/mem/ruby/network/garnet/BaseGarnetNetwork.py
src/mem/ruby/network/garnet/fixed-pipeline/GarnetLink_d.py
src/mem/ruby/network/garnet/fixed-pipeline/GarnetRouter_d.py
src/mem/ruby/network/garnet/fixed-pipeline/NetworkInterface_d.cc
src/mem/ruby/network/garnet/flexible-pipeline/GarnetLink.py
src/mem/ruby/network/garnet/flexible-pipeline/GarnetRouter.py
src/mem/ruby/network/garnet/flexible-pipeline/NetworkInterface.cc
src/mem/ruby/network/simple/SConscript
src/mem/ruby/network/simple/SimpleLink.cc [new file with mode: 0644]
src/mem/ruby/network/simple/SimpleLink.hh [new file with mode: 0644]
src/mem/ruby/network/simple/SimpleLink.py [new file with mode: 0644]
src/mem/ruby/network/simple/SimpleNetwork.cc

index 7f32829d6db2b55d0241d3e68193d4459ce50fff..604bb7a73ebaa56732743cef78aed7d421e3f65a 100644 (file)
@@ -87,8 +87,8 @@ def create_system(options, system, piobus = None, dma_devices = []):
         class RouterClass(GarnetRouter): pass
     else:
         class NetworkClass(SimpleNetwork): pass
-        class IntLinkClass(BasicIntLink): pass
-        class ExtLinkClass(BasicExtLink): pass
+        class IntLinkClass(SimpleIntLink): pass
+        class ExtLinkClass(SimpleExtLink): pass
         class RouterClass(BasicRouter): pass
     
     #
index 907a04f39bc58706492742e2274f51e96bbaf3bd..292e74e96fb639ab59506da9c1c80ee4df48a398 100644 (file)
@@ -32,7 +32,7 @@ BasicLink::BasicLink(const Params *p)
     : SimObject(p)
 {
     m_latency = p->latency;
-    m_bw_multiplier = p->bw_multiplier;
+    m_bandwidth_factor = p->bandwidth_factor;
     m_weight = p->weight;
 }
 
index c7359807f3c7ec9ee0f1a9ee8a727c93fcf87006..11832f9c376743c1561e02ce788fcbd41bfb053b 100644 (file)
@@ -53,7 +53,7 @@ class BasicLink : public SimObject
     void print(std::ostream& out) const;
 
     int m_latency;
-    int m_bw_multiplier;
+    int m_bandwidth_factor;
     int m_weight;
 };
 
index 53df4d57e69f6ef94dba7407d0f30a1c9bdd85fc..fb73f9ac7d22fc76b286c6fdd7277ea0ab233db4 100644 (file)
@@ -34,17 +34,21 @@ class BasicLink(SimObject):
     type = 'BasicLink'
     link_id = Param.Int("ID in relation to other links")
     latency = Param.Int(1, "latency")
-    bw_multiplier = Param.Int("simple network bw constant, usually in bytes")
+    # The following banwidth factor does not translate to the same value for
+    # both the simple and Garnet models.  For the most part, the bandwidth
+    # factor is the width of the link in bytes, expect for certain situations
+    # with regard to the simple network.
+    bandwidth_factor = Param.Int("generic bandwidth factor, usually in bytes")
     weight = Param.Int(1, "used to restrict routing in shortest path analysis")
 
 class BasicExtLink(BasicLink):
     type = 'BasicExtLink'
     ext_node = Param.RubyController("External node")
     int_node = Param.BasicRouter("ID of internal node")
-    bw_multiplier = 64
+    bandwidth_factor = 64
 
 class BasicIntLink(BasicLink):
     type = 'BasicIntLink'
     node_a = Param.BasicRouter("Router on one end")
     node_b = Param.BasicRouter("Router on other end")
-    bw_multiplier = 16
+    bandwidth_factor = 16
index 19b4c3d04d8030772e81ce18b2f62f2d3981b74a..6c5e5710383103a34ac75cc31dc032105d3ea803 100644 (file)
  * Authors: Niket Agarwal
  */
 
+#include "mem/ruby/network/BasicLink.hh"
+#include "mem/ruby/network/Topology.hh"
 #include "mem/ruby/network/garnet/BaseGarnetNetwork.hh"
 
 BaseGarnetNetwork::BaseGarnetNetwork(const Params *p)
     : Network(p)
 {
-    m_flit_size = p->flit_size;
+    m_ni_flit_size = p->ni_flit_size;
     m_number_of_pipe_stages = p->number_of_pipe_stages;
     m_vcs_per_class = p->vcs_per_class;
     m_buffers_per_data_vc = p->buffers_per_data_vc;
     m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc;
+
+    // Currently Garnet only supports uniform bandwidth for all
+    // links and network interfaces.
+    for (std::vector<BasicExtLink*>::const_iterator i = 
+             m_topology_ptr->params()->ext_links.begin();
+         i != m_topology_ptr->params()->ext_links.end(); ++i) {
+        BasicExtLink* ext_link = (*i);
+        if (ext_link->params()->bandwidth_factor != m_ni_flit_size) {
+            fatal("Garnet only supports uniform bw across all links and NIs\n");
+        }
+    }
+    for (std::vector<BasicIntLink*>::const_iterator i = 
+             m_topology_ptr->params()->int_links.begin();
+         i != m_topology_ptr->params()->int_links.end(); ++i) {
+        BasicIntLink* int_link = (*i);
+        if (int_link->params()->bandwidth_factor != m_ni_flit_size) {
+            fatal("Garnet only supports uniform bw across all links and NIs\n");
+        }
+    }
 }
 
 void
index 81b77ceeadd14a9f00dd5109eeb47b7bc5a26363..4ff04b68351fcbdd19a963a9583c79c479bb389d 100644 (file)
@@ -48,14 +48,14 @@ class BaseGarnetNetwork : public Network
     BaseGarnetNetwork(const Params *p);
 
     void init();
-    int getFlitSize() {return m_flit_size; }
+    int getNiFlitSize() {return m_ni_flit_size; }
     int getNumPipeStages() {return m_number_of_pipe_stages; }
     int getVCsPerClass() {return m_vcs_per_class; }
     int getBuffersPerDataVC() {return m_buffers_per_data_vc; }
     int getBuffersPerCtrlVC() {return m_buffers_per_ctrl_vc; }
 
   protected:
-    int m_flit_size;
+    int m_ni_flit_size;
     int m_number_of_pipe_stages;
     int m_vcs_per_class;
     int m_buffers_per_data_vc;
index 3594e93b6d2e9fb72a139ef15bdf9a0b1535ada9..d2366ed1a977869427302029266a80628dc9debb 100644 (file)
@@ -34,7 +34,7 @@ from Network import RubyNetwork
 class BaseGarnetNetwork(RubyNetwork):
     type = 'BaseGarnetNetwork'
     abstract = True
-    flit_size = Param.Int(16, "flit size in bytes")
+    ni_flit_size = Param.Int(16, "network interface flit size in bytes")
     number_of_pipe_stages = Param.Int(4, "router pipeline stages");
     vcs_per_class = Param.Int(4, "virtual channels per message class");
     buffers_per_data_vc = Param.Int(4, "buffers per data virtual channel");
index 941746cbc4203dbbc8550c6862cfb0dcbf6012ae..363ff2e44e3d6e6a70d2c7f0dd38d307e46da7be 100644 (file)
@@ -41,7 +41,8 @@ class NetworkLink_d(SimObject):
                               "virtual channels per message class")
     virt_nets = Param.Int(Parent.number_of_virtual_networks,
                           "number of virtual networks")
-    channel_width = Param.Int(Parent.flit_size, "channel width == flit size")
+    channel_width = Param.Int(Parent.bandwidth_factor,
+                              "channel width == bw factor")
 
 class CreditLink_d(NetworkLink_d):
     type = 'CreditLink_d'
index 92e49b3281a6d5f0ade1be9f45e421dac7c9ee57..1a216abb92ca35dfdb2107afea946fda00459fea 100644 (file)
@@ -39,6 +39,6 @@ class GarnetRouter_d(BasicRouter):
                               "virtual channels per message class")
     virt_nets = Param.Int(Parent.number_of_virtual_networks,
                           "number of virtual networks")
-    flit_width = Param.Int(Parent.flit_size, "flit width == flit size")
+    flit_width = Param.Int(Parent.ni_flit_size, "flit width == flit size")
 
 
index 71fefa2648cefe9190ebdf53ee1a4a1ca317f8af..0dd51019ce30770d1fa2fe0a2c00410a73e1bd4a 100644 (file)
@@ -129,7 +129,7 @@ NetworkInterface_d::flitisizeMessage(MsgPtr msg_ptr, int vnet)
     // Number of flits is dependent on the link bandwidth available.
     // This is expressed in terms of bytes/cycle or the flit size
     int num_flits = (int) ceil((double) m_net_ptr->MessageSizeType_to_int(
-        net_msg_ptr->getMessageSize())/m_net_ptr->getFlitSize() );
+        net_msg_ptr->getMessageSize())/m_net_ptr->getNiFlitSize());
 
     // loop to convert all multicast messages into unicast messages
     for (int ctr = 0; ctr < dest_nodes.size(); ctr++) {
index 45c56fa9e97d746203be53a5b4cf703be86a4750..4077f30e66906ff690443ce95ec8f1043b208691 100644 (file)
@@ -41,7 +41,8 @@ class NetworkLink(SimObject):
                               "virtual channels per message class")
     virt_nets = Param.Int(Parent.number_of_virtual_networks,
                           "number of virtual networks")
-    channel_width = Param.Int(Parent.flit_size, "channel width == flit size")
+    channel_width = Param.Int(Parent.bandwidth_factor,
+                              "channel width == bw factor")
 
 # Interior fixed pipeline links between routers
 class GarnetIntLink(BasicIntLink):
index c35b7db38939feaad537c982d1b470fcca849a0c..1aabd375fc17e09390de630a3229368ab989cb22 100644 (file)
@@ -39,6 +39,6 @@ class GarnetRouter(BasicRouter):
                               "virtual channels per message class")
     virt_nets = Param.Int(Parent.number_of_virtual_networks,
                           "number of virtual networks")
-    flit_width = Param.Int(Parent.flit_size, "flit width == flit size")
+    flit_width = Param.Int(Parent.ni_flit_size, "flit width == flit size")
 
 
index de51a72846aab0a8b4a8b379ad4fd26b9d0e80c3..df9f91c2de8698d71b72d8677d3bb715b5e5afff 100644 (file)
@@ -127,7 +127,7 @@ NetworkInterface::flitisizeMessage(MsgPtr msg_ptr, int vnet)
     // This is expressed in terms of bytes/cycle or the flit size
 
     int num_flits = (int) ceil((double) m_net_ptr->MessageSizeType_to_int(
-                net_msg_ptr->getMessageSize())/m_net_ptr->getFlitSize() );
+                net_msg_ptr->getMessageSize())/m_net_ptr->getNiFlitSize());
 
     // loop to convert all multicast messages into unicast messages
     for (int ctr = 0; ctr < dest_nodes.size(); ctr++) {
index c0fb84770b95d009ab888b3754b87b15d6126e1b..6bd836784a93127bcd80b250afb1b255efff70f2 100644 (file)
@@ -33,9 +33,11 @@ Import('*')
 if not env['RUBY']:
     Return()
 
+SimObject('SimpleLink.py')
 SimObject('SimpleNetwork.py')
 
 Source('PerfectSwitch.cc')
+Source('SimpleLink.cc')
 Source('SimpleNetwork.cc')
 Source('Switch.cc')
 Source('Throttle.cc')
diff --git a/src/mem/ruby/network/simple/SimpleLink.cc b/src/mem/ruby/network/simple/SimpleLink.cc
new file mode 100644 (file)
index 0000000..57ae6c7
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2011 Advanced Micro Devices, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include "mem/ruby/network/simple/SimpleLink.hh"
+
+SimpleExtLink::SimpleExtLink(const Params *p)
+    : BasicExtLink(p)
+{
+    // For the simple links, the bandwidth factor translates to the
+    // bandwidth multiplier.  The multipiler, in combination with the 
+    // endpoint bandwidth multiplier - message size multiplier ratio, 
+    // determines the link bandwidth in bytes 
+    m_bw_multiplier = p->bandwidth_factor;
+}
+
+void
+SimpleExtLink::print(std::ostream& out) const
+{
+    out << name();
+}
+
+SimpleExtLink *
+SimpleExtLinkParams::create()
+{
+    return new SimpleExtLink(this);
+}
+
+SimpleIntLink::SimpleIntLink(const Params *p)
+    : BasicIntLink(p)
+{
+    // For the simple links, the bandwidth factor translates to the
+    // bandwidth multiplier.  The multipiler, in combination with the 
+    // endpoint bandwidth multiplier - message size multiplier ratio, 
+    // determines the link bandwidth in bytes 
+    m_bw_multiplier = p->bandwidth_factor;
+}
+
+void
+SimpleIntLink::print(std::ostream& out) const
+{
+    out << name();
+}
+
+SimpleIntLink *
+SimpleIntLinkParams::create()
+{
+    return new SimpleIntLink(this);
+}
diff --git a/src/mem/ruby/network/simple/SimpleLink.hh b/src/mem/ruby/network/simple/SimpleLink.hh
new file mode 100644 (file)
index 0000000..ed98ec7
--- /dev/null
@@ -0,0 +1,82 @@
+/*
+ * Copyright (c) 2011 Advanced Micro Devices, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MEM_RUBY_NETWORK_SIMPLE_LINK_HH__
+#define __MEM_RUBY_NETWORK_SIMPLE_LINK_HH__
+
+#include <iostream>
+#include <string>
+#include <vector>
+
+#include "params/SimpleExtLink.hh"
+#include "params/SimpleIntLink.hh"
+#include "mem/ruby/network/BasicLink.hh"
+
+class SimpleExtLink : public BasicExtLink
+{
+  public:
+    typedef SimpleExtLinkParams Params;
+    SimpleExtLink(const Params *p);
+    const Params *params() const { return (const Params *)_params; }
+
+    friend class Topology;
+    void print(std::ostream& out) const;
+
+    int m_bw_multiplier;
+};
+
+inline std::ostream&
+operator<<(std::ostream& out, const SimpleExtLink& obj)
+{
+    obj.print(out);
+    out << std::flush;
+    return out;
+}
+
+class SimpleIntLink : public BasicIntLink
+{
+  public:
+    typedef SimpleIntLinkParams Params;
+    SimpleIntLink(const Params *p);
+    const Params *params() const { return (const Params *)_params; }
+
+    friend class Topology;
+    void print(std::ostream& out) const;
+
+    int m_bw_multiplier;
+};
+
+inline std::ostream&
+operator<<(std::ostream& out, const SimpleIntLink& obj)
+{
+    obj.print(out);
+    out << std::flush;
+    return out;
+}
+
+#endif // __MEM_RUBY_NETWORK_SIMPLE_LINK_HH__
diff --git a/src/mem/ruby/network/simple/SimpleLink.py b/src/mem/ruby/network/simple/SimpleLink.py
new file mode 100644 (file)
index 0000000..55b2156
--- /dev/null
@@ -0,0 +1,39 @@
+# Copyright (c) 2011 Advanced Micro Devices, Inc.
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are
+# met: redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer;
+# redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution;
+# neither the name of the copyright holders nor the names of its
+# contributors may be used to endorse or promote products derived from
+# this software without specific prior written permission.
+#
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# Authors: Steve Reinhardt
+#          Brad Beckmann
+
+from m5.params import *
+from m5.proxy import *
+from m5.SimObject import SimObject
+from BasicLink import BasicIntLink, BasicExtLink
+
+class SimpleExtLink(BasicExtLink):
+    type = 'SimpleExtLink'
+
+class SimpleIntLink(BasicIntLink):
+    type = 'SimpleIntLink'
index 15107b17fc0c493c7915fe54b4be71c7bba8a5ce..8829b2eb503b51a0c452677b121b909b8ba05bee 100644 (file)
@@ -36,6 +36,7 @@
 #include "mem/ruby/buffers/MessageBuffer.hh"
 #include "mem/ruby/common/NetDest.hh"
 #include "mem/ruby/network/BasicLink.hh"
+#include "mem/ruby/network/simple/SimpleLink.hh"
 #include "mem/ruby/network/simple/SimpleNetwork.hh"
 #include "mem/ruby/network/simple/Switch.hh"
 #include "mem/ruby/network/simple/Throttle.hh"
@@ -148,10 +149,12 @@ SimpleNetwork::makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
         return;
     }
 
+    SimpleExtLink *simple_link = safe_cast<SimpleExtLink*>(link);
+
     m_switch_ptr_vector[src]->addOutPort(m_fromNetQueues[dest],
                                          routing_table_entry,
-                                         link->m_latency,
-                                         link->m_bw_multiplier);
+                                         simple_link->m_latency,
+                                         simple_link->m_bw_multiplier);
 
     m_endpoint_switches[dest] = m_switch_ptr_vector[src];
 }
@@ -198,10 +201,12 @@ SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
         m_buffers_to_free.push_back(buffer_ptr);
     }
     // Connect it to the two switches
+    SimpleIntLink *simple_link = safe_cast<SimpleIntLink*>(link);
+
     m_switch_ptr_vector[dest]->addInPort(queues);
     m_switch_ptr_vector[src]->addOutPort(queues, routing_table_entry,
-                                         link->m_latency, 
-                                         link->m_bw_multiplier);
+                                         simple_link->m_latency, 
+                                         simple_link->m_bw_multiplier);
 }
 
 void