We are currently implementing GAPS within FS, following the description
provided in 'Enabling Design Space Exploration of DRAM Caches in Emerging
Memory Systems.' We aim to replicate the approach depicted in Figure 3 of
the paper.

           "Beginning at the ROI, we simulate the workload for 100ms to
warm up the system including the DRAM cache. At the end of 100ms, we take a
checkpoint. This process is done once per workload. Later, we restore from
the checkpoint to run all our simulations with different DRAM cache
configurations."



So, the checkpoint extraction was performed as follows, and we have
confirmed the generation of the 'm5.cpt' file.



This is part of the Python code

--------------------------------------------

max_ticks = 10**14

simulator.run(max_ticks=max_ticks)

end_tick = m5.curTick()

# Since we simulated the ROI in details, therefore, simulation is over at
this

# point.



# 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.

print("Done with the simulation")

print("Taking a checkpoint at", args.checkpoint_path)

simulator.save_checkpoint(args.checkpoint_path)

print("Done taking a checkpoint")

--------------------------------------------



*1) I'm curious about how to restore the 'm5.cpt' file. I attempted the
following, but it didn't work.*

*2) If you have an example of using set_kernel_disk_workload while
taking/restoring a checkpoint, could you please share it?*

*3) Is it necessary to use a KVM CPU to extract a checkpoint in FS mode?
Can't it be done on an OOO CPU?*



This is the error log.

--------------------------------------------

build/X86/sim/simulate.cc:192: info: Entering event queue @ 0.  Starting
simulation...

gem5.opt: build/X86/sim/eventq.hh:766: void
gem5::EventQueue::schedule(gem5::Event*, gem5::Tick, bool): Assertion `when
>= getCurTick()' failed.

--------------------------------------------





This is the Python code.

--------------------------------------------

#./build/X86/gem5.opt configs/example/gem5_library/x86-gabps-benchmarks.py
--benchmark bc --synthetic 1 --size 4

import argparse

import time

import sys



import m5

from m5.objects import Root



from gem5.utils.requires import requires

from gem5.components.boards.x86_board import X86Board

from gem5.components.memory import DualChannelDDR4_2400

from gem5.components.processors.simple_switchable_processor import (

    SimpleSwitchableProcessor,

)

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,
CustomResource

from gem5.simulate.simulator import Simulator

from gem5.simulate.exit_event import ExitEvent



requires(

    isa_required=ISA.X86,

    coherence_protocol_required=CoherenceProtocol.MESI_TWO_LEVEL,

    kvm_required=True,

)





benchmark_choices = ["cc", "bc", "tc", "pr", "bfs"]



synthetic_choices = ["0", "1"]



size_choices = [

    "1",

    "2",

    "3",

    "4",

    "5",

    "6",

    "7",

    "8",

    "9",

    "10",

    "11",

    "12",

    "13",

    "14",

    "15",

    "16",

    "USA-road-d.NY.gr",

]



parser = argparse.ArgumentParser(

    description="An example configuration script to run the gapbs
benchmarks."

)





parser.add_argument(

    "--benchmark",

    type=str,

    required=True,

    help="Input the benchmark program to execute.",

    choices=benchmark_choices,

)



parser.add_argument(

    "--synthetic",

    type=str,

    required=True,

    help="Synthetic Graph:: 1: synthetic graph is True; 0: real graph",

    choices=synthetic_choices,

)



parser.add_argument(

    "--size",

    type=str,

    required=True,

    help="Graph Size:: If synthetic is True, then specify a size [1 .. 15].
\

    Otherwise, specify a graph name [USA-road-d.NY.gr]",

    choices=size_choices,

)



parser.add_argument(

    "--ticks",

    type=int,

    help="Optionally put the maximum number of ticks to execute during the "

    "ROI. It accepts an integer value.",

)



parser.add_argument(

    "--checkpoint-path",

    type=str,

    required=False,

    default="riscv-hello-checkpoint/",

    help="The directory to store the checkpoint.",

)



args = parser.parse_args()





from gem5.components.cachehierarchies.ruby.mesi_two_level_cache_hierarchy
import (

    MESITwoLevelCacheHierarchy,

)



cache_hierarchy = MESITwoLevelCacheHierarchy(

    l1d_size="32kB",

    l1d_assoc=8,

    l1i_size="32kB",

    l1i_assoc=8,

    l2_size="256kB",

    l2_assoc=16,

    num_l2_banks=2,

)



memory = DualChannelDDR4_2400(size="3GB")





processor = SimpleSwitchableProcessor(

    starting_core_type=CPUTypes.KVM,

    switch_core_type=CPUTypes.TIMING,

    isa=ISA.X86,

    num_cores=2,

)



# Here we setup the board. The X86Board allows for Full-System X86
simulations



board = X86Board(

    clk_freq="3GHz",

    processor=processor,

    memory=memory,

    cache_hierarchy=cache_hierarchy,

)





if args.synthetic == "1":

    if args.size == "USA-road-d.NY.gr":

        print(

            "fatal: cannot use a real graph with --synthetic 1",

            file=sys.stderr,

        )

        exit(-1)



    command = "./{} -n 1 -u {}\n".format(args.benchmark, args.size)

else:

    command = "./{} -sf ../{}".format(args.benchmark, args.size)



board.set_kernel_disk_workload(

    # The x86 linux kernel will be automatically downloaded to the

    # `~/.cache/gem5` directory if not already present.

    # gapbs benchamarks was tested with kernel version 4.19.83

    kernel=Resource("x86-linux-kernel-4.19.83"),

    # The x86-gapbs image will be automatically downloaded to the

    # `~/.cache/gem5` directory if not already present.

    disk_image=Resource("x86-gapbs"),

    readfile_contents=command,

    checkpoint=CustomResource("/home/test/riscv-hello-checkpoint"),

)





def handle_workbegin():

    print("Done booting Linux")

    print("Resetting stats at the start of ROI!")

    m5.stats.reset()

    global start_tick

    start_tick = m5.curTick()

    # processor.switch()

    # if args.ticks:

    #     m5.scheduleTickExitFromCurrent(args.ticks)

    yield False  # E.g., continue the simulation.





def handle_workend():

    print("Dump stats at the end of the ROI!")

    m5.stats.dump()

    yield True  # Stop the simulation. We're done.





simulator = Simulator(

    board=board,

)



# We maintain the wall clock time.



globalStart = time.time()



print("Running the simulation")

print("Using KVM cpu")





simulator.run()

end_tick = m5.curTick()



print("All simulation events were successful.")



# We print the final simulation statistics.

print("Done with the simulation")

print("Taking a checkpoint at", args.checkpoint_path)

simulator.save_checkpoint(args.checkpoint_path)

print("Done taking a checkpoint")

print()

print("Performance statistics:")



print("Simulated time in ROI: %.2fs" % ((end_tick - start_tick) / 1e12))

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)

)

--------------------------------------------
_______________________________________________
gem5-users mailing list -- gem5-users@gem5.org
To unsubscribe send an email to gem5-users-le...@gem5.org

Reply via email to