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