diff options
Diffstat (limited to 'src/mem/cache/replacement_policies/lfu_rp.cc')
-rw-r--r-- | src/mem/cache/replacement_policies/lfu_rp.cc | 52 |
1 files changed, 38 insertions, 14 deletions
diff --git a/src/mem/cache/replacement_policies/lfu_rp.cc b/src/mem/cache/replacement_policies/lfu_rp.cc index 90a5ee227..ffa653e87 100644 --- a/src/mem/cache/replacement_policies/lfu_rp.cc +++ b/src/mem/cache/replacement_policies/lfu_rp.cc @@ -30,36 +30,60 @@ #include "mem/cache/replacement_policies/lfu_rp.hh" -#include "debug/CacheRepl.hh" +#include <memory> LFURP::LFURP(const Params *p) : BaseReplacementPolicy(p) { } -CacheBlk* -LFURP::getVictim(const ReplacementCandidates& candidates) +void +LFURP::invalidate(const std::shared_ptr<ReplacementData>& replacement_data) +const +{ + // Reset reference count + std::static_pointer_cast<LFUReplData>(replacement_data)->refCount = 0; +} + +void +LFURP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const +{ + // Update reference count + std::static_pointer_cast<LFUReplData>(replacement_data)->refCount++; +} + +void +LFURP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const +{ + // Reset reference count + std::static_pointer_cast<LFUReplData>(replacement_data)->refCount = 1; +} + +ReplaceableEntry* +LFURP::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->refCount < blk->refCount) { - blk = candidate; + // Update victim entry if necessary + if (std::static_pointer_cast<LFUReplData>( + candidate->replacementData)->refCount < + std::static_pointer_cast<LFUReplData>( + victim->replacementData)->refCount) { + 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> +LFURP::instantiateEntry() +{ + return std::shared_ptr<ReplacementData>(new LFUReplData()); } LFURP* |