mem-cache: Make cache warmup percentage a parameter.
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Wed, 7 Feb 2018 13:49:55 +0000 (14:49 +0100)
committerDaniel Carvalho <mr.danrc@gmail.com>
Thu, 8 Feb 2018 13:43:53 +0000 (13:43 +0000)
The warmupPercentage is the percentage of different tags (based on the
cache size) that need to be touched in order to warm up the cache.
If Warmup failed (i.e., not enough tags were touched), warmup_cycle = 0.

The warmup is not being taken into account to calculate the stats (i.e.,
stats acquisition starts before cache is warmed up). Maybe in the future
this functionality should be added.

Change-Id: I2b93a99c19fddb99a4c60e6d4293fa355744d05e
Reviewed-on: https://gem5-review.googlesource.com/8061
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/Cache.py
src/mem/cache/tags/Tags.py
src/mem/cache/tags/base.cc
src/mem/cache/tags/base.hh
src/mem/cache/tags/base_set_assoc.cc
src/mem/cache/tags/fa_lru.cc

index dce7e5bf4389e1032c507bcc896a8b73745dab43..bac6c73e1a7d01376d63362b3e7965978f2b4912 100644 (file)
@@ -57,6 +57,9 @@ class BaseCache(MemObject):
     data_latency = Param.Cycles("Data access latency")
     response_latency = Param.Cycles("Latency for the return path on a miss");
 
+    warmup_percentage = Param.Percent(0,
+        "Percentage of tags to be touched to warm up the cache")
+
     max_miss_count = Param.Counter(0,
         "Number of misses to handle before calling exit")
 
index 6c0b850442508cda7c3a1e86bfdaa9ad5bdd2a78..b19010f521d1b714bf0f31ced1a47c3d8983c8ef 100644 (file)
@@ -57,6 +57,10 @@ class BaseTags(ClockedObject):
     data_latency = Param.Cycles(Parent.data_latency,
                                "The data access latency for this cache")
 
+    # Get the warmup percentage from the parent (cache)
+    warmup_percentage = Param.Percent(Parent.warmup_percentage,
+        "Percentage of tags to be touched to warm up the cache")
+
     sequential_access = Param.Bool(Parent.sequential_access,
         "Whether to access tags and data sequentially")
 
index 7796cd3e5637df8c89fdcaa034a8e198cd367d30..aa8a34f2df3f3fa5c2401e46070245e67c1747c5 100644 (file)
@@ -61,7 +61,8 @@ BaseTags::BaseTags(const Params *p)
       accessLatency(p->sequential_access ?
                     p->tag_latency + p->data_latency :
                     std::max(p->tag_latency, p->data_latency)),
-      cache(nullptr), warmupBound(0),
+      cache(nullptr),
+      warmupBound((p->warmup_percentage/100.0) * (p->size / p->block_size)),
       warmedUp(false), numBlocks(0)
 {
 }
index 5c9f46a4116c4757cbfe2c3a22ffa116ca0db4db..2c528a9830b8b8afedd9a5b1e63c8faf39db30d1 100644 (file)
@@ -86,7 +86,7 @@ class BaseTags : public ClockedObject
      * The number of tags that need to be touched to meet the warmup
      * percentage.
      */
-    int warmupBound;
+    const unsigned warmupBound;
     /** Marked true when the cache is warmed up. */
     bool warmedUp;
 
@@ -95,6 +95,7 @@ class BaseTags : public ClockedObject
 
     // Statistics
     /**
+     * TODO: It would be good if these stats were acquired after warmup.
      * @addtogroup CacheStatistics
      * @{
      */
@@ -120,7 +121,7 @@ class BaseTags : public ClockedObject
      */
     Stats::Formula avgRefs;
 
-    /** The cycle that the warmup percentage was hit. */
+    /** The cycle that the warmup percentage was hit. 0 on failure. */
     Stats::Scalar warmupCycle;
 
     /** Average occupancy of each requestor using the cache */
index ba9447525f47a96731ba4b62856a4c62db1d9d84..cf647ac4d79efbb0ae6cfced83a0c03290aab20f 100644 (file)
@@ -73,8 +73,6 @@ BaseSetAssoc::BaseSetAssoc(const Params *p)
     setShift = floorLog2(blkSize);
     setMask = numSets - 1;
     tagShift = setShift + floorLog2(numSets);
-    /** @todo Make warmup percentage a parameter. */
-    warmupBound = numSets * assoc;
 
     sets = new SetType[numSets];
     blks = new BlkType[numSets * assoc];
index 895f7953b8a8ced5f197a92ea3fb563a30cc2a8d..dfd4c406013c8d777246c8c230739bf924ab9d0c 100644 (file)
@@ -73,7 +73,6 @@ FALRU::FALRU(const Params *p)
         cacheMask = 0;
     }
 
-    warmupBound = size/blkSize;
     numBlocks = size/blkSize;
 
     blks = new FALRUBlk[numBlocks];