PseudoLRUPolicy.hh revision 10301
15449Sgblack@eecs.umich.edu/* 28610Snilay@cs.wisc.edu * Copyright (c) 2007 Mark D. Hill and David A. Wood 34519Sgblack@eecs.umich.edu * All rights reserved. 44519Sgblack@eecs.umich.edu * 57087Snate@binkert.org * Redistribution and use in source and binary forms, with or without 67087Snate@binkert.org * modification, are permitted provided that the following conditions are 77087Snate@binkert.org * met: redistributions of source code must retain the above copyright 87087Snate@binkert.org * notice, this list of conditions and the following disclaimer; 97087Snate@binkert.org * redistributions in binary form must reproduce the above copyright 107087Snate@binkert.org * notice, this list of conditions and the following disclaimer in the 117087Snate@binkert.org * documentation and/or other materials provided with the distribution; 127087Snate@binkert.org * neither the name of the copyright holders nor the names of its 134519Sgblack@eecs.umich.edu * contributors may be used to endorse or promote products derived from 147087Snate@binkert.org * this software without specific prior written permission. 157087Snate@binkert.org * 167087Snate@binkert.org * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 177087Snate@binkert.org * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 187087Snate@binkert.org * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 197087Snate@binkert.org * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 207087Snate@binkert.org * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 217087Snate@binkert.org * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 224519Sgblack@eecs.umich.edu * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 237087Snate@binkert.org * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 244519Sgblack@eecs.umich.edu * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 254519Sgblack@eecs.umich.edu * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 264519Sgblack@eecs.umich.edu * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 274519Sgblack@eecs.umich.edu */ 284519Sgblack@eecs.umich.edu 294519Sgblack@eecs.umich.edu#ifndef __MEM_RUBY_SYSTEM_PSEUDOLRUPOLICY_HH__ 304519Sgblack@eecs.umich.edu#define __MEM_RUBY_SYSTEM_PSEUDOLRUPOLICY_HH__ 314519Sgblack@eecs.umich.edu 324519Sgblack@eecs.umich.edu#include "mem/ruby/structures/AbstractReplacementPolicy.hh" 334519Sgblack@eecs.umich.edu 344519Sgblack@eecs.umich.edu/** 354519Sgblack@eecs.umich.edu * Implementation of tree-based pseudo-LRU replacement 364519Sgblack@eecs.umich.edu * 374519Sgblack@eecs.umich.edu * Works for any associativity between 1 and 128. 384519Sgblack@eecs.umich.edu * 394519Sgblack@eecs.umich.edu * Also implements associativities that are not a power of 2 by 404519Sgblack@eecs.umich.edu * ignoring paths that lead to a larger index (i.e. truncating the 414519Sgblack@eecs.umich.edu * tree). Note that when this occurs, the algorithm becomes less 424519Sgblack@eecs.umich.edu * fair, as it will favor indicies in the larger (by index) half of 434519Sgblack@eecs.umich.edu * the associative set. This is most unfair when the nearest power of 444519Sgblack@eecs.umich.edu * 2 is one below the associativy, and most fair when it is one above. 454590Sgblack@eecs.umich.edu */ 465163Sgblack@eecs.umich.edu 474590Sgblack@eecs.umich.educlass PseudoLRUPolicy : public AbstractReplacementPolicy 484590Sgblack@eecs.umich.edu{ 494590Sgblack@eecs.umich.edu public: 505163Sgblack@eecs.umich.edu PseudoLRUPolicy(Index num_sets, Index assoc); 514590Sgblack@eecs.umich.edu ~PseudoLRUPolicy(); 524590Sgblack@eecs.umich.edu 535163Sgblack@eecs.umich.edu void touch(Index set, Index way, Tick time); 547620Sgblack@eecs.umich.edu Index getVictim(Index set) const; 554590Sgblack@eecs.umich.edu 564696Sgblack@eecs.umich.edu private: 574696Sgblack@eecs.umich.edu unsigned int m_effective_assoc; /** nearest (to ceiling) power of 2 */ 584590Sgblack@eecs.umich.edu unsigned int m_num_levels; /** number of levels in the tree */ 595172Sgblack@eecs.umich.edu uint64* m_trees; /** bit representation of the 605172Sgblack@eecs.umich.edu * trees, one for each set */ 615172Sgblack@eecs.umich.edu}; 625172Sgblack@eecs.umich.edu 635172Sgblack@eecs.umich.eduinline 647620Sgblack@eecs.umich.eduPseudoLRUPolicy::PseudoLRUPolicy(Index num_sets, Index assoc) 657682Sgblack@eecs.umich.edu : AbstractReplacementPolicy(num_sets, assoc) 667682Sgblack@eecs.umich.edu{ 677682Sgblack@eecs.umich.edu // associativity cannot exceed capacity of tree representation 685172Sgblack@eecs.umich.edu assert(num_sets > 0 && assoc > 1 && assoc <= (Index) sizeof(uint64)*4); 695172Sgblack@eecs.umich.edu 705172Sgblack@eecs.umich.edu m_trees = NULL; 715172Sgblack@eecs.umich.edu m_num_levels = 0; 725449Sgblack@eecs.umich.edu 735449Sgblack@eecs.umich.edu m_effective_assoc = 1; 745449Sgblack@eecs.umich.edu while (m_effective_assoc < assoc) { 755172Sgblack@eecs.umich.edu // effective associativity is ceiling power of 2 764590Sgblack@eecs.umich.edu m_effective_assoc <<= 1; 774590Sgblack@eecs.umich.edu } 785163Sgblack@eecs.umich.edu assoc = m_effective_assoc; 795163Sgblack@eecs.umich.edu while (true) { 805163Sgblack@eecs.umich.edu assoc /= 2; 815163Sgblack@eecs.umich.edu if(!assoc) break; 825163Sgblack@eecs.umich.edu m_num_levels++; 837620Sgblack@eecs.umich.edu } 845163Sgblack@eecs.umich.edu assert(m_num_levels < sizeof(unsigned int)*4); 855163Sgblack@eecs.umich.edu m_trees = new uint64[m_num_sets]; 865163Sgblack@eecs.umich.edu for (unsigned i = 0; i < m_num_sets; i++) { 875163Sgblack@eecs.umich.edu m_trees[i] = 0; 885163Sgblack@eecs.umich.edu } 895163Sgblack@eecs.umich.edu} 905163Sgblack@eecs.umich.edu 914519Sgblack@eecs.umich.eduinline 924519Sgblack@eecs.umich.eduPseudoLRUPolicy::~PseudoLRUPolicy() 935163Sgblack@eecs.umich.edu{ 945163Sgblack@eecs.umich.edu if (m_trees != NULL) 955163Sgblack@eecs.umich.edu delete[] m_trees; 965163Sgblack@eecs.umich.edu} 975163Sgblack@eecs.umich.edu 985163Sgblack@eecs.umich.eduinline void 995163Sgblack@eecs.umich.eduPseudoLRUPolicy::touch(Index set, Index index, Tick time) 1005163Sgblack@eecs.umich.edu{ 1014519Sgblack@eecs.umich.edu assert(index >= 0 && index < m_assoc); 1024519Sgblack@eecs.umich.edu assert(set >= 0 && set < m_num_sets); 1034519Sgblack@eecs.umich.edu 1045172Sgblack@eecs.umich.edu int tree_index = 0; 1055172Sgblack@eecs.umich.edu int node_val; 1065172Sgblack@eecs.umich.edu for (int i = m_num_levels - 1; i >= 0; i--) { 1075172Sgblack@eecs.umich.edu node_val = (index >> i)&1; 1085172Sgblack@eecs.umich.edu if (node_val) 1095173Sgblack@eecs.umich.edu m_trees[set] |= node_val << tree_index; 1105172Sgblack@eecs.umich.edu else 1115172Sgblack@eecs.umich.edu m_trees[set] &= ~(1 << tree_index); 1125172Sgblack@eecs.umich.edu tree_index = node_val ? (tree_index*2)+2 : (tree_index*2)+1; 1135172Sgblack@eecs.umich.edu } 1144590Sgblack@eecs.umich.edu m_last_ref_ptr[set][index] = time; 11510184SCurtis.Dunham@arm.com} 1165163Sgblack@eecs.umich.edu 1177620Sgblack@eecs.umich.eduinline Index 1187620Sgblack@eecs.umich.eduPseudoLRUPolicy::getVictim(Index set) const 1195163Sgblack@eecs.umich.edu{ 1204519Sgblack@eecs.umich.edu // assert(m_assoc != 0); 1214519Sgblack@eecs.umich.edu Index index = 0; 1224519Sgblack@eecs.umich.edu 1234519Sgblack@eecs.umich.edu int tree_index = 0; 1245163Sgblack@eecs.umich.edu int node_val; 12510184SCurtis.Dunham@arm.com for (unsigned i = 0; i < m_num_levels; i++){ 1267620Sgblack@eecs.umich.edu node_val = (m_trees[set] >> tree_index) & 1; 1275163Sgblack@eecs.umich.edu index += node_val ? 0 : (m_effective_assoc >> (i + 1)); 1287620Sgblack@eecs.umich.edu tree_index = node_val ? (tree_index * 2) + 1 : (tree_index * 2) + 2; 1295163Sgblack@eecs.umich.edu } 1307626Sgblack@eecs.umich.edu assert(index >= 0 && index < m_effective_assoc); 1315163Sgblack@eecs.umich.edu 1325163Sgblack@eecs.umich.edu /* return either the found index or the max possible index */ 1335163Sgblack@eecs.umich.edu /* NOTE: this is not a fair replacement when assoc is not a power of 2 */ 1344696Sgblack@eecs.umich.edu return (index > (m_assoc - 1)) ? m_assoc - 1 : index; 1355163Sgblack@eecs.umich.edu} 1364696Sgblack@eecs.umich.edu 1374696Sgblack@eecs.umich.edu#endif // __MEM_RUBY_SYSTEM_PSEUDOLRUPOLICY_HH__ 1384696Sgblack@eecs.umich.edu