blob: 86cf9574cc841b67837a531cf3bc5d4c4580f5e2 [file] [log] [blame]
/**
* 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 __MEM_CACHE_PREFETCH_DELTA_CORRELATING_PREDICTION_TABLES_HH_
#define __MEM_CACHE_PREFETCH_DELTA_CORRELATING_PREDICTION_TABLES_HH_
#include "mem/cache/prefetch/associative_set.hh"
#include "mem/cache/prefetch/queued.hh"
struct DeltaCorrelatingPredictionTablesParams;
/**
* Delta Correlating Prediction Tables Prefetcher
* References:
* Multi-level hardware prefetching using low complexity delta correlating
* prediction tables with partial matching.
* Marius Grannaes, Magnus Jahre, and Lasse Natvig. 2010.
* In Proceedings of the 5th international conference on High Performance
* Embedded Architectures and Compilers (HiPEAC'10)
*
* The filter feature is not implemented as gem5 already drops redundant
* prefetches.
* The main prefetcher logic is implemented on a separate SimObject as there
* are other prefetcher that can rehuse this component.
*/
class DeltaCorrelatingPredictionTables : public SimObject
{
/** Number of bits of each delta */
const unsigned int deltaBits;
/** Number of lower bits to ignore from the deltas */
const unsigned int deltaMaskBits;
/** DCPT Table entry datatype */
struct DCPTEntry : public TaggedEntry
{
/** Last accessed address */
Addr lastAddress;
/**
* Position of the first free entry, or the oldest element, if it is
* full
*/
unsigned int deltaPointer;
/** Stored deltas */
std::vector<Addr> deltas;
/**
* Constructor
* @param num_deltas number of deltas stored in the entry
*/
DCPTEntry(unsigned int num_deltas) : lastAddress(0), deltaPointer(0),
deltas(num_deltas)
{}
/** Reset callback called when invalidating the entry */
void reset() override;
/**
* Adds an address to the entry, if the entry already existed, a delta
* will be generated
* @param address address to add
* @param delta_num_bits number of bits of the delta
*/
void addAddress(Addr address, unsigned int delta_num_bits);
/**
* Attempt to generate prefetch candidates using the two most recent
* deltas. Prefetch candidates are added to the provided vector.
* @param pfs reference to a vector where candidates will be added
* @param mask_bits the number of lower bits that should be masked
* (ignored) when comparing deltas
*/
void getCandidates(std::vector<QueuedPrefetcher::AddrPriority> &pfs,
unsigned int mask_bits) const;
};
/** The main table */
AssociativeSet<DCPTEntry> table;
public:
DeltaCorrelatingPredictionTables(
DeltaCorrelatingPredictionTablesParams *p);
~DeltaCorrelatingPredictionTables()
{}
/**
* Computes the prefetch candidates given a prefetch event.
* @param pfi The prefetch event information
* @param addresses prefetch candidates generated
*/
void calculatePrefetch(const BasePrefetcher::PrefetchInfo &pfi,
std::vector<QueuedPrefetcher::AddrPriority> &addresses);
};
struct DCPTPrefetcherParams;
/** The prefetcher object using the DCPT */
class DCPTPrefetcher : public QueuedPrefetcher
{
/** DCPT object */
DeltaCorrelatingPredictionTables &dcpt;
public:
DCPTPrefetcher(const DCPTPrefetcherParams *p);
~DCPTPrefetcher()
{}
void calculatePrefetch(const PrefetchInfo &pfi,
std::vector<AddrPriority> &addresses) override;
};
#endif//__MEM_CACHE_PREFETCH_DELTA_CORRELATING_PREDICTION_TABLES_HH_