Prefetcher.py revision 13416
16313Sgblack@eecs.umich.edu# Copyright (c) 2012, 2014 ARM Limited 26313Sgblack@eecs.umich.edu# All rights reserved. 36313Sgblack@eecs.umich.edu# 46313Sgblack@eecs.umich.edu# The license below extends only to copyright in the software and shall 56313Sgblack@eecs.umich.edu# not be construed as granting a license to any other intellectual 66313Sgblack@eecs.umich.edu# property including but not limited to intellectual property relating 76313Sgblack@eecs.umich.edu# to a hardware implementation of the functionality of the software 86313Sgblack@eecs.umich.edu# licensed hereunder. You may use the software subject to the license 96313Sgblack@eecs.umich.edu# terms below provided that you ensure that this notice is replicated 106313Sgblack@eecs.umich.edu# unmodified and in its entirety in all distributions of the software, 116313Sgblack@eecs.umich.edu# modified or unmodified, in source code or in binary form. 126313Sgblack@eecs.umich.edu# 136313Sgblack@eecs.umich.edu# Copyright (c) 2005 The Regents of The University of Michigan 146313Sgblack@eecs.umich.edu# All rights reserved. 156313Sgblack@eecs.umich.edu# 166313Sgblack@eecs.umich.edu# Redistribution and use in source and binary forms, with or without 176313Sgblack@eecs.umich.edu# modification, are permitted provided that the following conditions are 186313Sgblack@eecs.umich.edu# met: redistributions of source code must retain the above copyright 196313Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer; 206313Sgblack@eecs.umich.edu# redistributions in binary form must reproduce the above copyright 216313Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 226313Sgblack@eecs.umich.edu# documentation and/or other materials provided with the distribution; 236313Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 246313Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 256313Sgblack@eecs.umich.edu# this software without specific prior written permission. 266313Sgblack@eecs.umich.edu# 276313Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 286313Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 296313Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 306313Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 316313Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 326313Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 336313Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 346335Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 356313Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 366335Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 376335Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 386335Sgblack@eecs.umich.edu# 396335Sgblack@eecs.umich.edu# Authors: Ron Dreslinski 406335Sgblack@eecs.umich.edu# Mitch Hayenga 416313Sgblack@eecs.umich.edu 426313Sgblack@eecs.umich.edufrom ClockedObject import ClockedObject 436313Sgblack@eecs.umich.edufrom m5.SimObject import * 446335Sgblack@eecs.umich.edufrom m5.params import * 456313Sgblack@eecs.umich.edufrom m5.proxy import * 466313Sgblack@eecs.umich.edu 476313Sgblack@eecs.umich.educlass HWPProbeEvent(object): 486313Sgblack@eecs.umich.edu def __init__(self, prefetcher, obj, *listOfNames): 496313Sgblack@eecs.umich.edu self.obj = obj 506335Sgblack@eecs.umich.edu self.prefetcher = prefetcher 516335Sgblack@eecs.umich.edu self.names = listOfNames 526335Sgblack@eecs.umich.edu 536335Sgblack@eecs.umich.edu def register(self): 546335Sgblack@eecs.umich.edu if self.obj: 556335Sgblack@eecs.umich.edu for name in self.names: 566335Sgblack@eecs.umich.edu self.prefetcher.getCCObject().addEventProbe( 576335Sgblack@eecs.umich.edu self.obj.getCCObject(), name) 586335Sgblack@eecs.umich.edu 596335Sgblack@eecs.umich.educlass BasePrefetcher(ClockedObject): 606335Sgblack@eecs.umich.edu type = 'BasePrefetcher' 616335Sgblack@eecs.umich.edu abstract = True 626335Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/base.hh" 636335Sgblack@eecs.umich.edu cxx_exports = [ 646335Sgblack@eecs.umich.edu PyBindMethod("addEventProbe"), 656335Sgblack@eecs.umich.edu ] 666335Sgblack@eecs.umich.edu sys = Param.System(Parent.any, "System this prefetcher belongs to") 676335Sgblack@eecs.umich.edu 686335Sgblack@eecs.umich.edu on_miss = Param.Bool(False, "Only notify prefetcher on misses") 696335Sgblack@eecs.umich.edu on_read = Param.Bool(True, "Notify prefetcher on reads") 706335Sgblack@eecs.umich.edu on_write = Param.Bool(True, "Notify prefetcher on writes") 716335Sgblack@eecs.umich.edu on_data = Param.Bool(True, "Notify prefetcher on data accesses") 726335Sgblack@eecs.umich.edu on_inst = Param.Bool(True, "Notify prefetcher on instruction accesses") 736335Sgblack@eecs.umich.edu prefetch_on_access = Param.Bool(Parent.prefetch_on_access, 746335Sgblack@eecs.umich.edu "Notify the hardware prefetcher on every access (not just misses)") 756335Sgblack@eecs.umich.edu 766335Sgblack@eecs.umich.edu _events = [] 776335Sgblack@eecs.umich.edu def addEvent(self, newObject): 786335Sgblack@eecs.umich.edu self._events.append(newObject) 796335Sgblack@eecs.umich.edu 806335Sgblack@eecs.umich.edu # Override the normal SimObject::regProbeListeners method and 816335Sgblack@eecs.umich.edu # register deferred event handlers. 826335Sgblack@eecs.umich.edu def regProbeListeners(self): 836335Sgblack@eecs.umich.edu for event in self._events: 846335Sgblack@eecs.umich.edu event.register() 856335Sgblack@eecs.umich.edu self.getCCObject().regProbeListeners() 866335Sgblack@eecs.umich.edu 876335Sgblack@eecs.umich.edu def listenFromProbe(self, simObj, *probeNames): 886335Sgblack@eecs.umich.edu if not isinstance(simObj, SimObject): 896335Sgblack@eecs.umich.edu raise TypeError("argument must be of SimObject type") 906335Sgblack@eecs.umich.edu if len(probeNames) <= 0: 916335Sgblack@eecs.umich.edu raise TypeError("probeNames must have at least one element") 926335Sgblack@eecs.umich.edu self.addEvent(HWPProbeEvent(self, simObj, *probeNames)) 936335Sgblack@eecs.umich.edu 946335Sgblack@eecs.umich.educlass QueuedPrefetcher(BasePrefetcher): 956335Sgblack@eecs.umich.edu type = "QueuedPrefetcher" 966335Sgblack@eecs.umich.edu abstract = True 976335Sgblack@eecs.umich.edu cxx_class = "QueuedPrefetcher" 986335Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/queued.hh" 996335Sgblack@eecs.umich.edu latency = Param.Int(1, "Latency for generated prefetches") 1006335Sgblack@eecs.umich.edu queue_size = Param.Int(32, "Maximum number of queued prefetches") 1016335Sgblack@eecs.umich.edu queue_squash = Param.Bool(True, "Squash queued prefetch on demand access") 1026335Sgblack@eecs.umich.edu queue_filter = Param.Bool(True, "Don't queue redundant prefetches") 1036335Sgblack@eecs.umich.edu cache_snoop = Param.Bool(False, "Snoop cache to eliminate redundant request") 1046335Sgblack@eecs.umich.edu 1056335Sgblack@eecs.umich.edu tag_prefetch = Param.Bool(True, "Tag prefetch with PC of generating access") 1066335Sgblack@eecs.umich.edu 1076335Sgblack@eecs.umich.educlass StridePrefetcher(QueuedPrefetcher): 1086335Sgblack@eecs.umich.edu type = 'StridePrefetcher' 1096335Sgblack@eecs.umich.edu cxx_class = 'StridePrefetcher' 1106335Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/stride.hh" 1116335Sgblack@eecs.umich.edu 1126335Sgblack@eecs.umich.edu max_conf = Param.Int(7, "Maximum confidence level") 1136335Sgblack@eecs.umich.edu thresh_conf = Param.Int(4, "Threshold confidence level") 1146335Sgblack@eecs.umich.edu min_conf = Param.Int(0, "Minimum confidence level") 1156335Sgblack@eecs.umich.edu start_conf = Param.Int(4, "Starting confidence for new entries") 1166335Sgblack@eecs.umich.edu 1176335Sgblack@eecs.umich.edu table_sets = Param.Int(16, "Number of sets in PC lookup table") 1186335Sgblack@eecs.umich.edu table_assoc = Param.Int(4, "Associativity of PC lookup table") 1196335Sgblack@eecs.umich.edu use_master_id = Param.Bool(True, "Use master id based history") 1206335Sgblack@eecs.umich.edu 1216335Sgblack@eecs.umich.edu degree = Param.Int(4, "Number of prefetches to generate") 1226335Sgblack@eecs.umich.edu 1236335Sgblack@eecs.umich.educlass TaggedPrefetcher(QueuedPrefetcher): 1246335Sgblack@eecs.umich.edu type = 'TaggedPrefetcher' 1256335Sgblack@eecs.umich.edu cxx_class = 'TaggedPrefetcher' 1266335Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/tagged.hh" 1276335Sgblack@eecs.umich.edu 1286335Sgblack@eecs.umich.edu degree = Param.Int(2, "Number of prefetches to generate") 1296335Sgblack@eecs.umich.edu