summaryrefslogtreecommitdiff
path: root/src/mem/cache/replacement_policies/lru_rp.cc
diff options
context:
space:
mode:
authorDaniel R. Carvalho <odanrc@yahoo.com.br>2018-03-27 11:53:33 +0200
committerDaniel Carvalho <odanrc@yahoo.com.br>2018-05-03 14:25:29 +0000
commitc149983d931054d8cf88d2977a1f03a0b8b3b543 (patch)
tree1651101f29d8b06098394ffb078bf2716348664a /src/mem/cache/replacement_policies/lru_rp.cc
parentddb80527e37e505e74b04755da502934ce8f0645 (diff)
downloadgem5-c149983d931054d8cf88d2977a1f03a0b8b3b543.tar.xz
mem-cache: ReplacementPolicy specific replacement data
Replacement data is specific for each replacement policy, and thus should be instantiated differently by each policy. Touch() and reset() do not need to be aware of CacheBlk, as they only update its ReplacementData. Invalidate() makes replacement policies independent of cache blocks, by removing the awareness of the valid state. An inheritable base ReplaceableEntry class was created to allow usage of replacement policies with any table-like structure. Change-Id: I998917d800fa48504ed95abffa2f1b7bfd68522b Reviewed-on: https://gem5-review.googlesource.com/9421 Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Diffstat (limited to 'src/mem/cache/replacement_policies/lru_rp.cc')
-rw-r--r--src/mem/cache/replacement_policies/lru_rp.cc51
1 files changed, 30 insertions, 21 deletions
diff --git a/src/mem/cache/replacement_policies/lru_rp.cc b/src/mem/cache/replacement_policies/lru_rp.cc
index b2fa20b6f..99e35db19 100644
--- a/src/mem/cache/replacement_policies/lru_rp.cc
+++ b/src/mem/cache/replacement_policies/lru_rp.cc
@@ -30,7 +30,7 @@
#include "mem/cache/replacement_policies/lru_rp.hh"
-#include "debug/CacheRepl.hh"
+#include <memory>
LRURP::LRURP(const Params *p)
: BaseReplacementPolicy(p)
@@ -38,46 +38,55 @@ LRURP::LRURP(const Params *p)
}
void
-LRURP::touch(CacheBlk *blk)
+LRURP::invalidate(const std::shared_ptr<ReplacementData>& replacement_data)
+const
{
- BaseReplacementPolicy::touch(blk);
+ // Reset last touch timestamp
+ std::static_pointer_cast<LRUReplData>(
+ replacement_data)->lastTouchTick = Tick(0);
+}
+void
+LRURP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const
+{
// Update last touch timestamp
- blk->lastTouchTick = curTick();
+ std::static_pointer_cast<LRUReplData>(
+ replacement_data)->lastTouchTick = curTick();
}
void
-LRURP::reset(CacheBlk *blk)
+LRURP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const
{
- BaseReplacementPolicy::reset(blk);
-
// Set last touch timestamp
- blk->lastTouchTick = blk->tickInserted;
+ std::static_pointer_cast<LRUReplData>(
+ replacement_data)->lastTouchTick = curTick();
}
-CacheBlk*
-LRURP::getVictim(const ReplacementCandidates& candidates)
+ReplaceableEntry*
+LRURP::getVictim(const ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Visit all candidates to find victim
- CacheBlk* blk = candidates[0];
+ ReplaceableEntry* victim = candidates[0];
for (const auto& candidate : candidates) {
- // Stop iteration if found an invalid block
- if (!candidate->isValid()) {
- blk = candidate;
- break;
- // Update victim block if necessary
- } else if (candidate->lastTouchTick < blk->lastTouchTick) {
- blk = candidate;
+ // Update victim entry if necessary
+ if (std::static_pointer_cast<LRUReplData>(
+ candidate->replacementData)->lastTouchTick <
+ std::static_pointer_cast<LRUReplData>(
+ victim->replacementData)->lastTouchTick) {
+ victim = candidate;
}
}
- DPRINTF(CacheRepl, "set %x, way %x: selecting blk for replacement\n",
- blk->set, blk->way);
+ return victim;
+}
- return blk;
+std::shared_ptr<ReplacementData>
+LRURP::instantiateEntry()
+{
+ return std::shared_ptr<ReplacementData>(new LRUReplData());
}
LRURP*