From b8ecd2784c24879712b598fe940d8a73ec6842b1 Mon Sep 17 00:00:00 2001 From: Mingyuan Date: Mon, 2 Sep 2019 17:43:59 -0500 Subject: [PATCH] mem-cache: Fixed a bug in MRU replacement policy The lastTouchTick is set to 0 when instantiate. This will cause the candidate[0] to get evicted over and over again in MRU replacement policy. To resolve this, break the search loop whenever it finds a cold cache line. Change-Id: I33aa57ebe0efca15986f62c3ae10a146bd2b779f Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/20881 Tested-by: kokoro Maintainer: Jason Lowe-Power Maintainer: Nikos Nikoleris Reviewed-by: Jason Lowe-Power Reviewed-by: Daniel Carvalho Reviewed-by: Nikos Nikoleris Reviewed-by: Matt Sinclair --- src/mem/cache/replacement_policies/mru_rp.cc | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/mem/cache/replacement_policies/mru_rp.cc b/src/mem/cache/replacement_policies/mru_rp.cc index b2e019f9a..534fb52f0 100644 --- a/src/mem/cache/replacement_policies/mru_rp.cc +++ b/src/mem/cache/replacement_policies/mru_rp.cc @@ -74,9 +74,14 @@ MRURP::getVictim(const ReplacementCandidates& candidates) const // Visit all candidates to find victim ReplaceableEntry* victim = candidates[0]; for (const auto& candidate : candidates) { - // Update victim entry if necessary - if (std::static_pointer_cast( - candidate->replacementData)->lastTouchTick > + std::shared_ptr candidate_replacement_data = + std::static_pointer_cast(candidate->replacementData); + + // Stop searching entry if a cache line that doesn't warm up is found. + if (candidate_replacement_data->lastTouchTick == 0) { + victim = candidate; + break; + } else if (candidate_replacement_data->lastTouchTick > std::static_pointer_cast( victim->replacementData)->lastTouchTick) { victim = candidate; -- 2.30.2