Sungkeun Kim has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/56283 )

Change subject: mem-garnet: Packet Tracing of garnet network
......................................................................

mem-garnet: Packet Tracing of garnet network

This is a new debug-flag and trace macro to keep track of
a single packet in the garnet network.
This patch would help for finding a deadlock issue
during the extending the garnet network.

Jira Issue: https://gem5.atlassian.net/browse/GEM5-1181

Change-Id: I133658b8b2c2adf7e311fc227351642f382d10fd
---
M configs/network/Network.py
M src/base/trace.hh
M src/mem/ruby/SConscript
M src/mem/ruby/network/garnet/Credit.cc
M src/mem/ruby/network/garnet/CrossbarSwitch.cc
M src/mem/ruby/network/garnet/GarnetNetwork.cc
M src/mem/ruby/network/garnet/GarnetNetwork.hh
M src/mem/ruby/network/garnet/GarnetNetwork.py
M src/mem/ruby/network/garnet/InputUnit.cc
M src/mem/ruby/network/garnet/NetworkBridge.cc
M src/mem/ruby/network/garnet/NetworkInterface.cc
M src/mem/ruby/network/garnet/SwitchAllocator.cc
M src/mem/ruby/network/garnet/flit.cc
M src/mem/ruby/network/garnet/flit.hh
14 files changed, 115 insertions(+), 17 deletions(-)



diff --git a/configs/network/Network.py b/configs/network/Network.py
index e5a86f6..5ba7f3b 100644
--- a/configs/network/Network.py
+++ b/configs/network/Network.py
@@ -84,6 +84,9 @@
         default=False,
         help="""SimpleNetwork links uses a separate physical
             channel for each virtual network""")
+    parser.add_argument("--trace-packet-id", action="store", type=int,
+                      default=-1,
+                      help="""A packet id to trace. -1 means trace all.""")

 def create_network(options, ruby):

@@ -125,6 +128,7 @@
         network.ni_flit_size = options.link_width_bits / 8
         network.routing_algorithm = options.routing_algorithm
network.garnet_deadlock_threshold = options.garnet_deadlock_threshold
+        network.trace_packet_id = options.trace_packet_id

         # Create Bridges and connect them to the corresponding links
         for intLink in network.int_links:
diff --git a/src/base/trace.hh b/src/base/trace.hh
index 05ad70e..79b98f3 100644
--- a/src/base/trace.hh
+++ b/src/base/trace.hh
@@ -190,6 +190,16 @@
     }                                            \
 } while (0)

+#define NDPRINTF(x, flit, trace_packet_id, ...) do {                \
+    if (GEM5_UNLIKELY(TRACING_ON && ::gem5::debug::x)) {            \
+        if (trace_packet_id == -1 ||                                \
+                (trace_packet_id == flit->get_packet_id())) {       \
+        ::gem5::Trace::getDebugLogger()->dprintf_flag(              \
+            ::gem5::curTick(), std::string(), #x, __VA_ARGS__);     \
+        }                                                           \
+    }                                                               \
+} while (0)
+
 #define DPRINTFS(x, s, ...) do {                        \
     if (GEM5_UNLIKELY(TRACING_ON && ::gem5::debug::x)) {          \
         ::gem5::Trace::getDebugLogger()->dprintf_flag(          \
diff --git a/src/mem/ruby/SConscript b/src/mem/ruby/SConscript
index b3ea716..045aebd 100644
--- a/src/mem/ruby/SConscript
+++ b/src/mem/ruby/SConscript
@@ -46,6 +46,7 @@
 DebugFlag('RubyDma')
 DebugFlag('RubyGenerated')
 DebugFlag('RubyNetwork')
+DebugFlag('RubyNetworkPacket')
 DebugFlag('RubyPort')
 DebugFlag('RubyPrefetcher')
 DebugFlag('RubyQueue')
diff --git a/src/mem/ruby/network/garnet/Credit.cc b/src/mem/ruby/network/garnet/Credit.cc
index 65ff488..6e1e2d2 100644
--- a/src/mem/ruby/network/garnet/Credit.cc
+++ b/src/mem/ruby/network/garnet/Credit.cc
@@ -46,7 +46,7 @@
 // and m_is_free_signal (whether VC is free or not)

 Credit::Credit(int vc, bool is_free_signal, Tick curTime)
-    : flit(0, vc, 0, RouteInfo(), 0, nullptr, 0, 0, curTime)
+    : flit(0, 0, vc, 0, RouteInfo(), 0, nullptr, 0, 0, curTime, -1)
 {
     m_is_free_signal = is_free_signal;
     m_type = CREDIT_;
diff --git a/src/mem/ruby/network/garnet/CrossbarSwitch.cc b/src/mem/ruby/network/garnet/CrossbarSwitch.cc
index cae7113..34dbe5d 100644
--- a/src/mem/ruby/network/garnet/CrossbarSwitch.cc
+++ b/src/mem/ruby/network/garnet/CrossbarSwitch.cc
@@ -32,6 +32,7 @@
 #include "mem/ruby/network/garnet/CrossbarSwitch.hh"

 #include "debug/RubyNetwork.hh"
+#include "debug/RubyNetworkPacket.hh"
 #include "mem/ruby/network/garnet/OutputUnit.hh"
 #include "mem/ruby/network/garnet/Router.hh"

@@ -87,6 +88,13 @@
             m_router->getOutputUnit(outport)->insert_flit(t_flit);
             switch_buffer.getTopFlit();
             m_crossbar_activity++;
+
+            NDPRINTF(RubyNetworkPacket, t_flit,
+                    m_router->get_net_ptr()->get_trace_packet_id(),
+                    "Router[%d] XB send a flit to %s %s\n",
+                    t_flit->get_cur_router(),
+                    m_router->getOutputUnit(outport)->get_direction(),
+                    *t_flit);
         }
     }
 }
diff --git a/src/mem/ruby/network/garnet/GarnetNetwork.cc b/src/mem/ruby/network/garnet/GarnetNetwork.cc
index de566a5..3e8e00b 100644
--- a/src/mem/ruby/network/garnet/GarnetNetwork.cc
+++ b/src/mem/ruby/network/garnet/GarnetNetwork.cc
@@ -70,6 +70,8 @@
     m_buffers_per_data_vc = p.buffers_per_data_vc;
     m_buffers_per_ctrl_vc = p.buffers_per_ctrl_vc;
     m_routing_algorithm = p.routing_algorithm;
+    m_packet_id = 0;
+    m_trace_packet_id = p.trace_packet_id;

     m_enable_fault_model = p.enable_fault_model;
     if (m_enable_fault_model)
diff --git a/src/mem/ruby/network/garnet/GarnetNetwork.hh b/src/mem/ruby/network/garnet/GarnetNetwork.hh
index 912445b..2d5550c 100644
--- a/src/mem/ruby/network/garnet/GarnetNetwork.hh
+++ b/src/mem/ruby/network/garnet/GarnetNetwork.hh
@@ -154,6 +154,8 @@

     void update_traffic_distribution(RouteInfo route);

+    int get_next_packet_id() { return m_packet_id++; }
+    int get_trace_packet_id() const { return m_trace_packet_id; }
   protected:
     // Configuration
     int m_num_rows;
@@ -209,6 +211,8 @@
std::vector<NetworkLink *> m_networklinks; // All flit links in the network std::vector<CreditLink *> m_creditlinks; // All credit links in the network
     std::vector<NetworkInterface *> m_nis;   // All NI's in Network
+    int m_packet_id;
+    int m_trace_packet_id;
 };

 inline std::ostream&
diff --git a/src/mem/ruby/network/garnet/GarnetNetwork.py b/src/mem/ruby/network/garnet/GarnetNetwork.py
index 184e64c..1abba81 100644
--- a/src/mem/ruby/network/garnet/GarnetNetwork.py
+++ b/src/mem/ruby/network/garnet/GarnetNetwork.py
@@ -50,6 +50,7 @@
     fault_model = Param.FaultModel(NULL, "network fault model");
     garnet_deadlock_threshold = Param.UInt32(50000,
                               "network-level deadlock threshold")
+    trace_packet_id = Param.Int(-1, "A packet id to trace");

 class GarnetNetworkInterface(ClockedObject):
     type = 'GarnetNetworkInterface'
diff --git a/src/mem/ruby/network/garnet/InputUnit.cc b/src/mem/ruby/network/garnet/InputUnit.cc
index e8515a6..820ed49 100644
--- a/src/mem/ruby/network/garnet/InputUnit.cc
+++ b/src/mem/ruby/network/garnet/InputUnit.cc
@@ -32,6 +32,7 @@
 #include "mem/ruby/network/garnet/InputUnit.hh"

 #include "debug/RubyNetwork.hh"
+#include "debug/RubyNetworkPacket.hh"
 #include "mem/ruby/network/garnet/Credit.hh"
 #include "mem/ruby/network/garnet/Router.hh"

@@ -83,6 +84,11 @@
         DPRINTF(RubyNetwork, "Router[%d] Consuming:%s Width: %d Flit:%s\n",
         m_router->get_id(), m_in_link->name(),
         m_router->getBitWidth(), *t_flit);
+        t_flit->set_cur_router(m_router->get_id());
+        NDPRINTF(RubyNetworkPacket, t_flit,
+                m_router->get_net_ptr()->get_trace_packet_id(),
+                "Router[%d] IN[%s(%d)] Consuming a flit %s\n",
+                t_flit->get_cur_router(), m_direction, m_id, *t_flit);
         assert(t_flit->m_width == m_router->getBitWidth());
         int vc = t_flit->get_vc();
         t_flit->increment_hops(); // for stats
diff --git a/src/mem/ruby/network/garnet/NetworkBridge.cc b/src/mem/ruby/network/garnet/NetworkBridge.cc
index 9412b5b..c828353 100644
--- a/src/mem/ruby/network/garnet/NetworkBridge.cc
+++ b/src/mem/ruby/network/garnet/NetworkBridge.cc
@@ -184,7 +184,8 @@

             flit *fl = NULL;
             if (flitPossible) {
-                fl = t_flit->deserialize(lenBuffer[vc], num_flits,
+                fl = t_flit->deserialize(t_flit,
+                    lenBuffer[vc], num_flits,
                     target_width);
             }

@@ -237,7 +238,9 @@
             // num_flits could be zero for credits
             for (int i = 0; i < flitPossible; i++) {
                 // Ignore neutralized credits
- flit *fl = t_flit->serialize(i, flitPossible, target_width);
+                flit *fl = t_flit->serialize(
+                        t_flit,
+                        i, flitPossible, target_width);
                 scheduleFlit(fl, serDesLatency);
                 DPRINTF(RubyNetwork, "Serialized to flit[%d of %d parts]:"
                 " %s\n", i+1, flitPossible, *fl);
diff --git a/src/mem/ruby/network/garnet/NetworkInterface.cc b/src/mem/ruby/network/garnet/NetworkInterface.cc
index a33102a..54f7ef4 100644
--- a/src/mem/ruby/network/garnet/NetworkInterface.cc
+++ b/src/mem/ruby/network/garnet/NetworkInterface.cc
@@ -37,6 +37,7 @@

 #include "base/cast.hh"
 #include "debug/RubyNetwork.hh"
+#include "debug/RubyNetworkPacket.hh"
 #include "mem/ruby/network/MessageBuffer.hh"
 #include "mem/ruby/network/garnet/Credit.hh"
 #include "mem/ruby/network/garnet/flitBuffer.hh"
@@ -235,6 +236,10 @@
             int vnet = t_flit->get_vnet();
             t_flit->set_dequeue_time(curTick());

+            NDPRINTF(RubyNetworkPacket, t_flit,
+                    m_net_ptr->get_trace_packet_id(),
+                    "Router[%d] NI[%d] A flit is ejected %s\n",
+                    t_flit->get_cur_router(), m_id, *t_flit);
// If a tail flit is received, enqueue into the protocol buffers // if space is available. Otherwise, exchange non-tail flits for
             // credits.
@@ -343,6 +348,11 @@
                     // Update Stats
                     incrementStats(stallFlit);

+                    NDPRINTF(RubyNetworkPacket, stallFlit,
+                            m_net_ptr->get_trace_packet_id(),
+                            "Router[%d] NI[%d] A flit is ejected %s\n",
+                            stallFlit->get_cur_router(), m_id, *stallFlit);
+
// Flit can now safely be deleted and removed from stall
                     // queue
                     delete stallFlit;
@@ -436,12 +446,17 @@

         m_net_ptr->increment_injected_packets(vnet);
         m_net_ptr->update_traffic_distribution(route);
+        const int packet_id = m_net_ptr->get_next_packet_id();
         for (int i = 0; i < num_flits; i++) {
             m_net_ptr->increment_injected_flits(vnet);
-            flit *fl = new flit(i, vc, vnet, route, num_flits, new_msg_ptr,
+            flit *fl = new flit(packet_id,
+                    i, vc, vnet, route, num_flits, new_msg_ptr,
                 m_net_ptr->MessageSizeType_to_int(
                 net_msg_ptr->getMessageSize()),
-                oPort->bitWidth(), curTick());
+                oPort->bitWidth(), curTick(), oPort->routerID());
+ NDPRINTF(RubyNetworkPacket, fl, m_net_ptr->get_trace_packet_id(),
+                    "Router[%d] NI[%d] A flit is created %s\n",
+                    fl->get_cur_router(), m_id, *fl);

             fl->set_src_delay(curTick() - msg_ptr->getTime());
             niOutVcs[vc].insert(fl);
@@ -593,6 +608,9 @@
DPRINTF(RubyNetwork, "Scheduling at %s time:%ld flit:%s Message:%s\n",
         oPort->outNetLink()->name(), clockEdge(Cycles(1)),
         *t_flit, *(t_flit->get_msg_ptr()));
+ NDPRINTF(RubyNetworkPacket, t_flit, m_net_ptr->get_trace_packet_id(),
+                "Router[%d] NI[%d] Scheduling a flit %s\n",
+                t_flit->get_cur_router(), m_id, *t_flit);
         oPort->outFlitQueue()->insert(t_flit);
         oPort->outNetLink()->scheduleEventAbsolute(clockEdge(Cycles(1)));
         return;
diff --git a/src/mem/ruby/network/garnet/SwitchAllocator.cc b/src/mem/ruby/network/garnet/SwitchAllocator.cc
index e31733d..582d67d 100644
--- a/src/mem/ruby/network/garnet/SwitchAllocator.cc
+++ b/src/mem/ruby/network/garnet/SwitchAllocator.cc
@@ -32,6 +32,7 @@
 #include "mem/ruby/network/garnet/SwitchAllocator.hh"

 #include "debug/RubyNetwork.hh"
+#include "debug/RubyNetworkPacket.hh"
 #include "mem/ruby/network/garnet/GarnetNetwork.hh"
 #include "mem/ruby/network/garnet/InputUnit.hh"
 #include "mem/ruby/network/garnet/OutputUnit.hh"
@@ -200,6 +201,16 @@
                             input_unit->get_direction()),
                             *t_flit,
                         m_router->curCycle());
+                NDPRINTF(RubyNetworkPacket,
+ t_flit, m_router->get_net_ptr()->get_trace_packet_id(),
+                        "Router[%d] SA granted outvc %d at outport %d "
+                        " to invc %d at inport %d to flit %s\n",
+                        t_flit->get_cur_router(),
+                        outvc, m_router->getPortDirectionName(
+                            output_unit->get_direction()),
+                        invc, m_router->getPortDirectionName(
+                            input_unit->get_direction()),
+                        *t_flit);


                 // Update outport field in the flit since this is
diff --git a/src/mem/ruby/network/garnet/flit.cc b/src/mem/ruby/network/garnet/flit.cc
index 6e6ed5f..a9285ad 100644
--- a/src/mem/ruby/network/garnet/flit.cc
+++ b/src/mem/ruby/network/garnet/flit.cc
@@ -43,14 +43,15 @@
 {

 // Constructor for the flit
-flit::flit(int id, int  vc, int vnet, RouteInfo route, int size,
-    MsgPtr msg_ptr, int MsgSize, uint32_t bWidth, Tick curTime)
+flit::flit(int packet_id, int id, int vc, int vnet, RouteInfo route, int size, + MsgPtr msg_ptr, int MsgSize, uint32_t bWidth, Tick curTime, int cur_router)
 {
     m_size = size;
     m_msg_ptr = msg_ptr;
     m_enqueue_time = curTime;
     m_dequeue_time = curTime;
     m_time = curTime;
+    m_packet_id = packet_id;
     m_id = id;
     m_vnet = vnet;
     m_vc = vc;
@@ -59,6 +60,7 @@
     m_stage.second = curTime;
     m_width = bWidth;
     msgSize = MsgSize;
+    m_cur_router = cur_router;

     if (size == 1) {
         m_type = HEAD_TAIL_;
@@ -73,7 +75,7 @@
 }

 flit *
-flit::serialize(int ser_id, int parts, uint32_t bWidth)
+flit::serialize(flit* t_flit, int ser_id, int parts, uint32_t bWidth)
 {
     assert(m_width > bWidth);

@@ -82,23 +84,25 @@
     int new_size = (int)divCeil((float)msgSize, (float)bWidth);
     assert(new_id < new_size);

-    flit *fl = new flit(new_id, m_vc, m_vnet, m_route,
-                    new_size, m_msg_ptr, msgSize, bWidth, m_time);
+ flit *fl = new flit(t_flit->get_packet_id(), new_id, m_vc, m_vnet, m_route,
+                    new_size, m_msg_ptr, msgSize,
+                    bWidth, m_time, t_flit->get_cur_router());
     fl->set_enqueue_time(m_enqueue_time);
     fl->set_src_delay(src_delay);
     return fl;
 }

 flit *
-flit::deserialize(int des_id, int num_flits, uint32_t bWidth)
+flit::deserialize(flit* t_flit, int des_id, int num_flits, uint32_t bWidth)
 {
     int ratio = (int)divCeil((float)bWidth, (float)m_width);
     int new_id = ((int)divCeil((float)(m_id+1), (float)ratio)) - 1;
     int new_size = (int)divCeil((float)msgSize, (float)bWidth);
     assert(new_id < new_size);

-    flit *fl = new flit(new_id, m_vc, m_vnet, m_route,
-                    new_size, m_msg_ptr, msgSize, bWidth, m_time);
+ flit *fl = new flit(t_flit->get_packet_id(), new_id, m_vc, m_vnet, m_route,
+                    new_size, m_msg_ptr, msgSize,
+                    bWidth, m_time, t_flit->get_cur_router());
     fl->set_enqueue_time(m_enqueue_time);
     fl->set_src_delay(src_delay);
     return fl;
@@ -109,6 +113,7 @@
 flit::print(std::ostream& out) const
 {
     out << "[flit:: ";
+    out << "PacketId=" << m_packet_id << " ";
     out << "Id=" << m_id << " ";
     out << "Type=" << m_type << " ";
     out << "Size=" << m_size << " ";
@@ -120,6 +125,7 @@
     out << "Dest Router=" << m_route.dest_router << " ";
     out << "Set Time=" << m_time << " ";
     out << "Width=" << m_width<< " ";
+    out << "Cur Router=" << m_cur_router << " ";
     out << "]";
 }

diff --git a/src/mem/ruby/network/garnet/flit.hh b/src/mem/ruby/network/garnet/flit.hh
index 8814d3c..654c5c7 100644
--- a/src/mem/ruby/network/garnet/flit.hh
+++ b/src/mem/ruby/network/garnet/flit.hh
@@ -51,8 +51,9 @@
 {
   public:
     flit() {}
-    flit(int id, int vc, int vnet, RouteInfo route, int size,
-         MsgPtr msg_ptr, int MsgSize, uint32_t bWidth, Tick curTime);
+ flit(int packet_id, int id, int vc, int vnet, RouteInfo route, int size,
+         MsgPtr msg_ptr, int MsgSize, uint32_t bWidth,
+         Tick curTime, int cur_router);

     virtual ~flit(){};

@@ -60,6 +61,7 @@
     int get_size() { return m_size; }
     Tick get_enqueue_time() { return m_enqueue_time; }
     Tick get_dequeue_time() { return m_dequeue_time; }
+    int get_packet_id() const { return m_packet_id; }
     int get_id() { return m_id; }
     Tick get_time() { return m_time; }
     int get_vnet() { return m_vnet; }
@@ -69,6 +71,8 @@
     flit_type get_type() { return m_type; }
     std::pair<flit_stage, Tick> get_stage() { return m_stage; }
     Tick get_src_delay() { return src_delay; }
+    int get_cur_router() const { return m_cur_router; }
+    void set_cur_router(int const cur_router) { m_cur_router= cur_router; }

     void set_outport(int port) { m_outport = port; }
     void set_time(Tick time) { m_time = time; }
@@ -108,12 +112,15 @@

     bool functionalWrite(Packet *pkt);

-    virtual flit* serialize(int ser_id, int parts, uint32_t bWidth);
-    virtual flit* deserialize(int des_id, int num_flits, uint32_t bWidth);
+    virtual flit* serialize(flit* t_flit,
+            int ser_id, int parts, uint32_t bWidth);
+    virtual flit* deserialize(flit* t_flit,
+            int des_id, int num_flits, uint32_t bWidth);

     uint32_t m_width;
     int msgSize;
   protected:
+    int m_packet_id;
     int m_id;
     int m_vnet;
     int m_vc;
@@ -126,6 +133,7 @@
     int m_outport;
     Tick src_delay;
     std::pair<flit_stage, Tick> m_stage;
+    int m_cur_router;
 };

 inline std::ostream&

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

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I133658b8b2c2adf7e311fc227351642f382d10fd
Gerrit-Change-Number: 56283
Gerrit-PatchSet: 1
Gerrit-Owner: Sungkeun Kim <ksungkeu...@tamu.edu>
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