mem-cache: Vectorize StridePrefetcher's entries.
authorDaniel <odanrc@yahoo.com.br>
Tue, 13 Nov 2018 19:47:51 +0000 (20:47 +0100)
committerDaniel Carvalho <odanrc@yahoo.com.br>
Thu, 15 Nov 2018 16:52:55 +0000 (16:52 +0000)
Turn StridePrefetcher::PCTable::entries into a vector of vectors.

Change-Id: I2a4589a76eb205910c43723638b7989eddd5ca24
Reviewed-on: https://gem5-review.googlesource.com/c/14357
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>

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

index a00b10a05284bb5fbcf13e2afde9853e2058b4b9..fde4f30117053127c30b47ff5f4789f66fe3bf1e 100644 (file)
@@ -72,32 +72,26 @@ StridePrefetcher::StridePrefetcher(const StridePrefetcherParams *p)
     assert(isPowerOf2(pcTableSets));
 }
 
-StridePrefetcher::StrideEntry**
+std::vector<std::vector<StridePrefetcher::StrideEntry>>&
 StridePrefetcher::PCTable::allocateNewContext(int context)
 {
     auto res = entries.insert(std::make_pair(context,
-                              new StrideEntry*[pcTableSets]));
+        std::vector<std::vector<StrideEntry>>(pcTableSets)));
     auto it = res.first;
     chatty_assert(res.second, "Allocating an already created context\n");
     assert(it->first == context);
 
-    DPRINTF(HWPrefetch, "Adding context %i with stride entries at %p\n",
-            context, it->second);
+    DPRINTF(HWPrefetch, "Adding context %i with stride entries\n", context);
 
-    StrideEntry** entry = it->second;
-    for (int s = 0; s < pcTableSets; s++) {
-        entry[s] = new StrideEntry[pcTableAssoc];
+    std::vector<std::vector<StrideEntry>>& table = it->second;
+    for (auto& set : table) {
+        set.resize(pcTableAssoc);
     }
-    return entry;
+    return table;
 }
 
-StridePrefetcher::PCTable::~PCTable() {
-    for (auto entry : entries) {
-        for (int s = 0; s < pcTableSets; s++) {
-            delete[] entry.second[s];
-        }
-        delete[] entry.second;
-    }
+StridePrefetcher::PCTable::~PCTable()
+{
 }
 
 void
@@ -202,7 +196,7 @@ inline StridePrefetcher::StrideEntry*
 StridePrefetcher::findEntry(Addr pc, bool is_secure, int master_id)
 {
     int set = pcHash(pc);
-    StrideEntry* set_entries = pcTable[master_id][set];
+    std::vector<StrideEntry>& set_entries = pcTable[master_id][set];
     for (int way = 0; way < pcTableAssoc; way++) {
         StrideEntry* entry = &set_entries[way];
         // Search ways for match
index 605b5432d32cbdf69e4980355b1dbb3efe80b21a..da3bbb33f92556866cf86162ba1e4ac88f050d8d 100644 (file)
@@ -50,6 +50,7 @@
 
 #include <string>
 #include <unordered_map>
+#include <vector>
 
 #include "base/types.hh"
 #include "mem/cache/prefetch/queued.hh"
@@ -90,7 +91,8 @@ class StridePrefetcher : public QueuedPrefetcher
       public:
         PCTable(int assoc, int sets, const std::string name) :
             pcTableAssoc(assoc), pcTableSets(sets), _name(name) {}
-        StrideEntry** operator[] (int context) {
+
+        std::vector<std::vector<StrideEntry>>& operator[] (int context) {
             auto it = entries.find(context);
             if (it != entries.end())
                 return it->second;
@@ -104,9 +106,9 @@ class StridePrefetcher : public QueuedPrefetcher
         const int pcTableAssoc;
         const int pcTableSets;
         const std::string _name;
-        std::unordered_map<int, StrideEntry**> entries;
+        std::unordered_map<int, std::vector<std::vector<StrideEntry>>> entries;
 
-        StrideEntry** allocateNewContext(int context);
+        std::vector<std::vector<StrideEntry>>& allocateNewContext(int context);
     };
     PCTable pcTable;