diff --git a/src/mem/cache/prefetch/Prefetcher.py b/src/mem/cache/prefetch/Prefetcher.py index 7d704881b4..024004e57b 100644 --- a/src/mem/cache/prefetch/Prefetcher.py +++ b/src/mem/cache/prefetch/Prefetcher.py @@ -488,6 +488,8 @@ class STeMSPrefetcher(QueuedPrefetcher): region_miss_order_buffer_entries = Param.Unsigned(131072, "Number of entries of the Region Miss Order Buffer") + add_duplicate_entries_to_rmob = Param.Bool(True, + "Add duplicate entries to RMOB") reconstruction_entries = Param.Unsigned(256, "Number of reconstruction entries") diff --git a/src/mem/cache/prefetch/spatio_temporal_memory_streaming.cc b/src/mem/cache/prefetch/spatio_temporal_memory_streaming.cc index f610288ae0..3c9b9eb64c 100644 --- a/src/mem/cache/prefetch/spatio_temporal_memory_streaming.cc +++ b/src/mem/cache/prefetch/spatio_temporal_memory_streaming.cc @@ -56,6 +56,7 @@ STeMS::STeMS(const STeMSPrefetcherParams &p) ActiveGenerationTableEntry( spatialRegionSize / blkSize)), rmob(p.region_miss_order_buffer_entries), + addDuplicateEntriesToRMOB(p.add_duplicate_entries_to_rmob), lastTriggerCounter(0) { fatal_if(!isPowerOf2(spatialRegionSize), @@ -120,6 +121,16 @@ STeMS::addToRMOB(Addr sr_addr, Addr pst_addr, unsigned int delta) rmob_entry.pstAddress = pst_addr; rmob_entry.delta = delta; + if (!addDuplicateEntriesToRMOB) { + for (const auto& entry : rmob) { + if (entry.srAddress == sr_addr && + entry.pstAddress == pst_addr && + entry.delta == delta) { + return; + } + } + } + rmob.push_back(rmob_entry); } diff --git a/src/mem/cache/prefetch/spatio_temporal_memory_streaming.hh b/src/mem/cache/prefetch/spatio_temporal_memory_streaming.hh index e5914b4555..bee746c5c7 100644 --- a/src/mem/cache/prefetch/spatio_temporal_memory_streaming.hh +++ b/src/mem/cache/prefetch/spatio_temporal_memory_streaming.hh @@ -175,6 +175,9 @@ class STeMS : public Queued /** Region Miss Order Buffer (RMOB) */ CircularQueue rmob; + /** Add duplicate entries to RMOB */ + bool addDuplicateEntriesToRMOB; + /** Counter to keep the count of accesses between trigger accesses */ unsigned int lastTriggerCounter;