Go to the documentation of this file.
34 #include "debug/HWPrefetch.hh"
36 #include "params/SignaturePathPrefetcher.hh"
47 stridesPerPatternEntry(
p.strides_per_pattern_entry),
48 signatureShift(
p.signature_shift),
49 signatureBits(
p.signature_bits),
50 prefetchConfidenceThreshold(
p.prefetch_confidence_threshold),
51 lookaheadConfidenceThreshold(
p.lookahead_confidence_threshold),
52 signatureTable(
p.signature_table_assoc,
p.signature_table_entries,
53 p.signature_table_indexing_policy,
54 p.signature_table_replacement_policy),
55 patternTable(
p.pattern_table_assoc,
p.pattern_table_entries,
56 p.pattern_table_indexing_policy,
57 p.pattern_table_replacement_policy,
61 "The prefetch confidence threshold must be greater than 0\n");
63 "The prefetch confidence threshold must be less than 1\n");
65 "The lookahead confidence threshold must be greater than 0\n");
67 "The lookahead confidence threshold must be less than 1\n");
74 if (pstride_entry ==
nullptr) {
82 unsigned long current_counter = ULONG_MAX;
84 if (entry.counter < current_counter) {
85 victim_pstride_entry = &entry;
86 current_counter = entry.
counter;
90 pstride_entry = victim_pstride_entry;
94 return *pstride_entry;
102 stride_t block = last_block + delta;
108 if (num_cross_pages >
ppn) {
112 pf_ppn =
ppn - num_cross_pages;
122 pf_ppn =
ppn + num_cross_pages;
134 DPRINTF(HWPrefetch,
"Queuing prefetch to %#x.\n", new_addr);
142 new_signature = current_block;
144 new_stride = current_block;
167 double &initial_confidence)
170 if (signature_entry !=
nullptr) {
176 assert(signature_entry !=
nullptr);
180 initial_confidence,
stride);
186 return *signature_entry;
193 if (pattern_entry !=
nullptr) {
199 assert(pattern_entry !=
nullptr);
201 patternTable.insertEntry(signature,
false, pattern_entry);
203 return *pattern_entry;
218 if (lookahead_confidence > 0.95) {
224 lookahead_confidence = 0.95;
226 return lookahead_confidence;
238 double initial_confidence = 1.0;
245 current_block, miss,
stride, initial_confidence);
265 double current_confidence = initial_confidence;
278 if (current_pattern_entry !=
nullptr) {
279 unsigned long max_counter = 0;
280 for (
auto const &entry : current_pattern_entry->
strideEntries) {
282 if (max_counter < entry.counter) {
286 double prefetch_confidence =
290 assert(entry.stride != 0);
293 current_confidence, current_signature,
294 is_secure, addresses);
299 if (lookahead !=
nullptr) {
301 *current_pattern_entry, *lookahead);
304 current_stride += lookahead->
stride;
306 current_confidence = 0.0;
317 if (addresses.empty()) {
320 is_secure, addresses);
Addr getAddr() const
Obtains the address value of this Prefetcher address.
double calcSaturation() const
Calculate saturation percentile of the current counter's value with regard to its maximum possible va...
stride_t stride
stride in a page in blkSize increments
std::pair< Addr, int32_t > AddrPriority
bool isSecure() const
Returns true if the address targets the secure memory space.
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.
const double lookaheadConfidenceThreshold
Minimum confidence to keep navigating lookahead entries.
Signature entry data type.
virtual double calculateLookaheadConfidence(PatternEntry const &sig, PatternStrideEntry const &lookahead) const
Computes the lookahead path confidence of the provided pattern entry.
const double prefetchConfidenceThreshold
Minimum confidence to issue a prefetch.
signature_t signature
Path signature.
uint16_t signature_t
Signature type.
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.
PatternStrideEntry * findStride(stride_t stride)
Returns the entry with the desired stride.
virtual void increasePatternEntryCounter(PatternEntry &pattern_entry, PatternStrideEntry &pstride_entry)
Increases the counter of a given PatternEntry/PatternStrideEntry.
void updatePatternTable(Addr signature, stride_t stride)
Updates the pattern table with the provided signature and stride.
int16_t stride_t
Stride type.
stride_t lastBlock
Last accessed block within a page.
void reset()
Reset the counter to its initial value.
A stride entry with its counter.
PatternEntry & getPatternEntry(Addr signature)
Obtains the PatternEntry of the given signature, if the signature is not found, it allocates a new on...
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses) override
PatternStrideEntry & getStrideEntry(stride_t stride)
Gets the entry with the provided stride, if there is no entry with the associated stride,...
SignaturePath(const SignaturePathPrefetcherParams &p)
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...
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
GEM5_DEPRECATED_NAMESPACE(GuestABI, guest_abi)
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.
AssociativeSet< SignatureEntry > signatureTable
Signature table.
AssociativeSet< PatternEntry > patternTable
Pattern table.
Pattern entry data type, a set of stride and counter entries.
unsigned blkSize
The block size of the parent cache.
std::vector< PatternStrideEntry > strideEntries
group of stides
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,...
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
virtual double calculatePrefetchConfidence(PatternEntry const &sig, PatternStrideEntry const &entry) const
Computes the prefetch confidence of the provided pattern entry.
Bitfield< 21, 20 > stride
signature_t updateSignature(signature_t sig, stride_t str) const
Generates a new signature from an existing one and a new stride.
Class containing the information needed by the prefetch to train and generate new prefetch requests.
SatCounter8 counter
Saturating counter.
Generated on Tue Feb 8 2022 11:47:10 for gem5 by doxygen 1.8.17