diff --git a/src/mem/cache/replacement_policies/base.hh b/src/mem/cache/replacement_policies/base.hh index 039362942e..0851287585 100644 --- a/src/mem/cache/replacement_policies/base.hh +++ b/src/mem/cache/replacement_policies/base.hh @@ -33,6 +33,7 @@ #include "base/compiler.hh" #include "mem/cache/replacement_policies/replaceable_entry.hh" +#include "mem/packet.hh" #include "params/BaseReplacementPolicy.hh" #include "sim/sim_object.hh" @@ -67,17 +68,29 @@ class Base : public SimObject * Update replacement data. * * @param replacement_data Replacement data to be touched. + * @param pkt Packet that generated this access. */ virtual void touch(const std::shared_ptr& - replacement_data) const = 0; + replacement_data, const PacketPtr pkt) + { + touch(replacement_data); + } + virtual void touch(const std::shared_ptr& + replacement_data) const = 0; /** * Reset replacement data. Used when it's holder is inserted/validated. * * @param replacement_data Replacement data to be reset. + * @param pkt Packet that generated this access. */ virtual void reset(const std::shared_ptr& - replacement_data) const = 0; + replacement_data, const PacketPtr pkt) + { + reset(replacement_data); + } + virtual void reset(const std::shared_ptr& + replacement_data) const = 0; /** * Find replacement victim among candidates. diff --git a/src/mem/cache/replacement_policies/dueling_rp.cc b/src/mem/cache/replacement_policies/dueling_rp.cc index e6911415da..3565017d07 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.cc +++ b/src/mem/cache/replacement_policies/dueling_rp.cc @@ -53,6 +53,16 @@ Dueling::invalidate(const std::shared_ptr& replacement_data) replPolicyB->invalidate(casted_replacement_data->replDataB); } +void +Dueling::touch(const std::shared_ptr& replacement_data, + const PacketPtr pkt) +{ + std::shared_ptr casted_replacement_data = + std::static_pointer_cast(replacement_data); + replPolicyA->touch(casted_replacement_data->replDataA, pkt); + replPolicyB->touch(casted_replacement_data->replDataB, pkt); +} + void Dueling::touch(const std::shared_ptr& replacement_data) const { @@ -62,6 +72,22 @@ Dueling::touch(const std::shared_ptr& replacement_data) const replPolicyB->touch(casted_replacement_data->replDataB); } +void +Dueling::reset(const std::shared_ptr& replacement_data, + const PacketPtr pkt) +{ + std::shared_ptr casted_replacement_data = + std::static_pointer_cast(replacement_data); + replPolicyA->reset(casted_replacement_data->replDataA, pkt); + replPolicyB->reset(casted_replacement_data->replDataB, pkt); + + // A miss in a set is a sample to the duel. A call to this function + // implies in the replacement of an entry, which was either caused by + // a miss, an external invalidation, or the initialization of the table + // entry (when warming up) + duelingMonitor.sample(static_cast(casted_replacement_data.get())); +} + void Dueling::reset(const std::shared_ptr& replacement_data) const { diff --git a/src/mem/cache/replacement_policies/dueling_rp.hh b/src/mem/cache/replacement_policies/dueling_rp.hh index 0c96ca70a1..314042ed06 100644 --- a/src/mem/cache/replacement_policies/dueling_rp.hh +++ b/src/mem/cache/replacement_policies/dueling_rp.hh @@ -97,8 +97,12 @@ class Dueling : public Base void invalidate(const std::shared_ptr& replacement_data) override; + void touch(const std::shared_ptr& replacement_data, + const PacketPtr pkt) override; void touch(const std::shared_ptr& replacement_data) const override; + void reset(const std::shared_ptr& replacement_data, + const PacketPtr pkt) override; void reset(const std::shared_ptr& replacement_data) const override; ReplaceableEntry* getVictim(const ReplacementCandidates& candidates) const diff --git a/src/mem/cache/tags/base_set_assoc.hh b/src/mem/cache/tags/base_set_assoc.hh index dc749dde99..7ca702b4ae 100644 --- a/src/mem/cache/tags/base_set_assoc.hh +++ b/src/mem/cache/tags/base_set_assoc.hh @@ -143,7 +143,7 @@ class BaseSetAssoc : public BaseTags blk->increaseRefCount(); // Update replacement data of accessed block - replacementPolicy->touch(blk->replacementData); + replacementPolicy->touch(blk->replacementData, pkt); } // The tag lookup latency is the same for a hit or a miss @@ -195,7 +195,7 @@ class BaseSetAssoc : public BaseTags stats.tagsInUse++; // Update replacement policy - replacementPolicy->reset(blk->replacementData); + replacementPolicy->reset(blk->replacementData, pkt); } void moveBlock(CacheBlk *src_blk, CacheBlk *dest_blk) override; diff --git a/src/mem/cache/tags/sector_tags.cc b/src/mem/cache/tags/sector_tags.cc index d90708ed54..d63773b2bb 100644 --- a/src/mem/cache/tags/sector_tags.cc +++ b/src/mem/cache/tags/sector_tags.cc @@ -163,7 +163,7 @@ SectorTags::accessBlock(const PacketPtr pkt, Cycles &lat) // Update replacement data of accessed block, which is shared with // the whole sector it belongs to - replacementPolicy->touch(sector_blk->replacementData); + replacementPolicy->touch(sector_blk->replacementData, pkt); } // The tag lookup latency is the same for a hit or a miss @@ -183,14 +183,14 @@ SectorTags::insertBlock(const PacketPtr pkt, CacheBlk *blk) // sector was not previously present in the cache. if (sector_blk->isValid()) { // An existing entry's replacement data is just updated - replacementPolicy->touch(sector_blk->replacementData); + replacementPolicy->touch(sector_blk->replacementData, pkt); } else { // Increment tag counter stats.tagsInUse++; assert(stats.tagsInUse.value() <= numSectors); // A new entry resets the replacement data - replacementPolicy->reset(sector_blk->replacementData); + replacementPolicy->reset(sector_blk->replacementData, pkt); } // Do common block insertion functionality