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 <nikos.nikoleris@arm.com> Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
This commit is contained in:
26
src/mem/cache/prefetch/stride.cc
vendored
26
src/mem/cache/prefetch/stride.cc
vendored
@@ -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
|
||||
|
||||
8
src/mem/cache/prefetch/stride.hh
vendored
8
src/mem/cache/prefetch/stride.hh
vendored
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user