From ceac4b8f1a0a2e3ccd9c2e82832361a7a25ca481 Mon Sep 17 00:00:00 2001 From: Melissa Jost Date: Thu, 6 Oct 2022 10:02:24 -0700 Subject: [PATCH] stdlib,configs: Update simpoint example to use the Workload With the inclusion of the "x86-print-this-15000-with-simpoints" workloads (introduced here: https://gem5-review.googlesource.com/c/public/gem5-resources/+/64531) This patch utilizes this workload for the simpoint examples. Change-Id: I5e2c4a48206fd7108a33a4a64ac64235ea9f1f33 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/64552 Maintainer: Bobby Bruce Reviewed-by: Bobby Bruce Tested-by: kokoro --- .../checkpoints/simpoints-se-checkpoint.py | 40 +++++++------------ .../checkpoints/simpoints-se-restore.py | 23 +++-------- src/python/gem5/utils/simpoint.py | 22 +++++++++- 3 files changed, 41 insertions(+), 44 deletions(-) diff --git a/configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py b/configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py index bc30a024eb..d2d1af730f 100644 --- a/configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py +++ b/configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py @@ -25,15 +25,10 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -This configuation script shows an example of how to take checkpoints for -SimPoints using the gem5 stdlib. SimPoints, SimPoints interval length, -SimPoints weights, and the warmup instruction length are passed into the gem5 -SimPoint module. The gem5 SimPoint module will calculate where to take -checkpoints based of the SimPoints, SimPoints interval length, and the warmup -instruction length. In SE mode, when you pass in a SimPoint object to the -set_se_binary_workload, it will schedule exit events for SimPoints in the init -stage of the core. With the Simulator module and the exit event generator, -checkpoints will be taken for the SimPoints. +This configuration script shows an example of how to take checkpoints for +SimPoints using the gem5 stdlib. Simpoints are set via a Workload and the +gem5 SimPoint module will calculate where to take checkpoints based of the +SimPoints, SimPoints interval length, and the warmup instruction length. This scipt builds a simple board with the gem5 stdlib with no cache and a simple memory structure to take checkpoints. Some of the components, such as @@ -53,6 +48,7 @@ scons build/X86/gem5.opt """ import argparse + from gem5.simulate.exit_event import ExitEvent from gem5.simulate.simulator import Simulator from gem5.utils.requires import requires @@ -61,15 +57,20 @@ from gem5.components.memory.single_channel import SingleChannelDDR3_1600 from gem5.components.processors.simple_processor import SimpleProcessor from gem5.components.processors.cpu_types import CPUTypes from gem5.isas import ISA -from gem5.resources.resource import Resource +from gem5.resources.workload import Workload from pathlib import Path from gem5.components.cachehierarchies.classic.no_cache import NoCache -from gem5.utils.simpoint import SimPoint from gem5.simulate.exit_event_generators import ( save_checkpoint_generator, ) -parser = argparse.ArgumentParser() +requires(isa_required=ISA.X86) + +parser = argparse.ArgumentParser( + description="An example simpoint workload file path" +) + +# The lone arguments is a file path to a directory to store the checkpoints. parser.add_argument( "--checkpoint-path", @@ -81,8 +82,6 @@ parser.add_argument( args = parser.parse_args() -requires(isa_required=ISA.X86) - # When taking a checkpoint, the cache state is not saved, so the cache # hierarchy can be changed completely when restoring from a checkpoint. # By using NoCache() to take checkpoints, it can slightly improve the @@ -109,18 +108,7 @@ board = SimpleBoard( cache_hierarchy=cache_hierarchy, ) -simpoint = SimPoint( - simpoint_list=[2, 3, 5, 15], - weight_list=[0.1, 0.2, 0.4, 0.3], - simpoint_interval=1000000, - warmup_interval=1000000, -) - -board.set_se_simpoint_workload( - binary=Resource("x86-print-this"), - arguments=["print this", 15000], - simpoint=simpoint, -) +board.set_workload(Workload("x86-print-this-15000-with-simpoints")) dir = Path(args.checkpoint_path) dir.mkdir(exist_ok=True) diff --git a/configs/example/gem5_library/checkpoints/simpoints-se-restore.py b/configs/example/gem5_library/checkpoints/simpoints-se-restore.py index aacddd7e31..decf9eaec3 100644 --- a/configs/example/gem5_library/checkpoints/simpoints-se-restore.py +++ b/configs/example/gem5_library/checkpoints/simpoints-se-restore.py @@ -25,17 +25,17 @@ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. """ -This configuation script shows an example of how to restore a checkpoint that +This configuration script shows an example of how to restore a checkpoint that was taken for SimPoints in the configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py. The SimPoints, SimPoints interval length, and the warmup instruction length are passed into the SimPoint module, so the SimPoint object will store and calculate the warmup instruction length for each SimPoints based on the -avaliable instructions before reaching the start of the SimPoint. With the +available instructions before reaching the start of the SimPoint. With the Simulator module, exit event will be generated to stop when the warmup session ends and the SimPoints interval ends. -This scipt builds a more complex board than the board used for taking +This script builds a more complex board than the board used for taking checkpoint. Usage @@ -49,9 +49,9 @@ scons build/X86/gem5.opt ./build/X86/gem5.opt \ configs/example/gem5_library/checkpoints/simpoints-se-restore.py ``` + """ -import imp from gem5.simulate.exit_event import ExitEvent from gem5.simulate.simulator import Simulator from gem5.utils.requires import requires @@ -64,8 +64,8 @@ from gem5.components.processors.simple_processor import SimpleProcessor from gem5.components.processors.cpu_types import CPUTypes from gem5.isas import ISA from gem5.resources.resource import Resource +from gem5.resources.workload import Workload -from gem5.utils.simpoint import SimPoint from pathlib import Path from m5.stats import reset, dump @@ -96,18 +96,7 @@ board = SimpleBoard( cache_hierarchy=cache_hierarchy, ) -simpoint = SimPoint( - simpoint_list=[2, 3, 5, 15], - weight_list=[0.1, 0.2, 0.4, 0.3], - simpoint_interval=1000000, - warmup_interval=1000000, -) - -board.set_se_simpoint_workload( - binary=Resource("x86-print-this"), - arguments=["print this", 15000], - simpoint=simpoint, -) +board.set_workload(Workload("x86-print-this-15000-with-simpoints")) # Here we obtain the checkpoints from gem5 resources, but these are generated # from `configs/example/gem5_library/checkpoints/simpoints-se-checkpoint.py`.If diff --git a/src/python/gem5/utils/simpoint.py b/src/python/gem5/utils/simpoint.py index 11d10875bb..9e861cc0a5 100644 --- a/src/python/gem5/utils/simpoint.py +++ b/src/python/gem5/utils/simpoint.py @@ -27,6 +27,7 @@ from m5.util import fatal from pathlib import Path from typing import List, Tuple +from gem5.resources.resource import Resource, CustomResource class SimPoint: @@ -38,7 +39,8 @@ class SimPoint: def __init__( self, - simpoint_interval: int, + simpoint_resource: CustomResource = None, + simpoint_interval: int = None, simpoint_file_path: Path = None, weight_file_path: Path = None, simpoint_list: List[int] = None, @@ -67,6 +69,24 @@ class SimPoint: (sorted by SimPoints in ascending order) is strongly suggested. The warmup_list only works correctly with sorted simpoint_list. """ + + # initalize input if you're passing in a CustomResource + if simpoint_resource is not None: + simpoint_directory = str(simpoint_resource.get_local_path()) + + simpoint_file_path = Path(simpoint_directory + "/simpoint.simpt") + weight_file_path = Path(simpoint_directory + "/simpoint.weight") + simpoint_interval = ( + simpoint_resource.get_metadata() + .get("additional_metadata") + .get("simpoint_interval") + ) + warmup_interval = ( + simpoint_resource.get_metadata() + .get("additional_metadata") + .get("warmup_interval") + ) + self._simpoint_interval = simpoint_interval if simpoint_file_path is None or weight_file_path is None: