31#include "debug/HWPrefetch.hh"
33#include "params/DCPTPrefetcher.hh"
34#include "params/DeltaCorrelatingPredictionTables.hh"
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))
65 unsigned int delta_bits)
67 if ((address - lastAddress) != 0) {
68 Addr delta = address - lastAddress;
70 Addr max_positive_delta = (1 << (delta_bits-1)) - 1;
71 if (address > lastAddress) {
73 if (delta > max_positive_delta) {
78 if (lastAddress - address > (max_positive_delta + 1)) {
82 deltas.push_back(delta);
83 lastAddress = address;
91 assert(deltas.full());
94 const int delta_penultimate = *(deltas.end() - 2);
95 const int delta_last = *(deltas.end() - 1);
98 if (delta_last == 0 || delta_penultimate == 0) {
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)) {
116 while (it != deltas.end()) {
117 const int pf_delta = *(it++);
133 DPRINTF(HWPrefetch,
"Ignoring request with no PC.\n");
140 if (entry !=
nullptr) {
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.
Addr getPC() const
Returns the program counter that generated this request.
Addr getAddr() const
Obtains the address value of this Prefetcher address.
bool hasPC() const
Returns true if the associated program counter is valid.
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.
AssociativeCache< DCPTEntry > table
The main table.
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.
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...
Copyright (c) 2024 - Pranith Kumar Copyright (c) 2020 Inria All rights reserved.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Provides generic cache lookup functions.
DCPT Table entry datatype.
CircularQueue< Addr > deltas
Stored deltas.
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.
Addr lastAddress
Last accessed address.
void getCandidates(std::vector< Queued::AddrPriority > &pfs, unsigned int mask_bits) const
Attempt to generate prefetch candidates using the two most recent deltas.
void invalidate() override
Invalidate the block.
const std::string & name()