mem-cache: Add multiple eviction stats
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Fri, 19 Oct 2018 10:24:02 +0000 (12:24 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Fri, 17 Jan 2020 16:31:03 +0000 (16:31 +0000)
Add stats to inform how many blocks were evicted due to a sector
replacement/eviction.

Change-Id: I886365506016d0888f835d182b3b65a808a9dccd
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/22606
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

src/mem/cache/tags/compressed_tags.cc
src/mem/cache/tags/sector_tags.cc
src/mem/cache/tags/sector_tags.hh

index 1871a7ad602e0dcf7f1ab67883f10a9c1479a5a4..d2ab7cf434e6a8ee3cddb6fd3b0bec30f5ee579d 100644 (file)
@@ -138,7 +138,9 @@ CompressedTags::findVictim(Addr addr, const bool is_secure,
 
         // The whole superblock must be evicted to make room for the new one
         for (const auto& blk : victim_superblock->blks){
-            evict_blks.push_back(blk);
+            if (blk->isValid()) {
+                evict_blks.push_back(blk);
+            }
         }
     }
 
@@ -159,6 +161,9 @@ CompressedTags::findVictim(Addr addr, const bool is_secure,
         }
     }
 
+    // Update number of sub-blocks evicted due to a replacement
+    sectorStats.evictionsReplacement[evict_blks.size()]++;
+
     return victim;
 }
 
index 610cba8ce9b9b5b646b39dda19da7703edfe856b..d2fcd76123ac8a176a95318918b3bd2fc529a792 100644 (file)
@@ -53,7 +53,8 @@ SectorTags::SectorTags(const SectorTagsParams *p)
       replacementPolicy(p->replacement_policy),
       numBlocksPerSector(p->num_blocks_per_sector),
       numSectors(numBlocks / numBlocksPerSector),
-      sectorShift(floorLog2(blkSize)), sectorMask(numBlocksPerSector - 1)
+      sectorShift(floorLog2(blkSize)), sectorMask(numBlocksPerSector - 1),
+      sectorStats(stats, *this)
 {
     // Check parameters
     fatal_if(blkSize < 4 || !isPowerOf2(blkSize),
@@ -260,10 +261,15 @@ SectorTags::findVictim(Addr addr, const bool is_secure, const std::size_t size,
     } else {
         // The whole sector must be evicted to make room for the new sector
         for (const auto& blk : victim_sector->blks){
-            evict_blks.push_back(blk);
+            if (blk->isValid()) {
+                evict_blks.push_back(blk);
+            }
         }
     }
 
+    // Update number of sub-blocks evicted due to a replacement
+    sectorStats.evictionsReplacement[evict_blks.size()]++;
+
     return victim;
 }
 
@@ -282,6 +288,27 @@ SectorTags::regenerateBlkAddr(const CacheBlk* blk) const
     return sec_addr | ((Addr)blk_cast->getSectorOffset() << sectorShift);
 }
 
+SectorTags::SectorTagsStats::SectorTagsStats(BaseTagStats &base_group,
+    SectorTags& _tags)
+  : Stats::Group(&base_group), tags(_tags),
+    evictionsReplacement(this, "evictions_replacement",
+        "Number of blocks evicted due to a replacement")
+{
+}
+
+void
+SectorTags::SectorTagsStats::regStats()
+{
+    Stats::Group::regStats();
+
+    evictionsReplacement.init(tags.numBlocksPerSector + 1);
+    for (unsigned i = 0; i <= tags.numBlocksPerSector; ++i) {
+        evictionsReplacement.subname(i, std::to_string(i));
+        evictionsReplacement.subdesc(i, "Number of replacements that caused " \
+            "the eviction of " + std::to_string(i) + " blocks");
+    }
+}
+
 void
 SectorTags::forEachBlk(std::function<void(CacheBlk &)> visitor)
 {
index 905a87aaf242ef7beff95d0a0d5fc77353de238e..3ad59e39d3606ec8005e438b5b2857779c4413dc 100644 (file)
@@ -40,6 +40,7 @@
 #include <string>
 #include <vector>
 
+#include "base/statistics.hh"
 #include "mem/cache/tags/base.hh"
 #include "mem/cache/tags/sector_blk.hh"
 #include "mem/packet.hh"
@@ -88,6 +89,18 @@ class SectorTags : public BaseTags
     /** Mask out all bits that aren't part of the sector tag. */
     const unsigned sectorMask;
 
+    struct SectorTagsStats : public Stats::Group
+    {
+        const SectorTags& tags;
+
+        SectorTagsStats(BaseTagStats &base_group, SectorTags& _tags);
+
+        void regStats() override;
+
+        /** Number of sub-blocks evicted due to a replacement. */
+        Stats::Vector evictionsReplacement;
+    } sectorStats;
+
   public:
     /** Convenience typedef. */
      typedef SectorTagsParams Params;