summaryrefslogtreecommitdiff
path: root/src/mem/cache
diff options
context:
space:
mode:
Diffstat (limited to 'src/mem/cache')
-rw-r--r--src/mem/cache/Cache.py3
-rw-r--r--src/mem/cache/tags/Tags.py4
-rw-r--r--src/mem/cache/tags/base.cc3
-rw-r--r--src/mem/cache/tags/base.hh5
-rw-r--r--src/mem/cache/tags/base_set_assoc.cc2
-rw-r--r--src/mem/cache/tags/fa_lru.cc1
6 files changed, 12 insertions, 6 deletions
diff --git a/src/mem/cache/Cache.py b/src/mem/cache/Cache.py
index dce7e5bf4..bac6c73e1 100644
--- a/src/mem/cache/Cache.py
+++ b/src/mem/cache/Cache.py
@@ -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")
diff --git a/src/mem/cache/tags/Tags.py b/src/mem/cache/tags/Tags.py
index 6c0b85044..b19010f52 100644
--- a/src/mem/cache/tags/Tags.py
+++ b/src/mem/cache/tags/Tags.py
@@ -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")
diff --git a/src/mem/cache/tags/base.cc b/src/mem/cache/tags/base.cc
index 7796cd3e5..aa8a34f2d 100644
--- a/src/mem/cache/tags/base.cc
+++ b/src/mem/cache/tags/base.cc
@@ -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)
{
}
diff --git a/src/mem/cache/tags/base.hh b/src/mem/cache/tags/base.hh
index 5c9f46a41..2c528a983 100644
--- a/src/mem/cache/tags/base.hh
+++ b/src/mem/cache/tags/base.hh
@@ -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 */
diff --git a/src/mem/cache/tags/base_set_assoc.cc b/src/mem/cache/tags/base_set_assoc.cc
index ba9447525..cf647ac4d 100644
--- a/src/mem/cache/tags/base_set_assoc.cc
+++ b/src/mem/cache/tags/base_set_assoc.cc
@@ -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];
diff --git a/src/mem/cache/tags/fa_lru.cc b/src/mem/cache/tags/fa_lru.cc
index 895f7953b..dfd4c4060 100644
--- a/src/mem/cache/tags/fa_lru.cc
+++ b/src/mem/cache/tags/fa_lru.cc
@@ -73,7 +73,6 @@ FALRU::FALRU(const Params *p)
cacheMask = 0;
}
- warmupBound = size/blkSize;
numBlocks = size/blkSize;
blks = new FALRUBlk[numBlocks];