Go to the documentation of this file.
31 #include "debug/HWPrefetch.hh"
33 #include "params/AMPMPrefetcher.hh"
34 #include "params/AccessMapPatternMatching.hh"
44 const AccessMapPatternMatchingParams &
p)
46 startDegree(
p.start_degree), hotZoneSize(
p.hot_zone_size),
47 highCoverageThreshold(
p.high_coverage_threshold),
48 lowCoverageThreshold(
p.low_coverage_threshold),
49 highAccuracyThreshold(
p.high_accuracy_threshold),
50 lowAccuracyThreshold(
p.low_accuracy_threshold),
51 highCacheHitThreshold(
p.high_cache_hit_threshold),
52 lowCacheHitThreshold(
p.low_cache_hit_threshold),
53 epochCycles(
p.epoch_cycles),
54 offChipMemoryLatency(
p.offchip_memory_latency),
55 accessMapTable(
p.access_map_table_assoc,
p.access_map_table_entries,
56 p.access_map_table_indexing_policy,
57 p.access_map_table_replacement_policy,
59 numGoodPrefetches(0), numTotalPrefetches(0), numRawCacheMisses(0),
60 numRawCacheHits(0), degree(startDegree), usefulDegree(startDegree),
64 "the hot zone size must be a power of 2");
77 double prefetch_accuracy =
79 double prefetch_coverage =
112 if (am_entry !=
nullptr) {
116 assert(am_entry !=
nullptr);
128 entry.
states[block] = state;
153 panic(
"Impossible path\n");
162 assert(addresses.empty());
176 assert(am_entry_curr != am_entry_prev);
177 assert(am_entry_curr != am_entry_next);
178 assert(am_entry_prev != am_entry_next);
179 assert(am_entry_curr !=
nullptr);
190 for (
unsigned idx = 0; idx < lines_per_zone; idx += 1) {
193 states[idx + lines_per_zone] = am_entry_curr->
states[idx];
194 states[idx + 2 * lines_per_zone] =
205 Addr states_current_block = current_block + lines_per_zone;
213 if (
stride > current_block) {
228 if (addresses.size() ==
degree) {
237 if (current_block +
stride >= lines_per_zone) {
241 Addr blk = (states_current_block +
stride) % lines_per_zone;
252 if (addresses.size() ==
degree) {
Addr getAddr() const
Obtains the address value of this Prefetcher address.
const double lowAccuracyThreshold
A prefetch accuracy factor smaller than this is considered low.
AccessMapPatternMatching & ampm
const uint64_t hotZoneSize
Amount of memory covered by a hot zone.
AccessMapEntry data type.
bool isSecure() const
Returns true if the address targets the secure memory space.
AssociativeSet< AccessMapEntry > accessMapTable
Access map table.
const double lowCoverageThreshold
A prefetch coverage factor smaller than this is considered low.
void processEpochEvent()
This event constitues the epoch of the statistics that keep track of the prefetcher accuracy,...
const Cycles epochCycles
Cycles in an epoch period.
void calculatePrefetch(const Base::PrefetchInfo &pfi, std::vector< Queued::AddrPriority > &addresses)
void schedule(Event &event, Tick when)
const unsigned blkSize
Cacheline size used by the prefetcher using this object.
AccessMapPatternMatching(const AccessMapPatternMatchingParams &p)
static constexpr bool isPowerOf2(const T &n)
const unsigned limitStride
Limit the stride checking to -limitStride/+limitStride.
std::vector< AccessMapState > states
vector containing the state of the cachelines in this zone
AccessMapEntry * getAccessMapEntry(Addr am_addr, bool is_secure)
Obtain an AccessMapEntry from the AccessMapTable, if the entry is not found a new one is initialized ...
bool checkCandidate(std::vector< AccessMapState > const &states, Addr current, int stride) const
Given a target cacheline, this function checks if the cachelines that follow the provided stride have...
Tick cyclesToTicks(Cycles c) const
unsigned degree
Current degree.
AccessMapState
Data type representing the state of a cacheline in the access map.
const double highCacheHitThreshold
A cache hit ratio bigger than this is considered high.
unsigned usefulDegree
Current useful degree.
uint64_t numRawCacheHits
Number of raw cache hits.
uint64_t numGoodPrefetches
Number of good prefetches.
uint64_t numRawCacheMisses
Number of raw cache misses.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
uint64_t numTotalPrefetches
Number of prefetches issued.
GEM5_DEPRECATED_NAMESPACE(GuestABI, guest_abi)
const std::string & name()
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
Tick clockEdge(Cycles cycles=Cycles(0)) const
Determine the tick when a cycle begins, by default the current one, but the argument also enables the...
AMPM(const AMPMPrefetcherParams &p)
void setEntryState(AccessMapEntry &entry, Addr block, enum AccessMapState state)
Updates the state of a block within an AccessMapEntry, also updates the prefetcher metrics.
const double lowCacheHitThreshold
A cache hit ratio smaller than this is considered low.
const Tick offChipMemoryLatency
Off chip memory latency to use for the epoch bandwidth calculation.
const double highAccuracyThreshold
A prefetch accuracy factor bigger than this is considered high.
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses) override
EventFunctionWrapper epochEvent
#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....
Bitfield< 21, 20 > stride
Class containing the information needed by the prefetch to train and generate new prefetch requests.
#define panic(...)
This implements a cprintf based panic() function.
void startup() override
startup() is the final initialization call before simulation.
const double highCoverageThreshold
A prefetch coverage factor bigger than this is considered high.
Generated on Tue Sep 21 2021 12:25:29 for gem5 by doxygen 1.8.17