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 <bbruce@ucdavis.edu>
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
This commit is contained in:
Melissa Jost
2022-10-06 10:02:24 -07:00
committed by Bobby Bruce
parent 36e5feb0de
commit ceac4b8f1a
3 changed files with 41 additions and 44 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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: