Srikant Bharadwaj has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/32295 )

Change subject: mem-garnet:Fix Serdes credit bug
......................................................................

mem-garnet:Fix Serdes credit bug

This patch fixes the way we convert flits for the
cases when message sizes are not multiples of link
width sizes.

Change-Id: I634ca8105d3025ba38b353da95dbd57389f2c0c9
---
M src/mem/ruby/network/garnet2.0/NetworkBridge.cc
M src/mem/ruby/network/garnet2.0/OutputUnit.cc
M src/mem/ruby/network/garnet2.0/Router.cc
M src/mem/ruby/network/garnet2.0/flit.cc
4 files changed, 34 insertions(+), 26 deletions(-)



diff --git a/src/mem/ruby/network/garnet2.0/NetworkBridge.cc b/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
index 3c834d9..0073c65 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
+++ b/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
@@ -113,15 +113,15 @@
     // Serialize-Deserialize only if it is enabled
     if (enSerDes) {
         // Calculate the target-width
-        uint32_t target_width = bitWidth;
-        uint32_t cur_width = nLink->bitWidth;
+        int target_width = bitWidth;
+        int cur_width = nLink->bitWidth;
         if (mType == TO_LINK_) {
             target_width = nLink->bitWidth;
             cur_width = bitWidth;
         }

-        DPRINTF(RubyNetwork, "Target width: %d Current: %d Native: %d\n",
-            target_width, cur_width, bitWidth);
+        DPRINTF(RubyNetwork, "Target width: %d Current: %d\n",
+            target_width, cur_width);
         assert(target_width != cur_width);

         int vc = t_flit->get_vc();
@@ -134,12 +134,17 @@
             int num_flits = 0;
             if (t_flit->get_type() == CREDIT_) {
num_flits = (int)ceil((float)target_width/(float)cur_width);
+            } else if (t_flit->get_type() == TAIL_ ||
+                       t_flit->get_type() == HEAD_TAIL_) {
+                num_flits = 1;
             } else {
- num_flits = (int)ceil((float)t_flit->msgSize/(float)cur_width);
+                num_flits = (int)ceil((float)std::min(t_flit->msgSize,
+                                       target_width)/(float)cur_width);
             }
             assert(num_flits > 0);

- DPRINTF(RubyNetwork, "Deserialize :%d -----> %d num:%d vc:%d\n",
+            DPRINTF(RubyNetwork, "Deserialize :%d -----> %d "
+                "num-flits-needed:%d vc:%d\n",
                 cur_width, target_width, num_flits, vc);

             // lenBuffer acts as the buffer for deserialization
@@ -154,6 +159,7 @@

             // Schedule only if we are done deserializing
             if (fl) {
+                DPRINTF(RubyNetwork, "Scheduling a flit\n");
                 lenBuffer[vc] = 0;
                 scheduleFlit(fl, serDesLatency);
             }
@@ -161,8 +167,9 @@
             delete t_flit;
         } else {
             // Serialize
-            DPRINTF(RubyNetwork, "Serialize :%d -----> %d vc:%d\n",
-                cur_width, target_width);
+            DPRINTF(RubyNetwork, "Serializing flit :%d -----> %d "
+            "(vc:%d, Original Message Size: %d)\n",
+                cur_width, target_width, vc, t_flit->msgSize);

             int num_parts = 0;
             if (t_flit->get_type() == CREDIT_) {
@@ -170,11 +177,12 @@
                 num_parts = extraCredit[vc].front();
                 extraCredit[vc].pop();
             } else {
-                num_parts = (int)ceil((float)t_flit->msgSize/
+                num_parts = (int)ceil((float)cur_width/
                             (float)target_width);
             }
             assert(num_parts > 0);

+            DPRINTF(RubyNetwork, "Serialized into %d parts\n", num_parts);
             // Schedule all the flits
             // num_flits could be zero for credits
             for (int i = 0; i < num_parts; i++) {
@@ -201,6 +209,7 @@

     if (link_srcQueue->isReady(curTick())) {
         t_flit = link_srcQueue->getTopFlit();
+        DPRINTF(RubyNetwork, "Recieved flit %s\n", *t_flit);
         flitisizeAndSend(t_flit);
         return;
     }
diff --git a/src/mem/ruby/network/garnet2.0/OutputUnit.cc b/src/mem/ruby/network/garnet2.0/OutputUnit.cc
index 787514f..d342eb1 100644
--- a/src/mem/ruby/network/garnet2.0/OutputUnit.cc
+++ b/src/mem/ruby/network/garnet2.0/OutputUnit.cc
@@ -51,12 +51,11 @@
 void
 OutputUnit::decrement_credit(int out_vc)
 {
- DPRINTF(RubyNetwork, "Router %d OutputUnit %d decrementing credit:%d for "
-            "outvc %d at time: %lld for %s\n",
-            m_router->get_id(), m_id,
-            outVcState[out_vc].get_credit_count(),
-            out_vc, m_router->curCycle(),
-            m_credit_link->name());
+ DPRINTF(RubyNetwork, "Router %d OutputUnit %s decrementing credit:%d for "
+            "outvc %d at time: %lld for %s\n", m_router->get_id(),
+            m_router->getPortDirectionName(get_direction()),
+            outVcState[out_vc]->get_credit_count(),
+            out_vc, m_router->curCycle(), m_credit_link->name());

     outVcState[out_vc].decrement_credit();
 }
@@ -64,11 +63,11 @@
 void
 OutputUnit::increment_credit(int out_vc)
 {
- DPRINTF(RubyNetwork, "Router %d OutputUnit %d incrementing credit:%d for "
-            "outvc %d at time: %lld from:%s\n",
- m_router->get_id(), m_id, outVcState[out_vc].get_credit_count(),
-            out_vc, m_router->curCycle(),
-            m_credit_link->name());
+ DPRINTF(RubyNetwork, "Router %d OutputUnit %s incrementing credit:%d for "
+            "outvc %d at time: %lld from:%s\n", m_router->get_id(),
+            m_router->getPortDirectionName(get_direction()),
+            outVcState[out_vc]->get_credit_count(),
+            out_vc, m_router->curCycle(), m_credit_link->name());

     outVcState[out_vc].increment_credit();
 }
diff --git a/src/mem/ruby/network/garnet2.0/Router.cc b/src/mem/ruby/network/garnet2.0/Router.cc
index b07d55c..20eb93b 100644
--- a/src/mem/ruby/network/garnet2.0/Router.cc
+++ b/src/mem/ruby/network/garnet2.0/Router.cc
@@ -96,8 +96,9 @@
     DPRINTF(RubyNetwork, "%d == %d? %s\n", in_link->bitWidth,
             m_bit_width, in_link->name());

- fatal_if(in_link->bitWidth != m_bit_width, "Widths of units do not match."
-            " Consider inserting SerDes Units");
+    fatal_if(in_link->bitWidth != m_bit_width, "Widths of link %s(%d)does"
+            " not match that of Router%d(%d). Consider inserting SerDes "
+ "Units.", in_link->name(), in_link->bitWidth, m_id, m_bit_width);

     int port_num = m_input_unit.size();
     InputUnit *input_unit = new InputUnit(port_num, inport_dirn, this);
diff --git a/src/mem/ruby/network/garnet2.0/flit.cc b/src/mem/ruby/network/garnet2.0/flit.cc
index b3bf541..9631b5c 100644
--- a/src/mem/ruby/network/garnet2.0/flit.cc
+++ b/src/mem/ruby/network/garnet2.0/flit.cc
@@ -63,7 +63,6 @@
 flit *
 flit::serialize(int ser_id, int parts, uint32_t bWidth)
 {
-    DPRINTF(RubyNetwork, "Serializing a flit\n");
     assert(m_width > bWidth);

     // Assuming all flits get broken into equal parts
@@ -80,15 +79,14 @@
 flit *
 flit::deserialize(int des_id, int num_flits, uint32_t bWidth)
 {
-    DPRINTF(RubyNetwork, "Deserializing a flit\n");
     if ((m_type == HEAD_ || m_type == BODY_) &&
        ((m_id + 1) % num_flits)) {
         return NULL;
     }

     // Assuming all flits are joined into equal parts
-    int new_id = (int) floor(m_id/num_flits);
-    int new_size = (int) ceil(m_size/num_flits);
+    int new_id = (int) floor((float)m_id/(float)num_flits);
+    int new_size = (int) ceil((float)m_size/(float)num_flits);

     flit *fl = new flit(new_id, m_vc, m_vnet, m_route,
                     new_size, m_msg_ptr, msgSize, bWidth, m_time);
@@ -104,6 +102,7 @@
     out << "[flit:: ";
     out << "Id=" << m_id << " ";
     out << "Type=" << m_type << " ";
+    out << "Size=" << m_size << " ";
     out << "Vnet=" << m_vnet << " ";
     out << "VC=" << m_vc << " ";
     out << "Src NI=" << m_route.src_ni << " ";

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/32295
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: feature-heterogarnet
Gerrit-Change-Id: I634ca8105d3025ba38b353da95dbd57389f2c0c9
Gerrit-Change-Number: 32295
Gerrit-PatchSet: 1
Gerrit-Owner: Srikant Bharadwaj <srikant.bharad...@amd.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to