From 784642b4312c3366cae727b4fef1ea763ace2c87 Mon Sep 17 00:00:00 2001 From: "Daniel R. Carvalho" Date: Fri, 30 Mar 2018 15:09:51 +0200 Subject: [PATCH] mem-cache: Add compression data to CompressionBlk Add a compression bit, decompression latency and compressed block size and their respective getters and setters. Change-Id: Ia9d8656552d60e8d4e85fe5379dd75fc5adb0abe Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/11102 Tested-by: kokoro Maintainer: Nikos Nikoleris Reviewed-by: Nikos Nikoleris --- src/mem/cache/cache_blk.hh | 2 + src/mem/cache/tags/super_blk.cc | 65 ++++++++++++++++++++++++++++- src/mem/cache/tags/super_blk.hh | 72 +++++++++++++++++++++++++++++++++ 3 files changed, 138 insertions(+), 1 deletion(-) diff --git a/src/mem/cache/cache_blk.hh b/src/mem/cache/cache_blk.hh index 611ce448d..ddcf3ecb6 100644 --- a/src/mem/cache/cache_blk.hh +++ b/src/mem/cache/cache_blk.hh @@ -76,6 +76,8 @@ enum CacheBlkStatusBits : unsigned { BlkHWPrefetched = 0x20, /** block holds data from the secure memory space */ BlkSecure = 0x40, + /** block holds compressed data */ + BlkCompressed = 0x80 }; /** diff --git a/src/mem/cache/tags/super_blk.cc b/src/mem/cache/tags/super_blk.cc index 3e8835625..530a2c078 100644 --- a/src/mem/cache/tags/super_blk.cc +++ b/src/mem/cache/tags/super_blk.cc @@ -39,6 +39,69 @@ #include "base/logging.hh" CompressionBlk::CompressionBlk() - : SectorSubBlk() + : SectorSubBlk(), _size(0), _decompressionLatency(0) { } + +bool +CompressionBlk::isCompressed() const +{ + return (status & BlkCompressed) != 0; +} + +void +CompressionBlk::setCompressed() +{ + status |= BlkCompressed; +} + +void +CompressionBlk::setUncompressed() +{ + status &= ~BlkCompressed; +} + +std::size_t +CompressionBlk::getSizeBits() const +{ + return _size; +} + +void +CompressionBlk::setSizeBits(const std::size_t size) +{ + _size = size; +} + +Cycles +CompressionBlk::getDecompressionLatency() const +{ + return _decompressionLatency; +} + +void +CompressionBlk::setDecompressionLatency(const Cycles lat) +{ + _decompressionLatency = lat; +} + +std::string +CompressionBlk::print() const +{ + return csprintf("%s compressed: %d size: %llu decompression latency: %d", + SectorSubBlk::print(), isCompressed(), getSizeBits(), + getDecompressionLatency()); +} + +bool +SuperBlk::isCompressed() const +{ + for (const auto& blk : blks) { + if (blk->isValid()) { + return static_cast(blk)->isCompressed(); + } + } + + // An invalid block is seen as compressed + return true; +} diff --git a/src/mem/cache/tags/super_blk.hh b/src/mem/cache/tags/super_blk.hh index 45c7f1a66..bf35c6992 100644 --- a/src/mem/cache/tags/super_blk.hh +++ b/src/mem/cache/tags/super_blk.hh @@ -49,11 +49,75 @@ class SuperBlk; */ class CompressionBlk : public SectorSubBlk { + private: + /** + * Set size, in bits, of this compressed block's data. + */ + std::size_t _size; + + /** + * Number of cycles needed to decompress this block. We store it to avoid + * doing decompressions. + */ + Cycles _decompressionLatency; + public: CompressionBlk(); CompressionBlk(const CompressionBlk&) = delete; CompressionBlk& operator=(const CompressionBlk&) = delete; ~CompressionBlk() {}; + + /** + * Check if this block holds compressed data. + * + * @return True if the block holds compressed data. + */ + bool isCompressed() const; + + /** + * Set compression bit. + */ + void setCompressed(); + + /** + * Clear compression bit. + */ + void setUncompressed(); + + /* + * Get size, in bits, of this compressed block's data. + * + * @return The compressed size. + */ + std::size_t getSizeBits() const; + + /** + * Set size, in bits, of this compressed block's data. + * + * @param The compressed size. + */ + void setSizeBits(const std::size_t size); + + /** + * Get number of cycles needed to decompress this block. + * + * @return Decompression latency. + */ + Cycles getDecompressionLatency() const; + + /** + * Set number of cycles needed to decompress this block. + * + * @param Decompression latency. + */ + void setDecompressionLatency(const Cycles lat); + + /** + * Pretty-print sector offset and other CacheBlk information. + * + * @return string with basic state information + */ + std::string print() const override; }; /** @@ -67,6 +131,14 @@ class SuperBlk : public SectorBlk SuperBlk(const SuperBlk&) = delete; SuperBlk& operator=(const SuperBlk&) = delete; ~SuperBlk() {}; + + /** + * Returns whether the superblock contains compressed blocks or not. By + * default, if not blocks are valid, the superblock is compressible. + * + * @return The compressibility state of the superblock. + */ + bool isCompressed() const; }; #endif //__MEM_CACHE_TAGS_SUPER_BLK_HH__ -- 2.30.2