Daniel Carvalho has uploaded this change for review. (
https://gem5-review.googlesource.com/11198
Change subject: mem-cache: Data pointer in findVictim and insertBlock
......................................................................
mem-cache: Data pointer in findVictim and insertBlock
Add data pointer to findVictim and insertBlock. In findVictim
it will be used to know whether data can be co-allocated or not.
In insertBlock it will be used to insert compressed data.
Change-Id: Id07f79763687b29f75d707c080fa9bd978a408aa
---
M src/mem/cache/base.cc
M src/mem/cache/tags/base.hh
M src/mem/cache/tags/base_set_assoc.hh
M src/mem/cache/tags/compressed_tags.cc
M src/mem/cache/tags/compressed_tags.hh
M src/mem/cache/tags/fa_lru.cc
M src/mem/cache/tags/fa_lru.hh
M src/mem/cache/tags/sector_tags.cc
M src/mem/cache/tags/sector_tags.hh
9 files changed, 42 insertions(+), 20 deletions(-)
diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index 1144cba..e76621d 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -1223,6 +1223,9 @@
// Get secure bit
const bool is_secure = pkt->isSecure();
+ // Get packet's data pointer
+ const uint64_t* data_ptr = pkt->getConstPtr<uint64_t>();
+
// Allocation latency
// @todo When evicting compressed blocks they must be decompressed
// first, so the latency to do so must be taken into account.
@@ -1233,7 +1236,8 @@
// Find replacement victim
std::vector<CacheBlk*> evict_blks;
- CacheBlk *victim = tags->findVictim(addr, is_secure, lat, evict_blks);
+ CacheBlk *victim = tags->findVictim(addr, is_secure, data_ptr, lat,
+ evict_blks);
// It is valid to return nullptr if there is no victim
if (!victim)
@@ -1283,7 +1287,7 @@
// Insert new block at victimized entry
tags->insertBlock(addr, is_secure, pkt->req->masterId(),
- pkt->req->taskId(), victim);
+ pkt->req->taskId(), data_ptr, victim);
return victim;
}
diff --git a/src/mem/cache/tags/base.hh b/src/mem/cache/tags/base.hh
index 6ce9e60..fe0e094 100644
--- a/src/mem/cache/tags/base.hh
+++ b/src/mem/cache/tags/base.hh
@@ -280,11 +280,13 @@
*
* @param addr Address to find a victim for.
* @param is_secure True if the target memory space is secure.
+ * @param data_ptr Pointer to the block's data.
* @param lat The access latency (i.e., decompression).
* @param evict_blks Cache blocks to be evicted.
* @return Cache block to be replaced.
*/
- virtual CacheBlk* findVictim(Addr addr, const bool is_secure, Cycles
&lat,
+ virtual CacheBlk* findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
= 0;
virtual CacheBlk* accessBlock(Addr addr, bool is_secure, Cycles &lat)
= 0;
@@ -301,11 +303,12 @@
* @param is_secure Whether the block is in secure space or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param data_ptr Pointer to the block's data.
* @param blk The block to update.
*/
virtual void insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t
task_ID,
- CacheBlk *blk) = 0;
+ const uint64_t* data_ptr, CacheBlk *blk) = 0;
/**
* Regenerate the block address.
diff --git a/src/mem/cache/tags/base_set_assoc.hh
b/src/mem/cache/tags/base_set_assoc.hh
index 3029919..c383e75 100644
--- a/src/mem/cache/tags/base_set_assoc.hh
+++ b/src/mem/cache/tags/base_set_assoc.hh
@@ -204,11 +204,13 @@
*
* @param addr Address to find a victim for.
* @param is_secure True if the target memory space is secure.
+ * @param data_ptr Pointer to the block's data.
* @param lat The access latency (i.e., decompression).
* @param evict_blks Cache blocks to be evicted.
* @return Cache block to be replaced.
*/
- CacheBlk* findVictim(Addr addr, const bool is_secure, Cycles& lat,
+ CacheBlk* findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const override
{
// Get possible locations for the victim block
@@ -252,11 +254,12 @@
* @param is_secure Whether the block is in secure space or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param data_ptr Pointer to the block's data.
* @param blk The block to update.
*/
void insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk) override
+ const uint64_t* data_ptr, CacheBlk *blk) override
{
// Make sure we are not overwriting a valid block
assert(!blk->isValid());
diff --git a/src/mem/cache/tags/compressed_tags.cc
b/src/mem/cache/tags/compressed_tags.cc
index 4ff7dee..e99a4c8 100644
--- a/src/mem/cache/tags/compressed_tags.cc
+++ b/src/mem/cache/tags/compressed_tags.cc
@@ -225,7 +225,8 @@
}
CacheBlk*
-CompressedTags::findVictim(Addr addr, const bool is_secure, Cycles& lat,
+CompressedTags::findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
{
// Clear latency
@@ -287,7 +288,7 @@
void
CompressedTags::insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t
task_ID,
- CacheBlk *blk)
+ const uint64_t* data_ptr, CacheBlk *blk)
{
// Make sure we are not overwriting a valid block
assert(!blk->isValid());
diff --git a/src/mem/cache/tags/compressed_tags.hh
b/src/mem/cache/tags/compressed_tags.hh
index ba08ca1..d4915f1 100644
--- a/src/mem/cache/tags/compressed_tags.hh
+++ b/src/mem/cache/tags/compressed_tags.hh
@@ -175,15 +175,18 @@
CacheBlk* accessBlock(Addr addr, bool is_secure, Cycles &lat) override;
/**
- * Find replacement victim based on address.
+ * Find replacement victim based on address. The data_ptr is used to
+ * determine if a block can be co-allocated.
*
* @param addr Address to find a victim for.
* @param is_secure True if the target memory space is secure.
+ * @param data_ptr Pointer to the block's data.
* @param lat The access latency (i.e., decompression).
* @param evict_blks Cache blocks to be evicted.
* @return Cache block to be replaced.
*/
- CacheBlk* findVictim(Addr addr, const bool is_secure, Cycles& lat,
+ CacheBlk* findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
override;
/**
@@ -193,11 +196,12 @@
* @param is_secure Whether the block is in secure space or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param data_ptr Pointer to the block's data.
* @param blk The block to update.
*/
void insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk) override;
+ const uint64_t* data_ptr, CacheBlk *blk) override;
/**
* Generate the superblock tag from the given address.
diff --git a/src/mem/cache/tags/fa_lru.cc b/src/mem/cache/tags/fa_lru.cc
index 934876e..d200ca6 100644
--- a/src/mem/cache/tags/fa_lru.cc
+++ b/src/mem/cache/tags/fa_lru.cc
@@ -195,8 +195,8 @@
}
CacheBlk*
-FALRU::findVictim(Addr addr, const bool is_secure, Cycles& lat,
- std::vector<CacheBlk*>& evict_blks) const
+FALRU::findVictim(Addr addr, const bool is_secure, const uint64_t*
data_ptr,
+ Cycles& lat, std::vector<CacheBlk*>& evict_blks) const
{
// The victim is always stored on the tail for the FALRU
FALRUBlk* victim = tail;
@@ -213,7 +213,7 @@
void
FALRU::insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk)
+ const uint64_t* data_ptr, CacheBlk *blk)
{
FALRUBlk* falruBlk = static_cast<FALRUBlk*>(blk);
diff --git a/src/mem/cache/tags/fa_lru.hh b/src/mem/cache/tags/fa_lru.hh
index 252fa79..9f249ff 100644
--- a/src/mem/cache/tags/fa_lru.hh
+++ b/src/mem/cache/tags/fa_lru.hh
@@ -201,11 +201,13 @@
*
* @param addr Address to find a victim for.
* @param is_secure True if the target memory space is secure.
+ * @param data_ptr Pointer to the block's data.
* @param lat The access latency (i.e., decompression).
* @param evict_blks Cache blocks to be evicted.
* @return Cache block to be replaced.
*/
- CacheBlk* findVictim(Addr addr, const bool is_secure, Cycles &lat,
+ CacheBlk* findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
override;
/**
@@ -215,11 +217,12 @@
* @param is_secure Whether the block is in secure space or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param data_ptr Pointer to the block's data.
* @param blk The block to update.
*/
void insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk) override;
+ const uint64_t* data_ptr, CacheBlk *blk) override;
/**
* Generate the tag from the addres. For fully associative this is
just the
diff --git a/src/mem/cache/tags/sector_tags.cc
b/src/mem/cache/tags/sector_tags.cc
index 61f689a..230a701 100644
--- a/src/mem/cache/tags/sector_tags.cc
+++ b/src/mem/cache/tags/sector_tags.cc
@@ -196,7 +196,7 @@
void
SectorTags::insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk)
+ const uint64_t* data_ptr, CacheBlk *blk)
{
// Make sure we are not overwriting a valid block
assert(!blk->isValid());
@@ -259,7 +259,8 @@
}
CacheBlk*
-SectorTags::findVictim(Addr addr, const bool is_secure, Cycles& lat,
+SectorTags::findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
{
// Get all possible locations of this sector
diff --git a/src/mem/cache/tags/sector_tags.hh
b/src/mem/cache/tags/sector_tags.hh
index 1611ca0..f415ff1 100644
--- a/src/mem/cache/tags/sector_tags.hh
+++ b/src/mem/cache/tags/sector_tags.hh
@@ -153,11 +153,12 @@
* @param is_secure Whether the block is in secure space or not.
* @param src_master_ID The source requestor ID.
* @param task_ID The new task ID.
+ * @param data_ptr Pointer to the block's data.
* @param blk The block to update.
*/
void insertBlock(const Addr addr, const bool is_secure,
const int src_master_ID, const uint32_t task_ID,
- CacheBlk *blk) override;
+ const uint64_t* data_ptr, CacheBlk *blk) override;
/**
* Finds the given address in the cache, do not update replacement
data.
@@ -183,11 +184,13 @@
*
* @param addr Address to find a victim for.
* @param is_secure True if the target memory space is secure.
+ * @param data_ptr Pointer to the block's data.
* @param lat The access latency (i.e., decompression).
* @param evict_blks Cache blocks to be evicted.
* @return Cache block to be replaced.
*/
- CacheBlk* findVictim(Addr addr, const bool is_secure, Cycles& lat,
+ CacheBlk* findVictim(Addr addr, const bool is_secure,
+ const uint64_t* data_ptr, Cycles& lat,
std::vector<CacheBlk*>& evict_blks) const
override;
/**
--
To view, visit https://gem5-review.googlesource.com/11198
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: Id07f79763687b29f75d707c080fa9bd978a408aa
Gerrit-Change-Number: 11198
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