stdlib, configs: Updating configs/example/gem5_library

This commit updates all of the older tests in this directory to
use the Simulator to run instead of m5.simulate()

Change-Id: I2a81d5c2f27c89e8c03abb0203ca3e58a6688672
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/64791
Reviewed-by: Bobby Bruce <bbruce@ucdavis.edu>
Tested-by: kokoro <noreply+kokoro@google.com>
Maintainer: Bobby Bruce <bbruce@ucdavis.edu>
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/66332
This commit is contained in:
Melissa Jost
2022-10-18 16:04:18 -07:00
committed by Bobby Bruce
parent 005049f548
commit 6f3f6c16f3
5 changed files with 144 additions and 438 deletions

View File

@@ -64,8 +64,8 @@ from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.coherence_protocol import CoherenceProtocol
from gem5.resources.resource import Resource
from m5.stats.gem5stats import get_simstat
from gem5.simulate.simulator import Simulator
from gem5.simulate.exit_event import ExitEvent
requires(
isa_required=ISA.X86,
@@ -210,14 +210,26 @@ board.set_kernel_disk_workload(
readfile_contents=command,
)
root = Root(full_system=True, system=board)
# sim_quantum must be set when KVM cores are used.
def handle_exit():
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
global start_tick
start_tick = m5.curTick()
processor.switch()
yield False # E.g., continue the simulation.
print("Dump stats at the end of the ROI!")
m5.stats.dump()
yield True # Stop the simulation. We're done.
root.sim_quantum = int(1e9)
board._pre_instantiate()
m5.instantiate()
simulator = Simulator(
board=board,
on_exit_event={
ExitEvent.EXIT: handle_exit(),
},
)
# We maintain the wall clock time.
@@ -232,74 +244,8 @@ print("Using KVM cpu")
# the first ROI annotation in details. The X86Board currently does not support
# `work items started count reached`.
exit_event = m5.simulate()
# The first exit_event ends with a `workbegin` cause. This means that the
# system started successfully and the execution on the program started. The
# ROI begin is encountered.
if exit_event.getCause() == "workbegin":
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
start_tick = m5.curTick()
# We have completed up to this step using KVM cpu. Now we switch to timing
# cpu for detailed simulation.
processor.switch()
else:
print("Unexpected termination of simulation before ROI was reached!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# The next exit_event is to simulate the ROI. It should be exited with a cause
# marked by `workend`. This implies that the first annotation is successfully
# completed.
exit_event = m5.simulate()
# Reached the end of first ROI.
# We dump the stats here.
# We exepect that ROI ends with `workend`. Otherwise the simulation ended
# unexpectedly.
if exit_event.getCause() == "workend":
print("Dump stats at the end of the ROI!")
m5.stats.dump()
end_tick = m5.curTick()
else:
print("Unexpected termination of simulation while ROI was being executed!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# We get simInsts using get_simstat and output it in the final print statement.
gem5stats = get_simstat(root)
# We get the number of committed instructions from the timing cores. We then
# sum and print them at the end.
roi_insts = float(
gem5stats.to_json()["system"]["processor"]["switch0"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
) + float(
gem5stats.to_json()["system"]["processor"]["switch1"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
)
simulator.run()
end_tick = m5.curTick()
# Since we simulated the ROI in details, therefore, simulation is over at this
# point.
@@ -313,8 +259,9 @@ print()
print("Performance statistics:")
print("Simulated time in ROI: %.2fs" % ((end_tick - start_tick) / 1e12))
print("Instructions executed in ROI: %d" % ((roi_insts)))
print("Ran a total of", m5.curTick() / 1e12, "simulated seconds")
print(
"Ran a total of", simulator.get_current_tick() / 1e12, "simulated seconds"
)
print(
"Total wallclock time: %.2fs, %.2f min"
% (time.time() - globalStart, (time.time() - globalStart) / 60)

View File

@@ -61,6 +61,8 @@ from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.coherence_protocol import CoherenceProtocol
from gem5.resources.resource import Resource
from gem5.simulate.simulator import Simulator
from gem5.simulate.simulator import ExitEvent
from m5.stats.gem5stats import get_simstat
from m5.util import warn
@@ -209,17 +211,47 @@ board.set_kernel_disk_workload(
readfile_contents=command,
)
# We need this for long running processes.
m5.disableAllListeners()
# The first exit_event ends with a `workbegin` cause. This means that the
# system started successfully and the execution on the program started.
def handle_workbegin():
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
root = Root(full_system=True, system=board)
m5.stats.reset()
# sim_quantum must be set when KVM cores are used.
# We have completed up to this step using KVM cpu. Now we switch to timing
# cpu for detailed simulation.
root.sim_quantum = int(1e9)
# # Next, we need to check if the user passed a value for --ticks. If yes,
# then we limit out execution to this number of ticks during the ROI.
# Otherwise, we simulate until the ROI ends.
processor.switch()
if args.ticks:
# schedule an exit event for this amount of ticks in the future.
# The simulation will then continue.
m5.scheduleTickExitFromCurrent(args.ticks)
yield False
board._pre_instantiate()
m5.instantiate()
# The next exit_event is to simulate the ROI. It should be exited with a cause
# marked by `workend`.
# We exepect that ROI ends with `workend` or `simulate() limit reached`.
# Otherwise the simulation ended unexpectedly.
def handle_workend():
print("Dump stats at the end of the ROI!")
m5.stats.dump()
yield False
simulator = Simulator(
board=board,
on_exit_event={
ExitEvent.WORKBEGIN: handle_workbegin(),
ExitEvent.WORKEND: handle_workend(),
},
)
# We maintain the wall clock time.
@@ -229,96 +261,12 @@ print("Running the simulation")
print("Using KVM cpu")
# We start the simulation.
exit_event = m5.simulate()
# The first exit_event ends with a `workbegin` cause. This means that the
# system started successfully and the execution on the program started.
if exit_event.getCause() == "workbegin":
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
start_tick = m5.curTick()
# We have completed up to this step using KVM cpu. Now we switch to timing
# cpu for detailed simulation.
processor.switch()
else:
# `workbegin` call was never encountered.
print("Unexpected termination of simulation before ROI was reached!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# The next exit_event is to simulate the ROI. It should be exited with a cause
# marked by `workend`.
# Next, we need to check if the user passed a value for --ticks. If yes,
# then we limit out execution to this number of ticks during the ROI.
# Otherwise, we simulate until the ROI ends.
if args.ticks:
exit_event = m5.simulate(args.ticks)
else:
exit_event = m5.simulate()
# Reached the end of ROI.
# We dump the stats here.
# We exepect that ROI ends with `workend` or `simulate() limit reached`.
# Otherwise the simulation ended unexpectedly.
if exit_event.getCause() == "workend":
print("Dump stats at the end of the ROI!")
m5.stats.dump()
end_tick = m5.curTick()
elif (
exit_event.getCause() == "simulate() limit reached"
and args.ticks is not None
):
print("Dump stats at the end of {} ticks in the ROI".format(args.ticks))
m5.stats.dump()
end_tick = m5.curTick()
else:
print("Unexpected termination of simulation while ROI was being executed!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
simulator.run()
# We need to note that the benchmark is not executed completely till this
# point, but, the ROI has. We collect the essential statistics here before
# resuming the simulation again.
# We get simInsts using get_simstat and output it in the final
# print statement.
gem5stats = get_simstat(root)
# We get the number of committed instructions from the timing
# cores. We then sum and print them at the end.
roi_insts = float(
gem5stats.to_json()["system"]["processor"]["switch0"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
) + float(
gem5stats.to_json()["system"]["processor"]["switch1"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
)
# Simulation is over at this point. We acknowledge that all the simulation
# events were successful.
print("All simulation events were successful.")
@@ -328,9 +276,16 @@ print("Done with the simulation")
print()
print("Performance statistics:")
print("Simulated time in ROI: %.2fs" % ((end_tick - start_tick) / 1e12))
print("Instructions executed in ROI: %d" % ((roi_insts)))
print("Ran a total of", m5.curTick() / 1e12, "simulated seconds")
# manually calculate ROI time if ticks arg is used in case the
# entire ROI wasn't simulated
if args.ticks:
print(f"Simulated time in ROI (to tick): {args.ticks/ 1e12}s")
else:
print(f"Simulated time in ROI: {simulator.get_roi_ticks()[0] / 1e12}s")
print(
f"Ran a total of {simulator.get_current_tick() / 1e12} simulated seconds"
)
print(
"Total wallclock time: %.2fs, %.2f min"
% (time.time() - globalStart, (time.time() - globalStart) / 60)

View File

@@ -60,8 +60,8 @@ from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.coherence_protocol import CoherenceProtocol
from gem5.resources.resource import Resource
from m5.stats.gem5stats import get_simstat
from gem5.simulate.simulator import Simulator
from gem5.simulate.exit_event import ExitEvent
# We check for the required gem5 build.
@@ -195,17 +195,28 @@ board.set_kernel_disk_workload(
readfile_contents=command,
)
# We need this for long running processes.
m5.disableAllListeners()
# functions to handle different exit events during the simuation
def handle_workbegin():
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
processor.switch()
yield False
root = Root(full_system=True, system=board)
# sim_quantum must be set if KVM cores are used.
def handle_workend():
print("Dump stats at the end of the ROI!")
m5.stats.dump()
yield True
root.sim_quantum = int(1e9)
board._pre_instantiate()
m5.instantiate()
simulator = Simulator(
board=board,
on_exit_event={
ExitEvent.WORKBEGIN: handle_workbegin(),
ExitEvent.WORKEND: handle_workend(),
},
)
# We maintain the wall clock time.
@@ -214,83 +225,11 @@ globalStart = time.time()
print("Running the simulation")
print("Using KVM cpu")
start_tick = m5.curTick()
end_tick = m5.curTick()
m5.stats.reset()
# We start the simulation
simulator.run()
exit_event = m5.simulate()
# The first exit_event ends with a `workbegin` cause. This means that the
# system booted successfully and the execution on the program started.
if exit_event.getCause() == "workbegin":
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
start_tick = m5.curTick()
# We have completed up to this step using KVM cpu. Now we switch to timing
# cpu for detailed simulation.
processor.switch()
else:
# `workbegin` call was never encountered.
print("Unexpected termination of simulation before ROI was reached!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# The next exit_event is to simulate the ROI. It should be exited with a cause
# marked by `workend`.
exit_event = m5.simulate()
# Reached the end of ROI.
# We dump the stats here.
# We exepect that ROI ends with `workend`. Otherwise the simulation ended
# unexpectedly.
if exit_event.getCause() == "workend":
print("Dump stats at the end of the ROI!")
m5.stats.dump()
end_tick = m5.curTick()
else:
print("Unexpected termination of simulation while ROI was being executed!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# ROI has ended here, and we get `simInsts` using get_simstat and print it in
# the final print statement.
gem5stats = get_simstat(root)
# We get the number of committed instructions from the timing
# cores. We then sum and print them at the end.
roi_insts = float(
gem5stats.to_json()["system"]["processor"]["switch0"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
) + float(
gem5stats.to_json()["system"]["processor"]["switch1"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
)
# Simulation is over at this point. We acknowledge that all the simulation
# events were successful.
print("All simulation events were successful.")
# We print the final simulation statistics.
@@ -299,9 +238,10 @@ print("Done with the simulation")
print()
print("Performance statistics:")
print("Simulated time in ROI: %.2fs" % ((end_tick - start_tick) / 1e12))
print("Instructions executed in ROI: %d" % ((roi_insts)))
print("Ran a total of", m5.curTick() / 1e12, "simulated seconds")
print("Simulated time in ROI: " + ((str(simulator.get_roi_ticks()[0]))))
print(
"Ran a total of", simulator.get_current_tick() / 1e12, "simulated seconds"
)
print(
"Total wallclock time: %.2fs, %.2f min"
% (time.time() - globalStart, (time.time() - globalStart) / 60)

View File

@@ -66,6 +66,8 @@ from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.coherence_protocol import CoherenceProtocol
from gem5.resources.resource import Resource, CustomDiskImageResource
from gem5.simulate.simulator import Simulator
from gem5.simulate.exit_event import ExitEvent
from m5.stats.gem5stats import get_simstat
from m5.util import warn
@@ -265,17 +267,23 @@ board.set_kernel_disk_workload(
readfile_contents=command,
)
# We need this for long running processes.
m5.disableAllListeners()
root = Root(full_system=True, system=board)
def handle_exit():
print("Done bootling Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
yield False # E.g., continue the simulation.
print("Dump stats at the end of the ROI!")
m5.stats.dump()
yield True # Stop the simulation. We're done.
# sim_quantum must be set when KVM cores are used.
root.sim_quantum = int(1e9)
board._pre_instantiate()
m5.instantiate()
simulator = Simulator(
board=board,
on_exit_event={
ExitEvent.EXIT: handle_exit(),
},
)
# We maintain the wall clock time.
@@ -284,92 +292,10 @@ globalStart = time.time()
print("Running the simulation")
print("Using KVM cpu")
start_tick = m5.curTick()
end_tick = m5.curTick()
m5.stats.reset()
exit_event = m5.simulate()
if exit_event.getCause() == "m5_exit instruction encountered":
# We have completed booting the OS using KVM cpu
# Reached the start of ROI
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
start_tick = m5.curTick()
# We switch to timing cpu for detailed simulation.
processor.switch()
else:
# `m5_exit instruction encountered` was never reached
print("Unexpected termination of simulation before ROI was reached!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# Simulate the ROI
exit_event = m5.simulate()
# Reached the end of ROI
gem5stats = get_simstat(root)
# We get the number of committed instructions from the timing
# cores. We then sum and print them at the end.
roi_insts = float(
json.loads(gem5stats.dumps())["system"]["processor"]["cores2"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
) + float(
json.loads(gem5stats.dumps())["system"]["processor"]["cores3"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
)
if exit_event.getCause() == "m5_exit instruction encountered":
print("Dump stats at the end of the ROI!")
m5.stats.dump()
end_tick = m5.curTick()
m5.stats.reset()
else:
# `m5_exit instruction encountered` was never reached
print("Unexpected termination of simulation while ROI was being executed!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# We need to copy back the contents of the `speclogs' directory to
# m5.options.outdir
exit_event = m5.simulate()
if exit_event.getCause() == "m5_exit instruction encountered":
print("Output logs copied!")
else:
print("Unexpected termination of simulation while copying speclogs!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
m5.stats.dump()
end_tick = m5.curTick()
m5.stats.reset()
# We start the simulation
simulator.run()
# Simulation is over at this point. We acknowledge that all the simulation
# events were successful.
@@ -378,9 +304,10 @@ print("All simulation events were successful.")
print("Performance statistics:")
print("Simulated time: %.2fs" % ((end_tick - start_tick) / 1e12))
print("Instructions executed: %d" % ((roi_insts)))
print("Ran a total of", m5.curTick() / 1e12, "simulated seconds")
print("Simulated time: " + ((str(simulator.get_roi_ticks()[0]))))
print(
"Ran a total of", simulator.get_current_tick() / 1e12, "simulated seconds"
)
print(
"Total wallclock time: %.2fs, %.2f min"
% (time.time() - globalStart, (time.time() - globalStart) / 60)

View File

@@ -64,6 +64,8 @@ from gem5.components.processors.cpu_types import CPUTypes
from gem5.isas import ISA
from gem5.coherence_protocol import CoherenceProtocol
from gem5.resources.resource import Resource, CustomDiskImageResource
from gem5.simulate.simulator import Simulator
from gem5.simulate.exit_event import ExitEvent
from m5.stats.gem5stats import get_simstat
from m5.util import warn
@@ -281,17 +283,23 @@ board.set_kernel_disk_workload(
readfile_contents=command,
)
# We need this for long running processes.
m5.disableAllListeners()
root = Root(full_system=True, system=board)
def handle_exit():
print("Done bootling Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
yield False # E.g., continue the simulation.
print("Dump stats at the end of the ROI!")
m5.stats.dump()
yield True # Stop the simulation. We're done.
# sim_quantum must be set when KVM cores are used.
root.sim_quantum = int(1e9)
board._pre_instantiate()
m5.instantiate()
simulator = Simulator(
board=board,
on_exit_event={
ExitEvent.EXIT: handle_exit(),
},
)
# We maintain the wall clock time.
@@ -300,92 +308,21 @@ globalStart = time.time()
print("Running the simulation")
print("Using KVM cpu")
start_tick = m5.curTick()
end_tick = m5.curTick()
m5.stats.reset()
exit_event = m5.simulate()
# We start the simulation
simulator.run()
if exit_event.getCause() == "m5_exit instruction encountered":
# We have completed booting the OS using KVM cpu
# Reached the start of ROI
print("Done booting Linux")
print("Resetting stats at the start of ROI!")
m5.stats.reset()
start_tick = m5.curTick()
# We switch to timing cpu for detailed simulation.
processor.switch()
else:
print("Unexpected termination of simulation before ROI was reached!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# Simulate the ROI
exit_event = m5.simulate()
# Reached the end of ROI
gem5stats = get_simstat(root)
# We get the number of committed instructions from the timing
# cores. We then sum and print them at the end.
roi_insts = float(
json.loads(gem5stats.dumps())["system"]["processor"]["cores2"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
) + float(
json.loads(gem5stats.dumps())["system"]["processor"]["cores3"]["core"][
"exec_context.thread_0"
]["numInsts"]["value"]
)
if exit_event.getCause() == "m5_exit instruction encountered":
print("Dump stats at the end of the ROI!")
m5.stats.dump()
end_tick = m5.curTick()
m5.stats.reset()
else:
print("Unexpected termination of simulation while ROI was being executed!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# We need to copy back the contents of the `speclogs' directory to
# m5.options.outdir
exit_event = m5.simulate()
if exit_event.getCause() == "m5_exit instruction encountered":
print("Output logs copied!")
else:
print("Unexpected termination of simulation while copying speclogs!")
print(
"Exiting @ tick {} because {}.".format(
m5.curTick(), exit_event.getCause()
)
)
exit(-1)
# We print the final simulation statistics.
print("Done with the simulation")
print()
print("Performance statistics:")
print("Simulated time in ROI: %.2fs" % ((end_tick - start_tick) / 1e12))
print("Instructions executed in ROI: %d" % ((roi_insts)))
print("Ran a total of", m5.curTick() / 1e12, "simulated seconds")
print("Simulated time in ROI: " + ((str(simulator.get_roi_ticks()[0]))))
print(
"Ran a total of", simulator.get_current_tick() / 1e12, "simulated seconds"
)
print(
"Total wallclock time: %.2fs, %.2f min"
% (time.time() - globalStart, (time.time() - globalStart) / 60)