mem-cache: Add compression stats
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>
This commit is contained in:
committed by
Daniel Carvalho
parent
f21f4a049e
commit
0e276f6512
24
src/mem/cache/compressors/base.cc
vendored
24
src/mem/cache/compressors/base.cc
vendored
@@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
18
src/mem/cache/compressors/base.hh
vendored
18
src/mem/cache/compressors/base.hh
vendored
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user