random_rp.cc (12600:e670dd17c8cf) random_rp.cc (12684:44ebd2bc020f)
1/**
2 * Copyright (c) 2018 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 17 unchanged lines hidden (view full) ---

26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Daniel Carvalho
29 */
30
31#include "mem/cache/replacement_policies/random_rp.hh"
32
33#include "base/random.hh"
1/**
2 * Copyright (c) 2018 Inria
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions are
7 * met: redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer;

--- 17 unchanged lines hidden (view full) ---

26 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 *
28 * Authors: Daniel Carvalho
29 */
30
31#include "mem/cache/replacement_policies/random_rp.hh"
32
33#include "base/random.hh"
34#include "debug/CacheRepl.hh"
34#include "mem/cache/blk.hh"
35
36RandomRP::RandomRP(const Params *p)
37 : BaseReplacementPolicy(p)
38{
39}
40
35
36RandomRP::RandomRP(const Params *p)
37 : BaseReplacementPolicy(p)
38{
39}
40
41CacheBlk*
42RandomRP::getVictim(const ReplacementCandidates& candidates)
41void
42RandomRP::invalidate(const std::shared_ptr<ReplacementData>& replacement_data)
43const
43{
44{
45 // Unprioritize replacement data victimization
46 std::static_pointer_cast<RandomReplData>(
47 replacement_data)->valid = false;
48}
49
50void
51RandomRP::touch(const std::shared_ptr<ReplacementData>& replacement_data) const
52{
53}
54
55void
56RandomRP::reset(const std::shared_ptr<ReplacementData>& replacement_data) const
57{
58 // Unprioritize replacement data victimization
59 std::static_pointer_cast<RandomReplData>(
60 replacement_data)->valid = true;
61}
62
63ReplaceableEntry*
64RandomRP::getVictim(const ReplacementCandidates& candidates) const
65{
44 // There must be at least one replacement candidate
45 assert(candidates.size() > 0);
46
47 // Choose one candidate at random
66 // There must be at least one replacement candidate
67 assert(candidates.size() > 0);
68
69 // Choose one candidate at random
48 CacheBlk* blk = candidates[random_mt.random<unsigned>(0,
70 ReplaceableEntry* victim = candidates[random_mt.random<unsigned>(0,
49 candidates.size() - 1)];
50
71 candidates.size() - 1)];
72
51 // Visit all candidates to find an invalid entry
73 // Visit all candidates to search for an invalid entry. If one is found,
74 // its eviction is prioritized
52 for (const auto& candidate : candidates) {
75 for (const auto& candidate : candidates) {
53 // Give priority to victimise invalid entries
54 if (!candidate->isValid()){
55 blk = candidate;
76 if (!std::static_pointer_cast<RandomReplData>(
77 candidate->replacementData)->valid) {
78 victim = candidate;
56 break;
57 }
58 }
59
79 break;
80 }
81 }
82
60 // If no invalid blocks were found, choose one of the candidates randomly
61 DPRINTF(CacheRepl, "set %x, way %x: selecting blk for replacement\n",
62 blk->set, blk->way);
83 return victim;
84}
63
85
64 return blk;
86std::shared_ptr<ReplacementData>
87RandomRP::instantiateEntry()
88{
89 return std::shared_ptr<ReplacementData>(new ReplacementData());
65}
66
67RandomRP*
68RandomRPParams::create()
69{
70 return new RandomRP(this);
71}
90}
91
92RandomRP*
93RandomRPParams::create()
94{
95 return new RandomRP(this);
96}