32#include "params/DuelingRP.hh"
47 "All replacement policies must be instantiated");
53 std::shared_ptr<DuelerReplData> casted_replacement_data =
54 std::static_pointer_cast<DuelerReplData>(replacement_data);
55 replPolicyA->invalidate(casted_replacement_data->replDataA);
56 replPolicyB->invalidate(casted_replacement_data->replDataB);
63 std::shared_ptr<DuelerReplData> casted_replacement_data =
64 std::static_pointer_cast<DuelerReplData>(replacement_data);
65 replPolicyA->touch(casted_replacement_data->replDataA, pkt);
66 replPolicyB->touch(casted_replacement_data->replDataB, pkt);
70Dueling::touch(
const std::shared_ptr<ReplacementData>& replacement_data)
const
72 std::shared_ptr<DuelerReplData> casted_replacement_data =
73 std::static_pointer_cast<DuelerReplData>(replacement_data);
74 replPolicyA->touch(casted_replacement_data->replDataA);
75 replPolicyB->touch(casted_replacement_data->replDataB);
82 std::shared_ptr<DuelerReplData> casted_replacement_data =
83 std::static_pointer_cast<DuelerReplData>(replacement_data);
84 replPolicyA->reset(casted_replacement_data->replDataA, pkt);
85 replPolicyB->reset(casted_replacement_data->replDataB, pkt);
95Dueling::reset(
const std::shared_ptr<ReplacementData>& replacement_data)
const
97 std::shared_ptr<DuelerReplData> casted_replacement_data =
98 std::static_pointer_cast<DuelerReplData>(replacement_data);
99 replPolicyA->reset(casted_replacement_data->replDataA);
100 replPolicyB->reset(casted_replacement_data->replDataB);
115 panic_if(candidates.size() !=
params().team_size,
"We currently only "
116 "support team sizes that match the number of replacement candidates");
124 std::static_pointer_cast<DuelerReplData>(
125 candidates[0]->replacementData).get()), team);
133 if ((is_sample && !team) || (!is_sample && !winner)) {
144 for (
auto& candidate : candidates) {
145 std::shared_ptr<DuelerReplData> dueler_repl_data =
146 std::static_pointer_cast<DuelerReplData>(
147 candidate->replacementData);
153 duelingMonitor.isSample(dueler_repl_data.get(), candidate_team) &&
154 (team != candidate_team),
155 "Not all sampled candidates belong to the same team");
159 dueling_replacement_data.push_back(dueler_repl_data);
160 candidate->replacementData = team_a ? dueler_repl_data->replDataA :
161 dueler_repl_data->replDataB;
169 for (
int i = 0;
i < candidates.size();
i++) {
170 candidates[
i]->replacementData = dueling_replacement_data[
i];
176std::shared_ptr<ReplacementData>
182 return std::shared_ptr<DuelerReplData>(replacement_data);
A dueler is an entry that may or may not be accounted for sampling.
A replaceable entry is a basic entry in a 2d table-like structure that needs to have replacement func...
BaseReplacementPolicyParams Params
Base *const replPolicyB
Sub-replacement policy used in this multiple container.
ReplaceableEntry * getVictim(const ReplacementCandidates &candidates) const override
Find replacement victim among candidates.
void reset(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt) override
Reset replacement data.
std::shared_ptr< ReplacementData > instantiateEntry() override
Instantiate a replacement data entry.
void touch(const std::shared_ptr< ReplacementData > &replacement_data, const PacketPtr pkt) override
Update replacement data.
DuelingMonitor duelingMonitor
A dueling monitor that decides which is the best sub-policy based on their number of misses.
Base *const replPolicyA
Sub-replacement policy used in this multiple container.
gem5::replacement_policy::Dueling::DuelingStats duelingStats
void invalidate(const std::shared_ptr< ReplacementData > &replacement_data) override
Invalidate replacement data to set it as the next probable victim.
#define ADD_STAT(n,...)
Convenience macro to add a stat to a statistics group.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
#define panic_if(cond,...)
Conditional panic macro that checks the supplied condition and only panics if the condition is true a...
const Params & params() const
Copyright (c) 2024 Arm Limited All rights reserved.
std::vector< ReplaceableEntry * > ReplacementCandidates
Replacement candidates as chosen by the indexing policy.
Dueler-specific implementation of replacement data.
DuelingStats(statistics::Group *parent)
statistics::Scalar selectedB
Number of times B was selected on victimization.
statistics::Scalar selectedA
Number of times A was selected on victimization.