gem5  v21.0.1.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
second_chance_rp.cc
Go to the documentation of this file.
1 
30 
31 #include <cassert>
32 
33 #include "params/SecondChanceRP.hh"
34 
35 namespace ReplacementPolicy {
36 
38  : FIFO(p)
39 {
40 }
41 
42 void
44  const std::shared_ptr<SecondChanceReplData>& replacement_data) const
45 {
46  // Reset FIFO data
47  FIFO::reset(replacement_data);
48 
49  // Use second chance
50  replacement_data->hasSecondChance = false;
51 }
52 
53 void
55  const std::shared_ptr<ReplacementData>& replacement_data) const
56 {
57  FIFO::invalidate(replacement_data);
58 
59  // Do not give a second chance to invalid entries
60  std::static_pointer_cast<SecondChanceReplData>(
61  replacement_data)->hasSecondChance = false;
62 }
63 
64 void
66  const std::shared_ptr<ReplacementData>& replacement_data) const
67 {
68  FIFO::touch(replacement_data);
69 
70  // Whenever an entry is touched, it is given a second chance
71  std::static_pointer_cast<SecondChanceReplData>(
72  replacement_data)->hasSecondChance = true;
73 }
74 
75 void
77  const std::shared_ptr<ReplacementData>& replacement_data) const
78 {
79  FIFO::reset(replacement_data);
80 
81  // Entries are inserted with a second chance
82  std::static_pointer_cast<SecondChanceReplData>(
83  replacement_data)->hasSecondChance = false;
84 }
85 
88 {
89  // There must be at least one replacement candidate
90  assert(candidates.size() > 0);
91 
92  // Search for invalid entries, as they have the eviction priority
93  for (const auto& candidate : candidates) {
94  // Cast candidate's replacement data
95  std::shared_ptr<SecondChanceReplData> candidate_replacement_data =
96  std::static_pointer_cast<SecondChanceReplData>(
97  candidate->replacementData);
98 
99  // Stop iteration if found an invalid entry
100  if ((candidate_replacement_data->tickInserted == Tick(0)) &&
101  !candidate_replacement_data->hasSecondChance) {
102  return candidate;
103  }
104  }
105 
106  // Visit all candidates to find victim
107  ReplaceableEntry* victim = candidates[0];
108  bool search_victim = true;
109  while (search_victim) {
110  // Do a FIFO victim search
111  victim = FIFO::getVictim(candidates);
112 
113  // Cast victim's replacement data for code readability
114  std::shared_ptr<SecondChanceReplData> victim_replacement_data =
115  std::static_pointer_cast<SecondChanceReplData>(
116  victim->replacementData);
117 
118  // If victim has a second chance, use it and repeat search
119  if (victim_replacement_data->hasSecondChance) {
120  useSecondChance(victim_replacement_data);
121  } else {
122  // Found victim
123  search_victim = false;
124  }
125  }
126 
127  return victim;
128 }
129 
130 std::shared_ptr<ReplacementData>
132 {
133  return std::shared_ptr<ReplacementData>(new SecondChanceReplData());
134 }
135 
136 } // namespace ReplacementPolicy
ReplaceableEntry
A replaceable entry is a basic entry in a 2d table-like structure that needs to have replacement func...
Definition: replaceable_entry.hh:57
ReplacementPolicy::SecondChance::touch
void touch(const std::shared_ptr< ReplacementData > &replacement_data) const override
Touch an entry to update its re-insertion tick and second chance bit.
Definition: second_chance_rp.cc:65
ReplacementPolicy::SecondChance::reset
void reset(const std::shared_ptr< ReplacementData > &replacement_data) const override
Reset replacement data.
Definition: second_chance_rp.cc:76
ReplacementPolicy::FIFO::reset
void reset(const std::shared_ptr< ReplacementData > &replacement_data) const override
Reset replacement data.
Definition: fifo_rp.cc:60
Tick
uint64_t Tick
Tick count type.
Definition: types.hh:59
std::vector
STL vector class.
Definition: stl.hh:37
ReplacementPolicy::SecondChance::invalidate
void invalidate(const std::shared_ptr< ReplacementData > &replacement_data) const override
Invalidate replacement data to set it as the next probable victim.
Definition: second_chance_rp.cc:54
ReplacementPolicy
Copyright (c) 2018-2020 Inria All rights reserved.
Definition: stride.hh:64
ReplacementPolicy::FIFO
Definition: fifo_rp.hh:46
ReplacementPolicy::Base::Params
BaseReplacementPolicyParams Params
Definition: base.hh:51
ReplacementPolicy::SecondChance::instantiateEntry
std::shared_ptr< ReplacementData > instantiateEntry() override
Instantiate a replacement data entry.
Definition: second_chance_rp.cc:131
ReplacementPolicy::SecondChance::SecondChance
SecondChance(const Params &p)
Definition: second_chance_rp.cc:37
ReplaceableEntry::replacementData
std::shared_ptr< ReplacementPolicy::ReplacementData > replacementData
Replacement data associated to this entry.
Definition: replaceable_entry.hh:78
ReplacementPolicy::FIFO::touch
void touch(const std::shared_ptr< ReplacementData > &replacement_data) const override
Touch an entry to update its replacement data.
Definition: fifo_rp.cc:54
ReplacementPolicy::FIFO::getVictim
ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const override
Find replacement victim using insertion timestamps.
Definition: fifo_rp.cc:68
ReplacementPolicy::FIFO::invalidate
void invalidate(const std::shared_ptr< ReplacementData > &replacement_data) const override
Invalidate replacement data to set it as the next probable victim.
Definition: fifo_rp.cc:45
ReplacementPolicy::SecondChance::getVictim
ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const override
Find replacement victim using insertion timestamps and second chance bit.
Definition: second_chance_rp.cc:87
ReplacementPolicy::SecondChance::SecondChanceReplData
Second-Chance-specific implementation of replacement data.
Definition: second_chance_rp.hh:52
second_chance_rp.hh
Copyright (c) 2018-2020 Inria All rights reserved.
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
ReplacementPolicy::SecondChance::useSecondChance
void useSecondChance(const std::shared_ptr< SecondChanceReplData > &replacement_data) const
Use replacement data's second chance.
Definition: second_chance_rp.cc:43

Generated on Tue Jun 22 2021 15:28:29 for gem5 by doxygen 1.8.17