diff options
author | Mitch Hayenga ext:(%2C%20Amin%20Farmahini%20%3Caminfar%40gmail.com%3E) <mitch.hayenga+gem5@gmail.com> | 2014-01-29 23:21:25 -0600 |
---|---|---|
committer | Mitch Hayenga ext:(%2C%20Amin%20Farmahini%20%3Caminfar%40gmail.com%3E) <mitch.hayenga+gem5@gmail.com> | 2014-01-29 23:21:25 -0600 |
commit | 95735e10e7ea85320ee39c15a4132eece8417af4 (patch) | |
tree | 370863ea1bb2413937c03218e0b59aecc7a76fbe /src/mem/cache/prefetch/base.hh | |
parent | 32cc2ea8b9173863adeaa03f4d7ee1635acfdef7 (diff) | |
download | gem5-95735e10e7ea85320ee39c15a4132eece8417af4.tar.xz |
mem: prefetcher: add options, support for unaligned addresses
This patch extends the classic prefetcher to work on non-block aligned
addresses. Because the existing prefetchers in gem5 mask off the lower
address bits of cache accesses, many predictable strides fail to be
detected. For example, if a load were to stride by 48 bytes, with 64 byte
cachelines, the current stride based prefetcher would see an access pattern
of 0, 64, 64, 128, 192.... Thus not detecting a constant stride pattern. This
patch fixes this, by training the prefetcher on access and not masking off the
lower address bits.
It also adds the following configuration options:
1) Training/prefetching only on cache misses,
2) Training/prefetching only on data acceses,
3) Optionally tagging prefetches with a PC address.
#3 allows prefetchers to train off of prefetch requests in systems with
multiple cache levels and PC-based prefetchers present at multiple levels.
It also effectively allows a pipelining of prefetch requests (like in POWER4)
across multiple levels of cache hierarchy.
Improves performance on my gem5 configuration by 4.3% for SPECINT and 4.7% for SPECFP (geomean).
Diffstat (limited to 'src/mem/cache/prefetch/base.hh')
-rw-r--r-- | src/mem/cache/prefetch/base.hh | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/src/mem/cache/prefetch/base.hh b/src/mem/cache/prefetch/base.hh index 953852c38..fc0dd0b36 100644 --- a/src/mem/cache/prefetch/base.hh +++ b/src/mem/cache/prefetch/base.hh @@ -89,18 +89,28 @@ class BasePrefetcher : public ClockedObject const Cycles latency; /** The number of prefetches to issue */ - unsigned degree; + const unsigned degree; /** If patterns should be found per context id */ - bool useMasterId; + const bool useMasterId; /** Do we prefetch across page boundaries. */ - bool pageStop; + const bool pageStop; /** Do we remove prefetches with later times than a new miss.*/ - bool serialSquash; + const bool serialSquash; /** Do we prefetch on only data reads, or on inst reads as well. */ - bool onlyData; + const bool onlyData; + + /** Do we trigger/train prefetch on cache misses only, or all accesses. */ + const bool onMissOnly; + + /** Do we trigger/train prefetch on reads only, or all accesses. */ + const bool onReadOnly; + + /** Do we tag prefetch's with PC addresses, allowing lower pc-based + prefetchers to prefetch on prefetch requests */ + const bool onPrefetch; /** System we belong to */ System* system; |