Go to the documentation of this file.
31 #include "debug/HWPrefetch.hh"
33 #include "params/AMPMPrefetcher.hh"
34 #include "params/AccessMapPatternMatching.hh"
39 const AccessMapPatternMatchingParams *
p)
41 startDegree(
p->start_degree), hotZoneSize(
p->hot_zone_size),
42 highCoverageThreshold(
p->high_coverage_threshold),
43 lowCoverageThreshold(
p->low_coverage_threshold),
44 highAccuracyThreshold(
p->high_accuracy_threshold),
45 lowAccuracyThreshold(
p->low_accuracy_threshold),
46 highCacheHitThreshold(
p->high_cache_hit_threshold),
47 lowCacheHitThreshold(
p->low_cache_hit_threshold),
48 epochCycles(
p->epoch_cycles),
49 offChipMemoryLatency(
p->offchip_memory_latency),
50 accessMapTable(
p->access_map_table_assoc,
p->access_map_table_entries,
51 p->access_map_table_indexing_policy,
52 p->access_map_table_replacement_policy,
54 numGoodPrefetches(0), numTotalPrefetches(0), numRawCacheMisses(0),
55 numRawCacheHits(0), degree(startDegree), usefulDegree(startDegree),
59 "the hot zone size must be a power of 2");
72 double prefetch_accuracy =
74 double prefetch_coverage =
107 if (am_entry !=
nullptr) {
111 assert(am_entry !=
nullptr);
123 entry.
states[block] = state;
148 panic(
"Impossible path\n");
157 assert(addresses.empty());
171 assert(am_entry_curr != am_entry_prev);
172 assert(am_entry_curr != am_entry_next);
173 assert(am_entry_prev != am_entry_next);
174 assert(am_entry_curr !=
nullptr);
185 for (
unsigned idx = 0; idx < lines_per_zone; idx += 1) {
188 states[idx + lines_per_zone] = am_entry_curr->
states[idx];
189 states[idx + 2 * lines_per_zone] =
200 Addr states_current_block = current_block + lines_per_zone;
208 if (
stride > current_block) {
223 if (addresses.size() ==
degree) {
232 if (current_block +
stride >= lines_per_zone) {
236 Addr blk = (states_current_block +
stride) % lines_per_zone;
247 if (addresses.size() ==
degree) {
269 AccessMapPatternMatchingParams::create()
275 AMPMPrefetcherParams::create()
const double lowCoverageThreshold
A prefetch coverage factor smaller than this is considered low.
uint64_t numTotalPrefetches
Number of prefetches issued.
uint64_t numGoodPrefetches
Number of good prefetches.
void calculatePrefetch(const Base::PrefetchInfo &pfi, std::vector< Queued::AddrPriority > &addresses)
AMPM(const AMPMPrefetcherParams *p)
void processEpochEvent()
This event constitues the epoch of the statistics that keep track of the prefetcher accuracy,...
const Tick offChipMemoryLatency
Off chip memory latency to use for the epoch bandwidth calculation.
AccessMapState
Data type representing the state of a cacheline in the access map.
void startup() override
startup() is the final initialization call before simulation.
AccessMapEntry data type.
AccessMapPatternMatching & ampm
const Cycles epochCycles
Cycles in an epoch period.
uint64_t numRawCacheMisses
Number of raw cache misses.
AccessMapPatternMatching(const AccessMapPatternMatchingParams *p)
unsigned degree
Current degree.
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 ...
const double highCacheHitThreshold
A cache hit ratio bigger than this is considered high.
const double lowAccuracyThreshold
A prefetch accuracy factor smaller than this is considered low.
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses) override
The ClockedObject class extends the SimObject with a clock and accessor functions to relate ticks to ...
void schedule(Event &event, Tick when)
const double highCoverageThreshold
A prefetch coverage factor bigger than this is considered high.
uint64_t numRawCacheHits
Number of raw cache hits.
const unsigned limitStride
Limit the stride checking to -limitStride/+limitStride.
const double highAccuracyThreshold
A prefetch accuracy factor bigger than this is considered high.
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...
Copyright (c) 2018 Metempsy Technology Consulting All rights reserved.
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...
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
const std::string & name()
bool isSecure() const
Returns true if the address targets the secure memory space.
AssociativeSet< AccessMapEntry > accessMapTable
Access map table.
std::vector< AccessMapState > states
vector containing the state of the cachelines in this zone
Class containing the information needed by the prefetch to train and generate new prefetch requests.
const uint64_t hotZoneSize
Amount of memory covered by a hot zone.
Bitfield< 21, 20 > stride
void setEntryState(AccessMapEntry &entry, Addr block, enum AccessMapState state)
Updates the state of a block within an AccessMapEntry, also updates the prefetcher metrics.
EventFunctionWrapper epochEvent
unsigned usefulDegree
Current useful degree.
#define fatal_if(cond,...)
Conditional fatal macro that checks the supplied condition and only causes a fatal error if the condi...
Addr getAddr() const
Obtains the address value of this Prefetcher address.
bool isPowerOf2(const T &n)
const double lowCacheHitThreshold
A cache hit ratio smaller than this is considered low.
const unsigned blkSize
Cacheline size used by the prefetcher using this object.
#define panic(...)
This implements a cprintf based panic() function.
Generated on Wed Sep 30 2020 14:02:12 for gem5 by doxygen 1.8.17