From 3a3e172b02c108196302a027307eab41626f4d69 Mon Sep 17 00:00:00 2001 From: Daniel Date: Tue, 13 Nov 2018 20:47:51 +0100 Subject: mem-cache: Vectorize StridePrefetcher's entries. 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 Maintainer: Nikos Nikoleris --- src/mem/cache/prefetch/stride.cc | 26 ++++++++++---------------- src/mem/cache/prefetch/stride.hh | 8 +++++--- 2 files changed, 15 insertions(+), 19 deletions(-) diff --git a/src/mem/cache/prefetch/stride.cc b/src/mem/cache/prefetch/stride.cc index a00b10a05..fde4f3011 100644 --- a/src/mem/cache/prefetch/stride.cc +++ b/src/mem/cache/prefetch/stride.cc @@ -72,32 +72,26 @@ StridePrefetcher::StridePrefetcher(const StridePrefetcherParams *p) assert(isPowerOf2(pcTableSets)); } -StridePrefetcher::StrideEntry** +std::vector>& StridePrefetcher::PCTable::allocateNewContext(int context) { auto res = entries.insert(std::make_pair(context, - new StrideEntry*[pcTableSets])); + std::vector>(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>& 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& set_entries = pcTable[master_id][set]; for (int way = 0; way < pcTableAssoc; way++) { StrideEntry* entry = &set_entries[way]; // Search ways for match diff --git a/src/mem/cache/prefetch/stride.hh b/src/mem/cache/prefetch/stride.hh index 605b5432d..da3bbb33f 100644 --- a/src/mem/cache/prefetch/stride.hh +++ b/src/mem/cache/prefetch/stride.hh @@ -50,6 +50,7 @@ #include #include +#include #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>& 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 entries; + std::unordered_map>> entries; - StrideEntry** allocateNewContext(int context); + std::vector>& allocateNewContext(int context); }; PCTable pcTable; -- cgit v1.2.3