From 3a3ad05aca43fb4dae1a0a9785549dcfc385af0d Mon Sep 17 00:00:00 2001 From: Javier Bueno Date: Thu, 29 Nov 2018 16:59:16 +0100 Subject: mem-cache: Signature Path Prefetcher Related paper: Lookahead Prefetching with Signature Path J Kim, PV Gratz, ALN Reddy The 2nd Data Prefetching Championship (DPC2), 2015 Change-Id: I2319be2fa409f955f65e1bf1e1bb2d6d9a4fea11 Reviewed-on: https://gem5-review.googlesource.com/c/14737 Reviewed-by: Nikos Nikoleris Reviewed-by: Daniel Carvalho Maintainer: Nikos Nikoleris --- src/mem/cache/prefetch/associative_set_impl.hh | 119 +++++++++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/mem/cache/prefetch/associative_set_impl.hh (limited to 'src/mem/cache/prefetch/associative_set_impl.hh') diff --git a/src/mem/cache/prefetch/associative_set_impl.hh b/src/mem/cache/prefetch/associative_set_impl.hh new file mode 100644 index 000000000..5e6e7c585 --- /dev/null +++ b/src/mem/cache/prefetch/associative_set_impl.hh @@ -0,0 +1,119 @@ +/** + * Copyright (c) 2018 Metempsy Technology Consulting + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are + * met: redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer; + * redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution; + * neither the name of the copyright holders nor the names of its + * contributors may be used to endorse or promote products derived from + * this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * Authors: Javier Bueno + */ + +#ifndef __CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ +#define __CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ + +#include "mem/cache/prefetch/associative_set.hh" + +template +AssociativeSet::AssociativeSet(int assoc, int num_entries, + BaseIndexingPolicy *idx_policy, BaseReplacementPolicy *rpl_policy, + Entry const &init_value) + : associativity(assoc), numEntries(num_entries), indexingPolicy(idx_policy), + replacementPolicy(rpl_policy), entries(numEntries, init_value) +{ + fatal_if(!isPowerOf2(num_entries), "The number of entries of an " + "AssociativeSet<> must be a power of 2"); + fatal_if(!isPowerOf2(assoc), "The associativity of an AssociativeSet<> " + "must be a power of 2"); + for (unsigned int entry_idx = 0; entry_idx < numEntries; entry_idx += 1) { + Entry* entry = &entries[entry_idx]; + indexingPolicy->setEntry(entry, entry_idx); + entry->replacementData = replacementPolicy->instantiateEntry(); + } +} + +template +Entry* +AssociativeSet::findEntry(Addr addr, bool is_secure) const +{ + Addr tag = indexingPolicy->extractTag(addr); + const std::vector selected_entries = + indexingPolicy->getPossibleEntries(addr); + + for (const auto& location : selected_entries) { + Entry* entry = static_cast(location); + if ((entry->getTag() == tag) && entry->isValid() && + entry->isSecure() == is_secure) { + return entry; + } + } + return nullptr; +} + +template +void +AssociativeSet::accessEntry(Entry *entry) +{ + replacementPolicy->touch(entry->replacementData); +} + +template +Entry* +AssociativeSet::findVictim(Addr addr) +{ + // Get possible entries to be victimized + const std::vector selected_entries = + indexingPolicy->getPossibleEntries(addr); + Entry* victim = static_cast(replacementPolicy->getVictim( + selected_entries)); + // There is only one eviction for this replacement + victim->reset(); + return victim; +} + + +template +std::vector +AssociativeSet::getPossibleEntries(const Addr addr) const +{ + std::vector selected_entries = + indexingPolicy->getPossibleEntries(addr); + std::vector entries(selected_entries.size(), nullptr); + + unsigned int idx = 0; + for (auto &entry : selected_entries) { + entries[idx++] = static_cast(entry); + } + return entries; +} + +template +void +AssociativeSet::insertEntry(Addr addr, bool is_secure, Entry* entry) +{ + entry->setValid(); + entry->setTag(indexingPolicy->extractTag(addr)); + entry->setSecure(is_secure); + replacementPolicy->reset(entry->replacementData); +} + +#endif//__CACHE_PREFETCH_ASSOCIATIVE_SET_IMPL_HH__ -- cgit v1.2.3