access_map_pattern_matching.hh revision 13700:56fa28e6fab4
16019Shines@cs.fsu.edu/**
27091Sgblack@eecs.umich.edu * Copyright (c) 2018 Metempsy Technology Consulting
37091Sgblack@eecs.umich.edu * All rights reserved.
47091Sgblack@eecs.umich.edu *
57091Sgblack@eecs.umich.edu * Redistribution and use in source and binary forms, with or without
67091Sgblack@eecs.umich.edu * modification, are permitted provided that the following conditions are
77091Sgblack@eecs.umich.edu * met: redistributions of source code must retain the above copyright
87091Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer;
97091Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright
107091Sgblack@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the
117091Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution;
127091Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its
137091Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from
146019Shines@cs.fsu.edu * this software without specific prior written permission.
156019Shines@cs.fsu.edu *
166019Shines@cs.fsu.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
176019Shines@cs.fsu.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
186019Shines@cs.fsu.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
196019Shines@cs.fsu.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
206019Shines@cs.fsu.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
216019Shines@cs.fsu.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
226019Shines@cs.fsu.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
236019Shines@cs.fsu.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
246019Shines@cs.fsu.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
256019Shines@cs.fsu.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
266019Shines@cs.fsu.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
276019Shines@cs.fsu.edu *
286019Shines@cs.fsu.edu * Authors: Javier Bueno
296019Shines@cs.fsu.edu */
306019Shines@cs.fsu.edu
316019Shines@cs.fsu.edu /**
326019Shines@cs.fsu.edu  * Implementation of the Access Map Pattern Matching Prefetcher
336019Shines@cs.fsu.edu  *
346019Shines@cs.fsu.edu  * References:
356019Shines@cs.fsu.edu  *     Access map pattern matching for high performance data cache prefetch.
366019Shines@cs.fsu.edu  *     Ishii, Y., Inaba, M., & Hiraki, K. (2011).
376019Shines@cs.fsu.edu  *     Journal of Instruction-Level Parallelism, 13, 1-24.
386019Shines@cs.fsu.edu  */
396019Shines@cs.fsu.edu
406019Shines@cs.fsu.edu#ifndef __MEM_CACHE_PREFETCH_ACCESS_MAP_PATTERN_MATCHING_HH__
416019Shines@cs.fsu.edu#define __MEM_CACHE_PREFETCH_ACCESS_MAP_PATTERN_MATCHING_HH__
426019Shines@cs.fsu.edu
436019Shines@cs.fsu.edu#include "mem/cache/base.hh"
446019Shines@cs.fsu.edu#include "mem/cache/prefetch/associative_set.hh"
456019Shines@cs.fsu.edu#include "mem/cache/prefetch/queued.hh"
466019Shines@cs.fsu.edu#include "mem/packet.hh"
476019Shines@cs.fsu.edu#include "sim/clocked_object.hh"
486019Shines@cs.fsu.edu
496019Shines@cs.fsu.edustruct AccessMapPatternMatchingParams;
507639Sgblack@eecs.umich.edu
516019Shines@cs.fsu.educlass AccessMapPatternMatching : public ClockedObject
526019Shines@cs.fsu.edu{
536019Shines@cs.fsu.edu    /** Cacheline size used by the prefetcher using this object */
546019Shines@cs.fsu.edu    const unsigned blkSize;
556312Sgblack@eecs.umich.edu    /** Limit the stride checking to -limitStride/+limitStride */
566312Sgblack@eecs.umich.edu    const unsigned limitStride;
577147Sgblack@eecs.umich.edu    /** Maximum number of prefetch generated */
586312Sgblack@eecs.umich.edu    const unsigned startDegree;
596312Sgblack@eecs.umich.edu    /** Amount of memory covered by a hot zone */
607186Sgblack@eecs.umich.edu    const uint64_t hotZoneSize;
617186Sgblack@eecs.umich.edu    /** A prefetch coverage factor bigger than this is considered high */
627186Sgblack@eecs.umich.edu    const double highCoverageThreshold;
637186Sgblack@eecs.umich.edu    /** A prefetch coverage factor smaller than this is considered low */
646312Sgblack@eecs.umich.edu    const double lowCoverageThreshold;
657093Sgblack@eecs.umich.edu    /** A prefetch accuracy factor bigger than this is considered high */
666312Sgblack@eecs.umich.edu    const double highAccuracyThreshold;
676312Sgblack@eecs.umich.edu    /** A prefetch accuracy factor smaller than this is considered low */
687148Sgblack@eecs.umich.edu    const double lowAccuracyThreshold;
697148Sgblack@eecs.umich.edu    /** A cache hit ratio bigger than this is considered high */
707148Sgblack@eecs.umich.edu    const double highCacheHitThreshold;
717148Sgblack@eecs.umich.edu    /** A cache hit ratio smaller than this is considered low */
727184Sgblack@eecs.umich.edu    const double lowCacheHitThreshold;
737184Sgblack@eecs.umich.edu    /** Cycles in an epoch period */
747289Sgblack@eecs.umich.edu    const Cycles epochCycles;
757289Sgblack@eecs.umich.edu    /** Off chip memory latency to use for the epoch bandwidth calculation */
767289Sgblack@eecs.umich.edu    const Tick offChipMemoryLatency;
777289Sgblack@eecs.umich.edu
787184Sgblack@eecs.umich.edu    /** Data type representing the state of a cacheline in the access map */
797184Sgblack@eecs.umich.edu    enum AccessMapState
807184Sgblack@eecs.umich.edu    {
817184Sgblack@eecs.umich.edu        AM_INIT,
827184Sgblack@eecs.umich.edu        AM_PREFETCH,
837184Sgblack@eecs.umich.edu        AM_ACCESS,
847093Sgblack@eecs.umich.edu        AM_INVALID
857093Sgblack@eecs.umich.edu    };
867093Sgblack@eecs.umich.edu
877148Sgblack@eecs.umich.edu    /** AccessMapEntry data type */
887151Sgblack@eecs.umich.edu    struct AccessMapEntry : public TaggedEntry
896312Sgblack@eecs.umich.edu    {
906312Sgblack@eecs.umich.edu        /** vector containing the state of the cachelines in this zone */
916019Shines@cs.fsu.edu        std::vector<AccessMapState> states;
927119Sgblack@eecs.umich.edu
937288Sgblack@eecs.umich.edu        AccessMapEntry(size_t num_entries) : states(num_entries, AM_INIT)
947119Sgblack@eecs.umich.edu        {}
957327Sgblack@eecs.umich.edu
967327Sgblack@eecs.umich.edu        /** Reset the entries to their initial values */
977327Sgblack@eecs.umich.edu        void reset() override
987327Sgblack@eecs.umich.edu        {
997327Sgblack@eecs.umich.edu            for (auto &entry : states) {
1007639Sgblack@eecs.umich.edu                entry = AM_INIT;
1017639Sgblack@eecs.umich.edu            }
1027639Sgblack@eecs.umich.edu        }
1037639Sgblack@eecs.umich.edu    };
1047639Sgblack@eecs.umich.edu    /** Access map table */
1057639Sgblack@eecs.umich.edu    AssociativeSet<AccessMapEntry> accessMapTable;
1067639Sgblack@eecs.umich.edu
1077639Sgblack@eecs.umich.edu    /**
1087639Sgblack@eecs.umich.edu     * Number of good prefetches
1097639Sgblack@eecs.umich.edu     * - State transitions from PREFETCH to ACCESS
1107639Sgblack@eecs.umich.edu     */
1117639Sgblack@eecs.umich.edu    uint64_t numGoodPrefetches;
1127303Sgblack@eecs.umich.edu    /**
1137303Sgblack@eecs.umich.edu     * Number of prefetches issued
1147288Sgblack@eecs.umich.edu     * - State transitions from INIT to PREFETCH
1157279Sgblack@eecs.umich.edu     */
1167327Sgblack@eecs.umich.edu    uint64_t numTotalPrefetches;
1177327Sgblack@eecs.umich.edu    /**
1187327Sgblack@eecs.umich.edu     * Number of raw cache misses
1197327Sgblack@eecs.umich.edu     * - State transitions from INIT or PREFETCH to ACCESS
1207327Sgblack@eecs.umich.edu     */
1217288Sgblack@eecs.umich.edu    uint64_t numRawCacheMisses;
1227148Sgblack@eecs.umich.edu    /**
1237288Sgblack@eecs.umich.edu     * Number of raw cache hits
1247184Sgblack@eecs.umich.edu     * - State transitions from ACCESS to ACCESS
1257310Sgblack@eecs.umich.edu     */
1267310Sgblack@eecs.umich.edu    uint64_t numRawCacheHits;
1277310Sgblack@eecs.umich.edu    /** Current degree */
1287288Sgblack@eecs.umich.edu    unsigned degree;
1297288Sgblack@eecs.umich.edu    /** Current useful degree */
1307186Sgblack@eecs.umich.edu    unsigned usefulDegree;
1317119Sgblack@eecs.umich.edu
1327119Sgblack@eecs.umich.edu    /**
1337288Sgblack@eecs.umich.edu     * Given a target cacheline, this function checks if the cachelines
1347137Sgblack@eecs.umich.edu     * that follow the provided stride have been accessed. If so, the line
1357327Sgblack@eecs.umich.edu     * is considered a good candidate.
1367327Sgblack@eecs.umich.edu     * @param states vector containing the states of three contiguous hot zones
1377327Sgblack@eecs.umich.edu     * @param current target block (cacheline)
1387327Sgblack@eecs.umich.edu     * @param stride access stride to obtain the reference cachelines
1397327Sgblack@eecs.umich.edu     * @return true if current is a prefetch candidate
1407639Sgblack@eecs.umich.edu     */
1417639Sgblack@eecs.umich.edu    inline bool checkCandidate(std::vector<AccessMapState> const &states,
1427639Sgblack@eecs.umich.edu                        Addr current, int stride) const
1437639Sgblack@eecs.umich.edu    {
1447639Sgblack@eecs.umich.edu        enum AccessMapState tgt   = states[current - stride];
1457639Sgblack@eecs.umich.edu        enum AccessMapState s     = states[current + stride];
1467639Sgblack@eecs.umich.edu        enum AccessMapState s2    = states[current + 2 * stride];
1477639Sgblack@eecs.umich.edu        enum AccessMapState s2_p1 = states[current + 2 * stride + 1];
1487639Sgblack@eecs.umich.edu        return (tgt != AM_INVALID &&
1497639Sgblack@eecs.umich.edu                ((s == AM_ACCESS && s2 == AM_ACCESS) ||
1507639Sgblack@eecs.umich.edu                (s == AM_ACCESS && s2_p1 == AM_ACCESS)));
1517639Sgblack@eecs.umich.edu    }
1527288Sgblack@eecs.umich.edu
1537288Sgblack@eecs.umich.edu    /**
1547137Sgblack@eecs.umich.edu     * Obtain an AccessMapEntry  from the AccessMapTable, if the entry is not
1557327Sgblack@eecs.umich.edu     * found a new one is initialized and inserted.
1567327Sgblack@eecs.umich.edu     * @param am_addr address of the hot zone
1577327Sgblack@eecs.umich.edu     * @param is_secure whether the address belongs to the secure memory area
1587327Sgblack@eecs.umich.edu     * @return the corresponding entry
1597327Sgblack@eecs.umich.edu     */
1607288Sgblack@eecs.umich.edu    AccessMapEntry *getAccessMapEntry(Addr am_addr, bool is_secure);
1617241Sgblack@eecs.umich.edu
1627288Sgblack@eecs.umich.edu    /**
1637137Sgblack@eecs.umich.edu     * Updates the state of a block within an AccessMapEntry, also updates
1647288Sgblack@eecs.umich.edu     * the prefetcher metrics.
1657160Sgblack@eecs.umich.edu     * @param entry AccessMapEntry to update
1667288Sgblack@eecs.umich.edu     * @param block cacheline within the hot zone
1677160Sgblack@eecs.umich.edu     * @param state new state
1687288Sgblack@eecs.umich.edu     */
1697160Sgblack@eecs.umich.edu    void setEntryState(AccessMapEntry &entry, Addr block,
1707288Sgblack@eecs.umich.edu        enum AccessMapState state);
1717160Sgblack@eecs.umich.edu
1726019Shines@cs.fsu.edu    /**
1737288Sgblack@eecs.umich.edu     * This event constitues the epoch of the statistics that keep track of
1746312Sgblack@eecs.umich.edu     * the prefetcher accuracy, when this event triggers, the prefetcher degree
1757288Sgblack@eecs.umich.edu     * is adjusted and the statistics counters are reset.
1767288Sgblack@eecs.umich.edu     */
1777288Sgblack@eecs.umich.edu    void processEpochEvent();
1787288Sgblack@eecs.umich.edu    EventFunctionWrapper epochEvent;
1796019Shines@cs.fsu.edu
1807288Sgblack@eecs.umich.edu  public:
1817288Sgblack@eecs.umich.edu    AccessMapPatternMatching(const AccessMapPatternMatchingParams* p);
1827422Sgblack@eecs.umich.edu    ~AccessMapPatternMatching()
1837422Sgblack@eecs.umich.edu    {}
1847422Sgblack@eecs.umich.edu    void calculatePrefetch(const BasePrefetcher::PrefetchInfo &pfi,
1856019Shines@cs.fsu.edu        std::vector<QueuedPrefetcher::AddrPriority> &addresses);
1866308Sgblack@eecs.umich.edu};
1877288Sgblack@eecs.umich.edu
1887288Sgblack@eecs.umich.edustruct AMPMPrefetcherParams;
1897207Sgblack@eecs.umich.edu
1907288Sgblack@eecs.umich.educlass AMPMPrefetcher : public QueuedPrefetcher
1917288Sgblack@eecs.umich.edu{
1927639Sgblack@eecs.umich.edu    AccessMapPatternMatching &ampm;
1936308Sgblack@eecs.umich.edu  public:
1946019Shines@cs.fsu.edu    AMPMPrefetcher(const AMPMPrefetcherParams* p);
1957288Sgblack@eecs.umich.edu    ~AMPMPrefetcher()
1967288Sgblack@eecs.umich.edu    {}
1977288Sgblack@eecs.umich.edu    void calculatePrefetch(const PrefetchInfo &pfi,
1986019Shines@cs.fsu.edu                           std::vector<AddrPriority> &addresses) override;
1996019Shines@cs.fsu.edu};
2007288Sgblack@eecs.umich.edu#endif//__MEM_CACHE_PREFETCH_ACCESS_MAP_PATTERN_MATCHING_HH__
2016019Shines@cs.fsu.edu