ruby: network: drop member m_in_use
authorNilay Vaish <nilay@cs.wisc.edu>
Sun, 30 Aug 2015 17:24:18 +0000 (12:24 -0500)
committerNilay Vaish <nilay@cs.wisc.edu>
Sun, 30 Aug 2015 17:24:18 +0000 (12:24 -0500)
This member indicates whether or not a particular virtual network is in use.
Instead of having a default big value for the number of virtual networks and
then checking whether a virtual network is in use, the next patch removes the
default value and the protocol configuration file would now specify the
number of virtual networks it requires.

Additionally, the patch also refactors some of the code used for computing the
virtual channel next in the round robin order.

src/mem/ruby/network/Network.cc
src/mem/ruby/network/Network.hh
src/mem/ruby/network/garnet/BaseGarnetNetwork.hh
src/mem/ruby/network/garnet/fixed-pipeline/GarnetNetwork_d.cc
src/mem/ruby/network/garnet/fixed-pipeline/SWallocator_d.cc
src/mem/ruby/network/garnet/fixed-pipeline/VCallocator_d.cc
src/mem/ruby/network/garnet/flexible-pipeline/GarnetNetwork.cc
src/mem/ruby/network/garnet/flexible-pipeline/Router.cc
src/mem/ruby/network/garnet/flexible-pipeline/Router.hh
src/mem/ruby/network/simple/SimpleNetwork.cc
src/mem/ruby/network/simple/SimpleNetwork.hh

index 2d611cd7eb6d68c72650770e7f5311f45d1ad1e8..5d0ff980c026323d1f63c40d7380e113743bcc79 100644 (file)
@@ -57,11 +57,9 @@ Network::Network(const Params *p)
     // Queues that are feeding the protocol
     m_fromNetQueues.resize(m_nodes);
 
-    m_in_use.resize(m_virtual_networks);
     m_ordered.resize(m_virtual_networks);
 
     for (int i = 0; i < m_virtual_networks; i++) {
-        m_in_use[i] = false;
         m_ordered[i] = false;
     }
 
index 24a487d255fc7486da7d805d4b7e9b79d6127d69..26221521f7f7331516c4fdbfb1c078af16f7eec6 100644 (file)
@@ -114,8 +114,6 @@ class Network : public ClockedObject
     // vector of queues from the components
     std::vector<std::vector<MessageBuffer*> > m_toNetQueues;
     std::vector<std::vector<MessageBuffer*> > m_fromNetQueues;
-
-    std::vector<bool> m_in_use;
     std::vector<bool> m_ordered;
 
   private:
index c959536f589581eaa8c678d884369bcc21711150..e2c843e10a9d3ad3e36a167331c097a0fc1a5290 100644 (file)
@@ -74,8 +74,7 @@ class BaseGarnetNetwork : public Network
     void setFromNetQueue(NodeID id, bool ordered, int network_num,
                          std::string vnet_type, MessageBuffer *b);
 
-    bool isVNetOrdered(int vnet) { return m_ordered[vnet]; }
-    bool validVirtualNetwork(int vnet) { return m_in_use[vnet]; }
+    bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
     virtual void checkNetworkAllocation(NodeID id, bool ordered,
         int network_num, std::string vnet_type) = 0;
 
index 5aa967e8f3592ebe871fde4cff2fad174c412d7e..196ebb089f72b0693311005d69aa742e7b11e8bc 100644 (file)
@@ -189,8 +189,7 @@ GarnetNetwork_d::makeInternalLink(SwitchID src, SwitchID dest, BasicLink* link,
 
 void
 GarnetNetwork_d::checkNetworkAllocation(NodeID id, bool ordered,
-                                        int network_num,
-                                        string vnet_type)
+                                        int network_num, string vnet_type)
 {
     assert(id < m_nodes);
     assert(network_num < m_virtual_networks);
@@ -198,7 +197,6 @@ GarnetNetwork_d::checkNetworkAllocation(NodeID id, bool ordered,
     if (ordered) {
         m_ordered[network_num] = true;
     }
-    m_in_use[network_num] = true;
 
     if (vnet_type == "response")
         m_vnet_type[network_num] = DATA_VNET_; // carries data (and ctrl) packets
index 1e636b589646bfa27e82984a61f96f68ced5b643..06afee845f17c1ba3ed68389406d87ad353ef814 100644 (file)
@@ -95,14 +95,9 @@ SWallocator_d::arbitrate_inports()
 
         // Select next round robin vc candidate within valid vnet
         int next_round_robin_invc = invc;
-        do {
-            next_round_robin_invc++;
-
-            if (next_round_robin_invc >= m_num_vcs)
-                next_round_robin_invc = 0;
-        } while (!((m_router->get_net_ptr())->validVirtualNetwork(
-                    get_vnet(next_round_robin_invc))));
-
+        next_round_robin_invc++;
+        if (next_round_robin_invc >= m_num_vcs)
+            next_round_robin_invc = 0;
         m_round_robin_inport[inport] = next_round_robin_invc;
 
         for (int invc_iter = 0; invc_iter < m_num_vcs; invc_iter++) {
@@ -110,10 +105,6 @@ SWallocator_d::arbitrate_inports()
             if (invc >= m_num_vcs)
                 invc = 0;
 
-            if (!((m_router->get_net_ptr())->validVirtualNetwork(
-                get_vnet(invc))))
-                continue;
-
             if (m_input_unit[inport]->need_stage(invc, ACTIVE_, SA_,
                                                  m_router->curCycle()) &&
                 m_input_unit[inport]->has_credits(invc)) {
index a7430b06e30468df80eb345420c90860ad727e30..d389f07ba1d588985d3c652660d1d6a69a51438f 100644 (file)
@@ -180,10 +180,6 @@ VCallocator_d::arbitrate_invcs()
 {
     for (int inport_iter = 0; inport_iter < m_num_inports; inport_iter++) {
         for (int invc_iter = 0; invc_iter < m_num_vcs; invc_iter++) {
-            if (!((m_router->get_net_ptr())->validVirtualNetwork(
-                get_vnet(invc_iter))))
-                continue;
-
             if (m_input_unit[inport_iter]->need_stage(invc_iter, VC_AB_,
                     VA_, m_router->curCycle())) {
                 if (!is_invc_candidate(inport_iter, invc_iter))
index 7a304be28b33504a97bfce9ec319b45b3666cd56..87418b6b1c6231ea211385e4fd9fb0de676190a3 100644 (file)
@@ -153,7 +153,6 @@ GarnetNetwork::checkNetworkAllocation(NodeID id, bool ordered,
     if (ordered) {
         m_ordered[network_num] = true;
     }
-    m_in_use[network_num] = true;
 }
 
 /*
index ef985058e460583609ac4899fba9a68e36a573b8..9451439c9a7bd46ea7d2bb9affe5c5dc82794833 100644 (file)
@@ -157,27 +157,13 @@ Router::vc_arbitrate()
         if (inport >= m_in_link.size())
             inport = 0;
         int invc = m_round_robin_invc[inport];
-
-        int next_round_robin_invc = invc;
-        do {
-            next_round_robin_invc++;
-
-            if (next_round_robin_invc >= m_num_vcs)
-                next_round_robin_invc = 0;
-
-        } while (!(m_net_ptr->validVirtualNetwork(
-                   get_vnet(next_round_robin_invc))));
-
-        m_round_robin_invc[inport] = next_round_robin_invc;
+        m_round_robin_invc[inport] = get_next_round_robin_vc(invc);
 
         for (int vc_iter = 0; vc_iter < m_num_vcs; vc_iter++) {
             invc++;
             if (invc >= m_num_vcs)
                 invc = 0;
 
-            if (!(m_net_ptr->validVirtualNetwork(get_vnet(invc))))
-                continue;
-
             InVcState *in_vc_state = m_in_vc_state[inport][invc];
 
             if (in_vc_state->isInState(VC_AB_, curCycle())) {
@@ -335,17 +321,7 @@ Router::scheduleOutputLinks()
 {
     for (int port = 0; port < m_out_link.size(); port++) {
         int vc_tolookat = m_vc_round_robin[port];
-
-        int next_round_robin_vc_tolookat = vc_tolookat;
-        do {
-            next_round_robin_vc_tolookat++;
-
-            if (next_round_robin_vc_tolookat == m_num_vcs)
-                next_round_robin_vc_tolookat = 0;
-        } while (!(m_net_ptr->validVirtualNetwork(
-                   get_vnet(next_round_robin_vc_tolookat))));
-
-        m_vc_round_robin[port] = next_round_robin_vc_tolookat;
+        m_vc_round_robin[port] = get_next_round_robin_vc(vc_tolookat);
 
         for (int i = 0; i < m_num_vcs; i++) {
             vc_tolookat++;
@@ -374,13 +350,22 @@ Router::scheduleOutputLinks()
 }
 
 int
-Router::get_vnet(int vc)
+Router::get_vnet(int vc) const
 {
     int vnet = vc/m_vc_per_vnet;
     assert(vnet < m_virtual_networks);
     return vnet;
 }
 
+int
+Router::get_next_round_robin_vc(int vc) const
+{
+    vc++;
+    if (vc == m_num_vcs)
+        vc = 0;
+    return vc;
+}
+
 void
 Router::checkReschedule()
 {
index e3f193045ef0ae8cf90151aaadfaddf181b0b91a..11a860b11ae09596397e6e63922e502e81477917 100644 (file)
@@ -65,7 +65,6 @@ class Router : public BasicRouter, public FlexibleConsumer
     void grant_vc(int out_port, int vc, Cycles grant_time);
     void release_vc(int out_port, int vc, Cycles release_time);
     void vc_arbitrate();
-    int get_vnet(int vc);
 
     void print(std::ostream& out) const;
 
@@ -104,6 +103,8 @@ class Router : public BasicRouter, public FlexibleConsumer
     void checkReschedule();
     void check_arbiter_reschedule();
     void scheduleOutputLinks();
+    int get_vnet(int vc) const;
+    int get_next_round_robin_vc(int vc) const;
 };
 
 #endif // __MEM_RUBY_NETWORK_GARNET_FLEXIBLE_PIPELINE_ROUTER_HH__
index 5b7d7ebadeab72e8c3dffc1b9170df799437ce6a..eb3bec256d69e30a0dcd8615a888d283ecce5bde 100644 (file)
@@ -148,7 +148,6 @@ SimpleNetwork::checkNetworkAllocation(NodeID id, bool ordered, int network_num)
     if (ordered) {
         m_ordered[network_num] = true;
     }
-    m_in_use[network_num] = true;
 }
 
 void
index fe0c1838b22d4cd15cd29b9bc530a95001681f6b..2d9b48dea7583ab7ff3212670ad459421459545f 100644 (file)
@@ -62,8 +62,7 @@ class SimpleNetwork : public Network
     void setFromNetQueue(NodeID id, bool ordered, int network_num,
                          std::string vnet_type, MessageBuffer *b);
 
-    bool isVNetOrdered(int vnet) { return m_ordered[vnet]; }
-    bool validVirtualNetwork(int vnet) { return m_in_use[vnet]; }
+    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,