Tiago Mück has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/21928 )
Change subject: mem-ruby: Fixed MOESI_CMP_directory resource tracking
......................................................................
mem-ruby: Fixed MOESI_CMP_directory resource tracking
Fixes a few resource allocation issues in the directory controller:
- Added TBE resource checks on allocation.
- Now also allocating a TBE when issuing read requests to the controller
to allow for a better response to backpressure. Without the TBE as a
limiting factor, the directory can have an unbounded amount of
outstanding memory requests.
- Also allocating a TBE for forwarded requests.
Change-Id: I17016668bd64a50a4354baad5d181e6d3802ac46
Signed-off-by: Tiago Mück <tiago.m...@arm.com>
---
M src/mem/ruby/protocol/MOESI_CMP_directory-dir.sm
M src/mem/ruby/protocol/MOESI_CMP_directory-dma.sm
2 files changed, 31 insertions(+), 5 deletions(-)
diff --git a/src/mem/ruby/protocol/MOESI_CMP_directory-dir.sm
b/src/mem/ruby/protocol/MOESI_CMP_directory-dir.sm
index 7e64271..25738a1 100644
--- a/src/mem/ruby/protocol/MOESI_CMP_directory-dir.sm
+++ b/src/mem/ruby/protocol/MOESI_CMP_directory-dir.sm
@@ -456,6 +456,9 @@
action(d_sendDataMsg, "d", desc="Send data to requestor") {
peek(memQueue_in, MemoryMsg) {
+ // Not using tbe here, but we must have allocated on a memory
+ // request
+ assert(is_valid(tbe));
enqueue(responseNetwork_out, ResponseMsg, 1) {
out_msg.addr := address;
out_msg.Sender := machineID;
@@ -593,6 +596,7 @@
action(qf_queueMemoryFetchRequest, "qf", desc="Queue off-chip fetch
request") {
peek(requestQueue_in, RequestMsg) {
+ assert(is_valid(tbe));
queueMemoryRead(in_msg.Requestor, address,
to_memory_controller_latency);
}
}
@@ -680,6 +684,7 @@
}
action(v_allocateTBE, "v", desc="Allocate TBE entry") {
+ check_allocate(TBEs);
peek (requestQueue_in, RequestMsg) {
assert(is_valid(tbe) == false);
TBEs.allocate(address);
@@ -705,12 +710,14 @@
// TRANSITIONS
transition(I, GETX, MM_M) {
allocDirEntry;
+ v_allocateTBE;
qf_queueMemoryFetchRequest;
i_popIncomingRequestQueue;
}
transition(I, DMA_READ, XI_M) {
allocDirEntry;
+ v_allocateTBE;
qf_queueMemoryFetchRequest;
i_popIncomingRequestQueue;
}
@@ -739,6 +746,7 @@
transition(XI_M, Memory_Data_DMA, I) {
d_sendDataMsg; // ack count may be zero
deallocDirEntry;
+ w_deallocateTBE;
q_popMemQueue;
}
@@ -763,6 +771,7 @@
}
transition(S, GETX, MM_M) {
+ v_allocateTBE;
qf_queueMemoryFetchRequest;
g_sendInvalidations;
i_popIncomingRequestQueue;
@@ -785,11 +794,19 @@
transition(I, GETS, IS_M) {
allocDirEntry;
+ v_allocateTBE;
qf_queueMemoryFetchRequest;
i_popIncomingRequestQueue;
}
- transition({S, SS}, {GETS, DMA_READ}, SS) {
+ transition(S, {GETS, DMA_READ}, SS) {
+ v_allocateTBE;
+ qf_queueMemoryFetchRequest;
+ n_incrementOutstanding;
+ i_popIncomingRequestQueue;
+ }
+
+ transition(SS, {GETS, DMA_READ}) {
qf_queueMemoryFetchRequest;
n_incrementOutstanding;
i_popIncomingRequestQueue;
@@ -855,22 +872,26 @@
}
transition(M, GETS, MO) {
+ v_allocateTBE;
f_forwardRequest;
i_popIncomingRequestQueue;
}
transition(M, PUTX, MI) {
+ v_allocateTBE;
a_sendWriteBackAck;
i_popIncomingRequestQueue;
}
// happens if M->O transition happens on-chip
transition(M, PUTO, MI) {
+ v_allocateTBE;
a_sendWriteBackAck;
i_popIncomingRequestQueue;
}
transition(M, PUTO_SHARERS, MIS) {
+ v_allocateTBE;
a_sendWriteBackAck;
i_popIncomingRequestQueue;
}
@@ -891,12 +912,14 @@
}
transition({MM, MO}, Exclusive_Unblock, M) {
+ w_deallocateTBE;
cc_clearSharers;
e_ownerIsUnblocker;
j_popIncomingUnblockQueue;
}
transition(MO, Unblock, O) {
+ w_deallocateTBE;
m_addUnlockerToSharers;
j_popIncomingUnblockQueue;
}
@@ -910,11 +933,13 @@
}
transition(IS, Unblock, S) {
+ w_deallocateTBE;
m_addUnlockerToSharers;
j_popIncomingUnblockQueue;
}
transition(IS, Exclusive_Unblock, M) {
+ w_deallocateTBE;
cc_clearSharers;
e_ownerIsUnblocker;
j_popIncomingUnblockQueue;
@@ -927,6 +952,7 @@
}
transition(SS, Last_Unblock, S) {
+ w_deallocateTBE;
m_addUnlockerToSharers;
o_decrementOutstanding;
j_popIncomingUnblockQueue;
@@ -947,7 +973,6 @@
transition(MI, Dirty_Writeback, WBI) {
c_clearOwner;
cc_clearSharers;
- v_allocateTBE;
qw_queueMemoryWBFromCacheRequest;
i_popIncomingRequestQueue;
}
@@ -961,13 +986,13 @@
transition(MIS, Dirty_Writeback, WBS) {
c_moveOwnerToSharer;
- v_allocateTBE;
qw_queueMemoryWBFromCacheRequest;
i_popIncomingRequestQueue;
}
transition(MIS, Clean_Writeback, S) {
c_moveOwnerToSharer;
+ w_deallocateTBE;
i_popIncomingRequestQueue;
}
@@ -999,6 +1024,7 @@
transition(MI, Clean_Writeback, I) {
c_clearOwner;
cc_clearSharers;
+ w_deallocateTBE;
deallocDirEntry;
i_popIncomingRequestQueue;
}
@@ -1016,8 +1042,7 @@
// j_popIncomingUnblockQueue;
//}
- //transition({S, O, M, SS, OO, MI, MIS, OS, OSS}, Memory_Data_Cache) {
- transition({S, O, M, SS, OO}, Memory_Data_Cache) {
+ transition({S, SS}, Memory_Data_Cache) {
d_sendDataMsg;
q_popMemQueue;
}
diff --git a/src/mem/ruby/protocol/MOESI_CMP_directory-dma.sm
b/src/mem/ruby/protocol/MOESI_CMP_directory-dma.sm
index 5a52b60..c2eb593 100644
--- a/src/mem/ruby/protocol/MOESI_CMP_directory-dma.sm
+++ b/src/mem/ruby/protocol/MOESI_CMP_directory-dma.sm
@@ -255,6 +255,7 @@
}
action(v_allocateTBE, "v", desc="Allocate TBE entry") {
+ check_allocate(TBEs);
TBEs.allocate(address);
set_tbe(TBEs[address]);
}
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/21928
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: I17016668bd64a50a4354baad5d181e6d3802ac46
Gerrit-Change-Number: 21928
Gerrit-PatchSet: 1
Gerrit-Owner: Tiago Mück <tiago.m...@arm.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
gem5-dev@gem5.org
http://m5sim.org/mailman/listinfo/gem5-dev