diff options
Diffstat (limited to 'src/mem/cache/compressors')
-rw-r--r-- | src/mem/cache/compressors/base.cc | 24 | ||||
-rw-r--r-- | src/mem/cache/compressors/base.hh | 18 |
2 files changed, 42 insertions, 0 deletions
diff --git a/src/mem/cache/compressors/base.cc b/src/mem/cache/compressors/base.cc index 2991dfeda..1ba2677ea 100644 --- a/src/mem/cache/compressors/base.cc +++ b/src/mem/cache/compressors/base.cc @@ -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"); + } +} + diff --git a/src/mem/cache/compressors/base.hh b/src/mem/cache/compressors/base.hh index 1a8c82c9b..a19a0727a 100644 --- a/src/mem/cache/compressors/base.hh +++ b/src/mem/cache/compressors/base.hh @@ -40,6 +40,7 @@ #include <cstdint> +#include "base/statistics.hh" #include "base/types.hh" #include "sim/sim_object.hh" @@ -64,6 +65,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 * usually covered by a good pipelined execution, and is currently ignored. @@ -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 { |