mem-cache: Fix invalidation of prefetchers

Add an invalidation function to the AssociativeSet, so that entries
can be properly invalidated by also invalidating their replacement
data.

Both setInvalid and reset have been merged into invalidate to
indicate users that they are using an incorrect approach by
generating compilation errors, and to match CacheBlk's naming
convention.

Change-Id: I568076a3b5adda8b1311d9498b086c0dab457a14
Signed-off-by: Daniel R. Carvalho <odanrc@yahoo.com.br>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/24529
Reviewed-by: Nikos Nikoleris <nikos.nikoleris@arm.com>
Maintainer: Nikos Nikoleris <nikos.nikoleris@arm.com>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Daniel R. Carvalho
2020-01-18 16:19:53 +01:00
committed by Daniel Carvalho
parent 7ac4607385
commit 519808c02f
11 changed files with 75 additions and 43 deletions

View File

@@ -89,12 +89,15 @@ class AccessMapPatternMatching : public ClockedObject
/** vector containing the state of the cachelines in this zone */
std::vector<AccessMapState> states;
AccessMapEntry(size_t num_entries) : states(num_entries, AM_INIT)
{}
/** Reset the entries to their initial values */
void reset() override
AccessMapEntry(size_t num_entries)
: TaggedEntry(), states(num_entries, AM_INIT)
{
}
void
invalidate() override
{
TaggedEntry::invalidate();
for (auto &entry : states) {
entry = AM_INIT;
}

View File

@@ -66,10 +66,10 @@ class TaggedEntry : public ReplaceableEntry {
valid = true;
}
/**
* Sets the entry to invalid
*/
void setInvalid() {
/** Invalidates the entry. */
virtual void
invalidate()
{
valid = false;
}
@@ -108,14 +108,6 @@ class TaggedEntry : public ReplaceableEntry {
{
secure = s;
}
/**
* Resets the entry, this is called when an entry is evicted to allocate
* a new one. Types inheriting this class should provide its own
* implementation
*/
virtual void reset () {
}
};
/**
@@ -196,6 +188,13 @@ class AssociativeSet {
*/
void insertEntry(Addr addr, bool is_secure, Entry* entry);
/**
* Invalidate an entry and its respective replacement data.
*
* @param entry Entry to be invalidated.
*/
void invalidate(Entry* entry);
/** Iterator types */
using const_iterator = typename std::vector<Entry>::const_iterator;
using iterator = typename std::vector<Entry>::iterator;

View File

@@ -87,7 +87,7 @@ AssociativeSet<Entry>::findVictim(Addr addr)
Entry* victim = static_cast<Entry*>(replacementPolicy->getVictim(
selected_entries));
// There is only one eviction for this replacement
victim->reset();
invalidate(victim);
return victim;
}
@@ -117,4 +117,12 @@ AssociativeSet<Entry>::insertEntry(Addr addr, bool is_secure, Entry* entry)
replacementPolicy->reset(entry->replacementData);
}
template<class Entry>
void
AssociativeSet<Entry>::invalidate(Entry* entry)
{
entry->invalidate();
replacementPolicy->invalidate(entry->replacementData);
}
#endif//__CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__

View File

@@ -44,8 +44,10 @@ DeltaCorrelatingPredictionTables::DeltaCorrelatingPredictionTables(
}
void
DeltaCorrelatingPredictionTables::DCPTEntry::reset()
DeltaCorrelatingPredictionTables::DCPTEntry::invalidate()
{
TaggedEntry::invalidate();
for (auto &delta : deltas) {
delta = 0;
}

View File

@@ -75,12 +75,12 @@ class DeltaCorrelatingPredictionTables : public SimObject
* Constructor
* @param num_deltas number of deltas stored in the entry
*/
DCPTEntry(unsigned int num_deltas) : lastAddress(0), deltaPointer(0),
deltas(num_deltas)
{}
DCPTEntry(unsigned int num_deltas)
: TaggedEntry(), lastAddress(0), deltaPointer(0), deltas(num_deltas)
{
}
/** Reset callback called when invalidating the entry */
void reset() override;
void invalidate() override;
/**
* Adds an address to the entry, if the entry already existed, a delta

View File

@@ -183,7 +183,7 @@ IndirectMemoryPrefetcher::allocateOrUpdateIPDEntry(
} else {
// Third access! no pattern has been found so far,
// release the IPD entry
ipd_entry->reset();
ipd.invalidate(ipd_entry);
ipdEntryTrackingMisses = nullptr;
}
} else {
@@ -237,7 +237,7 @@ IndirectMemoryPrefetcher::trackMissIndex2(Addr miss_addr)
pt_entry->enabled = true;
pt_entry->indirectCounter.reset();
// Release the current IPD Entry
entry->reset();
ipd.invalidate(entry);
// Do not track more misses
ipdEntryTrackingMisses = nullptr;
return;

View File

@@ -101,7 +101,10 @@ class IndirectMemoryPrefetcher : public QueuedPrefetcher
increasedIndirectCounter(false)
{}
void reset() override {
void
invalidate() override
{
TaggedEntry::invalidate();
address = 0;
secure = false;
streamCounter = 0;
@@ -136,16 +139,20 @@ class IndirectMemoryPrefetcher : public QueuedPrefetcher
IndirectPatternDetectorEntry(unsigned int num_addresses,
unsigned int num_shifts)
: idx1(0), idx2(0), secondIndexSet(false), numMisses(0),
: TaggedEntry(), idx1(0), idx2(0), secondIndexSet(false),
numMisses(0),
baseAddr(num_addresses, std::vector<Addr>(num_shifts))
{}
{
}
void reset() override {
void
invalidate() override
{
TaggedEntry::invalidate();
idx1 = 0;
idx2 = 0;
secondIndexSet = false;
numMisses = 0;
setInvalid();
}
};
/** Indirect Pattern Detector (IPD) table */

View File

@@ -79,13 +79,18 @@ class IrregularStreamBufferPrefetcher : public QueuedPrefetcher
* Maps a set of contiguous addresses to another set of (not necessarily
* contiguos) addresses, with their corresponding confidence counters
*/
struct AddressMappingEntry : public TaggedEntry {
struct AddressMappingEntry : public TaggedEntry
{
std::vector<AddressMapping> mappings;
AddressMappingEntry(size_t num_mappings, unsigned counter_bits)
: mappings(num_mappings, counter_bits)
{}
void reset() override
: TaggedEntry(), mappings(num_mappings, counter_bits)
{
}
void
invalidate() override
{
TaggedEntry::invalidate();
for (auto &entry : mappings) {
entry.address = 0;
entry.counter.reset();

View File

@@ -99,12 +99,16 @@ class SignaturePathPrefetcher : public QueuedPrefetcher
/** use counter, used by SPPv2 */
SatCounter counter;
PatternEntry(size_t num_strides, unsigned counter_bits)
: strideEntries(num_strides, counter_bits), counter(counter_bits)
{}
: TaggedEntry(), strideEntries(num_strides, counter_bits),
counter(counter_bits)
{
}
/** Reset the entries to their initial values */
void reset() override
void
invalidate() override
{
TaggedEntry::invalidate();
for (auto &entry : strideEntries) {
entry.counter.reset();
entry.stride = 0;

View File

@@ -96,7 +96,7 @@ STeMSPrefetcher::checkForActiveGenerationsEnd() {
// this also sets the values of the entry
pst_entry->update(agt_entry);
// Free the AGT entry
agt_entry.setInvalid();
activeGenerationTable.invalidate(&agt_entry);
}
}
}

View File

@@ -86,12 +86,16 @@ class STeMSPrefetcher : public QueuedPrefetcher
/** Sequence of accesses */
std::vector<SequenceEntry> sequence;
ActiveGenerationTableEntry(int num_positions) : paddress(0), pc(0),
ActiveGenerationTableEntry(int num_positions)
: TaggedEntry(), paddress(0), pc(0),
seqCounter(0), sequence(num_positions)
{}
void reset() override
{
}
void
invalidate() override
{
TaggedEntry::invalidate();
paddress = 0;
pc = 0;
seqCounter = 0;