gem5  v20.0.0.2
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
signature_path.hh
Go to the documentation of this file.
1 
40 #ifndef __MEM_CACHE_PREFETCH_SIGNATURE_PATH_HH__
41 #define __MEM_CACHE_PREFETCH_SIGNATURE_PATH_HH__
42 
43 #include "base/sat_counter.hh"
46 #include "mem/packet.hh"
47 
48 struct SignaturePathPrefetcherParams;
49 
50 namespace Prefetcher {
51 
52 class SignaturePath : public Queued
53 {
54  protected:
56  typedef uint16_t signature_t;
58  typedef int16_t stride_t;
59 
61  const unsigned stridesPerPatternEntry;
63  const uint8_t signatureShift;
65  const signature_t signatureBits;
70 
72  struct SignatureEntry : public TaggedEntry
73  {
75  signature_t signature;
77  stride_t lastBlock;
78  SignatureEntry() : signature(0), lastBlock(0)
79  {}
80  };
83 
86  {
88  stride_t stride;
91  PatternStrideEntry(unsigned bits) : stride(0), counter(bits)
92  {}
93  };
95  struct PatternEntry : public TaggedEntry
96  {
101  PatternEntry(size_t num_strides, unsigned counter_bits)
102  : TaggedEntry(), strideEntries(num_strides, counter_bits),
103  counter(counter_bits)
104  {
105  }
106 
108  void
109  invalidate() override
110  {
112  for (auto &entry : strideEntries) {
113  entry.counter.reset();
114  entry.stride = 0;
115  }
116  counter.reset();
117  }
118 
126  {
127  PatternStrideEntry *found_entry = nullptr;
128  for (auto &entry : strideEntries) {
129  if (entry.stride == stride) {
130  found_entry = &entry;
131  break;
132  }
133  }
134  return found_entry;
135  }
136 
143  PatternStrideEntry &getStrideEntry(stride_t stride);
144  };
147 
154  inline signature_t updateSignature(signature_t sig, stride_t str) const {
155  sig <<= signatureShift;
156  sig ^= str;
157  sig &= mask(signatureBits);
158  return sig;
159  }
160 
175  void addPrefetch(Addr ppn, stride_t last_block, stride_t delta,
176  double path_confidence, signature_t signature,
177  bool is_secure,
178  std::vector<AddrPriority> &addresses);
179 
193  SignatureEntry &getSignatureEntry(Addr ppn, bool is_secure, stride_t block,
194  bool &miss, stride_t &stride, double &initial_confidence);
201  PatternEntry& getPatternEntry(Addr signature);
202 
209  void updatePatternTable(Addr signature, stride_t stride);
210 
217  virtual double calculateLookaheadConfidence(PatternEntry const &sig,
218  PatternStrideEntry const &lookahead) const;
219 
226  virtual double calculatePrefetchConfidence(PatternEntry const &sig,
227  PatternStrideEntry const &entry) const;
228 
234  virtual void increasePatternEntryCounter(PatternEntry &pattern_entry,
235  PatternStrideEntry &pstride_entry);
236 
247  virtual void handleSignatureTableMiss(stride_t current_block,
248  signature_t &new_signature, double &new_conf,
249  stride_t &new_stride);
250 
262  virtual void auxiliaryPrefetcher(Addr ppn, stride_t current_block,
263  bool is_secure, std::vector<AddrPriority> &addresses);
264 
277  virtual void handlePageCrossingLookahead(signature_t signature,
278  stride_t last_offset, stride_t delta, double path_confidence) {
279  }
280 
281  public:
282  SignaturePath(const SignaturePathPrefetcherParams* p);
283  ~SignaturePath() = default;
284 
285  void calculatePrefetch(const PrefetchInfo &pfi,
286  std::vector<AddrPriority> &addresses) override;
287 };
288 
289 } // namespace Prefetcher
290 
291 #endif//__MEM_CACHE_PREFETCH_SIGNATURE_PATH_HH__
AssociativeSet< SignatureEntry > signatureTable
Signature table.
PatternStrideEntry * findStride(stride_t stride)
Returns the entry with the desired stride.
Bitfield< 21, 20 > stride
virtual void handlePageCrossingLookahead(signature_t signature, stride_t last_offset, stride_t delta, double path_confidence)
Handles the situation when the lookahead process has crossed the boundaries of the current page...
stride_t stride
stride in a page in blkSize increments
void updatePatternTable(Addr signature, stride_t stride)
Updates the pattern table with the provided signature and stride.
signature_t signature
Path signature.
SignaturePath(const SignaturePathPrefetcherParams *p)
signature_t updateSignature(signature_t sig, stride_t str) const
Generates a new signature from an existing one and a new stride.
const uint8_t signatureShift
Number of bits to shift when generating a new signature.
PatternEntry(size_t num_strides, unsigned counter_bits)
SignatureEntry & getSignatureEntry(Addr ppn, bool is_secure, stride_t block, bool &miss, stride_t &stride, double &initial_confidence)
Obtains the SignatureEntry of the given page, if the page is not found, it allocates a new one...
Class containing the information needed by the prefetch to train and generate new prefetch requests...
Definition: base.hh:91
STL vector class.
Definition: stl.hh:37
PatternEntry & getPatternEntry(Addr signature)
Obtains the PatternEntry of the given signature, if the signature is not found, it allocates a new on...
const signature_t signatureBits
Size of the signature, in bits.
std::vector< PatternStrideEntry > strideEntries
group of stides
Implements an n bit saturating counter and provides methods to increment, decrement, and read it.
Definition: sat_counter.hh:54
uint16_t signature_t
Signature type.
virtual void increasePatternEntryCounter(PatternEntry &pattern_entry, PatternStrideEntry &pstride_entry)
Increases the counter of a given PatternEntry/PatternStrideEntry.
void reset()
Reset the counter to its initial value.
Definition: sat_counter.hh:228
virtual void auxiliaryPrefetcher(Addr ppn, stride_t current_block, bool is_secure, std::vector< AddrPriority > &addresses)
Auxiliar prefetch mechanism used at the end of calculatePrefetch.
virtual double calculateLookaheadConfidence(PatternEntry const &sig, PatternStrideEntry const &lookahead) const
Computes the lookahead path confidence of the provided pattern entry.
stride_t lastBlock
Last accessed block within a page.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:140
Associative container based on the previosuly defined Entry type Each element is indexed by a key of ...
void addPrefetch(Addr ppn, stride_t last_block, stride_t delta, double path_confidence, signature_t signature, bool is_secure, std::vector< AddrPriority > &addresses)
Generates an address to be prefetched.
SatCounter counter
Saturating counter.
AssociativeSet< PatternEntry > patternTable
Pattern table.
const double prefetchConfidenceThreshold
Minimum confidence to issue a prefetch.
Pattern entry data type, a set of stride and counter entries.
Declaration of the Packet class.
Bitfield< 43, 0 > ppn
Definition: pagetable.hh:44
int16_t stride_t
Stride type.
Copyright (c) 2018 Metempsy Technology Consulting All rights reserved.
virtual double calculatePrefetchConfidence(PatternEntry const &sig, PatternStrideEntry const &entry) const
Computes the prefetch confidence of the provided pattern entry.
SatCounter counter
use counter, used by SPPv2
virtual void handleSignatureTableMiss(stride_t current_block, signature_t &new_signature, double &new_conf, stride_t &new_stride)
Whenever a new SignatureEntry is allocated, it computes the new signature to be used with the new ent...
Bitfield< 3, 0 > mask
Definition: types.hh:62
void invalidate() override
Reset the entries to their initial values.
A stride entry with its counter.
T bits(T val, int first, int last)
Extract the bitfield from position &#39;first&#39; to &#39;last&#39; (inclusive) from &#39;val&#39; and right justify it...
Definition: bitfield.hh:71
virtual void invalidate()
Invalidates the entry.
Copyright (c) 2018 Metempsy Technology Consulting All rights reserved.
Definition: base.hh:78
Bitfield< 0 > p
const double lookaheadConfidenceThreshold
Minimum confidence to keep navigating lookahead entries.
const unsigned stridesPerPatternEntry
Number of strides stored in each pattern entry.
void calculatePrefetch(const PrefetchInfo &pfi, std::vector< AddrPriority > &addresses) override

Generated on Mon Jun 8 2020 15:45:11 for gem5 by doxygen 1.8.13