Nathanael Premillieu has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/47204 )

Change subject: mem: adding late prefetch stats
......................................................................

mem: adding late prefetch stats

Adding a late prefetch stat plus stats for each reason a prefetch can be
detected as late

Change-Id: Ia6d5294e8ce58b2b0aae2be98fd0cee83be73b8d
---
M src/mem/cache/base.cc
M src/mem/cache/base.hh
2 files changed, 45 insertions(+), 6 deletions(-)



diff --git a/src/mem/cache/base.cc b/src/mem/cache/base.cc
index 0c5c13e..7d0e83c 100644
--- a/src/mem/cache/base.cc
+++ b/src/mem/cache/base.cc
@@ -52,6 +52,7 @@
 #include "debug/CachePort.hh"
 #include "debug/CacheRepl.hh"
 #include "debug/CacheVerbose.hh"
+#include "debug/HWPrefetch.hh"
 #include "mem/cache/compressors/base.hh"
 #include "mem/cache/mshr.hh"
 #include "mem/cache/prefetch/base.hh"
@@ -824,9 +825,25 @@
         PacketPtr pkt = prefetcher->getPacket();
         if (pkt) {
             Addr pf_addr = pkt->getBlockAddr(blkSize);
-            if (!tags->findBlock(pf_addr, pkt->isSecure()) &&
-                !mshrQueue.findMatch(pf_addr, pkt->isSecure()) &&
-                !writeBuffer.findMatch(pf_addr, pkt->isSecure())) {
+            if (tags->findBlock(pf_addr, pkt->isSecure())) {
+                DPRINTF(HWPrefetch, "Prefetch %#x has hit in cache, "
+                        "dropped.\n", pf_addr);
+                stats.hitInCachePrefetches++;
+                // free the request and packet
+                delete pkt;
+            } else if (mshrQueue.findMatch(pf_addr, pkt->isSecure())) {
+                DPRINTF(HWPrefetch, "Prefetch %#x has hit in a MSHR, "
+                        "dropped.\n", pf_addr);
+                stats.hitInMSHRPrefetches++;
+                // free the request and packet
+                delete pkt;
+            } else if (writeBuffer.findMatch(pf_addr, pkt->isSecure())) {
+                DPRINTF(HWPrefetch, "Prefetch %#x has hit in the "
+                        "Write Buffer, dropped.\n", pf_addr);
+                stats.hitInWBPrefetches++;
+                // free the request and packet
+                delete pkt;
+            } else {
                 // Update statistic on number of prefetches issued
                 // (hwpf_mshr_misses)
                 assert(pkt->req->requestorId() < system->maxRequestors());
@@ -836,9 +853,6 @@
                 // that we send the packet straight away, so do not
                 // schedule the send
                 return allocateMissBuffer(pkt, curTick(), false);
-            } else {
-                // free the request and packet
-                delete pkt;
             }
         }
     }
@@ -2132,6 +2146,14 @@
     ADD_STAT(usefulPrefetches, statistics::units::Count::get(),
"number of useful prefetches (prefetched block accessed at least "
             "once)"),
+    ADD_STAT(hitInCachePrefetches, statistics::units::Count::get(),
+            "number of prefetches hitting in cache"),
+    ADD_STAT(hitInMSHRPrefetches, statistics::units::Count::get(),
+            "number of prefetches hitting in a MSHR"),
+    ADD_STAT(hitInWBPrefetches, statistics::units::Count::get(),
+            "number of prefetches hit in the Write Buffer"),
+    ADD_STAT(latePrefetches, statistics::units::Count::get(),
+            "number of late prefetches (hitting in cache, MSHR or WB)"),
     ADD_STAT(unusedPrefetches, statistics::units::Count::get(),
              "number of HardPF blocks evicted w/o reference"),
ADD_STAT(writebacks, statistics::units::Count::get(), "number of writebacks"),
@@ -2293,6 +2315,9 @@
         ;
     avgBlocked = blockedCycles / blockedCauses;

+    latePrefetches = hitInCachePrefetches + hitInMSHRPrefetches +
+                     hitInWBPrefetches;
+
     unusedPrefetches.flags(nozero);

     writebacks
diff --git a/src/mem/cache/base.hh b/src/mem/cache/base.hh
index bf01152..f323b17 100644
--- a/src/mem/cache/base.hh
+++ b/src/mem/cache/base.hh
@@ -1084,6 +1084,20 @@
         /** The number of times a HW-prefetch is useful. */
         Stats::Scalar usefulPrefetches;

+        /** The number of times a HW-prefetch hits in cache. */
+        Stats::Scalar hitInCachePrefetches;
+
+        /** The number of times a HW-prefetch hits in a MSHR. */
+        Stats::Scalar hitInMSHRPrefetches;
+
+        /** The number of times a HW-prefetch hits
+         * in the Write Buffer (WB). */
+        Stats::Scalar hitInWBPrefetches;
+
+        /** The number of times a HW-prefetch is late
+         * (hit in cache, MSHR, WB). */
+        Stats::Formula latePrefetches;
+
         /** The number of times a HW-prefetched block is evicted w/o
          * reference. */
         statistics::Scalar unusedPrefetches;

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/47204
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: Ia6d5294e8ce58b2b0aae2be98fd0cee83be73b8d
Gerrit-Change-Number: 47204
Gerrit-PatchSet: 1
Gerrit-Owner: Nathanael Premillieu <nathanael.premill...@huawei.com>
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