def METHOD_NAME(args):
    """
    This function can be called by higher level scripts designed to simulate
    specific devices. As a result the scripts typically hard code some args
    that should not be changed by the user.
    """
    # GPUFS is primarily designed to use the X86 KVM CPU. This model needs to
    # use multiple event queues when more than one CPU is simulated. Force it
    # on if that is the case.
    args.host_parallel = True if args.num_cpus > 1 else False
    # These are used by the protocols. They should not be set by the user.
    n_cu = args.num_compute_units
    args.num_sqc = int(math.ceil(float(n_cu) / args.cu_per_sqc))
    args.num_scalar_cache = int(
        math.ceil(float(n_cu) / args.cu_per_scalar_cache)
    )
    # Verify MMIO trace is valid
    mmio_md5 = hashlib.md5(open(args.gpu_mmio_trace, "rb").read()).hexdigest()
    if mmio_md5 != "c4ff3326ae8a036e329b8b595c83bd6d":
        m5.util.panic("MMIO file does not match gem5 resources")
    system = makeGpuFSSystem(args)
    root = Root(
        full_system=True,
        system=system,
        time_sync_enable=True,
        time_sync_period="1000us",
    )
    if args.host_parallel:
        root.sim_quantum = int(1e8)
    if args.script is not None:
        system.readfile = args.script
    if args.restore_dir is None:
        m5.instantiate()
    else:
        m5.instantiate(args.restore_dir)
    print("Running the simulation")
    sim_ticks = args.abs_max_tick
    exit_event = m5.simulate(sim_ticks)
    # Keep executing while there is something to do
    while True:
        if (
            exit_event.getCause() == "m5_exit instruction encountered"
            or exit_event.getCause() == "user interrupt received"
            or exit_event.getCause() == "simulate() limit reached"
        ):
            break
        elif "checkpoint" in exit_event.getCause():
            assert args.checkpoint_dir is not None
            m5.checkpoint(args.checkpoint_dir)
            break
        else:
            print(
                f"Unknown exit event: {exit_event.getCause()}. Continuing..."
            )
    print(
        "Exiting @ tick %i because %s" % (m5.curTick(), exit_event.getCause())
    )