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