Daniel Carvalho has submitted this change. (
https://gem5-review.googlesource.com/c/public/gem5/+/38117 )
Change subject: mem-cache: Allow sending packet information to replacement
policy
......................................................................
mem-cache: Allow sending packet information to replacement policy
Some replacement policies can use information such as address or
PC to improve their re-reference prediction.
Change-Id: I412eee09efa2f3511ca1ece76fc2732509df4745
Signed-off-by: Daniel R. Carvalho <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/38117
Tested-by: kokoro <[email protected]>
Reviewed-by: Jason Lowe-Power <[email protected]>
Maintainer: Jason Lowe-Power <[email protected]>
---
M src/mem/cache/replacement_policies/base.hh
M src/mem/cache/replacement_policies/dueling_rp.cc
M src/mem/cache/replacement_policies/dueling_rp.hh
M src/mem/cache/tags/base_set_assoc.hh
M src/mem/cache/tags/sector_tags.cc
5 files changed, 50 insertions(+), 7 deletions(-)
Approvals:
Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved
kokoro: Regressions pass
diff --git a/src/mem/cache/replacement_policies/base.hh
b/src/mem/cache/replacement_policies/base.hh
index 0393629..0851287 100644
--- a/src/mem/cache/replacement_policies/base.hh
+++ b/src/mem/cache/replacement_policies/base.hh
@@ -33,6 +33,7 @@
#include "base/compiler.hh"
#include "mem/cache/replacement_policies/replaceable_entry.hh"
+#include "mem/packet.hh"
#include "params/BaseReplacementPolicy.hh"
#include "sim/sim_object.hh"
@@ -67,17 +68,29 @@
* Update replacement data.
*
* @param replacement_data Replacement data to be touched.
+ * @param pkt Packet that generated this access.
*/
virtual void touch(const std::shared_ptr<ReplacementData>&
- replacement_data) const =
0;
+ replacement_data, const PacketPtr pkt)
+ {
+ touch(replacement_data);
+ }
+ virtual void touch(const std::shared_ptr<ReplacementData>&
+ replacement_data) const = 0;
/**
* Reset replacement data. Used when it's holder is inserted/validated.
*
* @param replacement_data Replacement data to be reset.
+ * @param pkt Packet that generated this access.
*/
virtual void reset(const std::shared_ptr<ReplacementData>&
- replacement_data) const =
0;
+ replacement_data, const PacketPtr pkt)
+ {
+ reset(replacement_data);
+ }
+ virtual void reset(const std::shared_ptr<ReplacementData>&
+ replacement_data) const = 0;
/**
* Find replacement victim among candidates.
diff --git a/src/mem/cache/replacement_policies/dueling_rp.cc
b/src/mem/cache/replacement_policies/dueling_rp.cc
index e691141..3565017 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.cc
+++ b/src/mem/cache/replacement_policies/dueling_rp.cc
@@ -54,6 +54,16 @@
}
void
+Dueling::touch(const std::shared_ptr<ReplacementData>& replacement_data,
+ const PacketPtr pkt)
+{
+ std::shared_ptr<DuelerReplData> casted_replacement_data =
+ std::static_pointer_cast<DuelerReplData>(replacement_data);
+ replPolicyA->touch(casted_replacement_data->replDataA, pkt);
+ replPolicyB->touch(casted_replacement_data->replDataB, pkt);
+}
+
+void
Dueling::touch(const std::shared_ptr<ReplacementData>& replacement_data)
const
{
std::shared_ptr<DuelerReplData> casted_replacement_data =
@@ -63,6 +73,22 @@
}
void
+Dueling::reset(const std::shared_ptr<ReplacementData>& replacement_data,
+ const PacketPtr pkt)
+{
+ std::shared_ptr<DuelerReplData> casted_replacement_data =
+ std::static_pointer_cast<DuelerReplData>(replacement_data);
+ replPolicyA->reset(casted_replacement_data->replDataA, pkt);
+ replPolicyB->reset(casted_replacement_data->replDataB, pkt);
+
+ // A miss in a set is a sample to the duel. A call to this function
+ // implies in the replacement of an entry, which was either caused by
+ // a miss, an external invalidation, or the initialization of the table
+ // entry (when warming up)
+
duelingMonitor.sample(static_cast<Dueler*>(casted_replacement_data.get()));
+}
+
+void
Dueling::reset(const std::shared_ptr<ReplacementData>& replacement_data)
const
{
std::shared_ptr<DuelerReplData> casted_replacement_data =
diff --git a/src/mem/cache/replacement_policies/dueling_rp.hh
b/src/mem/cache/replacement_policies/dueling_rp.hh
index 0c96ca7..314042e 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.hh
+++ b/src/mem/cache/replacement_policies/dueling_rp.hh
@@ -97,8 +97,12 @@
void invalidate(const std::shared_ptr<ReplacementData>&
replacement_data)
override;
+ void touch(const std::shared_ptr<ReplacementData>& replacement_data,
+ const PacketPtr pkt) override;
void touch(const std::shared_ptr<ReplacementData>& replacement_data)
const
override;
+ void reset(const std::shared_ptr<ReplacementData>& replacement_data,
+ const PacketPtr pkt) override;
void reset(const std::shared_ptr<ReplacementData>& replacement_data)
const
override;
ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
diff --git a/src/mem/cache/tags/base_set_assoc.hh
b/src/mem/cache/tags/base_set_assoc.hh
index dc749dd..7ca702b 100644
--- a/src/mem/cache/tags/base_set_assoc.hh
+++ b/src/mem/cache/tags/base_set_assoc.hh
@@ -143,7 +143,7 @@
blk->increaseRefCount();
// Update replacement data of accessed block
- replacementPolicy->touch(blk->replacementData);
+ replacementPolicy->touch(blk->replacementData, pkt);
}
// The tag lookup latency is the same for a hit or a miss
@@ -195,7 +195,7 @@
stats.tagsInUse++;
// Update replacement policy
- replacementPolicy->reset(blk->replacementData);
+ replacementPolicy->reset(blk->replacementData, pkt);
}
void moveBlock(CacheBlk *src_blk, CacheBlk *dest_blk) override;
diff --git a/src/mem/cache/tags/sector_tags.cc
b/src/mem/cache/tags/sector_tags.cc
index d90708e..d63773b 100644
--- a/src/mem/cache/tags/sector_tags.cc
+++ b/src/mem/cache/tags/sector_tags.cc
@@ -163,7 +163,7 @@
// Update replacement data of accessed block, which is shared with
// the whole sector it belongs to
- replacementPolicy->touch(sector_blk->replacementData);
+ replacementPolicy->touch(sector_blk->replacementData, pkt);
}
// The tag lookup latency is the same for a hit or a miss
@@ -183,14 +183,14 @@
// sector was not previously present in the cache.
if (sector_blk->isValid()) {
// An existing entry's replacement data is just updated
- replacementPolicy->touch(sector_blk->replacementData);
+ replacementPolicy->touch(sector_blk->replacementData, pkt);
} else {
// Increment tag counter
stats.tagsInUse++;
assert(stats.tagsInUse.value() <= numSectors);
// A new entry resets the replacement data
- replacementPolicy->reset(sector_blk->replacementData);
+ replacementPolicy->reset(sector_blk->replacementData, pkt);
}
// Do common block insertion functionality
5 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the
submitted one.
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/38117
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: I412eee09efa2f3511ca1ece76fc2732509df4745
Gerrit-Change-Number: 38117
Gerrit-PatchSet: 9
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: Nikos Nikoleris <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s