34#include "debug/HWPrefetch.hh"
35#include "params/SignaturePathPrefetcher.hh"
45 stridesPerPatternEntry(
p.strides_per_pattern_entry),
46 signatureShift(
p.signature_shift),
47 signatureBits(
p.signature_bits),
48 prefetchConfidenceThreshold(
p.prefetch_confidence_threshold),
49 lookaheadConfidenceThreshold(
p.lookahead_confidence_threshold),
50 signatureTable((
name() +
".SignatureTable").c_str(),
51 p.signature_table_entries,
52 p.signature_table_assoc,
53 p.signature_table_replacement_policy,
54 p.signature_table_indexing_policy,
56 patternTable((
name() +
".PatternTable").c_str(),
57 p.pattern_table_entries,
58 p.pattern_table_assoc,
59 p.pattern_table_replacement_policy,
60 p.pattern_table_indexing_policy,
65 "The prefetch confidence threshold must be greater than 0\n");
67 "The prefetch confidence threshold must be less than 1\n");
69 "The lookahead confidence threshold must be greater than 0\n");
71 "The lookahead confidence threshold must be less than 1\n");
78 if (pstride_entry ==
nullptr) {
86 unsigned long current_counter = ULONG_MAX;
88 if (entry.counter < current_counter) {
89 victim_pstride_entry = &entry;
90 current_counter = entry.
counter;
94 pstride_entry = victim_pstride_entry;
98 return *pstride_entry;
106 stride_t block = last_block + delta;
112 if (num_cross_pages >
ppn) {
116 pf_ppn =
ppn - num_cross_pages;
126 pf_ppn =
ppn + num_cross_pages;
138 DPRINTF(HWPrefetch,
"Queuing prefetch to %#x.\n", new_addr);
146 new_signature = current_block;
148 new_stride = current_block;
171 double &initial_confidence)
175 if (signature_entry !=
nullptr) {
181 assert(signature_entry !=
nullptr);
185 initial_confidence,
stride);
191 return *signature_entry;
199 if (pattern_entry !=
nullptr) {
205 assert(pattern_entry !=
nullptr);
209 return *pattern_entry;
224 if (lookahead_confidence > 0.95) {
230 lookahead_confidence = 0.95;
232 return lookahead_confidence;
245 double initial_confidence = 1.0;
252 current_block, miss,
stride, initial_confidence);
272 double current_confidence = initial_confidence;
285 if (current_pattern_entry !=
nullptr) {
286 unsigned long max_counter = 0;
287 for (
auto const &entry : current_pattern_entry->
strideEntries) {
289 if (max_counter < entry.counter) {
293 double prefetch_confidence =
297 assert(entry.stride != 0);
300 current_confidence, current_signature,
301 is_secure, addresses);
306 if (lookahead !=
nullptr) {
308 *current_pattern_entry, *lookahead);
311 current_stride += lookahead->
stride;
313 current_confidence = 0.0;
324 if (addresses.empty()) {
327 is_secure, addresses);
Class containing the information needed by the prefetch to train and generate new prefetch requests.
bool isSecure() const
Returns true if the address targets the secure memory space.
Addr getAddr() const
Obtains the address value of this Prefetcher address.
unsigned blkSize
The block size of the parent cache.
std::pair< Addr, int32_t > AddrPriority
SignaturePath(const SignaturePathPrefetcherParams &p)
virtual void auxiliaryPrefetcher(Addr ppn, stride_t current_block, bool is_secure, std::vector< AddrPriority > &addresses)
Auxiliar prefetch mechanism used at the end of calculatePrefetch.
AssociativeCache< SignatureEntry > signatureTable
Signature table.
int16_t stride_t
Stride type.
const double prefetchConfidenceThreshold
Minimum confidence to issue a prefetch.
virtual double calculatePrefetchConfidence(PatternEntry const &sig, PatternStrideEntry const &entry) const
Computes the prefetch confidence of the provided pattern entry.
signature_t updateSignature(signature_t sig, stride_t str) const
Generates a new signature from an existing one and a new stride.
void addPrefetch(Addr ppn, stride_t last_block, stride_t delta, double path_confidence, signature_t signature, bool is_secure, std::vector< AddrPriority > &addresses)
Generates an address to be prefetched.
const double lookaheadConfidenceThreshold
Minimum confidence to keep navigating lookahead entries.
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses, const CacheAccessor &cache) override
virtual void handlePageCrossingLookahead(signature_t signature, stride_t last_offset, stride_t delta, double path_confidence)
Handles the situation when the lookahead process has crossed the boundaries of the current page.
virtual double calculateLookaheadConfidence(PatternEntry const &sig, PatternStrideEntry const &lookahead) const
Computes the lookahead path confidence of the provided pattern entry.
uint16_t signature_t
Signature type.
virtual void handleSignatureTableMiss(stride_t current_block, signature_t &new_signature, double &new_conf, stride_t &new_stride)
Whenever a new SignatureEntry is allocated, it computes the new signature to be used with the new ent...
AssociativeCache< PatternEntry > patternTable
Pattern table.
void updatePatternTable(Addr signature, stride_t stride)
Updates the pattern table with the provided signature and stride.
SignatureEntry & getSignatureEntry(Addr ppn, bool is_secure, stride_t block, bool &miss, stride_t &stride, double &initial_confidence)
Obtains the SignatureEntry of the given page, if the page is not found, it allocates a new one,...
PatternEntry & getPatternEntry(Addr signature)
Obtains the PatternEntry of the given signature, if the signature is not found, it allocates a new on...
virtual void increasePatternEntryCounter(PatternEntry &pattern_entry, PatternStrideEntry &pstride_entry)
Increases the counter of a given PatternEntry/PatternStrideEntry.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
double calcSaturation() const
Calculate saturation percentile of the current counter's value with regard to its maximum possible va...
void reset()
Reset the counter to its initial value.
Bitfield< 21, 20 > stride
Copyright (c) 2024 Arm Limited All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
static constexpr auto genTagExtractor(BTBIndexingPolicy *ip)
This helper generates a tag extractor function object which will be typically used by Replaceable ent...
Provides generic cache lookup functions.
Pattern entry data type, a set of stride and counter entries.
std::vector< PatternStrideEntry > strideEntries
group of stides
PatternStrideEntry & getStrideEntry(stride_t stride)
Gets the entry with the provided stride, if there is no entry with the associated stride,...
PatternStrideEntry * findStride(stride_t stride)
Returns the entry with the desired stride.
A stride entry with its counter.
stride_t stride
stride in a page in blkSize increments
SatCounter8 counter
Saturating counter.
Signature entry data type.
signature_t signature
Path signature.
stride_t lastBlock
Last accessed block within a page.
const std::string & name()