prefetcher: Make prefetcher a sim object instead of it being a parameter on cache
authorMrinmoy Ghosh <mrinmoy.ghosh@arm.com>
Sun, 12 Feb 2012 22:07:38 +0000 (16:07 -0600)
committerMrinmoy Ghosh <mrinmoy.ghosh@arm.com>
Sun, 12 Feb 2012 22:07:38 +0000 (16:07 -0600)
15 files changed:
configs/common/O3_ARM_v7a.py
src/mem/cache/BaseCache.py
src/mem/cache/builder.cc
src/mem/cache/cache.hh
src/mem/cache/cache_impl.hh
src/mem/cache/prefetch/Prefetcher.py [new file with mode: 0644]
src/mem/cache/prefetch/SConscript
src/mem/cache/prefetch/base.cc
src/mem/cache/prefetch/base.hh
src/mem/cache/prefetch/ghb.cc
src/mem/cache/prefetch/ghb.hh
src/mem/cache/prefetch/stride.cc
src/mem/cache/prefetch/stride.hh
src/mem/cache/prefetch/tagged.cc
src/mem/cache/prefetch/tagged.hh

index a2b769f272af642ef03b1ec50b137a3c046287b5..68fb0c543a9e1177e80c1dfaf5aa2cfff1f89231 100644 (file)
@@ -190,10 +190,7 @@ class O3_ARM_v7aL2(BaseCache):
     size = '1MB'
     assoc = 16
     write_buffers = 8
-    # Simple stride prefetcher
-    prefetch_policy = 'stride'
     prefetch_on_access = 'true'
-    prefetch_latency = '1.0ns'
-    prefetch_degree = 8
-
+    # Simple stride prefetcher
+    prefetcher = StridePrefetcher(degree=8, latency='1.0ns')
 
index 5c7ae527416aedae00d254f4c02d58b62c56d13b..e9e60859f514c5fe9723e62ad690862780f8514c 100644 (file)
@@ -29,8 +29,8 @@
 from m5.params import *
 from m5.proxy import Self
 from MemObject import MemObject
+from Prefetcher import BasePrefetcher
 
-class Prefetch(Enum): vals = ['none', 'tagged', 'stride', 'ghb']
 
 class BaseCache(MemObject):
     type = 'BaseCache'
@@ -58,22 +58,7 @@ class BaseCache(MemObject):
     write_buffers = Param.Int(8, "number of write buffers")
     prefetch_on_access = Param.Bool(False,
          "notify the hardware prefetcher on every access (not just misses)")
-    prefetcher_size = Param.Int(100,
-         "Number of entries in the hardware prefetch queue")
-    prefetch_past_page = Param.Bool(False,
-         "Allow prefetches to cross virtual page boundaries")
-    prefetch_serial_squash = Param.Bool(False,
-         "Squash prefetches with a later time on a subsequent miss")
-    prefetch_degree = Param.Int(1,
-         "Degree of the prefetch depth")
-    prefetch_latency = Param.Latency(10 * Self.latency,
-         "Latency of the prefetcher")
-    prefetch_policy = Param.Prefetch('none',
-         "Type of prefetcher to use")
-    prefetch_use_cpu_id = Param.Bool(True,
-         "Use the CPU ID to separate calculations of prefetches")
-    prefetch_data_accesses_only = Param.Bool(False,
-         "Only prefetch on data not on instruction accesses")
+    prefetcher = Param.BasePrefetcher(NULL,"Prefetcher attached to cache")
     cpu_side = Port("Port on side closer to CPU")
     mem_side = Port("Port on side closer to MEM")
     addr_range = Param.AddrRange(AllMemory, "The address range for the CPU-side port")
index e2c14ef5b85ff66df3af3ae14bed9eb3880eb326..cc206b7848ecaca6d98846d04c0af4a10b51d153 100644 (file)
@@ -37,7 +37,6 @@
 #include <vector>
 
 #include "config/the_isa.hh"
-#include "enums/Prefetch.hh"
 #include "mem/cache/base.hh"
 #include "mem/cache/cache.hh"
 #include "mem/config/cache.hh"
 #include "mem/cache/tags/iic.hh"
 #endif
 
-//Prefetcher Headers
-#include "mem/cache/prefetch/ghb.hh"
-#include "mem/cache/prefetch/stride.hh"
-#include "mem/cache/prefetch/tagged.hh"
 
 using namespace std;
 
 #define BUILD_CACHE(TAGS, tags)                         \
     do {                                                \
-        BasePrefetcher *pf;                             \
-        if (prefetch_policy == Enums::tagged) {         \
-            pf = new TaggedPrefetcher(this);            \
-        }                                               \
-        else if (prefetch_policy == Enums::stride) {    \
-            pf = new StridePrefetcher(this);            \
-        }                                               \
-        else if (prefetch_policy == Enums::ghb) {       \
-            pf = new GHBPrefetcher(this);               \
-        }                                               \
-        else {                                          \
-            pf = NULL;                                  \
-        }                                               \
         Cache<TAGS> *retval =                           \
-            new Cache<TAGS>(this, tags, pf);            \
+            new Cache<TAGS>(this, tags);            \
         return retval;                                  \
     } while (0)
 
index b5c95b301f89c907430c45e5b2f5c126cb0529cb..b2569648e2f1d81e191bdecd09ea28a82aab9d59 100644 (file)
@@ -211,7 +211,7 @@ class Cache : public BaseCache
 
   public:
     /** Instantiates a basic cache object. */
-    Cache(const Params *p, TagStore *tags, BasePrefetcher *prefetcher);
+    Cache(const Params *p, TagStore *tags);
 
     virtual Port *getPort(const std::string &if_name, int idx = -1);
 
index 2ef53e040876cee1a85340997e2db053f915d24e..16b5148dc0634dafa436b6a2cbb23cb5a8f58144 100644 (file)
 #include "sim/sim_exit.hh"
 
 template<class TagStore>
-Cache<TagStore>::Cache(const Params *p, TagStore *tags, BasePrefetcher *pf)
+Cache<TagStore>::Cache(const Params *p, TagStore *tags)
     : BaseCache(p),
       tags(tags),
-      prefetcher(pf),
+      prefetcher(p->prefetcher),
       doFastWrites(true),
       prefetchOnAccess(p->prefetch_on_access)
 {
@@ -89,8 +89,6 @@ Cache<TagStore>::regStats()
 {
     BaseCache::regStats();
     tags->regStats(name());
-    if (prefetcher)
-        prefetcher->regStats(name());
 }
 
 template<class TagStore>
diff --git a/src/mem/cache/prefetch/Prefetcher.py b/src/mem/cache/prefetch/Prefetcher.py
new file mode 100644 (file)
index 0000000..c2c17fa
--- /dev/null
@@ -0,0 +1,35 @@
+from m5.SimObject import SimObject
+from m5.params import *
+class BasePrefetcher(SimObject):
+    type = 'BasePrefetcher'
+    abstract = True
+    size = Param.Int(100,
+         "Number of entries in the hardware prefetch queue")
+    cross_pages = Param.Bool(False,
+         "Allow prefetches to cross virtual page boundaries")
+    serial_squash = Param.Bool(False,
+         "Squash prefetches with a later time on a subsequent miss")
+    degree = Param.Int(1,
+         "Degree of the prefetch depth")
+    latency = Param.Latency('10t',
+         "Latency of the prefetcher")
+    use_cpu_id = Param.Bool(True,
+         "Use the CPU ID to separate calculations of prefetches")
+    data_accesses_only = Param.Bool(False,
+         "Only prefetch on data not on instruction accesses")
+
+class GHBPrefetcher(BasePrefetcher):
+    type = 'GHBPrefetcher'
+    cxx_class = 'GHBPrefetcher'
+
+class StridePrefetcher(BasePrefetcher):
+    type = 'StridePrefetcher'
+    cxx_class = 'StridePrefetcher'
+
+class TaggedPrefetcher(BasePrefetcher):
+    type = 'TaggedPrefetcher'
+    cxx_class = 'TaggedPrefetcher'
+
+
+
+
index 9d05a8ee4fa27ecdae1cdb180ab06c7821a084c3..2310940c18493ff56432df8cb35edc08399cac51 100644 (file)
@@ -32,6 +32,7 @@ Import('*')
 
 if env['TARGET_ISA'] == 'no':
     Return()
+SimObject('Prefetcher.py')
 
 Source('base.cc')
 Source('ghb.cc')
index 0f92901867e60777b4cf13008da919bcb8349810..834787db687a3c28b83b0557250ba5d0f1ac5a7d 100644 (file)
 #include "mem/cache/base.hh"
 #include "mem/request.hh"
 
-BasePrefetcher::BasePrefetcher(const BaseCacheParams *p)
-    : size(p->prefetcher_size), pageStop(!p->prefetch_past_page),
-      serialSquash(p->prefetch_serial_squash),
-      onlyData(p->prefetch_data_accesses_only)
+BasePrefetcher::BasePrefetcher(const Params *p)
+    : SimObject(p), size(p->size), latency(p->latency), degree(p->degree),
+      useContextId(p->use_cpu_id), pageStop(!p->cross_pages),
+      serialSquash(p->serial_squash), onlyData(p->data_accesses_only)
 {
 }
 
@@ -55,54 +55,53 @@ BasePrefetcher::setCache(BaseCache *_cache)
 {
     cache = _cache;
     blkSize = cache->getBlockSize();
-    _name = cache->name() + "-pf";
 }
 
 void
-BasePrefetcher::regStats(const std::string &name)
+BasePrefetcher::regStats()
 {
     pfIdentified
-        .name(name + ".prefetcher.num_hwpf_identified")
+        .name(name() + ".prefetcher.num_hwpf_identified")
         .desc("number of hwpf identified")
         ;
 
     pfMSHRHit
-        .name(name + ".prefetcher.num_hwpf_already_in_mshr")
+        .name(name() + ".prefetcher.num_hwpf_already_in_mshr")
         .desc("number of hwpf that were already in mshr")
         ;
 
     pfCacheHit
-        .name(name + ".prefetcher.num_hwpf_already_in_cache")
+        .name(name() + ".prefetcher.num_hwpf_already_in_cache")
         .desc("number of hwpf that were already in the cache")
         ;
 
     pfBufferHit
-        .name(name + ".prefetcher.num_hwpf_already_in_prefetcher")
+        .name(name() + ".prefetcher.num_hwpf_already_in_prefetcher")
         .desc("number of hwpf that were already in the prefetch queue")
         ;
 
     pfRemovedFull
-        .name(name + ".prefetcher.num_hwpf_evicted")
+        .name(name() + ".prefetcher.num_hwpf_evicted")
         .desc("number of hwpf removed due to no buffer left")
         ;
 
     pfRemovedMSHR
-        .name(name + ".prefetcher.num_hwpf_removed_MSHR_hit")
+        .name(name() + ".prefetcher.num_hwpf_removed_MSHR_hit")
         .desc("number of hwpf removed because MSHR allocated")
         ;
 
     pfIssued
-        .name(name + ".prefetcher.num_hwpf_issued")
+        .name(name() + ".prefetcher.num_hwpf_issued")
         .desc("number of hwpf issued")
         ;
 
     pfSpanPage
-        .name(name + ".prefetcher.num_hwpf_span_page")
+        .name(name() + ".prefetcher.num_hwpf_span_page")
         .desc("number of hwpf spanning a virtual page")
         ;
 
     pfSquashed
-        .name(name + ".prefetcher.num_hwpf_squashed_from_miss")
+        .name(name() + ".prefetcher.num_hwpf_squashed_from_miss")
         .desc("number of hwpf that got squashed due to a miss "
               "aborting calculation time")
         ;
@@ -276,3 +275,5 @@ BasePrefetcher::samePage(Addr a, Addr b)
 {
     return roundDown(a, TheISA::VMPageSize) == roundDown(b, TheISA::VMPageSize);
 }
+
+
index e3c0cbf1634b970b27e0a387da2c0586527f1471..ead163215cc604b47ee5a69759e474f9b4c969f6 100644 (file)
 #include "base/statistics.hh"
 #include "mem/packet.hh"
 #include "params/BaseCache.hh"
+#include "sim/sim_object.hh"
 
 class BaseCache;
 
-class BasePrefetcher
+class BasePrefetcher : public SimObject
 {
   protected:
 
@@ -62,6 +63,14 @@ class BasePrefetcher
     /** The block size of the parent cache. */
     int blkSize;
 
+    /** The latency before a prefetch is issued */
+    Tick latency;
+
+    /** The number of prefetches to issue */
+    unsigned degree;
+
+    /** If patterns should be found per context id */
+    bool useContextId;
     /** Do we prefetch across page boundaries. */
     bool pageStop;
 
@@ -71,8 +80,6 @@ class BasePrefetcher
     /** Do we prefetch on only data reads, or on inst reads as well. */
     bool onlyData;
 
-    std::string _name;
-
   public:
 
     Stats::Scalar pfIdentified;
@@ -85,16 +92,14 @@ class BasePrefetcher
     Stats::Scalar pfSpanPage;
     Stats::Scalar pfSquashed;
 
-    void regStats(const std::string &name);
+    void regStats();
 
   public:
-
-    BasePrefetcher(const BaseCacheParams *p);
+    typedef BasePrefetcherParams Params;
+    BasePrefetcher(const Params *p);
 
     virtual ~BasePrefetcher() {}
 
-    const std::string name() const { return _name; }
-
     void setCache(BaseCache *_cache);
 
     /**
@@ -130,7 +135,12 @@ class BasePrefetcher
      * Utility function: are addresses a and b on the same VM page?
      */
     bool samePage(Addr a, Addr b);
-};
-
+ public:
+    const Params*
+    params() const
+    {
+        return dynamic_cast<const Params *>(_params);
+    }
 
+};
 #endif //__MEM_CACHE_PREFETCH_BASE_PREFETCHER_HH__
index dbc565bfdf0372f553f378489446037159233b6c..b9fc8e6752635ac5dc2ede578f0aa9c3e23af1cc 100644 (file)
@@ -71,3 +71,10 @@ GHBPrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
         }
     }
 }
+
+
+GHBPrefetcher*
+GHBPrefetcherParams::create()
+{
+   return new GHBPrefetcher(this);
+}
index c85221a3990f33b75f6ffbba1ea412d47c2f61a2..a21b57b93f8669cfbd65437ae14b7342566eee6a 100644 (file)
@@ -37,6 +37,7 @@
 #define __MEM_CACHE_PREFETCH_GHB_PREFETCHER_HH__
 
 #include "mem/cache/prefetch/base.hh"
+#include "params/GHBPrefetcher.hh"
 
 class GHBPrefetcher : public BasePrefetcher
 {
@@ -47,15 +48,9 @@ class GHBPrefetcher : public BasePrefetcher
     Addr secondLastMissAddr[Max_Contexts];
     Addr lastMissAddr[Max_Contexts];
 
-    Tick latency;
-    int degree;
-    bool useContextId;
-
   public:
-
-    GHBPrefetcher(const BaseCacheParams *p)
-        : BasePrefetcher(p), latency(p->prefetch_latency),
-          degree(p->prefetch_degree), useContextId(p->prefetch_use_cpu_id)
+    GHBPrefetcher(const Params *p)
+        : BasePrefetcher(p)
     {
     }
 
index a5cc805efe6a31ea2f9e67cb7e4949f67efecf05..645bc5fc55218e96704377fe757d8b5e1e39bd4d 100644 (file)
@@ -132,3 +132,10 @@ StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
         tab.push_back(new_entry);
     }
 }
+
+
+StridePrefetcher*
+StridePrefetcherParams::create()
+{
+   return new StridePrefetcher(this);
+}
index c78739b4e6d35731f86a8358ea7316923c87b985..51b4252a1486e017402b92d00213f05ebd20fef1 100644 (file)
@@ -39,6 +39,7 @@
 #include <climits>
 
 #include "mem/cache/prefetch/base.hh"
+#include "params/StridePrefetcher.hh"
 
 class StridePrefetcher : public BasePrefetcher
 {
@@ -63,15 +64,11 @@ class StridePrefetcher : public BasePrefetcher
     Addr *lastMissAddr[Max_Contexts];
 
     std::list<StrideEntry*> table[Max_Contexts];
-    Tick latency;
-    int degree;
-    bool useContextId;
 
   public:
 
-    StridePrefetcher(const BaseCacheParams *p)
-        : BasePrefetcher(p), latency(p->prefetch_latency),
-          degree(p->prefetch_degree), useContextId(p->prefetch_use_cpu_id)
+    StridePrefetcher(const Params *p)
+        : BasePrefetcher(p)
     {
     }
 
index 700af37900b1c486fed16fa7ddd481fb14d93ec5..c875b586b8a0162b00af397e9092e424af038172 100644 (file)
@@ -35,9 +35,8 @@
 
 #include "mem/cache/prefetch/tagged.hh"
 
-TaggedPrefetcher::TaggedPrefetcher(const BaseCacheParams *p)
-    : BasePrefetcher(p),
-      latency(p->prefetch_latency), degree(p->prefetch_degree)
+TaggedPrefetcher::TaggedPrefetcher(const Params *p)
+    : BasePrefetcher(p)
 {
 }
 
@@ -62,3 +61,8 @@ calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
 }
 
 
+TaggedPrefetcher*
+TaggedPrefetcherParams::create()
+{
+   return new TaggedPrefetcher(this);
+}
index 78e20083d008b7887299c84ef97bac7829059ceb..8037196f83b3f2a6b4c86f4572b9d5892262a547 100644 (file)
 #define __MEM_CACHE_PREFETCH_TAGGED_PREFETCHER_HH__
 
 #include "mem/cache/prefetch/base.hh"
+#include "params/TaggedPrefetcher.hh"
+
 
 class TaggedPrefetcher : public BasePrefetcher
 {
-  protected:
-
-    Tick latency;
-    int degree;
-
   public:
 
-    TaggedPrefetcher(const BaseCacheParams *p);
+    TaggedPrefetcher(const Params *p);
 
     ~TaggedPrefetcher() {}