Daniel Carvalho has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/37896 )
Change subject: mem-cache: Change ReplacementCandidates type
......................................................................
mem-cache: Change ReplacementCandidates type
The ReplacementCandidates type must be redefined in order to allow
implementing dynamic sampling of entries. Since the replacement
data being used is changed dynamically with such approach, there
must be a way to remap it.
Change-Id: Ic945c23dca236d22217984fc010c5c4c80c877dd
Signed-off-by: Daniel R. Carvalho <[email protected]>
---
M src/mem/cache/replacement_policies/base.hh
M src/mem/cache/replacement_policies/brrip_rp.cc
M src/mem/cache/replacement_policies/brrip_rp.hh
M src/mem/cache/replacement_policies/fifo_rp.cc
M src/mem/cache/replacement_policies/fifo_rp.hh
M src/mem/cache/replacement_policies/lfu_rp.cc
M src/mem/cache/replacement_policies/lfu_rp.hh
M src/mem/cache/replacement_policies/lru_rp.cc
M src/mem/cache/replacement_policies/lru_rp.hh
M src/mem/cache/replacement_policies/mru_rp.cc
M src/mem/cache/replacement_policies/mru_rp.hh
M src/mem/cache/replacement_policies/random_rp.cc
M src/mem/cache/replacement_policies/random_rp.hh
M src/mem/cache/replacement_policies/second_chance_rp.cc
M src/mem/cache/replacement_policies/second_chance_rp.hh
M src/mem/cache/replacement_policies/tree_plru_rp.cc
M src/mem/cache/replacement_policies/tree_plru_rp.hh
M src/mem/cache/replacement_policies/weighted_lru_rp.cc
M src/mem/cache/replacement_policies/weighted_lru_rp.hh
19 files changed, 207 insertions(+), 168 deletions(-)
diff --git a/src/mem/cache/replacement_policies/base.hh
b/src/mem/cache/replacement_policies/base.hh
index 147885d..61bf6e8 100644
--- a/src/mem/cache/replacement_policies/base.hh
+++ b/src/mem/cache/replacement_policies/base.hh
@@ -30,16 +30,13 @@
#define __MEM_CACHE_REPLACEMENT_POLICIES_BASE_HH__
#include <memory>
+#include <utility>
+#include <vector>
#include "mem/cache/replacement_policies/replaceable_entry.hh"
#include "params/BaseReplacementPolicy.hh"
#include "sim/sim_object.hh"
-/**
- * Replacement candidates as chosen by the indexing policy.
- */
-typedef std::vector<ReplaceableEntry*> ReplacementCandidates;
-
namespace ReplacementPolicy {
/**
@@ -47,6 +44,53 @@
*/
class Base : public SimObject
{
+ protected:
+ /**
+ * Replacement candidates as chosen by the indexing policy. Although
+ * the entry contains its replacemnt data, when using dynamic sampling
+ * the replacement data must be refined to match with the replacement
+ * policy being used.
+ */
+ struct ReplacementCandidate {
+ private:
+ std::shared_ptr<ReplacementData> replacementData;
+ ReplaceableEntry* const entry;
+
+ public:
+ ReplacementCandidate() = delete;
+ ReplacementCandidate(std::shared_ptr<ReplacementData>
replacement_data,
+ ReplaceableEntry* replaceable_entry)
+ : replacementData(replacement_data), entry(replaceable_entry)
+ {
+ }
+
+ /** Get replacement data pointer casted as its derived type. */
+ template <class T>
+ std::shared_ptr<T>
+ getReplacementData()
+ {
+ return std::static_pointer_cast<T>(replacementData);
+ }
+
+ /** Get the candidate entry that contains this replacement data. */
+ ReplaceableEntry*
+ getEntry()
+ {
+ return entry;
+ }
+ };
+ typedef std::vector<ReplacementCandidate> ReplacementCandidates;
+
+ /**
+ * Find the replacement victim. Must be implemented by the derived
+ * replacement policy.
+ *
+ * @param candidates Replacement candidates, selected by indexing
policy.
+ * @return Replacement entry to be replaced.
+ */
+ virtual ReplaceableEntry* getVictim(ReplacementCandidates& candidates)
+ const = 0;
+
public:
typedef BaseReplacementPolicyParams Params;
Base(const Params &p) : SimObject(p) {}
@@ -82,8 +126,16 @@
* @param candidates Replacement candidates, selected by indexing
policy.
* @return Replacement entry to be replaced.
*/
- virtual ReplaceableEntry* getVictim(
- const ReplacementCandidates& candidates) const
= 0;
+ ReplaceableEntry*
+ getVictim(const std::vector<ReplaceableEntry*>& candidates) const
+ {
+ ReplacementCandidates replacement_candidates;
+ for (const auto& candidate : candidates) {
+ replacement_candidates.push_back(
+ ReplacementCandidate(candidate->replacementData,
candidate));
+ }
+ return getVictim(replacement_candidates);
+ }
/**
* Instantiate a replacement data entry.
diff --git a/src/mem/cache/replacement_policies/brrip_rp.cc
b/src/mem/cache/replacement_policies/brrip_rp.cc
index 76300e0..19cd68d 100644
--- a/src/mem/cache/replacement_policies/brrip_rp.cc
+++ b/src/mem/cache/replacement_policies/brrip_rp.cc
@@ -90,52 +90,48 @@
}
ReplaceableEntry*
-BRRIP::getVictim(const ReplacementCandidates& candidates) const
+BRRIP::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Use first candidate as dummy victim
- ReplaceableEntry* victim = candidates[0];
+ ReplacementCandidate* victim = &(candidates[0]);
// Store victim->rrpv in a variable to improve code readability
- int victim_RRPV = std::static_pointer_cast<BRRIPReplData>(
- victim->replacementData)->rrpv;
+ int victim_RRPV = victim->getReplacementData<BRRIPReplData>()->rrpv;
// Visit all candidates to find victim
- for (const auto& candidate : candidates) {
+ for (auto& candidate : candidates) {
std::shared_ptr<BRRIPReplData> candidate_repl_data =
- std::static_pointer_cast<BRRIPReplData>(
- candidate->replacementData);
+ candidate.getReplacementData<BRRIPReplData>();
// Stop searching for victims if an invalid entry is found
if (!candidate_repl_data->valid) {
- return candidate;
+ return candidate.getEntry();
}
// Update victim entry if necessary
int candidate_RRPV = candidate_repl_data->rrpv;
if (candidate_RRPV > victim_RRPV) {
- victim = candidate;
+ victim = &candidate;
victim_RRPV = candidate_RRPV;
}
}
// Get difference of victim's RRPV to the highest possible RRPV in
// order to update the RRPV of all the other entries accordingly
- int diff = std::static_pointer_cast<BRRIPReplData>(
- victim->replacementData)->rrpv.saturate();
+ int diff =
victim->getReplacementData<BRRIPReplData>()->rrpv.saturate();
// No need to update RRPV if there is no difference
if (diff > 0){
// Update RRPV of all candidates
- for (const auto& candidate : candidates) {
- std::static_pointer_cast<BRRIPReplData>(
- candidate->replacementData)->rrpv += diff;
+ for (auto& candidate : candidates) {
+ candidate.getReplacementData<BRRIPReplData>()->rrpv += diff;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/brrip_rp.hh
b/src/mem/cache/replacement_policies/brrip_rp.hh
index 4ed8ca5..1cabb1f 100644
--- a/src/mem/cache/replacement_policies/brrip_rp.hh
+++ b/src/mem/cache/replacement_policies/brrip_rp.hh
@@ -107,6 +107,15 @@
*/
const unsigned btp;
+ /**
+ * Find replacement victim using rrpv.
+ *
+ * @param cands Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef BRRIPRPParams Params;
BRRIP(const Params &p);
@@ -139,15 +148,6 @@
override;
/**
- * Find replacement victim using rrpv.
- *
- * @param cands Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/fifo_rp.cc
b/src/mem/cache/replacement_policies/fifo_rp.cc
index 496d86a..be28a56 100644
--- a/src/mem/cache/replacement_policies/fifo_rp.cc
+++ b/src/mem/cache/replacement_policies/fifo_rp.cc
@@ -65,24 +65,22 @@
}
ReplaceableEntry*
-FIFO::getVictim(const ReplacementCandidates& candidates) const
+FIFO::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Visit all candidates to find victim
- ReplaceableEntry* victim = candidates[0];
- for (const auto& candidate : candidates) {
+ ReplacementCandidate* victim = &(candidates[0]);
+ for (auto& candidate : candidates) {
// Update victim entry if necessary
- if (std::static_pointer_cast<FIFOReplData>(
- candidate->replacementData)->tickInserted <
- std::static_pointer_cast<FIFOReplData>(
- victim->replacementData)->tickInserted) {
- victim = candidate;
+ if (candidate.getReplacementData<FIFOReplData>()->tickInserted <
+ victim->getReplacementData<FIFOReplData>()->tickInserted) {
+ victim = &candidate;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/fifo_rp.hh
b/src/mem/cache/replacement_policies/fifo_rp.hh
index ae9f317..d641035 100644
--- a/src/mem/cache/replacement_policies/fifo_rp.hh
+++ b/src/mem/cache/replacement_policies/fifo_rp.hh
@@ -58,6 +58,15 @@
FIFOReplData() : tickInserted(0) {}
};
+ /**
+ * Find replacement victim using insertion timestamps.
+ *
+ * @param cands Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef FIFORPParams Params;
FIFO(const Params &p);
@@ -91,15 +100,6 @@
override;
/**
- * Find replacement victim using insertion timestamps.
- *
- * @param cands Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/lfu_rp.cc
b/src/mem/cache/replacement_policies/lfu_rp.cc
index a3cd961..aa51b5a 100644
--- a/src/mem/cache/replacement_policies/lfu_rp.cc
+++ b/src/mem/cache/replacement_policies/lfu_rp.cc
@@ -63,24 +63,22 @@
}
ReplaceableEntry*
-LFU::getVictim(const ReplacementCandidates& candidates) const
+LFU::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Visit all candidates to find victim
- ReplaceableEntry* victim = candidates[0];
- for (const auto& candidate : candidates) {
+ ReplacementCandidate* victim = &(candidates[0]);
+ for (auto& candidate : candidates) {
// Update victim entry if necessary
- if (std::static_pointer_cast<LFUReplData>(
- candidate->replacementData)->refCount <
- std::static_pointer_cast<LFUReplData>(
- victim->replacementData)->refCount) {
- victim = candidate;
+ if (candidate.getReplacementData<LFUReplData>()->refCount <
+ victim->getReplacementData<LFUReplData>()->refCount) {
+ victim = &candidate;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/lfu_rp.hh
b/src/mem/cache/replacement_policies/lfu_rp.hh
index 4f233a4..d086a24 100644
--- a/src/mem/cache/replacement_policies/lfu_rp.hh
+++ b/src/mem/cache/replacement_policies/lfu_rp.hh
@@ -58,6 +58,15 @@
LFUReplData() : refCount(0) {}
};
+ /**
+ * Find replacement victim using reference frequency.
+ *
+ * @param cands Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef LFURPParams Params;
LFU(const Params &p);
@@ -91,15 +100,6 @@
override;
/**
- * Find replacement victim using reference frequency.
- *
- * @param cands Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/lru_rp.cc
b/src/mem/cache/replacement_policies/lru_rp.cc
index fd89703..350d0e7 100644
--- a/src/mem/cache/replacement_policies/lru_rp.cc
+++ b/src/mem/cache/replacement_policies/lru_rp.cc
@@ -67,24 +67,22 @@
}
ReplaceableEntry*
-LRU::getVictim(const ReplacementCandidates& candidates) const
+LRU::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Visit all candidates to find victim
- ReplaceableEntry* victim = candidates[0];
- for (const auto& candidate : candidates) {
+ ReplacementCandidate* victim = &(candidates[0]);
+ for (auto& candidate : candidates) {
// Update victim entry if necessary
- if (std::static_pointer_cast<LRUReplData>(
- candidate->replacementData)->lastTouchTick <
- std::static_pointer_cast<LRUReplData>(
- victim->replacementData)->lastTouchTick) {
- victim = candidate;
+ if (candidate.getReplacementData<LRUReplData>()->lastTouchTick <
+ victim->getReplacementData<LRUReplData>()->lastTouchTick) {
+ victim = &candidate;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/lru_rp.hh
b/src/mem/cache/replacement_policies/lru_rp.hh
index 033816f..5c2a1c2 100644
--- a/src/mem/cache/replacement_policies/lru_rp.hh
+++ b/src/mem/cache/replacement_policies/lru_rp.hh
@@ -56,6 +56,15 @@
LRUReplData() : lastTouchTick(0) {}
};
+ /**
+ * Find replacement victim using LRU timestamps.
+ *
+ * @param candidates Replacement candidates, selected by indexing
policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef LRURPParams Params;
LRU(const Params &p);
@@ -89,15 +98,6 @@
override;
/**
- * Find replacement victim using LRU timestamps.
- *
- * @param candidates Replacement candidates, selected by indexing
policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/mru_rp.cc
b/src/mem/cache/replacement_policies/mru_rp.cc
index cc2016b..a478269 100644
--- a/src/mem/cache/replacement_policies/mru_rp.cc
+++ b/src/mem/cache/replacement_policies/mru_rp.cc
@@ -67,29 +67,28 @@
}
ReplaceableEntry*
-MRU::getVictim(const ReplacementCandidates& candidates) const
+MRU::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Visit all candidates to find victim
- ReplaceableEntry* victim = candidates[0];
- for (const auto& candidate : candidates) {
+ ReplacementCandidate* victim = &(candidates[0]);
+ for (auto& candidate : candidates) {
std::shared_ptr<MRUReplData> candidate_replacement_data =
-
std::static_pointer_cast<MRUReplData>(candidate->replacementData);
+ candidate.getReplacementData<MRUReplData>();
// Stop searching entry if a cache line that doesn't warm up is
found.
if (candidate_replacement_data->lastTouchTick == 0) {
- victim = candidate;
+ victim = &candidate;
break;
} else if (candidate_replacement_data->lastTouchTick >
- std::static_pointer_cast<MRUReplData>(
- victim->replacementData)->lastTouchTick) {
- victim = candidate;
+ victim->getReplacementData<MRUReplData>()->lastTouchTick) {
+ victim = &candidate;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/mru_rp.hh
b/src/mem/cache/replacement_policies/mru_rp.hh
index d5ef19b..e3b8ec9 100644
--- a/src/mem/cache/replacement_policies/mru_rp.hh
+++ b/src/mem/cache/replacement_policies/mru_rp.hh
@@ -58,6 +58,15 @@
MRUReplData() : lastTouchTick(0) {}
};
+ /**
+ * Find replacement victim using access timestamps.
+ *
+ * @param cands Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef MRURPParams Params;
MRU(const Params &p);
@@ -91,15 +100,6 @@
override;
/**
- * Find replacement victim using access timestamps.
- *
- * @param cands Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/random_rp.cc
b/src/mem/cache/replacement_policies/random_rp.cc
index 8f81c1c..8b0b6f6 100644
--- a/src/mem/cache/replacement_policies/random_rp.cc
+++ b/src/mem/cache/replacement_policies/random_rp.cc
@@ -64,26 +64,25 @@
}
ReplaceableEntry*
-Random::getVictim(const ReplacementCandidates& candidates) const
+Random::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Choose one candidate at random
- ReplaceableEntry* victim = candidates[random_mt.random<unsigned>(0,
- candidates.size() - 1)];
+ ReplacementCandidate* victim =
+ &(candidates[random_mt.random<unsigned>(0, candidates.size() -
1)]);
// Visit all candidates to search for an invalid entry. If one is
found,
// its eviction is prioritized
- for (const auto& candidate : candidates) {
- if (!std::static_pointer_cast<RandomReplData>(
- candidate->replacementData)->valid) {
- victim = candidate;
+ for (auto& candidate : candidates) {
+ if (!candidate.getReplacementData<RandomReplData>()->valid) {
+ victim = &candidate;
break;
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/random_rp.hh
b/src/mem/cache/replacement_policies/random_rp.hh
index a8896e3..57d2842 100644
--- a/src/mem/cache/replacement_policies/random_rp.hh
+++ b/src/mem/cache/replacement_policies/random_rp.hh
@@ -59,6 +59,15 @@
RandomReplData() : valid(false) {}
};
+ /**
+ * Find replacement victim at random.
+ *
+ * @param candidates Replacement candidates, selected by indexing
policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef RandomRPParams Params;
Random(const Params &p);
@@ -92,15 +101,6 @@
override;
/**
- * Find replacement victim at random.
- *
- * @param candidates Replacement candidates, selected by indexing
policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/second_chance_rp.cc
b/src/mem/cache/replacement_policies/second_chance_rp.cc
index 0f8c392..0bd629f 100644
--- a/src/mem/cache/replacement_policies/second_chance_rp.cc
+++ b/src/mem/cache/replacement_policies/second_chance_rp.cc
@@ -84,36 +84,39 @@
}
ReplaceableEntry*
-SecondChance::getVictim(const ReplacementCandidates& candidates) const
+SecondChance::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Search for invalid entries, as they have the eviction priority
- for (const auto& candidate : candidates) {
+ for (auto& candidate : candidates) {
// Cast candidate's replacement data
std::shared_ptr<SecondChanceReplData> candidate_replacement_data =
- std::static_pointer_cast<SecondChanceReplData>(
- candidate->replacementData);
+ candidate.getReplacementData<SecondChanceReplData>();
// Stop iteration if found an invalid entry
if ((candidate_replacement_data->tickInserted == Tick(0)) &&
!candidate_replacement_data->hasSecondChance) {
- return candidate;
+ return candidate.getEntry();
}
}
// Visit all candidates to find victim
- ReplaceableEntry* victim = candidates[0];
+ ReplacementCandidate* victim = &(candidates[0]);
bool search_victim = true;
while (search_victim) {
// Do a FIFO victim search
- victim = FIFO::getVictim(candidates);
+ ReplaceableEntry* victim_entry = FIFO::getVictim(candidates);
+ for (auto& candidate : candidates) {
+ if (victim_entry == candidate.getEntry()) {
+ victim = &candidate;
+ }
+ }
// Cast victim's replacement data for code readability
std::shared_ptr<SecondChanceReplData> victim_replacement_data =
- std::static_pointer_cast<SecondChanceReplData>(
- victim->replacementData);
+ victim->getReplacementData<SecondChanceReplData>();
// If victim has a second chance, use it and repeat search
if (victim_replacement_data->hasSecondChance) {
@@ -124,7 +127,7 @@
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/second_chance_rp.hh
b/src/mem/cache/replacement_policies/second_chance_rp.hh
index 29a3ed5..6b7551f 100644
--- a/src/mem/cache/replacement_policies/second_chance_rp.hh
+++ b/src/mem/cache/replacement_policies/second_chance_rp.hh
@@ -72,6 +72,16 @@
void useSecondChance(
const std::shared_ptr<SecondChanceReplData>& replacement_data)
const;
+ /**
+ * Find replacement victim using insertion timestamps and second chance
+ * bit.
+ *
+ * @param cands Replacement candidates, selected by indexing policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef SecondChanceRPParams Params;
SecondChance(const Params &p);
@@ -106,16 +116,6 @@
override;
/**
- * Find replacement victim using insertion timestamps and second chance
- * bit.
- *
- * @param cands Replacement candidates, selected by indexing policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry.
*
* @return A shared pointer to the new replacement data.
diff --git a/src/mem/cache/replacement_policies/tree_plru_rp.cc
b/src/mem/cache/replacement_policies/tree_plru_rp.cc
index 9f50261..e5cd978 100644
--- a/src/mem/cache/replacement_policies/tree_plru_rp.cc
+++ b/src/mem/cache/replacement_policies/tree_plru_rp.cc
@@ -165,14 +165,14 @@
}
ReplaceableEntry*
-TreePLRU::getVictim(const ReplacementCandidates& candidates) const
+TreePLRU::getVictim(ReplacementCandidates& candidates) const
{
// There must be at least one replacement candidate
assert(candidates.size() > 0);
// Get tree
- const PLRUTree* tree = std::static_pointer_cast<TreePLRUReplData>(
- candidates[0]->replacementData)->tree.get();
+ const PLRUTree* tree =
+ candidates[0].getReplacementData<TreePLRUReplData>()->tree.get();
// Index of the tree entry we are currently checking. Start with root.
uint64_t tree_index = 0;
@@ -189,7 +189,7 @@
// The tree index is currently at the leaf of the victim displaced by
the
// number of non-leaf nodes
- return candidates[tree_index - (numLeaves - 1)];
+ return candidates[tree_index - (numLeaves - 1)].getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/tree_plru_rp.hh
b/src/mem/cache/replacement_policies/tree_plru_rp.hh
index 3724392..df4af57 100644
--- a/src/mem/cache/replacement_policies/tree_plru_rp.hh
+++ b/src/mem/cache/replacement_policies/tree_plru_rp.hh
@@ -150,6 +150,16 @@
TreePLRUReplData(const uint64_t index, std::shared_ptr<PLRUTree>
tree);
};
+ /**
+ * Find replacement victim using TreePLRU bits. It is assumed that all
+ * candidates share the same replacement data tree.
+ *
+ * @param candidates Replacement candidates, selected by indexing
policy.
+ * @return Replacement entry to be replaced.
+ */
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
+
public:
typedef TreePLRURPParams Params;
TreePLRU(const Params &p);
@@ -183,16 +193,6 @@
override;
/**
- * Find replacement victim using TreePLRU bits. It is assumed that all
- * candidates share the same replacement data tree.
- *
- * @param candidates Replacement candidates, selected by indexing
policy.
- * @return Replacement entry to be replaced.
- */
- ReplaceableEntry* getVictim(const ReplacementCandidates& candidates)
const
-
override;
-
- /**
* Instantiate a replacement data entry. Consecutive calls to this
* function use the same tree up to numLeaves. When numLeaves
replacement
* data have been created, a new tree is generated, and the counter is
diff --git a/src/mem/cache/replacement_policies/weighted_lru_rp.cc
b/src/mem/cache/replacement_policies/weighted_lru_rp.cc
index 0e2043d..2e44d8d 100644
--- a/src/mem/cache/replacement_policies/weighted_lru_rp.cc
+++ b/src/mem/cache/replacement_policies/weighted_lru_rp.cc
@@ -64,37 +64,33 @@
}
ReplaceableEntry*
-WeightedLRU::getVictim(const ReplacementCandidates& candidates) const
+WeightedLRU::getVictim(ReplacementCandidates& candidates) const
{
assert(candidates.size() > 0);
- ReplaceableEntry* victim = candidates[0];
+ ReplacementCandidate* victim = &(candidates[0]);
// Use weight (last_occ_ptr) to find victim.
// Evict the block that has the smallest weight.
// If two blocks have the same weight, evict the oldest one.
- for (const auto& candidate : candidates) {
- // candidate's replacement_data
+ for (auto& candidate : candidates) {
std::shared_ptr<WeightedLRUReplData> candidate_replacement_data =
- std::static_pointer_cast<WeightedLRUReplData>(
- candidate->replacementData);
- // victim's replacement_data
+ candidate.getReplacementData<WeightedLRUReplData>();
std::shared_ptr<WeightedLRUReplData> victim_replacement_data =
- std::static_pointer_cast<WeightedLRUReplData>(
- victim->replacementData);
+ victim->getReplacementData<WeightedLRUReplData>();
if (candidate_replacement_data->last_occ_ptr <
victim_replacement_data->last_occ_ptr) {
- victim = candidate;
+ victim = &candidate;
} else if (candidate_replacement_data->last_occ_ptr ==
victim_replacement_data->last_occ_ptr) {
// Evict the block with a smaller tick.
Tick time = candidate_replacement_data->last_touch_tick;
if (time < victim_replacement_data->last_touch_tick) {
- victim = candidate;
+ victim = &candidate;
}
}
}
- return victim;
+ return victim->getEntry();
}
std::shared_ptr<ReplacementData>
diff --git a/src/mem/cache/replacement_policies/weighted_lru_rp.hh
b/src/mem/cache/replacement_policies/weighted_lru_rp.hh
index 71156d3..941bb0d 100644
--- a/src/mem/cache/replacement_policies/weighted_lru_rp.hh
+++ b/src/mem/cache/replacement_policies/weighted_lru_rp.hh
@@ -107,8 +107,8 @@
* @param candidates Replacement candidates, selected by indexing
policy.
* @return Replacement entry to be replaced.
*/
- ReplaceableEntry* getVictim(const ReplacementCandidates&
- candidates) const override;
+ ReplaceableEntry* getVictim(ReplacementCandidates& candidates) const
+ override;
};
} // namespace ReplacementPolicy
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/37896
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: Ic945c23dca236d22217984fc010c5c4c80c877dd
Gerrit-Change-Number: 37896
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s