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