Srikant Bharadwaj has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/32299 )
Change subject: mem-garnet: Flexible VCs per Vnet for each router
......................................................................
mem-garnet: Flexible VCs per Vnet for each router
This change allows configuring each router with a certain number
of VCs for each VNET. This is beneficial when dealing with
heterogenous link widths in a system. Configuring VCs
for each router allows one to ensure equal throuput
within the network while avoiding head-of-line blocking.
Changing a router's VCs number can be done in topology files
using the vcs_per_vnet value argument of router.
Change-Id: Icf4f510248128429a1a11f19f9802ee96f340611
---
M src/mem/ruby/network/garnet2.0/GarnetNetwork.cc
M src/mem/ruby/network/garnet2.0/GarnetNetwork.hh
M src/mem/ruby/network/garnet2.0/NetworkBridge.cc
M src/mem/ruby/network/garnet2.0/NetworkBridge.hh
M src/mem/ruby/network/garnet2.0/NetworkInterface.cc
M src/mem/ruby/network/garnet2.0/NetworkInterface.hh
M src/mem/ruby/network/garnet2.0/NetworkLink.cc
M src/mem/ruby/network/garnet2.0/NetworkLink.hh
M src/mem/ruby/network/garnet2.0/OutVcState.cc
M src/mem/ruby/network/garnet2.0/OutVcState.hh
M src/mem/ruby/network/garnet2.0/OutputUnit.cc
M src/mem/ruby/network/garnet2.0/OutputUnit.hh
M src/mem/ruby/network/garnet2.0/Router.cc
M src/mem/ruby/network/garnet2.0/Router.hh
14 files changed, 127 insertions(+), 54 deletions(-)
diff --git a/src/mem/ruby/network/garnet2.0/GarnetNetwork.cc
b/src/mem/ruby/network/garnet2.0/GarnetNetwork.cc
index ca9e26f..3e3852a 100644
--- a/src/mem/ruby/network/garnet2.0/GarnetNetwork.cc
+++ b/src/mem/ruby/network/garnet2.0/GarnetNetwork.cc
@@ -58,7 +58,7 @@
{
m_num_rows = p->num_rows;
m_ni_flit_size = p->ni_flit_size;
- m_vcs_per_vnet = p->vcs_per_vnet;
+ m_max_vcs_per_vnet = 0;
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;
@@ -166,15 +166,19 @@
PortDirection dst_inport_dirn = "Local";
+ m_max_vcs_per_vnet = std::max(m_max_vcs_per_vnet,
+ (uint32_t) m_routers[dest]->get_vc_per_vnet());
+
if (garnet_link->extBridgeEn) {
DPRINTF(RubyNetwork, "Enable external bridge for %s\n",
garnet_link->name());
m_nis[local_src]->
addOutPort(garnet_link->extNetBridge[LinkDirection_In],
garnet_link->extCredBridge[LinkDirection_In],
- dest);
+ dest, m_routers[dest]->get_vc_per_vnet());
} else {
- m_nis[local_src]->addOutPort(net_link, credit_link, dest);
+ m_nis[local_src]->addOutPort(net_link, credit_link, dest,
+ m_routers[dest]->get_vc_per_vnet());
}
if (garnet_link->intBridgeEn) {
@@ -218,6 +222,9 @@
PortDirection src_outport_dirn = "Local";
+ m_max_vcs_per_vnet = std::max(m_max_vcs_per_vnet,
+ (uint32_t) m_routers[src]->get_vc_per_vnet());
+
if (garnet_link->extBridgeEn) {
DPRINTF(RubyNetwork, "Enable external bridge for %s\n",
garnet_link->name());
@@ -235,12 +242,14 @@
addOutPort(src_outport_dirn,
garnet_link->intNetBridge[LinkDirection_Out],
routing_table_entry, link->m_weight,
- garnet_link->intCredBridge[LinkDirection_Out]);
+ garnet_link->intCredBridge[LinkDirection_Out],
+ m_routers[src]->get_vc_per_vnet());
} else {
m_routers[src]->
addOutPort(src_outport_dirn, net_link,
routing_table_entry,
- link->m_weight, credit_link);
+ link->m_weight, credit_link,
+ m_routers[src]->get_vc_per_vnet());
}
}
@@ -265,6 +274,10 @@
m_networklinks.push_back(net_link);
m_creditlinks.push_back(credit_link);
+ m_max_vcs_per_vnet = std::max(m_max_vcs_per_vnet,
+ std::max((uint32_t) m_routers[dest]->get_vc_per_vnet(),
+ (uint32_t) m_routers[src]->get_vc_per_vnet()));
+
if (garnet_link->dstBridgeEn) {
DPRINTF(RubyNetwork, "Enable destination bridge for %s\n",
garnet_link->name());
@@ -280,11 +293,13 @@
m_routers[src]->
addOutPort(src_outport_dirn, garnet_link->srcNetBridge,
routing_table_entry,
- link->m_weight, garnet_link->srcCredBridge);
+ link->m_weight, garnet_link->srcCredBridge,
+ m_routers[dest]->get_vc_per_vnet());
} else {
m_routers[src]->addOutPort(src_outport_dirn, net_link,
routing_table_entry,
- link->m_weight, credit_link);
+ link->m_weight, credit_link,
+ m_routers[dest]->get_vc_per_vnet());
}
}
@@ -440,9 +455,8 @@
.name(name() + ".int_link_utilization");
m_average_link_utilization
.name(name() + ".avg_link_utilization");
-
m_average_vc_load
- .init(m_virtual_networks * m_vcs_per_vnet)
+ .init(m_virtual_networks * m_max_vcs_per_vnet)
.name(name() + ".avg_vc_load")
.flags(Stats::pdf | Stats::total | Stats::nozero | Stats::oneline)
;
diff --git a/src/mem/ruby/network/garnet2.0/GarnetNetwork.hh
b/src/mem/ruby/network/garnet2.0/GarnetNetwork.hh
index 5173fa7..bb4b24a 100644
--- a/src/mem/ruby/network/garnet2.0/GarnetNetwork.hh
+++ b/src/mem/ruby/network/garnet2.0/GarnetNetwork.hh
@@ -64,7 +64,6 @@
// for network
uint32_t getNiFlitSize() const { return m_ni_flit_size; }
- uint32_t getVCsPerVnet() const { return m_vcs_per_vnet; }
uint32_t getBuffersPerDataVC() { return m_buffers_per_data_vc; }
uint32_t getBuffersPerCtrlVC() { return m_buffers_per_ctrl_vc; }
int getRoutingAlgorithm() const { return m_routing_algorithm; }
@@ -76,9 +75,8 @@
// Internal configuration
bool isVNetOrdered(int vnet) const { return m_ordered[vnet]; }
VNET_type
- get_vnet_type(int vc)
+ get_vnet_type(int vnet)
{
- int vnet = vc/getVCsPerVnet();
return m_vnet_type[vnet];
}
int getNumRouters();
@@ -147,7 +145,7 @@
int m_num_rows;
int m_num_cols;
uint32_t m_ni_flit_size;
- uint32_t m_vcs_per_vnet;
+ uint32_t m_max_vcs_per_vnet;
uint32_t m_buffers_per_ctrl_vc;
uint32_t m_buffers_per_data_vc;
int m_routing_algorithm;
diff --git a/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
b/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
index 1cf560f..eaf8e39 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
+++ b/src/mem/ruby/network/garnet2.0/NetworkBridge.cc
@@ -63,11 +63,19 @@
// CDC type must be set
panic("CDC type must be set");
}
+}
- lenBuffer.resize(p->vcs_per_vnet * p->virt_nets);
- sizeSent.resize(p->vcs_per_vnet * p->virt_nets);
- flitsSent.resize(p->vcs_per_vnet * p->virt_nets);
- extraCredit.resize(p->vcs_per_vnet * p->virt_nets);
+void
+NetworkBridge::setVcsPerVnet(uint32_t consumerVcs)
+{
+ DPRINTF(RubyNetwork, "VcsPerVnet VC: %d\n", consumerVcs);
+ NetworkLink::setVcsPerVnet(consumerVcs);
+ lenBuffer.resize(consumerVcs * m_virt_nets);
+ sizeSent.resize(consumerVcs * m_virt_nets);
+ flitsSent.resize(consumerVcs * m_virt_nets);
+ extraCredit.resize(consumerVcs * m_virt_nets);
+
+ nLink->setVcsPerVnet(consumerVcs);
}
void
diff --git a/src/mem/ruby/network/garnet2.0/NetworkBridge.hh
b/src/mem/ruby/network/garnet2.0/NetworkBridge.hh
index f6c6b97..aa6bffd 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkBridge.hh
+++ b/src/mem/ruby/network/garnet2.0/NetworkBridge.hh
@@ -65,6 +65,7 @@
void scheduleFlit(flit *t_flit, Cycles latency);
void flitisizeAndSend(flit *t_flit);
+ void setVcsPerVnet(uint32_t consumerVcs);
friend class GarnetNetwork;
diff --git a/src/mem/ruby/network/garnet2.0/NetworkInterface.cc
b/src/mem/ruby/network/garnet2.0/NetworkInterface.cc
index 5c9b6c2..81c062f 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkInterface.cc
+++ b/src/mem/ruby/network/garnet2.0/NetworkInterface.cc
@@ -46,32 +46,19 @@
NetworkInterface::NetworkInterface(const Params *p)
: ClockedObject(p), Consumer(this), m_id(p->id),
- m_virtual_networks(p->virt_nets), m_vc_per_vnet(p->vcs_per_vnet),
- m_router_id(-1), m_vc_allocator(m_virtual_networks, 0),
+ m_virtual_networks(p->virt_nets), m_vc_per_vnet(0),
+ m_vc_allocator(m_virtual_networks, 0),
m_vc_round_robin(0),
m_deadlock_threshold(p->garnet_deadlock_threshold),
vc_busy_counter(m_virtual_networks, 0)
{
- const int num_vcs = m_vc_per_vnet * m_virtual_networks;
- niOutVcs.resize(num_vcs);
- m_ni_out_vcs_enqueue_time.resize(num_vcs);
-
- // instantiating the NI flit buffers
- for (auto& time : m_ni_out_vcs_enqueue_time) {
- time = Tick(INFINITE_);
- }
-
m_stall_count.resize(m_virtual_networks);
}
void
NetworkInterface::init()
{
- const int num_vcs = m_vc_per_vnet * m_virtual_networks;
- outVcState.reserve(num_vcs);
- for (int i = 0; i < num_vcs; i++) {
- outVcState.emplace_back(i, m_net_ptr);
- }
+ return;
}
void
@@ -85,22 +72,57 @@
in_link->setLinkConsumer(this);
credit_link->setSourceQueue(newInPort->outCreditQueue(), this);
+ if (m_vc_per_vnet != 0) {
+ in_link->setVcsPerVnet(m_vc_per_vnet);
+ credit_link->setVcsPerVnet(m_vc_per_vnet);
+ }
}
void
NetworkInterface::addOutPort(NetworkLink *out_link,
CreditLink *credit_link,
- SwitchID router_id)
+ SwitchID router_id, uint32_t consumerVcs)
{
OutputPort *newOutPort = new OutputPort(out_link, credit_link,
router_id);
outPorts.push_back(newOutPort);
+ assert(consumerVcs > 0);
+ // We are not allowing different physical links to have different vcs
+ // If it is required that the Network Interface support different VCs
+ // for every physical link connected to it. Then they need to change
+ // the logic within outport and inport.
+ if (m_num_vcs == 0) {
+ m_vc_per_vnet = consumerVcs;
+ m_num_vcs = consumerVcs * m_virtual_networks;
+ niOutVcs.resize(m_num_vcs);
+ outVcState.reserve(m_num_vcs);
+ m_ni_out_vcs_enqueue_time.resize(m_num_vcs);
+ // instantiating the NI flit buffers
+ for (int i = 0; i < m_num_vcs; i++) {
+ m_ni_out_vcs_enqueue_time[i] = Tick(INFINITE_);
+ outVcState.emplace_back(i, m_net_ptr, consumerVcs);
+ }
+
+ // Reset VC Per VNET for input links already instantiated
+ for (auto &iPort: inPorts) {
+ NetworkLink *inNetLink = iPort->inNetLink();
+ inNetLink->setVcsPerVnet(m_vc_per_vnet);
+ credit_link->setVcsPerVnet(m_vc_per_vnet);
+ }
+ } else {
+ fatal_if(consumerVcs != m_vc_per_vnet,
+ "%s: Connected Physical links have different vc requests: %d
and %d\n",
+ name(), consumerVcs, m_vc_per_vnet);
+ }
+
DPRINTF(RubyNetwork, "OutputPort:%s Vnet: %s\n",
out_link->name(), newOutPort->printVnets());
out_link->setSourceQueue(newOutPort->outFlitQueue(), this);
+ out_link->setVcsPerVnet(m_vc_per_vnet);
credit_link->setLinkConsumer(this);
+ credit_link->setVcsPerVnet(m_vc_per_vnet);
}
void
diff --git a/src/mem/ruby/network/garnet2.0/NetworkInterface.hh
b/src/mem/ruby/network/garnet2.0/NetworkInterface.hh
index 4ab4d83..1d3855a 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkInterface.hh
+++ b/src/mem/ruby/network/garnet2.0/NetworkInterface.hh
@@ -60,7 +60,7 @@
void addInPort(NetworkLink *in_link, CreditLink *credit_link);
void addOutPort(NetworkLink *out_link, CreditLink *credit_link,
- SwitchID router_id);
+ SwitchID router_id, uint32_t consumerVcs);
void dequeueCallback();
void wakeup();
@@ -236,8 +236,8 @@
private:
GarnetNetwork *m_net_ptr;
const NodeID m_id;
- const int m_virtual_networks, m_vc_per_vnet;
- int m_router_id; // id of my router
+ const int m_virtual_networks;
+ int m_vc_per_vnet, m_num_vcs;
std::vector<int> m_vc_allocator;
int m_vc_round_robin; // For round robin scheduling
std::vector<OutputPort *> outPorts;
diff --git a/src/mem/ruby/network/garnet2.0/NetworkLink.cc
b/src/mem/ruby/network/garnet2.0/NetworkLink.cc
index d4bb175..11ac4cb 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkLink.cc
+++ b/src/mem/ruby/network/garnet2.0/NetworkLink.cc
@@ -38,9 +38,8 @@
: ClockedObject(p), Consumer(this), m_id(p->link_id),
m_type(NUM_LINK_TYPES_),
m_latency(p->link_latency), m_link_utilized(0),
- m_vc_load(p->vcs_per_vnet * p->virt_nets),
- linkBuffer(), link_consumer(nullptr),
- link_srcQueue(nullptr)
+ m_virt_nets(p->virt_nets), linkBuffer(),
+ link_consumer(nullptr), link_srcQueue(nullptr)
{
int num_vnets = (p->supported_vnets).size();
assert(num_vnets > 0);
@@ -49,7 +48,6 @@
for (int i = 0; i < num_vnets; i++) {
mVnets[i] = p->supported_vnets[i];
}
- DPRINTF(RubyNetwork,"Created with bitwidth:%d\n", bitWidth);
}
void
@@ -59,6 +57,12 @@
}
void
+NetworkLink::setVcsPerVnet(uint32_t consumerVcs)
+{
+ m_vc_load.resize(m_virt_nets * consumerVcs);
+}
+
+void
NetworkLink::setSourceQueue(flitBuffer *src_queue, ClockedObject
*srcClockObj)
{
link_srcQueue = src_queue;
diff --git a/src/mem/ruby/network/garnet2.0/NetworkLink.hh
b/src/mem/ruby/network/garnet2.0/NetworkLink.hh
index e2708aa..9f65725 100644
--- a/src/mem/ruby/network/garnet2.0/NetworkLink.hh
+++ b/src/mem/ruby/network/garnet2.0/NetworkLink.hh
@@ -54,6 +54,7 @@
void setLinkConsumer(Consumer *consumer);
void setSourceQueue(flitBuffer *src_queue, ClockedObject
*srcClockObject);
+ virtual void setVcsPerVnet(uint32_t consumerVcs);
void setType(link_type type) { m_type = type; }
link_type getType() { return m_type; }
void print(std::ostream& out) const {}
@@ -90,6 +91,7 @@
std::vector<unsigned int> m_vc_load;
protected:
+ uint32_t m_virt_nets;
flitBuffer linkBuffer;
Consumer *link_consumer;
flitBuffer *link_srcQueue;
diff --git a/src/mem/ruby/network/garnet2.0/OutVcState.cc
b/src/mem/ruby/network/garnet2.0/OutVcState.cc
index 79cb80f..24e576d 100644
--- a/src/mem/ruby/network/garnet2.0/OutVcState.cc
+++ b/src/mem/ruby/network/garnet2.0/OutVcState.cc
@@ -32,13 +32,15 @@
#include "mem/ruby/system/RubySystem.hh"
-OutVcState::OutVcState(int id, GarnetNetwork *network_ptr)
+OutVcState::OutVcState(int id, GarnetNetwork *network_ptr,
+ uint32_t consumerVcs)
: m_time(0)
{
m_id = id;
m_vc_state = IDLE_;
+ int vnet = id/consumerVcs;
- if (network_ptr->get_vnet_type(id) == DATA_VNET_)
+ if (network_ptr->get_vnet_type(vnet) == DATA_VNET_)
m_max_credit_count = network_ptr->getBuffersPerDataVC();
else
m_max_credit_count = network_ptr->getBuffersPerCtrlVC();
diff --git a/src/mem/ruby/network/garnet2.0/OutVcState.hh
b/src/mem/ruby/network/garnet2.0/OutVcState.hh
index 05252bc..915c46f 100644
--- a/src/mem/ruby/network/garnet2.0/OutVcState.hh
+++ b/src/mem/ruby/network/garnet2.0/OutVcState.hh
@@ -37,7 +37,7 @@
class OutVcState
{
public:
- OutVcState(int id, GarnetNetwork *network_ptr);
+ OutVcState(int id, GarnetNetwork *network_ptr, uint32_t consumerVcs);
int get_credit_count() { return m_credit_count; }
inline bool has_credit() { return (m_credit_count > 0); }
diff --git a/src/mem/ruby/network/garnet2.0/OutputUnit.cc
b/src/mem/ruby/network/garnet2.0/OutputUnit.cc
index d342eb1..dfa63e3 100644
--- a/src/mem/ruby/network/garnet2.0/OutputUnit.cc
+++ b/src/mem/ruby/network/garnet2.0/OutputUnit.cc
@@ -37,14 +37,15 @@
#include "mem/ruby/network/garnet2.0/Router.hh"
#include "mem/ruby/network/garnet2.0/flitBuffer.hh"
-OutputUnit::OutputUnit(int id, PortDirection direction, Router *router)
+OutputUnit::OutputUnit(int id, PortDirection direction, Router *router,
+ uint32_t consumerVcs)
: Consumer(router), m_router(router), m_id(id), m_direction(direction),
- m_vc_per_vnet(m_router->get_vc_per_vnet())
+ m_vc_per_vnet(consumerVcs)
{
- const int m_num_vcs = m_router->get_num_vcs();
+ const int m_num_vcs = consumerVcs * m_router->get_num_vnets();
outVcState.reserve(m_num_vcs);
for (int i = 0; i < m_num_vcs; i++) {
- outVcState.emplace_back(i, m_router->get_net_ptr());
+ outVcState.emplace_back(i, m_router->get_net_ptr(), consumerVcs);
}
}
@@ -54,7 +55,7 @@
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(),
+ outVcState[out_vc].get_credit_count(),
out_vc, m_router->curCycle(), m_credit_link->name());
outVcState[out_vc].decrement_credit();
@@ -66,7 +67,7 @@
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(),
+ 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/OutputUnit.hh
b/src/mem/ruby/network/garnet2.0/OutputUnit.hh
index 6994707..0784643 100644
--- a/src/mem/ruby/network/garnet2.0/OutputUnit.hh
+++ b/src/mem/ruby/network/garnet2.0/OutputUnit.hh
@@ -47,7 +47,8 @@
class OutputUnit : public Consumer
{
public:
- OutputUnit(int id, PortDirection direction, Router *router);
+ OutputUnit(int id, PortDirection direction, Router *router,
+ uint32_t consumerVcs);
~OutputUnit() = default;
void set_out_link(NetworkLink *link);
void set_credit_link(CreditLink *credit_link);
@@ -88,6 +89,18 @@
void insert_flit(flit *t_flit);
+ inline int
+ getVcsPerVnet()
+ {
+ return m_vc_per_vnet;
+ }
+
+ Router *
+ getRouterPtr()
+ {
+ return m_router;
+ }
+
uint32_t functionalWrite(Packet *pkt);
private:
diff --git a/src/mem/ruby/network/garnet2.0/Router.cc
b/src/mem/ruby/network/garnet2.0/Router.cc
index 20eb93b..523680e 100644
--- a/src/mem/ruby/network/garnet2.0/Router.cc
+++ b/src/mem/ruby/network/garnet2.0/Router.cc
@@ -106,7 +106,9 @@
input_unit->set_in_link(in_link);
input_unit->set_credit_link(credit_link);
in_link->setLinkConsumer(this);
+ in_link->setVcsPerVnet(get_vc_per_vnet());
credit_link->setSourceQueue(input_unit->getCreditQueue(), this);
+ credit_link->setVcsPerVnet(get_vc_per_vnet());
m_input_unit.push_back(std::shared_ptr<InputUnit>(input_unit));
@@ -117,21 +119,26 @@
Router::addOutPort(PortDirection outport_dirn,
NetworkLink *out_link,
std::vector<NetDest>& routing_table_entry, int
link_weight,
- CreditLink *credit_link)
+ CreditLink *credit_link, uint32_t consumerVcs)
{
DPRINTF(RubyNetwork, "%d == %d? %s\n", out_link->bitWidth,
m_bit_width, out_link->name());
+ DPRINTF(RubyNetwork, "Consumer %s VC: %d\n", out_link->name(),
+ consumerVcs);
fatal_if(out_link->bitWidth != m_bit_width, "Widths of units do not
match."
" Consider inserting SerDes Units");
int port_num = m_output_unit.size();
- OutputUnit *output_unit = new OutputUnit(port_num, outport_dirn, this);
+ OutputUnit *output_unit = new OutputUnit(port_num, outport_dirn, this,
+ consumerVcs);
output_unit->set_out_link(out_link);
output_unit->set_credit_link(credit_link);
credit_link->setLinkConsumer(this);
+ credit_link->setVcsPerVnet(consumerVcs);
out_link->setSourceQueue(output_unit->getOutQueue(), this);
+ out_link->setVcsPerVnet(consumerVcs);
m_output_unit.push_back(std::shared_ptr<OutputUnit>(output_unit));
diff --git a/src/mem/ruby/network/garnet2.0/Router.hh
b/src/mem/ruby/network/garnet2.0/Router.hh
index ba3a581..e9404d0 100644
--- a/src/mem/ruby/network/garnet2.0/Router.hh
+++ b/src/mem/ruby/network/garnet2.0/Router.hh
@@ -69,7 +69,8 @@
CreditLink *credit_link);
void addOutPort(PortDirection outport_dirn, NetworkLink *link,
std::vector<NetDest>& routing_table_entry,
- int link_weight, CreditLink *credit_link);
+ int link_weight, CreditLink *credit_link,
+ uint32_t consumerVcs);
Cycles get_pipe_stages(){ return m_latency; }
int get_num_vcs() { return m_num_vcs; }
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/32299
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: Icf4f510248128429a1a11f19f9802ee96f340611
Gerrit-Change-Number: 32299
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