stride.hh revision 13425:00abf35b2f7e
15425Sgblack@eecs.umich.edu/* 24298Sgblack@eecs.umich.edu * Copyright (c) 2012-2013, 2015 ARM Limited 34298Sgblack@eecs.umich.edu * All rights reserved 47087Snate@binkert.org * 57087Snate@binkert.org * The license below extends only to copyright in the software and shall 67087Snate@binkert.org * not be construed as granting a license to any other intellectual 77087Snate@binkert.org * property including but not limited to intellectual property relating 87087Snate@binkert.org * to a hardware implementation of the functionality of the software 97087Snate@binkert.org * licensed hereunder. You may use the software subject to the license 107087Snate@binkert.org * terms below provided that you ensure that this notice is replicated 117087Snate@binkert.org * unmodified and in its entirety in all distributions of the software, 124298Sgblack@eecs.umich.edu * modified or unmodified, in source code or in binary form. 137087Snate@binkert.org * 147087Snate@binkert.org * Copyright (c) 2005 The Regents of The University of Michigan 157087Snate@binkert.org * All rights reserved. 167087Snate@binkert.org * 177087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 187087Snate@binkert.org * modification, are permitted provided that the following conditions are 197087Snate@binkert.org * met: redistributions of source code must retain the above copyright 207087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 214298Sgblack@eecs.umich.edu * redistributions in binary form must reproduce the above copyright 227087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 234298Sgblack@eecs.umich.edu * documentation and/or other materials provided with the distribution; 244298Sgblack@eecs.umich.edu * neither the name of the copyright holders nor the names of its 254298Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 264298Sgblack@eecs.umich.edu * this software without specific prior written permission. 274298Sgblack@eecs.umich.edu * 284298Sgblack@eecs.umich.edu * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 294298Sgblack@eecs.umich.edu * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 304298Sgblack@eecs.umich.edu * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 314298Sgblack@eecs.umich.edu * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 324298Sgblack@eecs.umich.edu * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 334298Sgblack@eecs.umich.edu * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 344298Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 354298Sgblack@eecs.umich.edu * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 364298Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 374298Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 384338Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 394338Sgblack@eecs.umich.edu * 404338Sgblack@eecs.umich.edu * Authors: Ron Dreslinski 415083Sgblack@eecs.umich.edu */ 425083Sgblack@eecs.umich.edu 435083Sgblack@eecs.umich.edu/** 444524Sgblack@eecs.umich.edu * @file 454524Sgblack@eecs.umich.edu * Describes a strided prefetcher. 464524Sgblack@eecs.umich.edu */ 474524Sgblack@eecs.umich.edu 484524Sgblack@eecs.umich.edu#ifndef __MEM_CACHE_PREFETCH_STRIDE_HH__ 494524Sgblack@eecs.umich.edu#define __MEM_CACHE_PREFETCH_STRIDE_HH__ 504561Sgblack@eecs.umich.edu 514561Sgblack@eecs.umich.edu#include <string> 524561Sgblack@eecs.umich.edu#include <unordered_map> 536516Sgblack@eecs.umich.edu#include <vector> 546516Sgblack@eecs.umich.edu 556516Sgblack@eecs.umich.edu#include "base/types.hh" 565661Sgblack@eecs.umich.edu#include "mem/cache/prefetch/queued.hh" 575661Sgblack@eecs.umich.edu#include "mem/packet.hh" 585661Sgblack@eecs.umich.edu 594519Sgblack@eecs.umich.edustruct StridePrefetcherParams; 604519Sgblack@eecs.umich.edu 615425Sgblack@eecs.umich.educlass StridePrefetcher : public QueuedPrefetcher 625425Sgblack@eecs.umich.edu{ 635425Sgblack@eecs.umich.edu protected: 64 const int maxConf; 65 const int threshConf; 66 const int minConf; 67 const int startConf; 68 69 const int pcTableAssoc; 70 const int pcTableSets; 71 72 const bool useMasterId; 73 74 const int degree; 75 76 struct StrideEntry 77 { 78 StrideEntry() : instAddr(0), lastAddr(0), isSecure(false), stride(0), 79 confidence(0) 80 { } 81 82 Addr instAddr; 83 Addr lastAddr; 84 bool isSecure; 85 int stride; 86 int confidence; 87 }; 88 89 class PCTable 90 { 91 public: 92 /** 93 * Default constructor. Create a table with given parameters. 94 * 95 * @param assoc Associativity of the table. 96 * @param sets Number of sets in the table. 97 * @param name Name of the prefetcher. 98 */ 99 PCTable(int assoc, int sets, const std::string name); 100 101 /** 102 * Default destructor. 103 */ 104 ~PCTable(); 105 106 /** 107 * Search for an entry in the pc table. 108 * 109 * @param pc The PC to look for. 110 * @param is_secure True if the target memory space is secure. 111 * @return Pointer to the entry. 112 */ 113 StrideEntry* findEntry(Addr pc, bool is_secure); 114 115 /** 116 * Find a replacement victim to make room for given PC. 117 * 118 * @param pc The PC value. 119 * @return The victimized entry. 120 */ 121 StrideEntry* findVictim(Addr pc); 122 123 private: 124 const std::string name() {return _name; } 125 const int pcTableAssoc; 126 const int pcTableSets; 127 const std::string _name; 128 std::vector<std::vector<StrideEntry>> entries; 129 130 /** 131 * PC hashing function to index sets in the table. 132 * 133 * @param pc The PC value. 134 * @return The set to which this PC maps. 135 */ 136 Addr pcHash(Addr pc) const; 137 }; 138 std::unordered_map<int, PCTable> pcTables; 139 140 /** 141 * Try to find a table of entries for the given context. If none is 142 * found, a new table is created. 143 * 144 * @param context The context to be searched for. 145 * @return The table corresponding to the given context. 146 */ 147 PCTable* findTable(int context); 148 149 /** 150 * Create a PC table for the given context. 151 * 152 * @param context The context of the new PC table. 153 * @return The new PC table 154 */ 155 PCTable* allocateNewContext(int context); 156 157 public: 158 StridePrefetcher(const StridePrefetcherParams *p); 159 160 void calculatePrefetch(const PacketPtr &pkt, 161 std::vector<AddrPriority> &addresses) override; 162}; 163 164#endif // __MEM_CACHE_PREFETCH_STRIDE_HH__ 165