34 #include "debug/HWPrefetch.hh"
36 #include "params/SignaturePathPrefetcher.hh"
42 stridesPerPatternEntry(
p->strides_per_pattern_entry),
43 signatureShift(
p->signature_shift),
44 signatureBits(
p->signature_bits),
45 prefetchConfidenceThreshold(
p->prefetch_confidence_threshold),
46 lookaheadConfidenceThreshold(
p->lookahead_confidence_threshold),
47 signatureTable(
p->signature_table_assoc,
p->signature_table_entries,
48 p->signature_table_indexing_policy,
49 p->signature_table_replacement_policy),
50 patternTable(
p->pattern_table_assoc,
p->pattern_table_entries,
51 p->pattern_table_indexing_policy,
52 p->pattern_table_replacement_policy,
56 "The prefetch confidence threshold must be greater than 0\n");
58 "The prefetch confidence threshold must be less than 1\n");
60 "The lookahead confidence threshold must be greater than 0\n");
62 "The lookahead confidence threshold must be less than 1\n");
69 if (pstride_entry ==
nullptr) {
77 unsigned long current_counter = ULONG_MAX;
79 if (entry.counter < current_counter) {
80 victim_pstride_entry = &entry;
81 current_counter = entry.
counter;
85 pstride_entry = victim_pstride_entry;
89 return *pstride_entry;
103 if (num_cross_pages >
ppn) {
107 pf_ppn =
ppn - num_cross_pages;
117 pf_ppn =
ppn + num_cross_pages;
129 DPRINTF(HWPrefetch,
"Queuing prefetch to %#x.\n", new_addr);
137 new_signature = current_block;
139 new_stride = current_block;
162 double &initial_confidence)
165 if (signature_entry !=
nullptr) {
171 assert(signature_entry !=
nullptr);
175 initial_confidence,
stride);
181 return *signature_entry;
188 if (pattern_entry !=
nullptr) {
194 assert(pattern_entry !=
nullptr);
196 patternTable.insertEntry(signature,
false, pattern_entry);
198 return *pattern_entry;
213 if (lookahead_confidence > 0.95) {
219 lookahead_confidence = 0.95;
221 return lookahead_confidence;
233 double initial_confidence = 1.0;
240 current_block, miss,
stride, initial_confidence);
260 double current_confidence = initial_confidence;
273 if (current_pattern_entry !=
nullptr) {
274 unsigned long max_counter = 0;
275 for (
auto const &entry : current_pattern_entry->
strideEntries) {
277 if (max_counter < entry.counter) {
281 double prefetch_confidence =
285 assert(entry.stride != 0);
288 current_confidence, current_signature,
289 is_secure, addresses);
294 if (lookahead !=
nullptr) {
296 *current_pattern_entry, *lookahead);
299 current_stride += lookahead->
stride;
301 current_confidence = 0.0;
312 if (addresses.empty()) {
315 is_secure, addresses);
322 SignaturePathPrefetcherParams::create()