ruby: fix message buffer init order
authorJoe Gross <joe.gross@amd.com>
Wed, 16 Sep 2015 17:10:42 +0000 (13:10 -0400)
committerJoe Gross <joe.gross@amd.com>
Wed, 16 Sep 2015 17:10:42 +0000 (13:10 -0400)
The recent changes to make MessageBuffers SimObjects required them to be
initialized in a particular order, which could break some protocols. Fix this
by calling initNetQueues on the external nodes of each external link in the
constructor of Network.

This patch also refactors the duplicated code for checking network allocation
and setting net queues (which are called by initNetQueues) from the simple and
garnet networks to be in Network.

src/mem/ruby/network/Network.cc
src/mem/ruby/network/Network.hh
src/mem/ruby/network/garnet/BaseGarnetNetwork.cc
src/mem/ruby/network/garnet/BaseGarnetNetwork.hh
src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc
src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.hh
src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc
src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.hh
src/mem/ruby/network/simple/SimpleNetwork.cc
src/mem/ruby/network/simple/SimpleNetwork.hh
src/mem/slicc/symbols/StateMachine.py

index d35b909d927380c50889c687764ee7d45a685525..721dbbabe01fea9d9f37457086263304ec2f6656 100644 (file)
@@ -58,6 +58,7 @@ Network::Network(const Params *p)
     m_fromNetQueues.resize(m_nodes);
 
     m_ordered.resize(m_virtual_networks);
+    m_vnet_type_names.resize(m_virtual_networks);
 
     for (int i = 0; i < m_virtual_networks; i++) {
         m_ordered[i] = false;
@@ -75,6 +76,10 @@ Network::Network(const Params *p)
 
     // Register a callback function for combining the statistics
     Stats::registerDumpCallback(new StatsCallback(this));
+
+    for (auto &it : dynamic_cast<Network *>(this)->params()->ext_links) {
+        it->params()->ext_node->initNetQueues();
+    }
 }
 
 Network::~Network()
@@ -128,3 +133,41 @@ Network::MessageSizeType_to_int(MessageSizeType size_type)
         break;
     }
 }
+
+void
+Network::checkNetworkAllocation(NodeID id, bool ordered,
+                                        int network_num,
+                                        std::string vnet_type)
+{
+    fatal_if(id >= m_nodes, "Node ID is out of range");
+    fatal_if(network_num >= m_virtual_networks, "Network id is out of range");
+
+    if (ordered) {
+        m_ordered[network_num] = true;
+    }
+
+    m_vnet_type_names[network_num] = vnet_type;
+}
+
+
+void
+Network::setToNetQueue(NodeID id, bool ordered, int network_num,
+                                 std::string vnet_type, MessageBuffer *b)
+{
+    checkNetworkAllocation(id, ordered, network_num, vnet_type);
+    while (m_toNetQueues[id].size() <= network_num) {
+        m_toNetQueues[id].push_back(nullptr);
+    }
+    m_toNetQueues[id][network_num] = b;
+}
+
+void
+Network::setFromNetQueue(NodeID id, bool ordered, int network_num,
+                                   std::string vnet_type, MessageBuffer *b)
+{
+    checkNetworkAllocation(id, ordered, network_num, vnet_type);
+    while (m_fromNetQueues[id].size() <= network_num) {
+        m_fromNetQueues[id].push_back(nullptr);
+    }
+    m_fromNetQueues[id][network_num] = b;
+}
index 26221521f7f7331516c4fdbfb1c078af16f7eec6..c06ee5a1a1d3d1de8786628a7e1a0af258423eb3 100644 (file)
@@ -72,10 +72,13 @@ class Network : public ClockedObject
     static uint32_t MessageSizeType_to_int(MessageSizeType size_type);
 
     // returns the queue requested for the given component
-    virtual void setToNetQueue(NodeID id, bool ordered, int netNumber,
-                               std::string vnet_type, MessageBuffer *b) = 0;
+    void setToNetQueue(NodeID id, bool ordered, int netNumber,
+                               std::string vnet_type, MessageBuffer *b);
     virtual void setFromNetQueue(NodeID id, bool ordered, int netNumber,
-                                 std::string vnet_type, MessageBuffer *b) = 0;
+                                 std::string vnet_type, MessageBuffer *b);
+
+    virtual void checkNetworkAllocation(NodeID id, bool ordered,
+        int network_num, std::string vnet_type);
 
     virtual void makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
                              LinkDirection direction,
@@ -107,6 +110,7 @@ class Network : public ClockedObject
 
     uint32_t m_nodes;
     static uint32_t m_virtual_networks;
+    std::vector<std::string> m_vnet_type_names;
     Topology* m_topology_ptr;
     static uint32_t m_control_msg_size;
     static uint32_t m_data_msg_size;
index ed4679c6355ddf9d6519f073bfcf200d245a9c3b..1213073e949b48786043a2b244a7821be0fb8bb2 100644 (file)
@@ -66,28 +66,6 @@ BaseGarnetNetwork::init()
     Network::init();
 }
 
-void
-BaseGarnetNetwork::setToNetQueue(NodeID id, bool ordered, int network_num,
-                                 string vnet_type, MessageBuffer *b)
-{
-    checkNetworkAllocation(id, ordered, network_num, vnet_type);
-    while (m_toNetQueues[id].size() <= network_num) {
-        m_toNetQueues[id].push_back(nullptr);
-    }
-    m_toNetQueues[id][network_num] = b;
-}
-
-void
-BaseGarnetNetwork::setFromNetQueue(NodeID id, bool ordered, int network_num,
-                                   string vnet_type, MessageBuffer *b)
-{
-    checkNetworkAllocation(id, ordered, network_num, vnet_type);
-    while (m_fromNetQueues[id].size() <= network_num) {
-        m_fromNetQueues[id].push_back(nullptr);
-    }
-    m_fromNetQueues[id][network_num] = b;
-}
-
 void
 BaseGarnetNetwork::regStats()
 {
index e2c843e10a9d3ad3e36a167331c097a0fc1a5290..fe2cbacc3ff5205b41fedc449698db253f5aa516 100644 (file)
@@ -68,15 +68,7 @@ class BaseGarnetNetwork : public Network
         m_queueing_latency[vnet] += latency;
     }
 
-    // set the queue
-    void setToNetQueue(NodeID id, bool ordered, int network_num,
-                       std::string vnet_type, MessageBuffer *b);
-    void setFromNetQueue(NodeID id, bool ordered, int network_num,
-                         std::string vnet_type, MessageBuffer *b);
-
     bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
-    virtual void checkNetworkAllocation(NodeID id, bool ordered,
-        int network_num, std::string vnet_type) = 0;
 
     virtual void regStats();
     virtual void collateStats() {}
index 4d5846f55b147719d14b11f21bbf947345c8af05..f6fe6f586aed7307dd87264a0c8d01b9c0b42c7e 100644 (file)
@@ -51,8 +51,13 @@ GarnetNetwork_d::GarnetNetwork_d(const Params *p)
     m_buffers_per_ctrl_vc = p->buffers_per_ctrl_vc;
 
     m_vnet_type.resize(m_virtual_networks);
-    for (int i = 0; i < m_vnet_type.size(); i++) {
-        m_vnet_type[i] = NULL_VNET_; // default
+
+    for(int i = 0 ; i < m_virtual_networks ; i++)
+    {
+        if (m_vnet_type_names[i] == "response")
+            m_vnet_type[i] = DATA_VNET_; // carries data (and ctrl) packets
+        else
+            m_vnet_type[i] = CTRL_VNET_; // carries only ctrl packets
     }
 
     // record the routers
@@ -187,23 +192,6 @@ GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
                                          link->m_weight, credit_link);
 }
 
-void
-GarnetNetwork_d::checkNetworkAllocation(NodeID id, bool ordered,
-                                        int network_num, string vnet_type)
-{
-    assert(id < m_nodes);
-    assert(network_num < m_virtual_networks);
-
-    if (ordered) {
-        m_ordered[network_num] = true;
-    }
-
-    if (vnet_type == "response")
-        m_vnet_type[network_num] = DATA_VNET_; // carries data (and ctrl) packets
-    else
-        m_vnet_type[network_num] = CTRL_VNET_; // carries only ctrl packets
-}
-
 void
 GarnetNetwork_d::regStats()
 {
index efd70c3a0d41f5f98a615a760cafa0fbbbd49e6d..99ecc02da13308440edadec0dd345fb8607e286a 100644 (file)
@@ -84,9 +84,6 @@ class GarnetNetwork_d : public BaseGarnetNetwork
     uint32_t functionalWrite(Packet *pkt);
 
   private:
-    void checkNetworkAllocation(NodeID id, bool ordered, int network_num,
-                                std::string vnet_type);
-
     GarnetNetwork_d(const GarnetNetwork_d& obj);
     GarnetNetwork_d& operator=(const GarnetNetwork_d& obj);
 
index 83cbe8d516e8f7e6d94c9d9ccaa4b448cfd20258..bd96fc2edd2e9ef2d71391b3a51549d78fbdc233 100644 (file)
@@ -143,18 +143,6 @@ GarnetNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
                                          link->m_weight);
 }
 
-void
-GarnetNetwork::checkNetworkAllocation(NodeID id, bool ordered,
-    int network_num, std::string vnet_type)
-{
-    assert(id < m_nodes);
-    assert(network_num < m_virtual_networks);
-
-    if (ordered) {
-        m_ordered[network_num] = true;
-    }
-}
-
 /*
  * Go through all the routers, network interfaces and the interconnecting
  * links for reading/writing all the messages.
index 906e7eb3a1d2b5c2f457441da48c2222a60d6eb2..46f62c04fd2a4b812acd3cb1792068558e6d365a 100644 (file)
@@ -79,9 +79,6 @@ class GarnetNetwork : public BaseGarnetNetwork
     uint32_t functionalWrite(Packet *pkt);
 
   private:
-    void checkNetworkAllocation(NodeID id, bool ordered, int network_num,
-                                std::string vnet_type);
-
     GarnetNetwork(const GarnetNetwork& obj);
     GarnetNetwork& operator=(const GarnetNetwork& obj);
 
index c10d1cce86c7629ec641fa6ecd18be72396bc782..457c3248e72164606a889a2f2c030fd92496d5e6 100644 (file)
@@ -139,39 +139,6 @@ SimpleNetwork::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
                                 simple_link->m_bw_multiplier);
 }
 
-void
-SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
-{
-    assert(id < m_nodes);
-    assert(network_num < m_virtual_networks);
-
-    if (ordered) {
-        m_ordered[network_num] = true;
-    }
-}
-
-void
-SimpleNetwork::setToNetQueue(NodeID id, bool ordered, int network_num,
-                             std::string vnet_type, MessageBuffer *b)
-{
-    checkNetworkAllocation(id, ordered, network_num);
-    while (m_toNetQueues[id].size() <= network_num) {
-        m_toNetQueues[id].push_back(nullptr);
-    }
-    m_toNetQueues[id][network_num] = b;
-}
-
-void
-SimpleNetwork::setFromNetQueue(NodeID id, bool ordered, int network_num,
-                               std::string vnet_type, MessageBuffer *b)
-{
-    checkNetworkAllocation(id, ordered, network_num);
-    while (m_fromNetQueues[id].size() <= network_num) {
-        m_fromNetQueues[id].push_back(nullptr);
-    }
-    m_fromNetQueues[id][network_num] = b;
-}
-
 void
 SimpleNetwork::regStats()
 {
index 2d9b48dea7583ab7ff3212670ad459421459545f..c5e56b1ecadea483060bdba8cf070e06adadcf7c 100644 (file)
@@ -56,23 +56,17 @@ class SimpleNetwork : public Network
     void collateStats();
     void regStats();
 
-    // sets the queue requested
-    void setToNetQueue(NodeID id, bool ordered, int network_num,
-                       std::string vnet_type, MessageBuffer *b);
-    void setFromNetQueue(NodeID id, bool ordered, int network_num,
-                         std::string vnet_type, MessageBuffer *b);
-
     bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
 
     // Methods used by Topology to setup the network
-    void makeOutLink(SwitchID src, NodeID dest, BasicLink* link, 
-                     LinkDirection direction, 
+    void makeOutLink(SwitchID src, NodeID dest, BasicLink* link,
+                     LinkDirection direction,
                      const NetDest& routing_table_entry);
     void makeInLink(NodeID src, SwitchID dest, BasicLink* link,
-                    LinkDirection direction, 
+                    LinkDirection direction,
                     const NetDest& routing_table_entry);
     void makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
-                          LinkDirection direction, 
+                          LinkDirection direction,
                           const NetDest& routing_table_entry);
 
     void print(std::ostream& out) const;
@@ -81,7 +75,6 @@ class SimpleNetwork : public Network
     uint32_t functionalWrite(Packet *pkt);
 
   private:
-    void checkNetworkAllocation(NodeID id, bool ordered, int network_num);
     void addLink(SwitchID src, SwitchID dest, int link_latency);
     void makeLink(SwitchID src, SwitchID dest,
         const NetDest& routing_table_entry, int link_latency);
@@ -98,7 +91,7 @@ class SimpleNetwork : public Network
 
     int m_buffer_size;
     int m_endpoint_bandwidth;
-    bool m_adaptive_routing;    
+    bool m_adaptive_routing;
 
     //Statistical variables
     Stats::Formula m_msg_counts[MessageSizeType_NUM];
index 015d902b415b224360abeb0de31358e0ac3b8d2f..480a6445d0d7516f1ff711d156ec164a93e8a533 100644 (file)
@@ -592,7 +592,6 @@ void
 $c_ident::init()
 {
     // initialize objects
-    initNetQueues();
 ''')
 
         code.indent()