Prefetcher.py revision 13700:56fa28e6fab4
15425Sgblack@eecs.umich.edu# Copyright (c) 2012, 2014 ARM Limited 25425Sgblack@eecs.umich.edu# All rights reserved. 35425Sgblack@eecs.umich.edu# 47087Snate@binkert.org# The license below extends only to copyright in the software and shall 57087Snate@binkert.org# not be construed as granting a license to any other intellectual 67087Snate@binkert.org# property including but not limited to intellectual property relating 77087Snate@binkert.org# to a hardware implementation of the functionality of the software 87087Snate@binkert.org# licensed hereunder. You may use the software subject to the license 97087Snate@binkert.org# terms below provided that you ensure that this notice is replicated 107087Snate@binkert.org# unmodified and in its entirety in all distributions of the software, 117087Snate@binkert.org# modified or unmodified, in source code or in binary form. 125425Sgblack@eecs.umich.edu# 137087Snate@binkert.org# Copyright (c) 2005 The Regents of The University of Michigan 147087Snate@binkert.org# All rights reserved. 157087Snate@binkert.org# 167087Snate@binkert.org# Redistribution and use in source and binary forms, with or without 177087Snate@binkert.org# modification, are permitted provided that the following conditions are 187087Snate@binkert.org# met: redistributions of source code must retain the above copyright 197087Snate@binkert.org# notice, this list of conditions and the following disclaimer; 207087Snate@binkert.org# redistributions in binary form must reproduce the above copyright 215425Sgblack@eecs.umich.edu# notice, this list of conditions and the following disclaimer in the 227087Snate@binkert.org# documentation and/or other materials provided with the distribution; 235425Sgblack@eecs.umich.edu# neither the name of the copyright holders nor the names of its 245425Sgblack@eecs.umich.edu# contributors may be used to endorse or promote products derived from 255425Sgblack@eecs.umich.edu# this software without specific prior written permission. 265425Sgblack@eecs.umich.edu# 275425Sgblack@eecs.umich.edu# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 285425Sgblack@eecs.umich.edu# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 295425Sgblack@eecs.umich.edu# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 305425Sgblack@eecs.umich.edu# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 315425Sgblack@eecs.umich.edu# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 325425Sgblack@eecs.umich.edu# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 335425Sgblack@eecs.umich.edu# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 345425Sgblack@eecs.umich.edu# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 355425Sgblack@eecs.umich.edu# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 365425Sgblack@eecs.umich.edu# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 375425Sgblack@eecs.umich.edu# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 385425Sgblack@eecs.umich.edu# 395425Sgblack@eecs.umich.edu# Authors: Ron Dreslinski 405425Sgblack@eecs.umich.edu# Mitch Hayenga 415425Sgblack@eecs.umich.edu 425425Sgblack@eecs.umich.edufrom m5.SimObject import * 435425Sgblack@eecs.umich.edufrom m5.params import * 445425Sgblack@eecs.umich.edufrom m5.proxy import * 4514277Sgabeblack@google.com 465425Sgblack@eecs.umich.edufrom m5.objects.ClockedObject import ClockedObject 475425Sgblack@eecs.umich.edufrom m5.objects.IndexingPolicies import * 4814277Sgabeblack@google.comfrom m5.objects.ReplacementPolicies import * 495425Sgblack@eecs.umich.edu 505425Sgblack@eecs.umich.educlass HWPProbeEvent(object): 5114277Sgabeblack@google.com def __init__(self, prefetcher, obj, *listOfNames): 5214277Sgabeblack@google.com self.obj = obj 5314277Sgabeblack@google.com self.prefetcher = prefetcher 5414277Sgabeblack@google.com self.names = listOfNames 5514277Sgabeblack@google.com 5614277Sgabeblack@google.com def register(self): 5714277Sgabeblack@google.com if self.obj: 5814277Sgabeblack@google.com for name in self.names: 5914277Sgabeblack@google.com self.prefetcher.getCCObject().addEventProbe( 605425Sgblack@eecs.umich.edu self.obj.getCCObject(), name) 617965Sgblack@eecs.umich.edu 627965Sgblack@eecs.umich.educlass BasePrefetcher(ClockedObject): 637965Sgblack@eecs.umich.edu type = 'BasePrefetcher' 647965Sgblack@eecs.umich.edu abstract = True 657965Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/base.hh" 667965Sgblack@eecs.umich.edu cxx_exports = [ 6714277Sgabeblack@google.com PyBindMethod("addEventProbe"), 687965Sgblack@eecs.umich.edu ] 697965Sgblack@eecs.umich.edu sys = Param.System(Parent.any, "System this prefetcher belongs to") 707965Sgblack@eecs.umich.edu 715425Sgblack@eecs.umich.edu # Get the block size from the parent (system) 725425Sgblack@eecs.umich.edu block_size = Param.Int(Parent.cache_line_size, "Block size in bytes") 7314277Sgabeblack@google.com 745425Sgblack@eecs.umich.edu on_miss = Param.Bool(False, "Only notify prefetcher on misses") 7514277Sgabeblack@google.com on_read = Param.Bool(True, "Notify prefetcher on reads") 7614277Sgabeblack@google.com on_write = Param.Bool(True, "Notify prefetcher on writes") 7714277Sgabeblack@google.com on_data = Param.Bool(True, "Notify prefetcher on data accesses") 785425Sgblack@eecs.umich.edu on_inst = Param.Bool(True, "Notify prefetcher on instruction accesses") 7914277Sgabeblack@google.com prefetch_on_access = Param.Bool(Parent.prefetch_on_access, 8014277Sgabeblack@google.com "Notify the hardware prefetcher on every access (not just misses)") 8114277Sgabeblack@google.com use_virtual_addresses = Param.Bool(False, 825425Sgblack@eecs.umich.edu "Use virtual addresses for prefetching") 8312236Sgabeblack@google.com 845425Sgblack@eecs.umich.edu _events = [] 855425Sgblack@eecs.umich.edu def addEvent(self, newObject): 865425Sgblack@eecs.umich.edu self._events.append(newObject) 8714277Sgabeblack@google.com 8814277Sgabeblack@google.com # Override the normal SimObject::regProbeListeners method and 8914277Sgabeblack@google.com # register deferred event handlers. 9014277Sgabeblack@google.com def regProbeListeners(self): 9114277Sgabeblack@google.com for event in self._events: 9214277Sgabeblack@google.com event.register() 9314277Sgabeblack@google.com self.getCCObject().regProbeListeners() 9414277Sgabeblack@google.com 9514277Sgabeblack@google.com def listenFromProbe(self, simObj, *probeNames): 9614277Sgabeblack@google.com if not isinstance(simObj, SimObject): 9714277Sgabeblack@google.com raise TypeError("argument must be of SimObject type") 987965Sgblack@eecs.umich.edu if len(probeNames) <= 0: 9912234Sgabeblack@google.com raise TypeError("probeNames must have at least one element") 1005425Sgblack@eecs.umich.edu self.addEvent(HWPProbeEvent(self, simObj, *probeNames)) 1015425Sgblack@eecs.umich.edu 1025425Sgblack@eecs.umich.educlass QueuedPrefetcher(BasePrefetcher): 1035425Sgblack@eecs.umich.edu type = "QueuedPrefetcher" 1045425Sgblack@eecs.umich.edu abstract = True 10514277Sgabeblack@google.com cxx_class = "QueuedPrefetcher" 1067965Sgblack@eecs.umich.edu cxx_header = "mem/cache/prefetch/queued.hh" 1077965Sgblack@eecs.umich.edu latency = Param.Int(1, "Latency for generated prefetches") 1085425Sgblack@eecs.umich.edu queue_size = Param.Int(32, "Maximum number of queued prefetches") 1095425Sgblack@eecs.umich.edu queue_squash = Param.Bool(True, "Squash queued prefetch on demand access") 1105425Sgblack@eecs.umich.edu queue_filter = Param.Bool(True, "Don't queue redundant prefetches") 1115425Sgblack@eecs.umich.edu cache_snoop = Param.Bool(False, "Snoop cache to eliminate redundant request") 11214277Sgabeblack@google.com 1137975Sgblack@eecs.umich.edu tag_prefetch = Param.Bool(True, "Tag prefetch with PC of generating access") 11414277Sgabeblack@google.com 11514277Sgabeblack@google.comclass StridePrefetcher(QueuedPrefetcher): 11614277Sgabeblack@google.com type = 'StridePrefetcher' 11714277Sgabeblack@google.com cxx_class = 'StridePrefetcher' 11814277Sgabeblack@google.com cxx_header = "mem/cache/prefetch/stride.hh" 1195425Sgblack@eecs.umich.edu 1207626Sgblack@eecs.umich.edu # Do not consult stride prefetcher on instruction accesses 1215425Sgblack@eecs.umich.edu on_inst = False 1225425Sgblack@eecs.umich.edu 1235425Sgblack@eecs.umich.edu max_conf = Param.Int(7, "Maximum confidence level") 1245425Sgblack@eecs.umich.edu thresh_conf = Param.Int(4, "Threshold confidence level") 12514277Sgabeblack@google.com min_conf = Param.Int(0, "Minimum confidence level") 12614277Sgabeblack@google.com start_conf = Param.Int(4, "Starting confidence for new entries") 12714277Sgabeblack@google.com 12814277Sgabeblack@google.com table_sets = Param.Int(16, "Number of sets in PC lookup table") 12914277Sgabeblack@google.com table_assoc = Param.Int(4, "Associativity of PC lookup table") 13014277Sgabeblack@google.com use_master_id = Param.Bool(True, "Use master id based history") 13114277Sgabeblack@google.com 13214277Sgabeblack@google.com degree = Param.Int(4, "Number of prefetches to generate") 13314277Sgabeblack@google.com 1345425Sgblack@eecs.umich.edu # Get replacement policy 13514277Sgabeblack@google.com replacement_policy = Param.BaseReplacementPolicy(RandomRP(), 13614277Sgabeblack@google.com "Replacement policy") 13714277Sgabeblack@google.com 1385425Sgblack@eecs.umich.educlass TaggedPrefetcher(QueuedPrefetcher): 13914277Sgabeblack@google.com type = 'TaggedPrefetcher' 14014277Sgabeblack@google.com cxx_class = 'TaggedPrefetcher' 14114277Sgabeblack@google.com cxx_header = "mem/cache/prefetch/tagged.hh" 14214277Sgabeblack@google.com 14314277Sgabeblack@google.com degree = Param.Int(2, "Number of prefetches to generate") 14414277Sgabeblack@google.com 1455425Sgblack@eecs.umich.educlass SignaturePathPrefetcher(QueuedPrefetcher): 1467620Sgblack@eecs.umich.edu type = 'SignaturePathPrefetcher' 14714277Sgabeblack@google.com cxx_class = 'SignaturePathPrefetcher' 14814277Sgabeblack@google.com cxx_header = "mem/cache/prefetch/signature_path.hh" 14914277Sgabeblack@google.com 15014277Sgabeblack@google.com signature_shift = Param.UInt8(3, 15114277Sgabeblack@google.com "Number of bits to shift when calculating a new signature"); 15214277Sgabeblack@google.com signature_bits = Param.UInt16(12, 15314277Sgabeblack@google.com "Size of the signature, in bits"); 15414277Sgabeblack@google.com signature_table_entries = Param.MemorySize("1024", 15514277Sgabeblack@google.com "Number of entries of the signature table") 15614277Sgabeblack@google.com signature_table_assoc = Param.Unsigned(2, 15714277Sgabeblack@google.com "Associativity of the signature table") 1585425Sgblack@eecs.umich.edu signature_table_indexing_policy = Param.BaseIndexingPolicy( 15914277Sgabeblack@google.com SetAssociative(entry_size = 1, assoc = Parent.signature_table_assoc, 16014277Sgabeblack@google.com size = Parent.signature_table_entries), 1615425Sgblack@eecs.umich.edu "Indexing policy of the signature table") 16214277Sgabeblack@google.com signature_table_replacement_policy = Param.BaseReplacementPolicy(LRURP(), 16314277Sgabeblack@google.com "Replacement policy of the signature table") 1645425Sgblack@eecs.umich.edu 16514277Sgabeblack@google.com max_counter_value = Param.UInt8(7, "Maximum pattern counter value") 1665425Sgblack@eecs.umich.edu pattern_table_entries = Param.MemorySize("4096", 16714277Sgabeblack@google.com "Number of entries of the pattern table") 16814277Sgabeblack@google.com pattern_table_assoc = Param.Unsigned(1, 16914277Sgabeblack@google.com "Associativity of the pattern table") 17014277Sgabeblack@google.com strides_per_pattern_entry = Param.Unsigned(4, 1715425Sgblack@eecs.umich.edu "Number of strides stored in each pattern entry") 1725425Sgblack@eecs.umich.edu pattern_table_indexing_policy = Param.BaseIndexingPolicy( 17314277Sgabeblack@google.com SetAssociative(entry_size = 1, assoc = Parent.pattern_table_assoc, 17414277Sgabeblack@google.com size = Parent.pattern_table_entries), 17514277Sgabeblack@google.com "Indexing policy of the pattern table") 1765425Sgblack@eecs.umich.edu pattern_table_replacement_policy = Param.BaseReplacementPolicy(LRURP(), 17714277Sgabeblack@google.com "Replacement policy of the pattern table") 1785425Sgblack@eecs.umich.edu 17914277Sgabeblack@google.com prefetch_confidence_threshold = Param.Float(0.5, 18014277Sgabeblack@google.com "Minimum confidence to issue prefetches") 18114277Sgabeblack@google.com lookahead_confidence_threshold = Param.Float(0.75, 18214277Sgabeblack@google.com "Minimum confidence to continue exploring lookahead entries") 18314277Sgabeblack@google.com 18414277Sgabeblack@google.comclass SignaturePathPrefetcherV2(SignaturePathPrefetcher): 18514277Sgabeblack@google.com type = 'SignaturePathPrefetcherV2' 18614277Sgabeblack@google.com cxx_class = 'SignaturePathPrefetcherV2' 18714277Sgabeblack@google.com cxx_header = "mem/cache/prefetch/signature_path_v2.hh" 18814277Sgabeblack@google.com 18914277Sgabeblack@google.com signature_table_entries = "256" 19014277Sgabeblack@google.com signature_table_assoc = 1 19114277Sgabeblack@google.com pattern_table_entries = "512" 19214277Sgabeblack@google.com pattern_table_assoc = 1 19314277Sgabeblack@google.com max_counter_value = 15 19414277Sgabeblack@google.com prefetch_confidence_threshold = 0.25 19514277Sgabeblack@google.com lookahead_confidence_threshold = 0.25 1965425Sgblack@eecs.umich.edu 197 global_history_register_entries = Param.MemorySize("8", 198 "Number of entries of global history register") 199 global_history_register_indexing_policy = Param.BaseIndexingPolicy( 200 SetAssociative(entry_size = 1, 201 assoc = Parent.global_history_register_entries, 202 size = Parent.global_history_register_entries), 203 "Indexing policy of the global history register") 204 global_history_register_replacement_policy = Param.BaseReplacementPolicy( 205 LRURP(), "Replacement policy of the global history register") 206 207class AccessMapPatternMatching(ClockedObject): 208 type = 'AccessMapPatternMatching' 209 cxx_class = 'AccessMapPatternMatching' 210 cxx_header = "mem/cache/prefetch/access_map_pattern_matching.hh" 211 212 block_size = Param.Unsigned(Parent.block_size, 213 "Cacheline size used by the prefetcher using this object") 214 215 limit_stride = Param.Unsigned(0, 216 "Limit the strides checked up to -X/X, if 0, disable the limit") 217 start_degree = Param.Unsigned(4, 218 "Initial degree (Maximum number of prefetches generated") 219 hot_zone_size = Param.MemorySize("2kB", "Memory covered by a hot zone") 220 access_map_table_entries = Param.MemorySize("256", 221 "Number of entries in the access map table") 222 access_map_table_assoc = Param.Unsigned(8, 223 "Associativity of the access map table") 224 access_map_table_indexing_policy = Param.BaseIndexingPolicy( 225 SetAssociative(entry_size = 1, assoc = Parent.access_map_table_assoc, 226 size = Parent.access_map_table_entries), 227 "Indexing policy of the access map table") 228 access_map_table_replacement_policy = Param.BaseReplacementPolicy(LRURP(), 229 "Replacement policy of the access map table") 230 high_coverage_threshold = Param.Float(0.25, 231 "A prefetch coverage factor bigger than this is considered high") 232 low_coverage_threshold = Param.Float(0.125, 233 "A prefetch coverage factor smaller than this is considered low") 234 high_accuracy_threshold = Param.Float(0.5, 235 "A prefetch accuracy factor bigger than this is considered high") 236 low_accuracy_threshold = Param.Float(0.25, 237 "A prefetch accuracy factor smaller than this is considered low") 238 high_cache_hit_threshold = Param.Float(0.875, 239 "A cache hit ratio bigger than this is considered high") 240 low_cache_hit_threshold = Param.Float(0.75, 241 "A cache hit ratio smaller than this is considered low") 242 epoch_cycles = Param.Cycles(256000, "Cycles in an epoch period") 243 offchip_memory_latency = Param.Latency("30ns", 244 "Memory latency used to compute the required memory bandwidth") 245 246class AMPMPrefetcher(QueuedPrefetcher): 247 type = 'AMPMPrefetcher' 248 cxx_class = 'AMPMPrefetcher' 249 cxx_header = "mem/cache/prefetch/access_map_pattern_matching.hh" 250 ampm = Param.AccessMapPatternMatching( AccessMapPatternMatching(), 251 "Access Map Pattern Matching object") 252 253class DeltaCorrelatingPredictionTables(SimObject): 254 type = 'DeltaCorrelatingPredictionTables' 255 cxx_class = 'DeltaCorrelatingPredictionTables' 256 cxx_header = "mem/cache/prefetch/delta_correlating_prediction_tables.hh" 257 deltas_per_entry = Param.Unsigned(20, 258 "Number of deltas stored in each table entry") 259 delta_bits = Param.Unsigned(12, "Bits per delta") 260 delta_mask_bits = Param.Unsigned(8, 261 "Lower bits to mask when comparing deltas") 262 table_entries = Param.MemorySize("128", 263 "Number of entries in the table") 264 table_assoc = Param.Unsigned(128, 265 "Associativity of the table") 266 table_indexing_policy = Param.BaseIndexingPolicy( 267 SetAssociative(entry_size = 1, assoc = Parent.table_assoc, 268 size = Parent.table_entries), 269 "Indexing policy of the table") 270 table_replacement_policy = Param.BaseReplacementPolicy(LRURP(), 271 "Replacement policy of the table") 272 273class DCPTPrefetcher(QueuedPrefetcher): 274 type = 'DCPTPrefetcher' 275 cxx_class = 'DCPTPrefetcher' 276 cxx_header = "mem/cache/prefetch/delta_correlating_prediction_tables.hh" 277 dcpt = Param.DeltaCorrelatingPredictionTables( 278 DeltaCorrelatingPredictionTables(), 279 "Delta Correlating Prediction Tables object") 280 281class IrregularStreamBufferPrefetcher(QueuedPrefetcher): 282 type = "IrregularStreamBufferPrefetcher" 283 cxx_class = "IrregularStreamBufferPrefetcher" 284 cxx_header = "mem/cache/prefetch/irregular_stream_buffer.hh" 285 286 max_counter_value = Param.Unsigned(3, 287 "Maximum value of the confidence counter") 288 chunk_size = Param.Unsigned(256, 289 "Maximum number of addresses in a temporal stream") 290 degree = Param.Unsigned(4, "Number of prefetches to generate") 291 training_unit_assoc = Param.Unsigned(128, 292 "Associativity of the training unit") 293 training_unit_entries = Param.MemorySize("128", 294 "Number of entries of the training unit") 295 training_unit_indexing_policy = Param.BaseIndexingPolicy( 296 SetAssociative(entry_size = 1, assoc = Parent.training_unit_assoc, 297 size = Parent.training_unit_entries), 298 "Indexing policy of the training unit") 299 training_unit_replacement_policy = Param.BaseReplacementPolicy(LRURP(), 300 "Replacement policy of the training unit") 301 302 prefetch_candidates_per_entry = Param.Unsigned(16, 303 "Number of prefetch candidates stored in a SP-AMC entry") 304 address_map_cache_assoc = Param.Unsigned(128, 305 "Associativity of the PS/SP AMCs") 306 address_map_cache_entries = Param.MemorySize("128", 307 "Number of entries of the PS/SP AMCs") 308 ps_address_map_cache_indexing_policy = Param.BaseIndexingPolicy( 309 SetAssociative(entry_size = 1, 310 assoc = Parent.address_map_cache_assoc, 311 size = Parent.address_map_cache_entries), 312 "Indexing policy of the Physical-to-Structural Address Map Cache") 313 ps_address_map_cache_replacement_policy = Param.BaseReplacementPolicy( 314 LRURP(), 315 "Replacement policy of the Physical-to-Structural Address Map Cache") 316 sp_address_map_cache_indexing_policy = Param.BaseIndexingPolicy( 317 SetAssociative(entry_size = 1, 318 assoc = Parent.address_map_cache_assoc, 319 size = Parent.address_map_cache_entries), 320 "Indexing policy of the Structural-to-Physical Address Mao Cache") 321 sp_address_map_cache_replacement_policy = Param.BaseReplacementPolicy( 322 LRURP(), 323 "Replacement policy of the Structural-to-Physical Address Map Cache") 324 325class SlimAccessMapPatternMatching(AccessMapPatternMatching): 326 start_degree = 2 327 limit_stride = 4 328 329class SlimDeltaCorrelatingPredictionTables(DeltaCorrelatingPredictionTables): 330 table_entries = "256" 331 table_assoc = 256 332 deltas_per_entry = 9 333 334class SlimAMPMPrefetcher(QueuedPrefetcher): 335 type = 'SlimAMPMPrefetcher' 336 cxx_class = 'SlimAMPMPrefetcher' 337 cxx_header = "mem/cache/prefetch/slim_ampm.hh" 338 339 ampm = Param.AccessMapPatternMatching(SlimAccessMapPatternMatching(), 340 "Access Map Pattern Matching object") 341 dcpt = Param.DeltaCorrelatingPredictionTables( 342 SlimDeltaCorrelatingPredictionTables(), 343 "Delta Correlating Prediction Tables object") 344