stride.hh revision 13427:72a3afac3e78
11758Ssaidi@eecs.umich.edu/* 21758Ssaidi@eecs.umich.edu * Copyright (c) 2018 Inria 31758Ssaidi@eecs.umich.edu * Copyright (c) 2012-2013, 2015 ARM Limited 41758Ssaidi@eecs.umich.edu * All rights reserved 51758Ssaidi@eecs.umich.edu * 61758Ssaidi@eecs.umich.edu * The license below extends only to copyright in the software and shall 71758Ssaidi@eecs.umich.edu * not be construed as granting a license to any other intellectual 81758Ssaidi@eecs.umich.edu * property including but not limited to intellectual property relating 91758Ssaidi@eecs.umich.edu * to a hardware implementation of the functionality of the software 101758Ssaidi@eecs.umich.edu * licensed hereunder. You may use the software subject to the license 111758Ssaidi@eecs.umich.edu * terms below provided that you ensure that this notice is replicated 121758Ssaidi@eecs.umich.edu * unmodified and in its entirety in all distributions of the software, 131758Ssaidi@eecs.umich.edu * modified or unmodified, in source code or in binary form. 141758Ssaidi@eecs.umich.edu * 151758Ssaidi@eecs.umich.edu * Copyright (c) 2005 The Regents of The University of Michigan 161758Ssaidi@eecs.umich.edu * All rights reserved. 171758Ssaidi@eecs.umich.edu * 181758Ssaidi@eecs.umich.edu * Redistribution and use in source and binary forms, with or without 191758Ssaidi@eecs.umich.edu * modification, are permitted provided that the following conditions are 201758Ssaidi@eecs.umich.edu * met: redistributions of source code must retain the above copyright 211758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer; 221758Ssaidi@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 231758Ssaidi@eecs.umich.edu * notice, this list of conditions and the following disclaimer in the 241758Ssaidi@eecs.umich.edu * documentation and/or other materials provided with the distribution; 251758Ssaidi@eecs.umich.edu * neither the name of the copyright holders nor the names of its 261758Ssaidi@eecs.umich.edu * contributors may be used to endorse or promote products derived from 271758Ssaidi@eecs.umich.edu * this software without specific prior written permission. 281758Ssaidi@eecs.umich.edu * 291758Ssaidi@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 301758Ssaidi@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 311758Ssaidi@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 321758Ssaidi@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 331758Ssaidi@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 341758Ssaidi@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 351758Ssaidi@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 361758Ssaidi@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 371758Ssaidi@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 381758Ssaidi@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 391758Ssaidi@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 401758Ssaidi@eecs.umich.edu * 411758Ssaidi@eecs.umich.edu * Authors: Ron Dreslinski 421758Ssaidi@eecs.umich.edu * Daniel Carvalho 431758Ssaidi@eecs.umich.edu */ 441758Ssaidi@eecs.umich.edu 451758Ssaidi@eecs.umich.edu/** 461758Ssaidi@eecs.umich.edu * @file 471049Sbinkertn@umich.edu * Describes a strided prefetcher. 481049Sbinkertn@umich.edu */ 491049Sbinkertn@umich.edu 501049Sbinkertn@umich.edu#ifndef __MEM_CACHE_PREFETCH_STRIDE_HH__ 511049Sbinkertn@umich.edu#define __MEM_CACHE_PREFETCH_STRIDE_HH__ 521049Sbinkertn@umich.edu 531049Sbinkertn@umich.edu#include <string> 541049Sbinkertn@umich.edu#include <unordered_map> 551049Sbinkertn@umich.edu#include <vector> 561049Sbinkertn@umich.edu 571049Sbinkertn@umich.edu#include "base/types.hh" 581049Sbinkertn@umich.edu#include "mem/cache/prefetch/queued.hh" 591049Sbinkertn@umich.edu#include "mem/cache/replacement_policies/replaceable_entry.hh" 601049Sbinkertn@umich.edu#include "mem/packet.hh" 611049Sbinkertn@umich.edu 621049Sbinkertn@umich.educlass BaseReplacementPolicy; 631049Sbinkertn@umich.edustruct StridePrefetcherParams; 641049Sbinkertn@umich.edu 651049Sbinkertn@umich.educlass StridePrefetcher : public QueuedPrefetcher 661049Sbinkertn@umich.edu{ 671049Sbinkertn@umich.edu protected: 681049Sbinkertn@umich.edu const int maxConf; 691049Sbinkertn@umich.edu const int threshConf; 701049Sbinkertn@umich.edu const int minConf; 711049Sbinkertn@umich.edu const int startConf; 721049Sbinkertn@umich.edu 731049Sbinkertn@umich.edu const int pcTableAssoc; 741049Sbinkertn@umich.edu const int pcTableSets; 751049Sbinkertn@umich.edu 761049Sbinkertn@umich.edu const bool useMasterId; 771049Sbinkertn@umich.edu 781049Sbinkertn@umich.edu const int degree; 791049Sbinkertn@umich.edu 801049Sbinkertn@umich.edu /** Replacement policy used in the PC tables. */ 811049Sbinkertn@umich.edu BaseReplacementPolicy* replacementPolicy; 821049Sbinkertn@umich.edu 831049Sbinkertn@umich.edu struct StrideEntry : public ReplaceableEntry 841049Sbinkertn@umich.edu { 851049Sbinkertn@umich.edu /** Default constructor */ 861049Sbinkertn@umich.edu StrideEntry(); 871049Sbinkertn@umich.edu 881049Sbinkertn@umich.edu /** Invalidate the entry */ 891049Sbinkertn@umich.edu void invalidate(); 901049Sbinkertn@umich.edu 911049Sbinkertn@umich.edu Addr instAddr; 921049Sbinkertn@umich.edu Addr lastAddr; 931049Sbinkertn@umich.edu bool isSecure; 941049Sbinkertn@umich.edu int stride; 951049Sbinkertn@umich.edu int confidence; 961049Sbinkertn@umich.edu }; 971049Sbinkertn@umich.edu 981049Sbinkertn@umich.edu class PCTable 991049Sbinkertn@umich.edu { 1001049Sbinkertn@umich.edu public: 1011049Sbinkertn@umich.edu /** 1021049Sbinkertn@umich.edu * Default constructor. Create a table with given parameters. 1031049Sbinkertn@umich.edu * 1041049Sbinkertn@umich.edu * @param assoc Associativity of the table. 1051049Sbinkertn@umich.edu * @param sets Number of sets in the table. 1061049Sbinkertn@umich.edu * @param name Name of the prefetcher. 1071049Sbinkertn@umich.edu * @param replacementPolicy Replacement policy used by the table. 1081049Sbinkertn@umich.edu */ 1091049Sbinkertn@umich.edu PCTable(int assoc, int sets, const std::string name, 1101049Sbinkertn@umich.edu BaseReplacementPolicy* replacementPolicy); 1111049Sbinkertn@umich.edu 1121049Sbinkertn@umich.edu /** 1131049Sbinkertn@umich.edu * Default destructor. 1141049Sbinkertn@umich.edu */ 1151049Sbinkertn@umich.edu ~PCTable(); 1161049Sbinkertn@umich.edu 1171049Sbinkertn@umich.edu /** 1181049Sbinkertn@umich.edu * Search for an entry in the pc table. 1191049Sbinkertn@umich.edu * 1201049Sbinkertn@umich.edu * @param pc The PC to look for. 1211049Sbinkertn@umich.edu * @param is_secure True if the target memory space is secure. 1221049Sbinkertn@umich.edu * @return Pointer to the entry. 1231049Sbinkertn@umich.edu */ 1241049Sbinkertn@umich.edu StrideEntry* findEntry(Addr pc, bool is_secure); 1251049Sbinkertn@umich.edu 1261049Sbinkertn@umich.edu /** 1271049Sbinkertn@umich.edu * Find a replacement victim to make room for given PC. 1281049Sbinkertn@umich.edu * 1291049Sbinkertn@umich.edu * @param pc The PC value. 1301049Sbinkertn@umich.edu * @return The victimized entry. 1311049Sbinkertn@umich.edu */ 1321049Sbinkertn@umich.edu StrideEntry* findVictim(Addr pc); 1331049Sbinkertn@umich.edu 1341049Sbinkertn@umich.edu private: 1351049Sbinkertn@umich.edu const std::string name() {return _name; } 1361049Sbinkertn@umich.edu const int pcTableSets; 1371049Sbinkertn@umich.edu const std::string _name; 1381049Sbinkertn@umich.edu std::vector<std::vector<StrideEntry>> entries; 1391049Sbinkertn@umich.edu 1401049Sbinkertn@umich.edu /** 1411049Sbinkertn@umich.edu * Replacement policy used by StridePrefetcher. 1421049Sbinkertn@umich.edu */ 1431049Sbinkertn@umich.edu BaseReplacementPolicy* replacementPolicy; 1441049Sbinkertn@umich.edu 1451049Sbinkertn@umich.edu /** 1461049Sbinkertn@umich.edu * PC hashing function to index sets in the table. 1471049Sbinkertn@umich.edu * 1481049Sbinkertn@umich.edu * @param pc The PC value. 1491049Sbinkertn@umich.edu * @return The set to which this PC maps. 1501049Sbinkertn@umich.edu */ 1511049Sbinkertn@umich.edu Addr pcHash(Addr pc) const; 1521049Sbinkertn@umich.edu }; 1531049Sbinkertn@umich.edu std::unordered_map<int, PCTable> pcTables; 1541049Sbinkertn@umich.edu 1551049Sbinkertn@umich.edu /** 1561049Sbinkertn@umich.edu * Try to find a table of entries for the given context. If none is 1571049Sbinkertn@umich.edu * found, a new table is created. 1581049Sbinkertn@umich.edu * 1591049Sbinkertn@umich.edu * @param context The context to be searched for. 1601049Sbinkertn@umich.edu * @return The table corresponding to the given context. 1611049Sbinkertn@umich.edu */ 1621049Sbinkertn@umich.edu PCTable* findTable(int context); 1631049Sbinkertn@umich.edu 1641049Sbinkertn@umich.edu /** 1651049Sbinkertn@umich.edu * Create a PC table for the given context. 1661049Sbinkertn@umich.edu * 1671049Sbinkertn@umich.edu * @param context The context of the new PC table. 1681049Sbinkertn@umich.edu * @return The new PC table 1691049Sbinkertn@umich.edu */ 1701049Sbinkertn@umich.edu PCTable* allocateNewContext(int context); 1711049Sbinkertn@umich.edu 1721049Sbinkertn@umich.edu public: 1731049Sbinkertn@umich.edu StridePrefetcher(const StridePrefetcherParams *p); 1741049Sbinkertn@umich.edu 1751049Sbinkertn@umich.edu void calculatePrefetch(const PacketPtr &pkt, 1761049Sbinkertn@umich.edu std::vector<AddrPriority> &addresses) override; 1771049Sbinkertn@umich.edu}; 1781049Sbinkertn@umich.edu 1791049Sbinkertn@umich.edu#endif // __MEM_CACHE_PREFETCH_STRIDE_HH__ 1801049Sbinkertn@umich.edu