/** * 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: Ivan Pizarro */ /** * Implementation of the 'Sandbox Based Optimal Offset Estimation' * Reference: * Brown, N. T., & Sendag, R. Sandbox Based Optimal Offset Estimation. */ #ifndef __MEM_CACHE_PREFETCH_SBOOE_HH__ #define __MEM_CACHE_PREFETCH_SBOOE_HH__ #include #include #include #include "mem/cache/prefetch/queued.hh" #include "mem/packet.hh" struct SBOOEPrefetcherParams; class SBOOEPrefetcher : public QueuedPrefetcher { private: /** Prefetcher parameters */ const int latencyBufferSize; const int sequentialPrefetchers; /** Threshold used to issue prefetchers */ const unsigned int scoreThreshold; /** * Holds the current demand addresses and tick. This is later used to * calculate the average latency buffer when the address is filled in * the cache. */ std::unordered_map demandAddresses; /** * The latency buffer holds the elapsed ticks between the demand and * the fill in the cache for the latest N accesses which are used to * calculate the average access latency which is later used to * predict if a prefetcher would be filled on time if issued. */ std::deque latencyBuffer; /** Holds the current average access latency */ Tick averageAccessLatency; /** Holds the current sum of the latency buffer latency */ Tick latencyBufferSum; struct SandboxEntry { /** Cache line predicted by the candidate prefetcher */ Addr line; /** Tick when the simulated prefetch is expected to be filled */ Tick expectedArrivalTick; /** To indicate if it was initialized */ bool valid; SandboxEntry() : valid(false) {} }; struct Sandbox { /** FIFO queue. Max entries is 'sandboxEntries' */ std::vector entries; /** * Accesses during the eval period that were present * in the sandbox */ unsigned int sandboxScore; /** Hits in the sandbox that wouldn't have been filled on time */ unsigned int lateScore; /** Index of the oldest entry in the FIFO */ unsigned int index; /** Sequential stride for this prefetcher */ const int stride; Sandbox(unsigned int max_entries, int _stride) : sandboxScore(0), lateScore(0), index(0), stride(_stride) { entries.resize(max_entries); } /** * Insert the line address being accessed to the cache into the * FIFO queue of the sandbox. * @param line Line address being accessed * @param tick Tick in which the access is expected to be filled */ void insert(Addr line, Tick tick); /** Calculate the useful score * @return Useful score of the sandbox. Sandbox score adjusted by * by the late score */ unsigned int score() const { return (sandboxScore - lateScore); } }; std::vector sandboxes; /** Current best sandbox */ Sandbox * bestSandbox; /** Number of accesses notified to the prefetcher */ unsigned int accesses; /** * Process an access to the specified line address and update the * sandbox counters counters. * @param line Address of the line being accessed * @return TRUE if the evaluation finished, FALSE otherwise */ bool access(Addr line); /** Update the latency buffer after a prefetch fill */ void notifyFill(const PacketPtr& pkt) override; public: SBOOEPrefetcher(const SBOOEPrefetcherParams *p); void calculatePrefetch(const PrefetchInfo &pfi, std::vector &addresses) override; }; #endif // __MEM_CACHE_PREFETCH_SBOOE_HH__