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 <noreply+kokoro@google.com> Maintainer: Jason Lowe-Power <jason@lowepower.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-by: Jason Lowe-Power <jason@lowepower.com> Reviewed-by: Daniel Carvalho <odanrc@yahoo.com.br> Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com> Reviewed-by: Matt Sinclair <mattdsinclair@gmail.com>
This commit is contained in:
11
src/mem/cache/replacement_policies/mru_rp.cc
vendored
11
src/mem/cache/replacement_policies/mru_rp.cc
vendored
@@ -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<MRUReplData>(
|
||||
candidate->replacementData)->lastTouchTick >
|
||||
std::shared_ptr<MRUReplData> candidate_replacement_data =
|
||||
std::static_pointer_cast<MRUReplData>(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<MRUReplData>(
|
||||
victim->replacementData)->lastTouchTick) {
|
||||
victim = candidate;
|
||||
|
||||
Reference in New Issue
Block a user