Carlos Falquez has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/46900 )
Change subject: mem-garnet: Add masked functionalRead support
......................................................................
mem-garnet: Add masked functionalRead support
Recently the CHI protocol was introduced in Ruby.
The protocol introduces an alternative interface for
functional reads:
bool functionalRead(PacketPtr, WriteMask&)
This commit adds functionalRead(PacketPtr, WriteMask&)
implementations for various Garnet components.
Change-Id: Idd571899d679407b7b000c1a83a0a5420868cf28
Signed-off-by: Carlos Falquez <[email protected]>
---
M src/mem/ruby/network/garnet/CrossbarSwitch.cc
M src/mem/ruby/network/garnet/CrossbarSwitch.hh
M src/mem/ruby/network/garnet/GarnetNetwork.cc
M src/mem/ruby/network/garnet/GarnetNetwork.hh
M src/mem/ruby/network/garnet/InputUnit.cc
M src/mem/ruby/network/garnet/InputUnit.hh
M src/mem/ruby/network/garnet/NetworkInterface.cc
M src/mem/ruby/network/garnet/NetworkInterface.hh
M src/mem/ruby/network/garnet/NetworkLink.cc
M src/mem/ruby/network/garnet/NetworkLink.hh
M src/mem/ruby/network/garnet/OutputUnit.cc
M src/mem/ruby/network/garnet/OutputUnit.hh
M src/mem/ruby/network/garnet/Router.cc
M src/mem/ruby/network/garnet/Router.hh
M src/mem/ruby/network/garnet/VirtualChannel.cc
M src/mem/ruby/network/garnet/VirtualChannel.hh
M src/mem/ruby/network/garnet/flit.cc
M src/mem/ruby/network/garnet/flit.hh
M src/mem/ruby/network/garnet/flitBuffer.cc
M src/mem/ruby/network/garnet/flitBuffer.hh
20 files changed, 130 insertions(+), 0 deletions(-)
diff --git a/src/mem/ruby/network/garnet/CrossbarSwitch.cc
b/src/mem/ruby/network/garnet/CrossbarSwitch.cc
index 6b158df..7440558 100644
--- a/src/mem/ruby/network/garnet/CrossbarSwitch.cc
+++ b/src/mem/ruby/network/garnet/CrossbarSwitch.cc
@@ -82,6 +82,17 @@
}
}
+bool
+CrossbarSwitch::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ for (auto& switch_buffer : switchBuffers) {
+ if (switch_buffer.functionalRead(pkt, mask))
+ read = true;
+ }
+ return read;
+}
+
uint32_t
CrossbarSwitch::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/CrossbarSwitch.hh
b/src/mem/ruby/network/garnet/CrossbarSwitch.hh
index ee3a5ec..6c7c3bd 100644
--- a/src/mem/ruby/network/garnet/CrossbarSwitch.hh
+++ b/src/mem/ruby/network/garnet/CrossbarSwitch.hh
@@ -58,6 +58,7 @@
inline double get_crossbar_activity() { return m_crossbar_activity; }
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *pkt);
void resetStats();
diff --git a/src/mem/ruby/network/garnet/GarnetNetwork.cc
b/src/mem/ruby/network/garnet/GarnetNetwork.cc
index d7a761c..3e349a8 100644
--- a/src/mem/ruby/network/garnet/GarnetNetwork.cc
+++ b/src/mem/ruby/network/garnet/GarnetNetwork.cc
@@ -594,6 +594,28 @@
(*m_ctrl_traffic_distribution[src_node][dest_node])++;
}
+bool
+GarnetNetwork::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ for (unsigned int i = 0; i < m_routers.size(); i++) {
+ if (m_routers[i]->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ for (unsigned int i = 0; i < m_nis.size(); ++i) {
+ if (m_nis[i]->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ for (unsigned int i = 0; i < m_networklinks.size(); ++i) {
+ if (m_networklinks[i]->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ return read;
+}
+
uint32_t
GarnetNetwork::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/GarnetNetwork.hh
b/src/mem/ruby/network/garnet/GarnetNetwork.hh
index 3f6ebd9..3a672ee 100644
--- a/src/mem/ruby/network/garnet/GarnetNetwork.hh
+++ b/src/mem/ruby/network/garnet/GarnetNetwork.hh
@@ -95,6 +95,7 @@
PortDirection src_outport_dirn,
PortDirection dest_inport_dirn);
+ bool functionalRead(Packet *pkt, WriteMask &mask);
//! Function for performing a functional write. The return value
//! indicates the number of messages that were written.
uint32_t functionalWrite(Packet *pkt);
diff --git a/src/mem/ruby/network/garnet/InputUnit.cc
b/src/mem/ruby/network/garnet/InputUnit.cc
index acb5f4d..8724f4f 100644
--- a/src/mem/ruby/network/garnet/InputUnit.cc
+++ b/src/mem/ruby/network/garnet/InputUnit.cc
@@ -142,6 +142,17 @@
m_credit_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1)));
}
+bool
+InputUnit::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ for (auto& virtual_channel : virtualChannels) {
+ if (virtual_channel.functionalRead(pkt, mask))
+ read = true;
+ }
+
+ return read;
+}
uint32_t
InputUnit::functionalWrite(Packet *pkt)
diff --git a/src/mem/ruby/network/garnet/InputUnit.hh
b/src/mem/ruby/network/garnet/InputUnit.hh
index e57f0be..5ad85f8 100644
--- a/src/mem/ruby/network/garnet/InputUnit.hh
+++ b/src/mem/ruby/network/garnet/InputUnit.hh
@@ -143,7 +143,9 @@
double get_buf_write_activity(unsigned int vnet) const
{ return m_num_buffer_writes[vnet]; }
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *pkt);
+
void resetStats();
private:
diff --git a/src/mem/ruby/network/garnet/NetworkInterface.cc
b/src/mem/ruby/network/garnet/NetworkInterface.cc
index 5c0216a..069a952 100644
--- a/src/mem/ruby/network/garnet/NetworkInterface.cc
+++ b/src/mem/ruby/network/garnet/NetworkInterface.cc
@@ -657,6 +657,23 @@
out << "[Network Interface]";
}
+bool
+NetworkInterface::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ for (auto& ni_out_vc : niOutVcs) {
+ if (ni_out_vc.functionalRead(pkt, mask))
+ read = true;
+ }
+
+ for (auto &oPort: outPorts) {
+ if (oPort->outFlitQueue()->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ return read;
+}
+
uint32_t
NetworkInterface::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/NetworkInterface.hh
b/src/mem/ruby/network/garnet/NetworkInterface.hh
index 51347cc..31f0321 100644
--- a/src/mem/ruby/network/garnet/NetworkInterface.hh
+++ b/src/mem/ruby/network/garnet/NetworkInterface.hh
@@ -69,6 +69,7 @@
int get_vnet(int vc);
void init_net_ptr(GarnetNetwork *net_ptr) { m_net_ptr = net_ptr; }
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *);
void scheduleFlit(flit *t_flit);
diff --git a/src/mem/ruby/network/garnet/NetworkLink.cc
b/src/mem/ruby/network/garnet/NetworkLink.cc
index 8634e7d..62809cc 100644
--- a/src/mem/ruby/network/garnet/NetworkLink.cc
+++ b/src/mem/ruby/network/garnet/NetworkLink.cc
@@ -110,6 +110,12 @@
m_link_utilized = 0;
}
+bool
+NetworkLink::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ return linkBuffer.functionalRead(pkt, mask);
+}
+
uint32_t
NetworkLink::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/NetworkLink.hh
b/src/mem/ruby/network/garnet/NetworkLink.hh
index 20e0904..ea0b486 100644
--- a/src/mem/ruby/network/garnet/NetworkLink.hh
+++ b/src/mem/ruby/network/garnet/NetworkLink.hh
@@ -72,6 +72,7 @@
inline flit* peekLink() { return linkBuffer.peekTopFlit(); }
inline flit* consumeLink() { return linkBuffer.getTopFlit(); }
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *);
void resetStats();
diff --git a/src/mem/ruby/network/garnet/OutputUnit.cc
b/src/mem/ruby/network/garnet/OutputUnit.cc
index ac9673c..0b6ed26 100644
--- a/src/mem/ruby/network/garnet/OutputUnit.cc
+++ b/src/mem/ruby/network/garnet/OutputUnit.cc
@@ -163,6 +163,12 @@
m_out_link->scheduleEventAbsolute(m_router->clockEdge(Cycles(1)));
}
+bool
+OutputUnit::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ return outBuffer.functionalRead(pkt, mask);
+}
+
uint32_t
OutputUnit::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/OutputUnit.hh
b/src/mem/ruby/network/garnet/OutputUnit.hh
index fe7f889..72f4717 100644
--- a/src/mem/ruby/network/garnet/OutputUnit.hh
+++ b/src/mem/ruby/network/garnet/OutputUnit.hh
@@ -95,6 +95,7 @@
return m_vc_per_vnet;
}
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *pkt);
private:
diff --git a/src/mem/ruby/network/garnet/Router.cc
b/src/mem/ruby/network/garnet/Router.cc
index 3295989..0241839 100644
--- a/src/mem/ruby/network/garnet/Router.cc
+++ b/src/mem/ruby/network/garnet/Router.cc
@@ -265,6 +265,26 @@
out << aggregate_fault_prob << std::endl;
}
+bool
+Router::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ if (crossbarSwitch.functionalRead(pkt, mask))
+ read = true;
+
+ for (uint32_t i = 0; i < m_input_unit.size(); i++) {
+ if (m_input_unit[i]->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ for (uint32_t i = 0; i < m_output_unit.size(); i++) {
+ if (m_output_unit[i]->functionalRead(pkt, mask))
+ read = true;
+ }
+
+ return read;
+}
+
uint32_t
Router::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/Router.hh
b/src/mem/ruby/network/garnet/Router.hh
index b93da6f..b329239 100644
--- a/src/mem/ruby/network/garnet/Router.hh
+++ b/src/mem/ruby/network/garnet/Router.hh
@@ -129,6 +129,7 @@
aggregate_fault_prob);
}
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *);
private:
diff --git a/src/mem/ruby/network/garnet/VirtualChannel.cc
b/src/mem/ruby/network/garnet/VirtualChannel.cc
index 1035660..f3cb9ab 100644
--- a/src/mem/ruby/network/garnet/VirtualChannel.cc
+++ b/src/mem/ruby/network/garnet/VirtualChannel.cc
@@ -66,6 +66,12 @@
return false;
}
+bool
+VirtualChannel::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ return inputBuffer.functionalRead(pkt, mask);
+}
+
uint32_t
VirtualChannel::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/VirtualChannel.hh
b/src/mem/ruby/network/garnet/VirtualChannel.hh
index c538451..86139b2 100644
--- a/src/mem/ruby/network/garnet/VirtualChannel.hh
+++ b/src/mem/ruby/network/garnet/VirtualChannel.hh
@@ -86,6 +86,7 @@
return inputBuffer.getTopFlit();
}
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *pkt);
private:
diff --git a/src/mem/ruby/network/garnet/flit.cc
b/src/mem/ruby/network/garnet/flit.cc
index 50a8911..a0aaa95 100644
--- a/src/mem/ruby/network/garnet/flit.cc
+++ b/src/mem/ruby/network/garnet/flit.cc
@@ -115,6 +115,13 @@
}
bool
+flit::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ Message *msg = m_msg_ptr.get();
+ return msg->functionalRead(pkt, mask);
+}
+
+bool
flit::functionalWrite(Packet *pkt)
{
Message *msg = m_msg_ptr.get();
diff --git a/src/mem/ruby/network/garnet/flit.hh
b/src/mem/ruby/network/garnet/flit.hh
index 0396c97..93359a9 100644
--- a/src/mem/ruby/network/garnet/flit.hh
+++ b/src/mem/ruby/network/garnet/flit.hh
@@ -97,6 +97,7 @@
}
}
+ bool functionalRead(Packet *pkt, WriteMask &mask);
bool functionalWrite(Packet *pkt);
virtual flit* serialize(int ser_id, int parts, uint32_t bWidth);
diff --git a/src/mem/ruby/network/garnet/flitBuffer.cc
b/src/mem/ruby/network/garnet/flitBuffer.cc
index 6c0c1ad..28460e3 100644
--- a/src/mem/ruby/network/garnet/flitBuffer.cc
+++ b/src/mem/ruby/network/garnet/flitBuffer.cc
@@ -76,6 +76,19 @@
max_size = maximum;
}
+bool
+flitBuffer::functionalRead(Packet *pkt, WriteMask &mask)
+{
+ bool read = false;
+ for (unsigned int i = 0; i < m_buffer.size(); ++i) {
+ if (m_buffer[i]->functionalRead(pkt, mask)) {
+ read = true;
+ }
+ }
+
+ return read;
+}
+
uint32_t
flitBuffer::functionalWrite(Packet *pkt)
{
diff --git a/src/mem/ruby/network/garnet/flitBuffer.hh
b/src/mem/ruby/network/garnet/flitBuffer.hh
index 91a3a86..3a30909 100644
--- a/src/mem/ruby/network/garnet/flitBuffer.hh
+++ b/src/mem/ruby/network/garnet/flitBuffer.hh
@@ -71,6 +71,7 @@
m_buffer.push_back(flt);
}
+ bool functionalRead(Packet *pkt, WriteMask &mask);
uint32_t functionalWrite(Packet *pkt);
private:
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/46900
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: Idd571899d679407b7b000c1a83a0a5420868cf28
Gerrit-Change-Number: 46900
Gerrit-PatchSet: 1
Gerrit-Owner: Carlos Falquez <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s