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 &m; 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