From: Javier Bueno Date: Wed, 27 Mar 2019 13:19:52 +0000 (+0100) Subject: config: Add flag options to set the hardware prefetchers to use X-Git-Tag: v19.0.0.0~943 X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=8f010ce138a9b09b0a30e3d53df88662045fcc29;p=gem5.git config: Add flag options to set the hardware prefetchers to use This patch adds three flag options to set the prefetcher class of the L1i cache, L1d cache and L2 cache. Change-Id: I310fcd9c49f9554d98cd565a32bdb96a3e165486 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/17709 Reviewed-by: Jason Lowe-Power Reviewed-by: Andreas Sandberg Tested-by: kokoro Maintainer: Andreas Sandberg --- diff --git a/configs/common/CacheConfig.py b/configs/common/CacheConfig.py index 946060768..f705ab09a 100644 --- a/configs/common/CacheConfig.py +++ b/configs/common/CacheConfig.py @@ -47,6 +47,7 @@ from __future__ import absolute_import import m5 from m5.objects import * from .Caches import * +from . import HWPConfig def config_cache(options, system): if options.external_memory_system and (options.caches or options.l2cache): @@ -104,6 +105,14 @@ def config_cache(options, system): system.tol2bus = L2XBar(clk_domain = system.cpu_clk_domain) system.l2.cpu_side = system.tol2bus.master system.l2.mem_side = system.membus.slave + if options.l2_hwp_type: + hwpClass = HWPConfig.get(options.l2_hwp_type) + if system.l2.prefetcher != "Null": + print("Warning: l2-hwp-type is set (", hwpClass, "), but", + "the current l2 has a default Hardware Prefetcher", + "of type", type(system.l2.prefetcher), ", using the", + "specified by the flag option.") + system.l2.prefetcher = hwpClass() if options.memchecker: system.memchecker = MemChecker() @@ -139,6 +148,24 @@ def config_cache(options, system): # Let CPU connect to monitors dcache = dcache_mon + if options.l1d_hwp_type: + hwpClass = HWPConfig.get(options.l1d_hwp_type) + if dcache.prefetcher != m5.params.NULL: + print("Warning: l1d-hwp-type is set (", hwpClass, "), but", + "the current l1d has a default Hardware Prefetcher", + "of type", type(dcache.prefetcher), ", using the", + "specified by the flag option.") + dcache.prefetcher = hwpClass() + + if options.l1i_hwp_type: + hwpClass = HWPConfig.get(options.l1i_hwp_type) + if icache.prefetcher != m5.params.NULL: + print("Warning: l1i-hwp-type is set (", hwpClass, "), but", + "the current l1i has a default Hardware Prefetcher", + "of type", type(icache.prefetcher), ", using the", + "specified by the flag option.") + icache.prefetcher = hwpClass() + # When connecting the caches, the clock is also inherited # from the CPU in question system.cpu[i].addPrivateSplitL1Caches(icache, dcache, diff --git a/configs/common/HWPConfig.py b/configs/common/HWPConfig.py new file mode 100644 index 000000000..dd8cafa2e --- /dev/null +++ b/configs/common/HWPConfig.py @@ -0,0 +1,88 @@ +# Copyright (c) 2018 Metempsy Technology Consulting +# All rights reserved. +# +# Redistribution and use in source and binary forms, with or without +# modification, are permitted provided that the following conditions are +# met: redistributions of source code must retain the above copyright +# notice, this list of conditions and the following disclaimer; +# redistributions in binary form must reproduce the above copyright +# notice, this list of conditions and the following disclaimer in the +# documentation and/or other materials provided with the distribution; +# neither the name of the copyright holders nor the names of its +# contributors may be used to endorse or promote products derived from +# this software without specific prior written permission. +# +# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +# +# Authors: Pau Cabre + +# This file is a copy of MemConfig.py / CpuConfig.py, but modified to +# hanle branch predictors instead of memory controllers / CPUs + +from __future__ import print_function +from __future__ import absolute_import + +from m5 import fatal +import m5.objects +import inspect +import sys +from textwrap import TextWrapper + +# Dictionary of mapping names of real branch predictor models to classes. +_hwp_classes = {} + + +def is_hwp_class(cls): + """Determine if a class is a prefetcher that can be instantiated""" + + # We can't use the normal inspect.isclass because the ParamFactory + # and ProxyFactory classes have a tendency to confuse it. + try: + return issubclass(cls, m5.objects.BasePrefetcher) and \ + not cls.abstract + except (TypeError, AttributeError): + return False + +def get(name): + """Get a HWP class from a user provided class name or alias.""" + + try: + hwp_class = _hwp_classes[name] + return hwp_class + except KeyError: + print("%s is not a valid HWP model." % (name,)) + sys.exit(1) + +def print_hwp_list(): + """Print a list of available HWP classes.""" + + print("Available Hardware Prefetcher classes:") + doc_wrapper = TextWrapper(initial_indent="\t\t", subsequent_indent="\t\t") + for name, cls in _hwp_classes.items(): + print("\t%s" % name) + + # Try to extract the class documentation from the class help + # string. + doc = inspect.getdoc(cls) + if doc: + for line in doc_wrapper.wrap(doc): + print(line) + +def hwp_names(): + """Return a list of valid Hardware Prefetcher names.""" + return list(_hwp_classes.keys()) + +# Add all HWPs in the object hierarchy. +for name, cls in inspect.getmembers(m5.objects, is_hwp_class): + _hwp_classes[name] = cls + diff --git a/configs/common/Options.py b/configs/common/Options.py index 6d9c9cf37..58078ec86 100644 --- a/configs/common/Options.py +++ b/configs/common/Options.py @@ -48,6 +48,7 @@ from m5.objects import * from .Benchmarks import * from . import CpuConfig from . import BPConfig +from . import HWPConfig from . import MemConfig from . import PlatformConfig @@ -59,6 +60,10 @@ def _listBPTypes(option, opt, value, parser): BPConfig.print_bp_list() sys.exit(0) +def _listHWPTypes(option, opt, value, parser): + HWPConfig.print_hwp_list() + sys.exit(0) + def _listMemTypes(option, opt, value, parser): MemConfig.print_mem_list() sys.exit(0) @@ -163,6 +168,29 @@ def addCommonOptions(parser): type of branch predictor to run with (if not set, use the default branch predictor of the selected CPU)""") + parser.add_option("--list-hwp-types", + action="callback", callback=_listHWPTypes, + help="List available hardware prefetcher types") + parser.add_option("--l1i-hwp-type", type="choice", default=None, + choices=HWPConfig.hwp_names(), + help = """ + type of hardware prefetcher to use with the L1 + instruction cache. + (if not set, use the default prefetcher of + the selected cache)""") + parser.add_option("--l1d-hwp-type", type="choice", default=None, + choices=HWPConfig.hwp_names(), + help = """ + type of hardware prefetcher to use with the L1 + data cache. + (if not set, use the default prefetcher of + the selected cache)""") + parser.add_option("--l2-hwp-type", type="choice", default=None, + choices=HWPConfig.hwp_names(), + help = """ + type of hardware prefetcher to use with the L2 cache. + (if not set, use the default prefetcher of + the selected cache)""") parser.add_option("--checker", action="store_true"); parser.add_option("--cpu-clock", action="store", type="string", default='2GHz',