Daniel Carvalho has submitted this change. ( https://gem5-review.googlesource.com/c/public/gem5/+/38117 )

Change subject: mem-cache: Allow sending packet information to replacement policy
......................................................................

mem-cache: Allow sending packet information to replacement policy

Some replacement policies can use information such as address or
PC to improve their re-reference prediction.

Change-Id: I412eee09efa2f3511ca1ece76fc2732509df4745
Signed-off-by: Daniel R. Carvalho <[email protected]>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/38117
Tested-by: kokoro <[email protected]>
Reviewed-by: Jason Lowe-Power <[email protected]>
Maintainer: Jason Lowe-Power <[email protected]>
---
M src/mem/cache/replacement_policies/base.hh
M src/mem/cache/replacement_policies/dueling_rp.cc
M src/mem/cache/replacement_policies/dueling_rp.hh
M src/mem/cache/tags/base_set_assoc.hh
M src/mem/cache/tags/sector_tags.cc
5 files changed, 50 insertions(+), 7 deletions(-)

Approvals:
  Jason Lowe-Power: Looks good to me, approved; Looks good to me, approved
  kokoro: Regressions pass



diff --git a/src/mem/cache/replacement_policies/base.hh b/src/mem/cache/replacement_policies/base.hh
index 0393629..0851287 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 @@
      * 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<ReplacementData>&
- replacement_data) const = 0;
+        replacement_data, const PacketPtr pkt)
+    {
+        touch(replacement_data);
+    }
+    virtual void touch(const std::shared_ptr<ReplacementData>&
+        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<ReplacementData>&
- replacement_data) const = 0;
+        replacement_data, const PacketPtr pkt)
+    {
+        reset(replacement_data);
+    }
+    virtual void reset(const std::shared_ptr<ReplacementData>&
+        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 e691141..3565017 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.cc
+++ b/src/mem/cache/replacement_policies/dueling_rp.cc
@@ -54,6 +54,16 @@
 }

 void
+Dueling::touch(const std::shared_ptr<ReplacementData>& replacement_data,
+    const PacketPtr pkt)
+{
+    std::shared_ptr<DuelerReplData> casted_replacement_data =
+        std::static_pointer_cast<DuelerReplData>(replacement_data);
+    replPolicyA->touch(casted_replacement_data->replDataA, pkt);
+    replPolicyB->touch(casted_replacement_data->replDataB, pkt);
+}
+
+void
Dueling::touch(const std::shared_ptr<ReplacementData>& replacement_data) const
 {
     std::shared_ptr<DuelerReplData> casted_replacement_data =
@@ -63,6 +73,22 @@
 }

 void
+Dueling::reset(const std::shared_ptr<ReplacementData>& replacement_data,
+    const PacketPtr pkt)
+{
+    std::shared_ptr<DuelerReplData> casted_replacement_data =
+        std::static_pointer_cast<DuelerReplData>(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<Dueler*>(casted_replacement_data.get()));
+}
+
+void
Dueling::reset(const std::shared_ptr<ReplacementData>& replacement_data) const
 {
     std::shared_ptr<DuelerReplData> casted_replacement_data =
diff --git a/src/mem/cache/replacement_policies/dueling_rp.hh b/src/mem/cache/replacement_policies/dueling_rp.hh
index 0c96ca7..314042e 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.hh
+++ b/src/mem/cache/replacement_policies/dueling_rp.hh
@@ -97,8 +97,12 @@

void invalidate(const std::shared_ptr<ReplacementData>& replacement_data) override;
+    void touch(const std::shared_ptr<ReplacementData>& replacement_data,
+        const PacketPtr pkt) override;
void touch(const std::shared_ptr<ReplacementData>& replacement_data) const override;
+    void reset(const std::shared_ptr<ReplacementData>& replacement_data,
+        const PacketPtr pkt) override;
void reset(const std::shared_ptr<ReplacementData>& 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 dc749dd..7ca702b 100644
--- a/src/mem/cache/tags/base_set_assoc.hh
+++ b/src/mem/cache/tags/base_set_assoc.hh
@@ -143,7 +143,7 @@
             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 @@
         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 d90708e..d63773b 100644
--- a/src/mem/cache/tags/sector_tags.cc
+++ b/src/mem/cache/tags/sector_tags.cc
@@ -163,7 +163,7 @@

         // 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 @@
     // 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



5 is the latest approved patch-set.
No files were changed between the latest approved patch-set and the submitted one.
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/38117
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I412eee09efa2f3511ca1ece76fc2732509df4745
Gerrit-Change-Number: 38117
Gerrit-PatchSet: 9
Gerrit-Owner: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Daniel Carvalho <[email protected]>
Gerrit-Reviewer: Jason Lowe-Power <[email protected]>
Gerrit-Reviewer: Nikos Nikoleris <[email protected]>
Gerrit-Reviewer: kokoro <[email protected]>
Gerrit-MessageType: merged
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to