mem-cache: Add compression stats
authorDaniel R. Carvalho <odanrc@yahoo.com.br>
Tue, 29 May 2018 15:30:29 +0000 (17:30 +0200)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Wed, 8 May 2019 17:41:09 +0000 (17:41 +0000)
Add compression statistics to the compressors. It tracks
the number of blocks that can fit into a certain power
of two size, and the number of decompressions.

For example, if a block is compressed to 100 bits, it will
belong to the 128-bits compression size. Although it could
also fit bigger sizes, they are not taken into account for
the stats (i.e., the 100-bit compression will fit only the
128-bits size, not 256 or higher).

We save stats for compressions that fail (i.e., compressed
size is bigger than original cache line size).

Change-Id: Idab71a40a660e33259908ccd880e42a880b5ee06
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/11103
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/compressors/base.cc
src/mem/cache/compressors/base.hh

index 2991dfeda8afdd05b6ee73883f47dc32508b3bba..1ba2677ea4bb0e975d1e744c2a69d86159ac6b75 100644 (file)
@@ -36,6 +36,7 @@
 
 #include <algorithm>
 #include <cstdint>
+#include <string>
 
 #include "debug/CacheComp.hh"
 #include "mem/cache/tags/super_blk.hh"
@@ -100,6 +101,9 @@ BaseCacheCompressor::compress(const uint64_t* data, Cycles& comp_lat,
     // Get compression size
     comp_size_bits = comp_data->getSizeBits();
 
+    // Update stats
+    compressionSize[std::ceil(std::log2(comp_size_bits))]++;
+
     // Print debug information
     DPRINTF(CacheComp, "Compressed cache line from %d to %d bits. " \
             "Compression latency: %llu, decompression latency: %llu\n",
@@ -140,3 +144,23 @@ BaseCacheCompressor::setSizeBits(CacheBlk* blk, const std::size_t size_bits)
     static_cast<CompressionBlk*>(blk)->setSizeBits(size_bits);
 }
 
+void
+BaseCacheCompressor::regStats()
+{
+    SimObject::regStats();
+
+    // We also store when compression is bigger than original block size
+    compressionSize
+        .init(std::log2(blkSize*8) + 2)
+        .name(name() + ".compression_size")
+        .desc("Number of blocks that were compressed to this power of" \
+              "two size.")
+        ;
+
+    for (unsigned i = 0; i <= std::log2(blkSize*8) + 1; ++i) {
+        compressionSize.subname(i, std::to_string(1 << i));
+        compressionSize.subdesc(i, "Number of blocks that compressed to fit " \
+                                   "in " + std::to_string(1 << i) + " bits");
+    }
+}
+
index 1a8c82c9b662f10cab6ecac8fb0e50f2f44525b2..a19a0727a4b4ec724b24d5e43fdbbc9ceef247c2 100644 (file)
@@ -40,6 +40,7 @@
 
 #include <cstdint>
 
+#include "base/statistics.hh"
 #include "base/types.hh"
 #include "sim/sim_object.hh"
 
@@ -63,6 +64,18 @@ class BaseCacheCompressor : public SimObject {
      */
     const std::size_t blkSize;
 
+    /**
+     * @defgroup CompressionStats Compression specific statistics.
+     * @{
+     */
+
+    /** Number of blocks that were compressed to this power of two size. */
+    Stats::Vector compressionSize;
+
+    /**
+     * @}
+     */
+
     /**
      * Apply the compression process to the cache line.
      * Returns the number of cycles used by the compressor, however it is
@@ -136,6 +149,11 @@ class BaseCacheCompressor : public SimObject {
      * @param size_bits The block size.
      */
     static void setSizeBits(CacheBlk* blk, const std::size_t size_bits);
+
+    /**
+     * Register local statistics.
+     */
+    void regStats() override;
 };
 
 class BaseCacheCompressor::CompressionData {