mem: Add additional tolerance to stride prefetcher
authorMitch Hayenga <mitch.hayenga+gem5@gmail.com>
Thu, 30 Jan 2014 05:21:26 +0000 (23:21 -0600)
committerMitch Hayenga <mitch.hayenga+gem5@gmail.com>
Thu, 30 Jan 2014 05:21:26 +0000 (23:21 -0600)
Forces the prefetcher to mispredict twice in a row before resetting the
confidence of prefetching.  This helps cases where a load PC strides by a
constant factor, however it may operate on different arrays at times.
Avoids the cost of retraining.  Primarily helps with small iteration loops.

Committed by: Nilay Vaish <nilay@cs.wisc.edu>

src/mem/cache/prefetch/stride.cc
src/mem/cache/prefetch/stride.hh

index c4cf2023aa560236318cd434d8fd49a37c45bce1..d4a31f9da91389b2ae8aacb0174a1276664647dc 100644 (file)
@@ -98,12 +98,17 @@ StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
         bool stride_match = (new_stride == (*iter)->stride);
 
         if (stride_match && new_stride != 0) {
+            (*iter)->tolerance = true;
             if ((*iter)->confidence < Max_Conf)
                 (*iter)->confidence++;
         } else {
-            (*iter)->stride = new_stride;
-            if ((*iter)->confidence > Min_Conf)
-                (*iter)->confidence = 0;
+            if (!((*iter)->tolerance)) {
+                (*iter)->stride = new_stride;
+                if ((*iter)->confidence > Min_Conf)
+                    (*iter)->confidence = 0;
+            } else {
+                (*iter)->tolerance = false;
+            }
         }
 
         DPRINTF(HWPrefetch, "hit: PC %x data_addr %x (%s) stride %d (%s), "
@@ -118,7 +123,7 @@ StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
             return;
 
         for (int d = 1; d <= degree; d++) {
-            Addr new_addr = data_addr + d * new_stride;
+            Addr new_addr = data_addr + d * (*iter)->stride;
             if (pageStop && !samePage(data_addr, new_addr)) {
                 // Spanned the page, so now stop
                 pfSpanPage += degree - d + 1;
@@ -160,6 +165,7 @@ StridePrefetcher::calculatePrefetch(PacketPtr &pkt, std::list<Addr> &addresses,
         new_entry->isSecure = is_secure;
         new_entry->stride = 0;
         new_entry->confidence = 0;
+        new_entry->tolerance = false;
         tab.push_back(new_entry);
     }
 }
index 0e31984f96fc421d802abec73a3235cd16b2b5ae..a491eb687d05ef033235e07dbdf286f2c6da718a 100644 (file)
@@ -72,6 +72,7 @@ class StridePrefetcher : public BasePrefetcher
         bool isSecure;
         int stride;
         int confidence;
+        bool tolerance;
     };
 
     std::list<StrideEntry*> table[Max_Contexts];