Daniel Carvalho has uploaded this change for review. (
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 <oda...@yahoo.com.br>
---
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(-)
diff --git a/src/mem/cache/replacement_policies/base.hh
b/src/mem/cache/replacement_policies/base.hh
index 7d09a4a..f873926 100644
--- a/src/mem/cache/replacement_policies/base.hh
+++ b/src/mem/cache/replacement_policies/base.hh
@@ -34,6 +34,7 @@
#include <vector>
#include "mem/cache/replacement_policies/replaceable_entry.hh"
+#include "mem/packet.hh"
#include "params/BaseReplacementPolicy.hh"
#include "sim/sim_object.hh"
@@ -112,17 +113,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 f3cce39..3e2e604 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.cc
+++ b/src/mem/cache/replacement_policies/dueling_rp.cc
@@ -53,6 +53,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 =
@@ -62,6 +72,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 0bd0d95..3077744 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(
diff --git a/src/mem/cache/tags/base_set_assoc.hh
b/src/mem/cache/tags/base_set_assoc.hh
index 07e19a5..38baa6d 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 f0229bf..980bcf3 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
--
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: 1
Gerrit-Owner: Daniel Carvalho <oda...@yahoo.com.br>
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