Daniel Carvalho has uploaded this change for review. (
https://gem5-review.googlesource.com/11410
Change subject: mem-cache: Add compression and decompression calls
......................................................................
mem-cache: Add compression and decompression calls
Add a compressor to the base cache class and compress within
block allocation and decompress on writebacks.
Change-Id: Ie36db65f7487c9b05ec4aedebc2c7651b4cb4821
---
M src/mem/cache/Cache.py
M src/mem/cache/base.cc
M src/mem/cache/base.hh
M src/mem/cache/superblock_blk.cc
M src/mem/cache/superblock_blk.hh
M src/mem/cache/tags/Tags.py
M src/mem/cache/tags/base.hh
M src/mem/cache/tags/compressed_tags.cc
8 files changed, 92 insertions(+), 8 deletions(-)
diff --git a/src/mem/cache/Cache.py b/src/mem/cache/Cache.py
index 47fe2b6..10e9125 100644
--- a/src/mem/cache/Cache.py
+++ b/src/mem/cache/Cache.py
@@ -41,6 +41,7 @@
from m5.params import *
from m5.proxy import *
+from Compressors import *
from MemObject import MemObject
from Prefetcher import BasePrefetcher
from ReplacementPolicies import *
@@ -85,6 +86,8 @@
replacement_policy = Param.BaseReplacementPolicy(LRURP(),
"Replacement policy")
+ compressor = Param.BaseCacheCompressor(NoCompressor(),
+ "Cache compressor.")
max_compression_ratio = Param.Int(1,
"Maximum number of compressed blocks per tag.")
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index 32cffac..78c1fdc 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -57,6 +57,7 @@
#include "mem/cache/mshr.hh"
#include "mem/cache/prefetch/base.hh"
#include "mem/cache/queue_entry.hh"
+#include "mem/cache/superblock_blk.hh"
#include "params/BaseCache.hh"
#include "sim/core.hh"
@@ -81,6 +82,7 @@
mshrQueue("MSHRs", p->mshrs, 0, p->demand_mshr_reserve), // see below
writeBuffer("write buffer", p->write_buffers, p->mshrs), // see below
tags(p->tags),
+ compressor(p->compressor),
prefetcher(p->prefetcher),
prefetchOnAccess(p->prefetch_on_access),
writebackClean(p->writeback_clean),
@@ -917,6 +919,15 @@
// that can modify its value.
blk = tags->accessBlock(pkt->getAddr(), pkt->isSecure(), lat);
+ // The compressor is called to decompress data on accesses. Although
+ // the data is stored uncompressed, even if a compressor is used, the
+ // compression and decompression methods are called to calculate the
+ // amount of cycles used.
+ if (blk && blk->isCompressed()){
+ CompressionBlk* compression_blk =
static_cast<CompressionBlk*>(blk);
+ lat +=
compressor->decompress(compression_blk->getCompressionData());
+ }
+
DPRINTF(Cache, "%s for %s %s\n", __func__, pkt->print(),
blk ? "hit " + blk->print() : "miss");
@@ -1224,9 +1235,17 @@
// Get secure bit
const bool is_secure = pkt->isSecure();
+ // The compressor is called to compress data before insertion.
+ // Although in Gem5 the data is stored uncompressed, even if a
compressor
+ // is used, the compression/decompression methods are called to
+ // calculate the amount of cycles needed on insertions.
+ std::unique_ptr<CompressionData> compression_data =
+ compressor->compress(pkt->getConstPtr<uint64_t>());
+
// Find replacement victim
std::vector<CacheBlk*> evict_blks;
- CacheBlk *victim = tags->findVictim(addr, is_secure, nullptr,
evict_blks);
+ CacheBlk *victim = tags->findVictim(addr, is_secure,
+ compression_data.get(),
evict_blks);
// It is valid to return nullptr if there is no victim
if (!victim)
@@ -1275,7 +1294,6 @@
}
// Insert new block at victimized entry
- std::unique_ptr<CompressionData> compression_data;
tags->insertBlock(addr, is_secure, pkt->req->masterId(),
pkt->req->taskId(), compression_data, victim);
@@ -1329,6 +1347,14 @@
pkt->allocate();
pkt->setDataFromBlock(blk->data, blkSize);
+ // When a block is compressed, it must first be decompressed before
being
+ // accessed. This adds to the packet latency
+ if (blk->isCompressed()) {
+ CompressionBlk* compression_blk =
static_cast<CompressionBlk*>(blk);
+ pkt->headerDelay += compressor->decompress(
+ compression_blk->getCompressionData());
+ }
+
return pkt;
}
@@ -1368,6 +1394,14 @@
pkt->allocate();
pkt->setDataFromBlock(blk->data, blkSize);
+ // When a block is compressed, it must first be decompressed before
being
+ // accessed. This adds to the packet latency
+ if (blk->isCompressed()) {
+ CompressionBlk* compression_blk =
static_cast<CompressionBlk*>(blk);
+ pkt->headerDelay += compressor->decompress(
+ compression_blk->getCompressionData());
+ }
+
return pkt;
}
diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh
index 4ba256b..3b432bc 100644
--- a/src/mem/cache/base.hh
+++ b/src/mem/cache/base.hh
@@ -78,6 +78,7 @@
#include "sim/sim_exit.hh"
#include "sim/system.hh"
+class BaseCacheCompressor;
class BaseMasterPort;
class BasePrefetcher;
class BaseSlavePort;
@@ -320,6 +321,9 @@
/** Tag and data Storage */
BaseTags *tags;
+ /** Compression method being used. */
+ BaseCacheCompressor* compressor;
+
/** Prefetcher */
BasePrefetcher *prefetcher;
diff --git a/src/mem/cache/superblock_blk.cc
b/src/mem/cache/superblock_blk.cc
index b7e8f48..8f8e916 100644
--- a/src/mem/cache/superblock_blk.cc
+++ b/src/mem/cache/superblock_blk.cc
@@ -42,7 +42,8 @@
#include "base/logging.hh"
CompressionBlk::CompressionBlk()
- : CacheBlk(), _superblock(nullptr), _superblockOffset(0)
+ : CacheBlk(), _superblock(nullptr), _superblockOffset(0),
+ _compressionData(nullptr)
{
}
@@ -78,9 +79,23 @@
}
void
+CompressionBlk::setCompressionData(
+ std::unique_ptr<CompressionData>& compression_data)
+{
+ _compressionData = std::move(compression_data);
+}
+
+const CompressionData*
+CompressionBlk::getCompressionData() const
+{
+ return _compressionData.get();
+}
+
+void
CompressionBlk::insert(const Addr tag, const bool is_secure,
const bool is_compressed,
- const int src_master_ID, const uint32_t task_ID)
+ const int src_master_ID, const uint32_t task_ID,
+ std::unique_ptr<CompressionData>& compression_data)
{
// Make sure it is not overwriting another superblock
panic_if((_superblock && _superblock->isValid()) &&
@@ -92,6 +107,9 @@
// Set superblock tag
_superblock->setTag(tag);
+
+ // Set compression data
+ setCompressionData(compression_data);
}
bool
diff --git a/src/mem/cache/superblock_blk.hh
b/src/mem/cache/superblock_blk.hh
index 64bc1cb..1931978 100644
--- a/src/mem/cache/superblock_blk.hh
+++ b/src/mem/cache/superblock_blk.hh
@@ -40,6 +40,7 @@
#include <vector>
#include "mem/cache/blk.hh"
+#include "mem/cache/compressors/base.hh"
#include "mem/cache/replacement_policies/base.hh"
class SuperblockBlk;
@@ -61,6 +62,19 @@
*/
int _superblockOffset;
+ /**
+ * Data contained by this block in a compressed format.
+ */
+ std::unique_ptr<CompressionData> _compressionData;
+
+ /**
+ * Set data as compressed by the chosen compression method.
+ *
+ * @param compression_data The compression data.
+ */
+ void setCompressionData(
+ std::unique_ptr<CompressionData>& compression_data);
+
public:
CompressionBlk();
CompressionBlk(const CompressionBlk&) = delete;
@@ -103,6 +117,13 @@
Addr getTag() const;
/**
+ * Get compression data.
+ *
+ * @return The compression data.
+ */
+ const CompressionData* getCompressionData() const;
+
+ /**
* Set member variables when a block insertion occurs. Resets reference
* count to 1 (the insertion counts as a reference), and touch block if
* it hadn't been touched previously. Sets the insertion tick to the
@@ -113,9 +134,11 @@
* @param is_compressed Whether the data has been compressed or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param compression_data The compression data.
*/
void insert(const Addr tag, const bool is_secure, const bool
is_compressed,
- const int src_master_ID, const uint32_t task_ID);
+ const int src_master_ID, const uint32_t task_ID,
+ std::unique_ptr<CompressionData>& compression_data);
};
/**
diff --git a/src/mem/cache/tags/Tags.py b/src/mem/cache/tags/Tags.py
index 46f4339..81d12bb 100644
--- a/src/mem/cache/tags/Tags.py
+++ b/src/mem/cache/tags/Tags.py
@@ -38,6 +38,7 @@
from m5.params import *
from m5.proxy import *
from ClockedObject import ClockedObject
+from Compressors import *
class BaseTags(ClockedObject):
type = 'BaseTags'
diff --git a/src/mem/cache/tags/base.hh b/src/mem/cache/tags/base.hh
index 2a874ef..c4888bc 100644
--- a/src/mem/cache/tags/base.hh
+++ b/src/mem/cache/tags/base.hh
@@ -283,6 +283,7 @@
* @param is_secure True if the target memory space is secure.
* @param compression_data Compressed data of new block to allocate.
* @param evict_blks Cache blocks to be evicted.
+ * @param compression_data Compressed data of new block to co-allocate.
* @return Cache block to be replaced.
*/
virtual CacheBlk* findVictim(Addr addr, const bool is_secure,
diff --git a/src/mem/cache/tags/compressed_tags.cc
b/src/mem/cache/tags/compressed_tags.cc
index 71ecf79..b736d26 100644
--- a/src/mem/cache/tags/compressed_tags.cc
+++ b/src/mem/cache/tags/compressed_tags.cc
@@ -155,8 +155,8 @@
const Addr tag = extractTag(addr);
// The address can only be mapped to a specific location of a
superblock
- // due to superblocks being composed of contiguous-address entries
- // @todo this may not be true for other compressed cache organizations
+ // due to superblocks being composed of contiguous-address entries.
+ // This may not be true for other compressed cache organizations
const Addr offset = extractSuperblockOffset(addr);
// Find all possible superblock locations for the given address
@@ -302,7 +302,7 @@
// Set block's metadata. We always store compressed blocks when
possible
compression_blk->insert(extractTag(addr), is_secure,
false, /** @todo Determine compression status.
*/
- src_master_ID, task_ID);
+ src_master_ID, task_ID, compression_data);
// When a block is inserted, the tag is only a newly used tag if the
// superblock was not previously present in the cache.
--
To view, visit https://gem5-review.googlesource.com/11410
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Ie36db65f7487c9b05ec4aedebc2c7651b4cb4821
Gerrit-Change-Number: 11410
Gerrit-PatchSet: 1
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev