Prefetcher.py revision 13551
15124Sgblack@eecs.umich.edu# Copyright (c) 2012, 2014 ARM Limited 25124Sgblack@eecs.umich.edu# All rights reserved. 35124Sgblack@eecs.umich.edu# 45124Sgblack@eecs.umich.edu# The license below extends only to copyright in the software and shall 55124Sgblack@eecs.umich.edu# not be construed as granting a license to any other intellectual 65124Sgblack@eecs.umich.edu# property including but not limited to intellectual property relating 75124Sgblack@eecs.umich.edu# to a hardware implementation of the functionality of the software 85124Sgblack@eecs.umich.edu# licensed hereunder. You may use the software subject to the license 95124Sgblack@eecs.umich.edu# terms below provided that you ensure that this notice is replicated 105124Sgblack@eecs.umich.edu# unmodified and in its entirety in all distributions of the software, 115124Sgblack@eecs.umich.edu# modified or unmodified, in source code or in binary form. 125124Sgblack@eecs.umich.edu# 135124Sgblack@eecs.umich.edu# Copyright (c) 2005 The Regents of The University of Michigan 145124Sgblack@eecs.umich.edu# All rights reserved. 155124Sgblack@eecs.umich.edu# 165124Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 175124Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 185124Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 195124Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 205124Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 215124Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 225124Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 235124Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 245124Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 255124Sgblack@eecs.umich.edu# this software without specific prior written permission. 265124Sgblack@eecs.umich.edu# 275124Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 285124Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 295124Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 305124Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 315124Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 325124Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 335124Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 345124Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 355124Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 365124Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 375124Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 385124Sgblack@eecs.umich.edu# 395124Sgblack@eecs.umich.edu# Authors: Ron Dreslinski 405124Sgblack@eecs.umich.edu# Mitch Hayenga 415124Sgblack@eecs.umich.edu 425124Sgblack@eecs.umich.edufrom ClockedObject import ClockedObject 435124Sgblack@eecs.umich.edufrom m5.SimObject import * 445124Sgblack@eecs.umich.edufrom m5.params import * 455124Sgblack@eecs.umich.edufrom m5.proxy import * 465124Sgblack@eecs.umich.edufrom ReplacementPolicies import * 475124Sgblack@eecs.umich.edu 485124Sgblack@eecs.umich.educlass HWPProbeEvent(object): 495124Sgblack@eecs.umich.edu def __init__(self, prefetcher, obj, *listOfNames): 505124Sgblack@eecs.umich.edu self.obj = obj 515124Sgblack@eecs.umich.edu self.prefetcher = prefetcher 525124Sgblack@eecs.umich.edu self.names = listOfNames 535124Sgblack@eecs.umich.edu 545124Sgblack@eecs.umich.edu def register(self): 555124Sgblack@eecs.umich.edu if self.obj: 565124Sgblack@eecs.umich.edu for name in self.names: 575124Sgblack@eecs.umich.edu self.prefetcher.getCCObject().addEventProbe( 585124Sgblack@eecs.umich.edu self.obj.getCCObject(), name) 595124Sgblack@eecs.umich.edu 605124Sgblack@eecs.umich.educlass BasePrefetcher(ClockedObject): 615124Sgblack@eecs.umich.edu type = 'BasePrefetcher' 625124Sgblack@eecs.umich.edu abstract = True 635124Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/base.hh" 645124Sgblack@eecs.umich.edu cxx_exports = [ 655124Sgblack@eecs.umich.edu PyBindMethod("addEventProbe"), 665124Sgblack@eecs.umich.edu ] 675124Sgblack@eecs.umich.edu sys = Param.System(Parent.any, "System this prefetcher belongs to") 685124Sgblack@eecs.umich.edu 695124Sgblack@eecs.umich.edu # Get the block size from the parent (system) 705124Sgblack@eecs.umich.edu block_size = Param.Int(Parent.cache_line_size, "Block size in bytes") 715124Sgblack@eecs.umich.edu 725124Sgblack@eecs.umich.edu on_miss = Param.Bool(False, "Only notify prefetcher on misses") 735124Sgblack@eecs.umich.edu on_read = Param.Bool(True, "Notify prefetcher on reads") 745124Sgblack@eecs.umich.edu on_write = Param.Bool(True, "Notify prefetcher on writes") 755124Sgblack@eecs.umich.edu on_data = Param.Bool(True, "Notify prefetcher on data accesses") 765124Sgblack@eecs.umich.edu on_inst = Param.Bool(True, "Notify prefetcher on instruction accesses") 775124Sgblack@eecs.umich.edu prefetch_on_access = Param.Bool(Parent.prefetch_on_access, 785124Sgblack@eecs.umich.edu "Notify the hardware prefetcher on every access (not just misses)") 795124Sgblack@eecs.umich.edu use_virtual_addresses = Param.Bool(False, 805124Sgblack@eecs.umich.edu "Use virtual addresses for prefetching") 815124Sgblack@eecs.umich.edu 825124Sgblack@eecs.umich.edu _events = [] 835124Sgblack@eecs.umich.edu def addEvent(self, newObject): 845124Sgblack@eecs.umich.edu self._events.append(newObject) 855124Sgblack@eecs.umich.edu 865124Sgblack@eecs.umich.edu # Override the normal SimObject::regProbeListeners method and 875124Sgblack@eecs.umich.edu # register deferred event handlers. 885681Sgblack@eecs.umich.edu def regProbeListeners(self): 895124Sgblack@eecs.umich.edu for event in self._events: 905124Sgblack@eecs.umich.edu event.register() 915124Sgblack@eecs.umich.edu self.getCCObject().regProbeListeners() 925124Sgblack@eecs.umich.edu 935124Sgblack@eecs.umich.edu def listenFromProbe(self, simObj, *probeNames): 945124Sgblack@eecs.umich.edu if not isinstance(simObj, SimObject): 955124Sgblack@eecs.umich.edu raise TypeError("argument must be of SimObject type") 965124Sgblack@eecs.umich.edu if len(probeNames) <= 0: 975237Sgblack@eecs.umich.edu raise TypeError("probeNames must have at least one element") 985237Sgblack@eecs.umich.edu self.addEvent(HWPProbeEvent(self, simObj, *probeNames)) 995124Sgblack@eecs.umich.edu 1005124Sgblack@eecs.umich.educlass QueuedPrefetcher(BasePrefetcher): 1015124Sgblack@eecs.umich.edu type = "QueuedPrefetcher" 1025124Sgblack@eecs.umich.edu abstract = True 1035124Sgblack@eecs.umich.edu cxx_class = "QueuedPrefetcher" 1045858Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/queued.hh" 1055124Sgblack@eecs.umich.edu latency = Param.Int(1, "Latency for generated prefetches") 1065909Sgblack@eecs.umich.edu queue_size = Param.Int(32, "Maximum number of queued prefetches") 1075909Sgblack@eecs.umich.edu queue_squash = Param.Bool(True, "Squash queued prefetch on demand access") 1085681Sgblack@eecs.umich.edu queue_filter = Param.Bool(True, "Don't queue redundant prefetches") 1095681Sgblack@eecs.umich.edu cache_snoop = Param.Bool(False, "Snoop cache to eliminate redundant request") 1105681Sgblack@eecs.umich.edu 1115681Sgblack@eecs.umich.edu tag_prefetch = Param.Bool(True, "Tag prefetch with PC of generating access") 1125858Sgblack@eecs.umich.edu 1135858Sgblack@eecs.umich.educlass StridePrefetcher(QueuedPrefetcher): 1145858Sgblack@eecs.umich.edu type = 'StridePrefetcher' 1155858Sgblack@eecs.umich.edu cxx_class = 'StridePrefetcher' 1165858Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/stride.hh" 1175681Sgblack@eecs.umich.edu 1185681Sgblack@eecs.umich.edu # Do not consult stride prefetcher on instruction accesses 1195681Sgblack@eecs.umich.edu on_inst = False 1205681Sgblack@eecs.umich.edu 1215909Sgblack@eecs.umich.edu max_conf = Param.Int(7, "Maximum confidence level") 1225857Sgblack@eecs.umich.edu thresh_conf = Param.Int(4, "Threshold confidence level") 1235858Sgblack@eecs.umich.edu min_conf = Param.Int(0, "Minimum confidence level") 1245858Sgblack@eecs.umich.edu start_conf = Param.Int(4, "Starting confidence for new entries") 1255858Sgblack@eecs.umich.edu 1265858Sgblack@eecs.umich.edu table_sets = Param.Int(16, "Number of sets in PC lookup table") 1275858Sgblack@eecs.umich.edu table_assoc = Param.Int(4, "Associativity of PC lookup table") 1285858Sgblack@eecs.umich.edu use_master_id = Param.Bool(True, "Use master id based history") 1295858Sgblack@eecs.umich.edu 1305858Sgblack@eecs.umich.edu degree = Param.Int(4, "Number of prefetches to generate") 1315858Sgblack@eecs.umich.edu 1325857Sgblack@eecs.umich.edu # Get replacement policy 1335857Sgblack@eecs.umich.edu replacement_policy = Param.BaseReplacementPolicy(RandomRP(), 1345681Sgblack@eecs.umich.edu "Replacement policy") 1355681Sgblack@eecs.umich.edu 1365124Sgblack@eecs.umich.educlass TaggedPrefetcher(QueuedPrefetcher): 1375909Sgblack@eecs.umich.edu type = 'TaggedPrefetcher' 1385909Sgblack@eecs.umich.edu cxx_class = 'TaggedPrefetcher' 1395909Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/tagged.hh" 1405909Sgblack@eecs.umich.edu 1415909Sgblack@eecs.umich.edu degree = Param.Int(2, "Number of prefetches to generate") 1425909Sgblack@eecs.umich.edu