gem5  v19.0.0.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 
32 
33 #include <cassert>
34 
35 #include "params/SecondChanceRP.hh"
36 
38  : FIFORP(p)
39 {
40 }
41 
42 void
44  const std::shared_ptr<SecondChanceReplData>& replacement_data) const
45 {
46  // Reset FIFO data
47  FIFORP::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  FIFORP::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
65 SecondChanceRP::touch(const std::shared_ptr<ReplacementData>&
66  replacement_data) const
67 {
68  FIFORP::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
76 SecondChanceRP::reset(const std::shared_ptr<ReplacementData>&
77  replacement_data) const
78 {
79  FIFORP::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 = FIFORP::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 
137 SecondChanceRPParams::create()
138 {
139  return new SecondChanceRP(this);
140 }
BaseReplacementPolicyParams Params
Convenience typedef.
Definition: base.hh:54
void useSecondChance(const std::shared_ptr< SecondChanceReplData > &replacement_data) const
Use replacement data&#39;s second chance.
void invalidate(const std::shared_ptr< ReplacementData > &replacement_data) const override
Invalidate replacement data to set it as the next probable victim.
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:44
Copyright (c) 2018 Inria All rights reserved.
void reset(const std::shared_ptr< ReplacementData > &replacement_data) const override
Reset replacement data.
STL vector class.
Definition: stl.hh:40
void touch(const std::shared_ptr< ReplacementData > &replacement_data) const override
Touch an entry to update its re-insertion tick and second chance bit.
std::shared_ptr< ReplacementData > instantiateEntry() override
Instantiate a replacement data entry.
std::shared_ptr< ReplacementData > replacementData
Replacement data associated to this entry.
uint64_t Tick
Tick count type.
Definition: types.hh:63
Second-Chance-specific implementation of replacement data.
SecondChanceRP(const Params *p)
Construct and initiliaze this replacement policy.
ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const override
Find replacement victim using insertion timestamps and second chance bit.
void touch(const std::shared_ptr< ReplacementData > &replacement_data) const override
Touch an entry to update its replacement data.
Definition: fifo_rp.cc:53
ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const override
Find replacement victim using insertion timestamps.
Definition: fifo_rp.cc:67
A replaceable entry is a basic entry in a 2d table-like structure that needs to have replacement func...
Bitfield< 0 > p
void reset(const std::shared_ptr< ReplacementData > &replacement_data) const override
Reset replacement data.
Definition: fifo_rp.cc:59

Generated on Fri Feb 28 2020 16:27:02 for gem5 by doxygen 1.8.13