Daniel Carvalho has uploaded this change for review. ( 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 <oda...@yahoo.com.br>
---
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(-)



diff --git a/src/mem/cache/replacement_policies/base.hh b/src/mem/cache/replacement_policies/base.hh
index 7d09a4a..f873926 100644
--- a/src/mem/cache/replacement_policies/base.hh
+++ b/src/mem/cache/replacement_policies/base.hh
@@ -34,6 +34,7 @@
 #include <vector>

 #include "mem/cache/replacement_policies/replaceable_entry.hh"
+#include "mem/packet.hh"
 #include "params/BaseReplacementPolicy.hh"
 #include "sim/sim_object.hh"

@@ -112,17 +113,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 f3cce39..3e2e604 100644
--- a/src/mem/cache/replacement_policies/dueling_rp.cc
+++ b/src/mem/cache/replacement_policies/dueling_rp.cc
@@ -53,6 +53,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 =
@@ -62,6 +72,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 0bd0d95..3077744 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(
diff --git a/src/mem/cache/tags/base_set_assoc.hh b/src/mem/cache/tags/base_set_assoc.hh
index 07e19a5..38baa6d 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 f0229bf..980bcf3 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

--
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: 1
Gerrit-Owner: Daniel Carvalho <oda...@yahoo.com.br>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s

Reply via email to