diff options
author | Daniel R. Carvalho <odanrc@yahoo.com.br> | 2019-08-21 14:44:00 +0200 |
---|---|---|
committer | Daniel Carvalho <odanrc@yahoo.com.br> | 2019-10-29 21:32:02 +0000 |
commit | b42971dabdfa0467911c7d320a08398411bf2a34 (patch) | |
tree | 7b10bc465d213b30c78de92cf9b5b6b88c3552c3 /src/mem | |
parent | 0c5ef2d999d439a0313bb60e42a6fe6133c59038 (diff) | |
download | gem5-b42971dabdfa0467911c7d320a08398411bf2a34.tar.xz |
mem-cache: Limit compression size
Add a threshold so that if the compressed size is greater than it,
the compression is abandoned, and the data is considered uncompressible.
Change-Id: Ic416195b06ec440a40263b75bd0f0383cde2ea6a
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/21144
Tested-by: kokoro <noreply+kokoro@google.com>
Reviewed-by: Bobby R. Bruce <bbruce@ucdavis.edu>
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Diffstat (limited to 'src/mem')
-rw-r--r-- | src/mem/cache/compressors/Compressors.py | 3 | ||||
-rw-r--r-- | src/mem/cache/compressors/base.cc | 14 | ||||
-rw-r--r-- | src/mem/cache/compressors/base.hh | 6 |
3 files changed, 18 insertions, 5 deletions
diff --git a/src/mem/cache/compressors/Compressors.py b/src/mem/cache/compressors/Compressors.py index b266ccc95..4f86ec282 100644 --- a/src/mem/cache/compressors/Compressors.py +++ b/src/mem/cache/compressors/Compressors.py @@ -36,6 +36,9 @@ class BaseCacheCompressor(SimObject): cxx_header = "mem/cache/compressors/base.hh" block_size = Param.Int(Parent.cache_line_size, "Block size in bytes") + size_threshold = Param.Unsigned(Parent.cache_line_size, "Minimum size, " + "in bytes, in which a block must be compressed to. Otherwise it is " + "stored in its uncompressed state") class BDI(BaseCacheCompressor): type = 'BDI' diff --git a/src/mem/cache/compressors/base.cc b/src/mem/cache/compressors/base.cc index 40244e249..0016e4702 100644 --- a/src/mem/cache/compressors/base.cc +++ b/src/mem/cache/compressors/base.cc @@ -73,8 +73,9 @@ BaseCacheCompressor::CompressionData::getSize() const } BaseCacheCompressor::BaseCacheCompressor(const Params *p) - : SimObject(p), blkSize(p->block_size) + : SimObject(p), blkSize(p->block_size), sizeThreshold(p->size_threshold) { + fatal_if(blkSize < sizeThreshold, "Compressed data must fit in a block"); } void @@ -98,8 +99,12 @@ BaseCacheCompressor::compress(const uint64_t* data, Cycles& comp_lat, "Decompressed line does not match original line."); #endif - // Get compression size + // Get compression size. If compressed size is greater than the size + // threshold, the compression is seen as unsuccessful comp_size_bits = comp_data->getSizeBits(); + if (comp_size_bits >= sizeThreshold * 8) { + comp_size_bits = blkSize * 8; + } // Update stats compressionSize[std::ceil(std::log2(comp_size_bits))]++; @@ -152,15 +157,14 @@ BaseCacheCompressor::regStats() { SimObject::regStats(); - // We also store when compression is bigger than original block size compressionSize - .init(std::log2(blkSize*8) + 2) + .init(std::log2(blkSize*8) + 1) .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) { + for (unsigned i = 0; i <= std::log2(blkSize*8); ++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 f457ecdc4..19dec0fd3 100644 --- a/src/mem/cache/compressors/base.hh +++ b/src/mem/cache/compressors/base.hh @@ -65,6 +65,12 @@ class BaseCacheCompressor : public SimObject { const std::size_t blkSize; /** + * Size in bytes at which a compression is classified as bad and therefore + * the compressed block is restored to its uncompressed format. + */ + const std::size_t sizeThreshold; + + /** * @defgroup CompressionStats Compression specific statistics. * @{ */ |