summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel R. Carvalho <odanrc@yahoo.com.br>2019-08-21 14:44:00 +0200
committerDaniel Carvalho <odanrc@yahoo.com.br>2019-10-29 21:32:02 +0000
commitb42971dabdfa0467911c7d320a08398411bf2a34 (patch)
tree7b10bc465d213b30c78de92cf9b5b6b88c3552c3
parent0c5ef2d999d439a0313bb60e42a6fe6133c59038 (diff)
downloadgem5-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>
-rw-r--r--src/mem/cache/compressors/Compressors.py3
-rw-r--r--src/mem/cache/compressors/base.cc14
-rw-r--r--src/mem/cache/compressors/base.hh6
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.
* @{
*/