gem5  v20.1.0.0
RubyPrefetcher.cc
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2020 ARM Limited
3  * All rights reserved
4  *
5  * The license below extends only to copyright in the software and shall
6  * not be construed as granting a license to any other intellectual
7  * property including but not limited to intellectual property relating
8  * to a hardware implementation of the functionality of the software
9  * licensed hereunder. You may use the software subject to the license
10  * terms below provided that you ensure that this notice is replicated
11  * unmodified and in its entirety in all distributions of the software,
12  * modified or unmodified, in source code or in binary form.
13  *
14  * Copyright (c) 1999-2012 Mark D. Hill and David A. Wood
15  * All rights reserved.
16  *
17  * Redistribution and use in source and binary forms, with or without
18  * modification, are permitted provided that the following conditions are
19  * met: redistributions of source code must retain the above copyright
20  * notice, this list of conditions and the following disclaimer;
21  * redistributions in binary form must reproduce the above copyright
22  * notice, this list of conditions and the following disclaimer in the
23  * documentation and/or other materials provided with the distribution;
24  * neither the name of the copyright holders nor the names of its
25  * contributors may be used to endorse or promote products derived from
26  * this software without specific prior written permission.
27  *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
30  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
31  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
32  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
34  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
35  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
36  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
37  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
38  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
39  */
40 
42 
43 #include "base/bitfield.hh"
44 #include "debug/RubyPrefetcher.hh"
47 
49 RubyPrefetcherParams::create()
50 {
51  return new RubyPrefetcher(this);
52 }
53 
55  : SimObject(p), m_num_streams(p->num_streams),
56  m_array(p->num_streams), m_train_misses(p->train_misses),
57  m_num_startup_pfs(p->num_startup_pfs), m_num_unit_filters(p->unit_filter),
58  m_num_nonunit_filters(p->nonunit_filter),
59  m_unit_filter(p->unit_filter, 0),
60  m_negative_filter(p->unit_filter, 0),
61  m_nonunit_filter(p->nonunit_filter, 0),
62  m_prefetch_cross_pages(p->cross_page),
63  m_page_shift(p->sys->getPageShift())
64 {
65  assert(m_num_streams > 0);
67 
68  // create +1 stride filter
70  m_unit_filter_hit = new uint32_t[m_num_unit_filters];
71  for (uint32_t i =0; i < m_num_unit_filters; i++) {
72  m_unit_filter_hit[i] = 0;
73  }
74 
75  // create -1 stride filter
78  for (int i =0; i < m_num_unit_filters; i++) {
80  }
81 
82  // create nonunit stride filter
83  m_nonunit_index = 0;
85  m_nonunit_hit = new uint32_t[m_num_nonunit_filters];
86  for (int i =0; i < m_num_nonunit_filters; i++) {
87  m_nonunit_stride[i] = 0;
88  m_nonunit_hit[i] = 0;
89  }
90 }
91 
93 {
94  delete m_unit_filter_hit;
95  delete m_negative_filter_hit;
96  delete m_nonunit_stride;
97  delete m_nonunit_hit;
98 }
99 
100 void
102 {
104 
106  .name(name() + ".miss_observed")
107  .desc("number of misses observed")
108  ;
109 
111  .name(name() + ".allocated_streams")
112  .desc("number of streams allocated for prefetching")
113  ;
114 
116  .name(name() + ".prefetches_requested")
117  .desc("number of prefetch requests made")
118  ;
119 
120  numHits
121  .name(name() + ".hits")
122  .desc("number of prefetched blocks accessed (for the first time)")
123  ;
124 
126  .name(name() + ".partial_hits")
127  .desc("number of misses observed for a block being prefetched")
128  ;
129 
131  .name(name() + ".pages_crossed")
132  .desc("number of prefetches across pages")
133  ;
134 
136  .name(name() + ".misses_on_prefetched_blocks")
137  .desc("number of misses for blocks that were prefetched, yet missed")
138  ;
139 }
140 
141 void
142 RubyPrefetcher::observeMiss(Addr address, const RubyRequestType& type)
143 {
144  DPRINTF(RubyPrefetcher, "Observed miss for %#x\n", address);
145  Addr line_addr = makeLineAddress(address);
146  numMissObserved++;
147 
148  // check to see if we have already issued a prefetch for this block
149  uint32_t index = 0;
150  PrefetchEntry *pfEntry = getPrefetchEntry(line_addr, index);
151  if (pfEntry != NULL) {
152  if (pfEntry->requestIssued[index]) {
153  if (pfEntry->requestCompleted[index]) {
154  // We prefetched too early and now the prefetch block no
155  // longer exists in the cache
157  return;
158  } else {
159  // The controller has issued the prefetch request,
160  // but the request for the block arrived earlier.
161  numPartialHits++;
162  observePfMiss(line_addr);
163  return;
164  }
165  } else {
166  // The request is still in the prefetch queue of the controller.
167  // Or was evicted because of other requests.
168  return;
169  }
170  }
171 
172  // check to see if this address is in the unit stride filter
173  bool alloc = false;
175  m_unit_filter_index, line_addr, 1, alloc);
176  if (alloc) {
177  // allocate a new prefetch stream
178  initializeStream(line_addr, 1, getLRUindex(), type);
179  }
180  if (hit) {
181  DPRINTF(RubyPrefetcher, " *** hit in unit stride buffer\n");
182  return;
183  }
184 
186  m_negative_filter_index, line_addr, -1, alloc);
187  if (alloc) {
188  // allocate a new prefetch stream
189  initializeStream(line_addr, -1, getLRUindex(), type);
190  }
191  if (hit) {
192  DPRINTF(RubyPrefetcher, " *** hit in unit negative unit buffer\n");
193  return;
194  }
195 
196  // check to see if this address is in the non-unit stride filter
197  int stride = 0; // NULL value
198  hit = accessNonunitFilter(address, &stride, alloc);
199  if (alloc) {
200  assert(stride != 0); // ensure non-zero stride prefetches
201  initializeStream(line_addr, stride, getLRUindex(), type);
202  }
203  if (hit) {
204  DPRINTF(RubyPrefetcher, " *** hit in non-unit stride buffer\n");
205  return;
206  }
207 }
208 
209 void
211 {
212  numPartialHits++;
213  DPRINTF(RubyPrefetcher, "Observed partial hit for %#x\n", address);
214  issueNextPrefetch(address, NULL);
215 }
216 
217 void
219 {
220  numHits++;
221  DPRINTF(RubyPrefetcher, "Observed hit for %#x\n", address);
222  issueNextPrefetch(address, NULL);
223 }
224 
225 void
227 {
228  // get our corresponding stream fetcher
229  if (stream == NULL) {
230  uint32_t index = 0;
231  stream = getPrefetchEntry(address, index);
232  }
233 
234  // if (for some reason), this stream is unallocated, return.
235  if (stream == NULL) {
236  DPRINTF(RubyPrefetcher, "Unallocated stream, returning\n");
237  return;
238  }
239 
240  // extend this prefetching stream by 1 (or more)
241  Addr page_addr = pageAddress(stream->m_address);
242  Addr line_addr = makeNextStrideAddress(stream->m_address,
243  stream->m_stride);
244 
245  // possibly stop prefetching at page boundaries
246  if (page_addr != pageAddress(line_addr)) {
247  if (!m_prefetch_cross_pages) {
248  // Deallocate the stream since we are not prefetching
249  // across page boundries
250  stream->m_is_valid = false;
251  return;
252  }
253  numPagesCrossed++;
254  }
255 
256  // launch next prefetch
258  stream->m_address = line_addr;
259  stream->m_use_time = m_controller->curCycle();
260  DPRINTF(RubyPrefetcher, "Requesting prefetch for %#x\n", line_addr);
261  m_controller->enqueuePrefetch(line_addr, stream->m_type);
262 }
263 
264 uint32_t
266 {
267  uint32_t lru_index = 0;
268  Cycles lru_access = m_array[lru_index].m_use_time;
269 
270  for (uint32_t i = 0; i < m_num_streams; i++) {
271  if (!m_array[i].m_is_valid) {
272  return i;
273  }
274  if (m_array[i].m_use_time < lru_access) {
275  lru_access = m_array[i].m_use_time;
276  lru_index = i;
277  }
278  }
279 
280  return lru_index;
281 }
282 
283 void
285 {
286  m_nonunit_filter[index] = 0;
287  m_nonunit_stride[index] = 0;
288  m_nonunit_hit[index] = 0;
289 }
290 
291 void
293  uint32_t index, const RubyRequestType& type)
294 {
296 
297  // initialize the stream prefetcher
298  PrefetchEntry *mystream = &(m_array[index]);
299  mystream->m_address = makeLineAddress(address);
300  mystream->m_stride = stride;
301  mystream->m_use_time = m_controller->curCycle();
302  mystream->m_is_valid = true;
303  mystream->m_type = type;
304 
305  // create a number of initial prefetches for this stream
306  Addr page_addr = pageAddress(mystream->m_address);
307  Addr line_addr = makeLineAddress(mystream->m_address);
308 
309  // insert a number of prefetches into the prefetch table
310  for (int k = 0; k < m_num_startup_pfs; k++) {
311  line_addr = makeNextStrideAddress(line_addr, stride);
312  // possibly stop prefetching at page boundaries
313  if (page_addr != pageAddress(line_addr)) {
314  if (!m_prefetch_cross_pages) {
315  // deallocate this stream prefetcher
316  mystream->m_is_valid = false;
317  return;
318  }
319  numPagesCrossed++;
320  }
321 
322  // launch prefetch
324  DPRINTF(RubyPrefetcher, "Requesting prefetch for %#x\n", line_addr);
325  m_controller->enqueuePrefetch(line_addr, m_array[index].m_type);
326  }
327 
328  // update the address to be the last address prefetched
329  mystream->m_address = line_addr;
330 }
331 
334 {
335  // search all streams for a match
336  for (int i = 0; i < m_num_streams; i++) {
337  // search all the outstanding prefetches for this stream
338  if (m_array[i].m_is_valid) {
339  for (int j = 0; j < m_num_startup_pfs; j++) {
340  if (makeNextStrideAddress(m_array[i].m_address,
341  -(m_array[i].m_stride*j)) == address) {
342  return &(m_array[i]);
343  }
344  }
345  }
346  }
347  return NULL;
348 }
349 
350 bool
352  uint32_t *filter_hit, uint32_t &index, Addr address,
353  int stride, bool &alloc)
354 {
355  //reset the alloc flag
356  alloc = false;
357 
358  Addr line_addr = makeLineAddress(address);
359  for (int i = 0; i < m_num_unit_filters; i++) {
360  if (filter_table[i] == line_addr) {
361  filter_table[i] = makeNextStrideAddress(filter_table[i], stride);
362  filter_hit[i]++;
363  if (filter_hit[i] >= m_train_misses) {
364  alloc = true;
365  }
366  return true;
367  }
368  }
369 
370  // enter this address in the table
371  int local_index = index;
372  filter_table[local_index] = makeNextStrideAddress(line_addr, stride);
373  filter_hit[local_index] = 0;
374  local_index = local_index + 1;
375  if (local_index >= m_num_unit_filters) {
376  local_index = 0;
377  }
378 
379  index = local_index;
380  return false;
381 }
382 
383 bool
385  bool &alloc)
386 {
387  //reset the alloc flag
388  alloc = false;
389 
391  Addr page_addr = pageAddress(address);
392  Addr line_addr = makeLineAddress(address);
393 
394  for (uint32_t i = 0; i < m_num_nonunit_filters; i++) {
395  if (pageAddress(m_nonunit_filter[i]) == page_addr) {
396  // hit in the non-unit filter
397  // compute the actual stride (for this reference)
398  int delta = line_addr - m_nonunit_filter[i];
399 
400  if (delta != 0) {
401  // no zero stride prefetches
402  // check that the stride matches (for the last N times)
403  if (delta == m_nonunit_stride[i]) {
404  // -> stride hit
405  // increment count (if > 2) allocate stream
406  m_nonunit_hit[i]++;
407  if (m_nonunit_hit[i] > m_train_misses) {
408  // This stride HAS to be the multiplicative constant of
409  // dataBlockBytes (bc makeNextStrideAddress is
410  // calculated based on this multiplicative constant!)
413 
414  // clear this filter entry
416  alloc = true;
417  }
418  } else {
419  // delta didn't match ... reset m_nonunit_hit count for
420  // this entry
421  m_nonunit_hit[i] = 0;
422  }
423 
424  // update the last address seen & the stride
425  m_nonunit_stride[i] = delta;
426  m_nonunit_filter[i] = line_addr;
427  return true;
428  } else {
429  return false;
430  }
431  }
432  }
433 
434  // not found: enter this address in the table
435  m_nonunit_filter[m_nonunit_index] = line_addr;
438 
441  m_nonunit_index = 0;
442  }
443  return false;
444 }
445 
446 void
447 RubyPrefetcher::print(std::ostream& out) const
448 {
449  out << name() << " Prefetcher State\n";
450  // print out unit filter
451  out << "unit table:\n";
452  for (int i = 0; i < m_num_unit_filters; i++) {
453  out << m_unit_filter[i] << std::endl;
454  }
455 
456  out << "negative table:\n";
457  for (int i = 0; i < m_num_unit_filters; i++) {
458  out << m_negative_filter[i] << std::endl;
459  }
460 
461  // print out non-unit stride filter
462  out << "non-unit table:\n";
463  for (int i = 0; i < m_num_nonunit_filters; i++) {
464  out << m_nonunit_filter[i] << " "
465  << m_nonunit_stride[i] << " "
466  << m_nonunit_hit[i] << std::endl;
467  }
468 
469  // print out allocated stream buffers
470  out << "streams:\n";
471  for (int i = 0; i < m_num_streams; i++) {
472  out << m_array[i].m_address << " "
473  << m_array[i].m_stride << " "
474  << m_array[i].m_is_valid << " "
475  << m_array[i].m_use_time << std::endl;
476  }
477 }
478 
479 Addr
481 {
482  return mbits<Addr>(addr, 63, m_page_shift);
483 }
PrefetchEntry::m_type
RubyRequestType m_type
L1D prefetches loads and stores.
Definition: RubyPrefetcher.hh:85
Stats::Group::regStats
virtual void regStats()
Callback to set stat parameters.
Definition: group.cc:64
RubyPrefetcher::pageAddress
Addr pageAddress(Addr addr) const
determine the page aligned address
Definition: RubyPrefetcher.cc:480
RubyPrefetcher::numPartialHits
Stats::Scalar numPartialHits
Count of partial successful prefetches.
Definition: RubyPrefetcher.hh:217
RubyPrefetcher::print
void print(std::ostream &out) const
Print out some statistics.
Definition: RubyPrefetcher.cc:447
RubyPrefetcher::m_num_startup_pfs
uint32_t m_num_startup_pfs
number of initial prefetches to startup a stream
Definition: RubyPrefetcher.hh:166
RubySystem::getBlockSizeBytes
static uint32_t getBlockSizeBytes()
Definition: RubySystem.hh:62
MipsISA::index
Bitfield< 30, 0 > index
Definition: pra_constants.hh:44
RubyPrefetcher::m_nonunit_stride
int * m_nonunit_stride
An array of strides (in # of cache lines) for the filter entries.
Definition: RubyPrefetcher.hh:194
makeLineAddress
Addr makeLineAddress(Addr addr)
Definition: Address.cc:54
PrefetchEntry::m_use_time
Cycles m_use_time
the last time that any prefetched request was used
Definition: RubyPrefetcher.hh:79
ArmISA::i
Bitfield< 7 > i
Definition: miscregs_types.hh:63
RubyPrefetcher::issueNextPrefetch
void issueNextPrefetch(Addr address, PrefetchEntry *stream)
Definition: RubyPrefetcher.cc:226
PrefetchEntry::m_stride
int m_stride
stride distance to get next address from
Definition: RubyPrefetcher.hh:76
RubyPrefetcher::numHits
Stats::Scalar numHits
Count of successful prefetches.
Definition: RubyPrefetcher.hh:215
RubyPrefetcher::m_num_streams
uint32_t m_num_streams
number of prefetch streams available
Definition: RubyPrefetcher.hh:159
type
uint8_t type
Definition: inet.hh:421
PrefetchEntry::requestCompleted
std::bitset< MAX_PF_INFLIGHT > requestCompleted
Definition: RubyPrefetcher.hh:90
RubyPrefetcher::observeMiss
void observeMiss(Addr address, const RubyRequestType &type)
Observe a memory miss from the cache.
Definition: RubyPrefetcher.cc:142
std::vector< Addr >
RubyPrefetcher::accessUnitFilter
bool accessUnitFilter(std::vector< Addr > &filter_table, uint32_t *hit_table, uint32_t &index, Addr address, int stride, bool &alloc)
access a unit stride filter to determine if there is a hit
Definition: RubyPrefetcher.cc:351
RubyPrefetcher
Definition: RubyPrefetcher.hh:93
PrefetchEntry::m_is_valid
bool m_is_valid
valid bit for each stream
Definition: RubyPrefetcher.hh:82
PrefetchEntry::requestIssued
std::bitset< MAX_PF_INFLIGHT > requestIssued
Bitset for tracking prefetches for which addresses have been issued, which ones have completed.
Definition: RubyPrefetcher.hh:89
makeNextStrideAddress
Addr makeNextStrideAddress(Addr addr, int stride)
Definition: Address.cc:67
RubyPrefetcher::observePfHit
void observePfHit(Addr address)
Implement the prefetch hit(miss) callback interface.
Definition: RubyPrefetcher.cc:218
RubyPrefetcher::m_negative_filter_index
uint32_t m_negative_filter_index
a round robin pointer into the negative filter group
Definition: RubyPrefetcher.hh:185
RubyPrefetcher::m_num_nonunit_filters
uint32_t m_num_nonunit_filters
number of non-stride filters
Definition: RubyPrefetcher.hh:170
ArmISA::j
Bitfield< 24 > j
Definition: miscregs_types.hh:54
RubyPrefetcher.hh
MipsISA::k
Bitfield< 23 > k
Definition: dt_constants.hh:78
bitfield.hh
DPRINTF
#define DPRINTF(x,...)
Definition: trace.hh:234
RubyPrefetcher::RubyPrefetcher
RubyPrefetcher(const Params *p)
Definition: RubyPrefetcher.cc:54
Clocked::curCycle
Cycles curCycle() const
Determine the current cycle, corresponding to a tick aligned to a clock edge.
Definition: clocked_object.hh:192
RubyPrefetcher::m_controller
AbstractController * m_controller
Definition: RubyPrefetcher.hh:204
RubySystem.hh
MAX_PF_INFLIGHT
#define MAX_PF_INFLIGHT
Definition: RubyPrefetcher.hh:58
RubyPrefetcher::numPagesCrossed
Stats::Scalar numPagesCrossed
Count of pages crossed.
Definition: RubyPrefetcher.hh:219
RubyPrefetcher::getLRUindex
uint32_t getLRUindex(void)
Returns an unused stream buffer (or if all are used, returns the least recently used (accessed) strea...
Definition: RubyPrefetcher.cc:265
Addr
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
Definition: types.hh:142
Stats::DataWrap::name
Derived & name(const std::string &name)
Set the name and marks this stat to print at the end of simulation.
Definition: statistics.hh:274
RubyPrefetcher::accessNonunitFilter
bool accessNonunitFilter(Addr address, int *stride, bool &alloc)
access a unit stride filter to determine if there is a hit
Definition: RubyPrefetcher.cc:384
RubySlicc_ComponentMapping.hh
PrefetchEntry
Definition: RubyPrefetcher.hh:60
SimObject::name
virtual const std::string name() const
Definition: sim_object.hh:133
RubyPrefetcher::m_nonunit_hit
uint32_t * m_nonunit_hit
An array used to count the of times particular filter entries have been hit.
Definition: RubyPrefetcher.hh:197
RubyPrefetcher::m_unit_filter
std::vector< Addr > m_unit_filter
a unit stride filter array: helps reduce BW requirement of prefetching
Definition: RubyPrefetcher.hh:174
RubyPrefetcher::observePfMiss
void observePfMiss(Addr address)
Definition: RubyPrefetcher.cc:210
RubyPrefetcher::initializeStream
void initializeStream(Addr address, int stride, uint32_t index, const RubyRequestType &type)
allocate a new stream buffer at a specific index
Definition: RubyPrefetcher.cc:292
RubyPrefetcher::numAllocatedStreams
Stats::Scalar numAllocatedStreams
Count of prefetch streams allocated.
Definition: RubyPrefetcher.hh:211
RubyPrefetcher::m_nonunit_filter
std::vector< Addr > m_nonunit_filter
a non-unit stride filter array: helps reduce BW requirement of prefetching
Definition: RubyPrefetcher.hh:192
RubyPrefetcher::regStats
void regStats()
Callback to set stat parameters.
Definition: RubyPrefetcher.cc:101
RubyPrefetcher::m_page_shift
const Addr m_page_shift
Definition: RubyPrefetcher.hh:206
RubyPrefetcher::m_array
std::vector< PrefetchEntry > m_array
an array of the active prefetch streams
Definition: RubyPrefetcher.hh:161
addr
ip6_addr_t addr
Definition: inet.hh:423
RubyPrefetcher::m_unit_filter_hit
uint32_t * m_unit_filter_hit
An array used to count the of times particular filter entries have been hit.
Definition: RubyPrefetcher.hh:179
PrefetchEntry::m_address
Addr m_address
The base address for the stream prefetch.
Definition: RubyPrefetcher.hh:73
ArmISA::stride
Bitfield< 21, 20 > stride
Definition: miscregs_types.hh:441
RubyPrefetcher::Params
RubyPrefetcherParams Params
Definition: RubyPrefetcher.hh:96
Cycles
Cycles is a wrapper class for representing cycle counts, i.e.
Definition: types.hh:83
RubyPrefetcher::m_negative_filter
std::vector< Addr > m_negative_filter
a negative unit stride filter array: helps reduce BW requirement of prefetching
Definition: RubyPrefetcher.hh:183
RubyPrefetcher::getPrefetchEntry
PrefetchEntry * getPrefetchEntry(Addr address, uint32_t &index)
get pointer to the matching stream entry, returns NULL if not found index holds the multiple of the s...
Definition: RubyPrefetcher.cc:333
RubyPrefetcher::m_train_misses
uint32_t m_train_misses
number of misses I must see before allocating a stream
Definition: RubyPrefetcher.hh:164
RubyPrefetcher::m_unit_filter_index
uint32_t m_unit_filter_index
a round robin pointer into the unit filter group
Definition: RubyPrefetcher.hh:176
RubyPrefetcher::numMissedPrefetchedBlocks
Stats::Scalar numMissedPrefetchedBlocks
Count of misses incurred for blocks that were prefetched.
Definition: RubyPrefetcher.hh:221
RubyPrefetcher::numPrefetchRequested
Stats::Scalar numPrefetchRequested
Count of prefetch requests made.
Definition: RubyPrefetcher.hh:213
AbstractController::enqueuePrefetch
virtual void enqueuePrefetch(const Addr &, const RubyRequestType &)
Function for enqueuing a prefetch request.
Definition: AbstractController.hh:127
RubyPrefetcher::m_prefetch_cross_pages
bool m_prefetch_cross_pages
Used for allowing prefetches across pages.
Definition: RubyPrefetcher.hh:202
MipsISA::p
Bitfield< 0 > p
Definition: pra_constants.hh:323
RubyPrefetcher::~RubyPrefetcher
~RubyPrefetcher()
Definition: RubyPrefetcher.cc:92
RubyPrefetcher::m_nonunit_index
uint32_t m_nonunit_index
a round robin pointer into the unit filter group
Definition: RubyPrefetcher.hh:199
Stats::DataWrap::desc
Derived & desc(const std::string &_desc)
Set the description and marks this stat to print at the end of simulation.
Definition: statistics.hh:307
RubyPrefetcher::clearNonunitEntry
void clearNonunitEntry(uint32_t index)
clear a non-unit stride prefetcher entry
Definition: RubyPrefetcher.cc:284
RubyPrefetcher::m_num_unit_filters
uint32_t m_num_unit_filters
number of stride filters
Definition: RubyPrefetcher.hh:168
RubyPrefetcher::numMissObserved
Stats::Scalar numMissObserved
Count of accesses to the prefetcher.
Definition: RubyPrefetcher.hh:209
RubyPrefetcher::m_negative_filter_hit
uint32_t * m_negative_filter_hit
An array used to count the of times particular filter entries have been hit.
Definition: RubyPrefetcher.hh:188
SimObject
Abstract superclass for simulation objects.
Definition: sim_object.hh:92

Generated on Wed Sep 30 2020 14:02:13 for gem5 by doxygen 1.8.17