Deleted Added
sdiff udiff text old ( 12600:e670dd17c8cf ) new ( 12684:44ebd2bc020f )
full compact
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"
35
36RandomRP::RandomRP(const Params *p)
37 : BaseReplacementPolicy(p)
38{
39}
40
41CacheBlk*
42RandomRP::getVictim(const ReplacementCandidates& candidates)
43{
44 // There must be at least one replacement candidate
45 assert(candidates.size() > 0);
46
47 // Choose one candidate at random
48 CacheBlk* blk = candidates[random_mt.random<unsigned>(0,
49 candidates.size() - 1)];
50
51 // Visit all candidates to find an invalid entry
52 for (const auto& candidate : candidates) {
53 // Give priority to victimise invalid entries
54 if (!candidate->isValid()){
55 blk = candidate;
56 break;
57 }
58 }
59
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);
63
64 return blk;
65}
66
67RandomRP*
68RandomRPParams::create()
69{
70 return new RandomRP(this);
71}