gem5 v24.0.0.0
Loading...
Searching...
No Matches
delta_correlating_prediction_tables.cc
Go to the documentation of this file.
1
30
31#include "debug/HWPrefetch.hh"
33#include "params/DCPTPrefetcher.hh"
34#include "params/DeltaCorrelatingPredictionTables.hh"
35
36namespace gem5
37{
38
39namespace prefetch
40{
41
43 const DeltaCorrelatingPredictionTablesParams &p) : SimObject(p),
44 deltaBits(p.delta_bits), deltaMaskBits(p.delta_mask_bits),
45 table((name() + "DCPT").c_str(), p.table_entries,
46 p.table_assoc, p.table_replacement_policy,
47 p.table_indexing_policy, DCPTEntry(p.deltas_per_entry))
48{
49}
50
51void
62
63void
65 unsigned int delta_bits)
66{
67 if ((address - lastAddress) != 0) {
68 Addr delta = address - lastAddress;
69 // Account for the sign bit
70 Addr max_positive_delta = (1 << (delta_bits-1)) - 1;
71 if (address > lastAddress) {
72 // check positive delta overflow
73 if (delta > max_positive_delta) {
74 delta = 0;
75 }
76 } else {
77 // check negative delta overflow
78 if (lastAddress - address > (max_positive_delta + 1)) {
79 delta = 0;
80 }
81 }
82 deltas.push_back(delta);
83 lastAddress = address;
84 }
85}
86
87void
89 std::vector<Queued::AddrPriority> &pfs, unsigned int mask) const
90{
91 assert(deltas.full());
92
93 // Get the two most recent deltas
94 const int delta_penultimate = *(deltas.end() - 2);
95 const int delta_last = *(deltas.end() - 1);
96
97 // a delta 0 means that it overflowed, we can not match it
98 if (delta_last == 0 || delta_penultimate == 0) {
99 return;
100 }
101
102 // Try to find the two most recent deltas in a previous position on the
103 // delta circular array, if found, start issuing prefetches using the
104 // remaining deltas (adding each delta to the last Addr to generate the
105 // prefetched address.
106 auto it = deltas.begin();
107 for (; it != (deltas.end() - 2); ++it) {
108 const int prev_delta_penultimate = *it;
109 const int prev_delta_last = *(it + 1);
110 if ((prev_delta_penultimate >> mask) == (delta_penultimate >> mask) &&
111 (prev_delta_last >> mask) == (delta_last >> mask)) {
112 // Pattern found. Skip the matching pair and issue prefetches with
113 // the remaining deltas
114 it += 2;
115 Addr addr = lastAddress;
116 while (it != deltas.end()) {
117 const int pf_delta = *(it++);
118 addr += pf_delta;
119 pfs.push_back(Queued::AddrPriority(addr, 0));
120 }
121 break;
122 }
123 }
124}
125
126void
128 const Base::PrefetchInfo &pfi,
130 const CacheAccessor &cache)
131{
132 if (!pfi.hasPC()) {
133 DPRINTF(HWPrefetch, "Ignoring request with no PC.\n");
134 return;
135 }
136 Addr address = pfi.getAddr();
137 Addr pc = pfi.getPC();
138 // Look up table entry
139 DCPTEntry *entry = table.findEntry(pc);
140 if (entry != nullptr) {
141 entry->addAddress(address, deltaBits);
142 //Delta correlating
143 entry->getCandidates(addresses, deltaMaskBits);
144 } else {
145 entry = table.findVictim(pc);
146
147 table.insertEntry(pc, entry);
148
149 entry->lastAddress = address;
150 }
151}
152
153DCPT::DCPT(const DCPTPrefetcherParams &p)
154 : Queued(p), dcpt(*p.dcpt)
155{
156}
157
158void
160 std::vector<AddrPriority> &addresses,
161 const CacheAccessor &cache)
162{
163 dcpt.calculatePrefetch(pfi, addresses, cache);
164}
165
166} // namespace prefetch
167} // namespace gem5
#define DPRINTF(x,...)
Definition trace.hh:210
virtual void invalidate()
Invalidate the block.
Abstract superclass for simulation objects.
Class containing the information needed by the prefetch to train and generate new prefetch requests.
Definition base.hh:111
Addr getPC() const
Returns the program counter that generated this request.
Definition base.hh:156
Addr getAddr() const
Obtains the address value of this Prefetcher address.
Definition base.hh:138
bool hasPC() const
Returns true if the associated program counter is valid.
Definition base.hh:166
DCPT(const DCPTPrefetcherParams &p)
DeltaCorrelatingPredictionTables & dcpt
DCPT object.
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses, const CacheAccessor &cache) override
DeltaCorrelatingPredictionTables(const DeltaCorrelatingPredictionTablesParams &p)
const unsigned int deltaBits
Number of bits of each delta.
void calculatePrefetch(const Base::PrefetchInfo &pfi, std::vector< Queued::AddrPriority > &addresses, const CacheAccessor &cache)
Computes the prefetch candidates given a prefetch event.
const unsigned int deltaMaskBits
Number of lower bits to ignore from the deltas.
STL pair class.
Definition stl.hh:58
STL vector class.
Definition stl.hh:37
void push_back(typename std::vector< T >::value_type val)
Pushes an element at the end of the queue.
void flush()
Remove all the elements in the queue.
bool full() const
Is the queue full? A queue is full if the head is the 0^{th} element and the tail is the (size-1)^{th...
Bitfield< 3, 0 > mask
Definition pcstate.hh:63
Bitfield< 4 > pc
Bitfield< 0 > p
Bitfield< 3 > addr
Definition types.hh:84
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
Definition binary32.hh:36
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition types.hh:147
Provides generic cache lookup functions.
void addAddress(Addr address, unsigned int delta_num_bits)
Adds an address to the entry, if the entry already existed, a delta will be generated.
void getCandidates(std::vector< Queued::AddrPriority > &pfs, unsigned int mask_bits) const
Attempt to generate prefetch candidates using the two most recent deltas.
const std::string & name()
Definition trace.cc:48

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