gem5 v24.0.0.0
Loading...
Searching...
No Matches
signature_path_v2.cc
Go to the documentation of this file.
1
30
31#include <cassert>
32
33#include "debug/HWPrefetch.hh"
35#include "params/SignaturePathPrefetcherV2.hh"
36
37namespace gem5
38{
39
40namespace prefetch
41{
42
43SignaturePathV2::SignaturePathV2(const SignaturePathPrefetcherV2Params &p)
45 globalHistoryRegister((name() + ".GlobalHistoryRegister").c_str(),
46 p.global_history_register_entries,
47 p.global_history_register_entries,
48 p.global_history_register_replacement_policy,
49 p.global_history_register_indexing_policy,
51{
52}
53
54void
56 signature_t &new_signature, double &new_conf, stride_t &new_stride)
57{
58 bool found = false;
59
60 // This should return all entries of the GHR, since it is a fully
61 // associative table
62 std::vector<GlobalHistoryEntry *> all_ghr_entries =
63 globalHistoryRegister.getPossibleEntries(0 /* any value works */);
64
65 for (auto gh_entry : all_ghr_entries) {
66 if (gh_entry->lastBlock + gh_entry->delta == current_block) {
67 new_signature = gh_entry->signature;
68 new_conf = gh_entry->confidence;
69 new_stride = gh_entry->delta;
70 found = true;
71 globalHistoryRegister.accessEntry(gh_entry);
72 break;
73 }
74 }
75 if (!found) {
76 new_signature = current_block;
77 new_conf = 1.0;
78 new_stride = current_block;
79 }
80}
81
82double
84 PatternEntry const &sig, PatternStrideEntry const &lookahead) const
85{
86 if (sig.counter == 0) return 0.0;
87 return (((double) usefulPrefetches) / issuedPrefetches) *
88 (((double) lookahead.counter) / sig.counter);
89}
90
91double
93 PatternStrideEntry const &entry) const
94{
95 if (sig.counter == 0) return 0.0;
96 return ((double) entry.counter) / sig.counter;
97}
98
99void
101 PatternEntry &pattern_entry, PatternStrideEntry &pstride_entry)
102{
103 if (pattern_entry.counter.isSaturated()) {
104 pattern_entry.counter >>= 1;
105 for (auto &entry : pattern_entry.strideEntries) {
106 entry.counter >>= 1;
107 }
108 }
109 if (pstride_entry.counter.isSaturated()) {
110 pattern_entry.counter >>= 1;
111 for (auto &entry : pattern_entry.strideEntries) {
112 entry.counter >>= 1;
113 }
114 }
115 pattern_entry.counter++;
116 pstride_entry.counter++;
117}
118
119void
121 stride_t last_offset, stride_t delta, double path_confidence)
122{
123 // Always use the replacement policy to assign new entries, as all
124 // of them are unique, there are never "hits" in the GHR
125 GlobalHistoryEntry *gh_entry = globalHistoryRegister.findVictim(0);
126 assert(gh_entry != nullptr);
127 // Any address value works, as it is never used
128 globalHistoryRegister.insertEntry(0, gh_entry);
129
130 gh_entry->signature = signature;
131 gh_entry->lastBlock = last_offset;
132 gh_entry->delta = delta;
133 gh_entry->confidence = path_confidence;
134}
135
136} // namespace prefetch
137} // namespace gem5
uint64_t issuedPrefetches
Total prefetches issued.
Definition base.hh:372
uint64_t usefulPrefetches
Total prefetches that has been useful.
Definition base.hh:374
double calculateLookaheadConfidence(PatternEntry const &sig, PatternStrideEntry const &lookahead) const override
Computes the lookahead path confidence of the provided pattern entry.
virtual void handlePageCrossingLookahead(signature_t signature, stride_t last_offset, stride_t delta, double path_confidence) override
Handles the situation when the lookahead process has crossed the boundaries of the current page.
void increasePatternEntryCounter(PatternEntry &pattern_entry, PatternStrideEntry &pstride_entry) override
Increases the counter of a given PatternEntry/PatternStrideEntry.
SignaturePathV2(const SignaturePathPrefetcherV2Params &p)
void handleSignatureTableMiss(stride_t current_block, signature_t &new_signature, double &new_conf, stride_t &new_stride) override
Whenever a new SignatureEntry is allocated, it computes the new signature to be used with the new ent...
double calculatePrefetchConfidence(PatternEntry const &sig, PatternStrideEntry const &lookahead) const override
Computes the prefetch confidence of the provided pattern entry.
AssociativeCache< GlobalHistoryEntry > globalHistoryRegister
Global History Register.
uint16_t signature_t
Signature type.
STL vector class.
Definition stl.hh:37
bool isSaturated() const
Whether the counter has achieved its maximum value or not.
Bitfield< 0 > p
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
Global History Register entry datatype.
Pattern entry data type, a set of stride and counter entries.
std::vector< PatternStrideEntry > strideEntries
group of stides
SatCounter8 counter
use counter, used by SPPv2
const std::string & name()
Definition trace.cc:48

Generated on Tue Jun 18 2024 16:24:05 for gem5 by doxygen 1.11.0