mirror of
https://github.com/ARM-software/workload-automation.git
synced 2025-04-15 15:20:45 +01:00
Merge pull request #418 from setrofim/master
cpustates: workaround for disabled cpuidle
This commit is contained in:
commit
0c0ccb10d9
@ -122,6 +122,20 @@ class CpuStatesProcessor(ResultProcessor):
|
|||||||
:`error`: An error will be raised if the start marker is not found in the trace.
|
:`error`: An error will be raised if the start marker is not found in the trace.
|
||||||
:`try`: If the start marker is not found, all events in the trace will be used.
|
:`try`: If the start marker is not found, all events in the trace will be used.
|
||||||
""")
|
""")
|
||||||
|
Parameter('no_idle', kind=bool, default=False,
|
||||||
|
description="""
|
||||||
|
Indicate that there will be no idle transitions in the trace. By default, a core
|
||||||
|
will be reported as being in an "unknown" state until the first idle transtion for
|
||||||
|
that core. Normally, this is not an issue, as cores are "nudged" as part of the setup
|
||||||
|
to ensure that there is an idle transtion before the meassured region. However, if all
|
||||||
|
idle states for the core have been disabled, or if the kernel does not have cpuidle,
|
||||||
|
the nudge will not result in an idle transition, which would cause the cores to be
|
||||||
|
reported to be in "unknown" state for the entire execution.
|
||||||
|
|
||||||
|
If this parameter is set to ``True``, the processor will assuming that cores are
|
||||||
|
running prior to the begining of the issue, and they will leave unknown state on
|
||||||
|
the first frequency transition.
|
||||||
|
"""),
|
||||||
]
|
]
|
||||||
|
|
||||||
def validate(self):
|
def validate(self):
|
||||||
@ -215,6 +229,7 @@ class CpuStatesProcessor(ResultProcessor):
|
|||||||
cpu_utilisation=cpu_utilisation,
|
cpu_utilisation=cpu_utilisation,
|
||||||
max_freq_list=self.max_freq_list,
|
max_freq_list=self.max_freq_list,
|
||||||
start_marker_handling=self.start_marker_handling,
|
start_marker_handling=self.start_marker_handling,
|
||||||
|
no_idle=self.no_idle,
|
||||||
)
|
)
|
||||||
parallel_report = reports.pop(0)
|
parallel_report = reports.pop(0)
|
||||||
powerstate_report = reports.pop(0)
|
powerstate_report = reports.pop(0)
|
||||||
|
@ -113,11 +113,12 @@ class SystemPowerState(object):
|
|||||||
def num_cores(self):
|
def num_cores(self):
|
||||||
return len(self.cpus)
|
return len(self.cpus)
|
||||||
|
|
||||||
def __init__(self, num_cores):
|
def __init__(self, num_cores, no_idle=False):
|
||||||
self.timestamp = None
|
self.timestamp = None
|
||||||
self.cpus = []
|
self.cpus = []
|
||||||
|
idle_state = -1 if no_idle else None
|
||||||
for _ in xrange(num_cores):
|
for _ in xrange(num_cores):
|
||||||
self.cpus.append(CpuPowerState())
|
self.cpus.append(CpuPowerState(idle_state=idle_state))
|
||||||
|
|
||||||
def copy(self):
|
def copy(self):
|
||||||
new = SystemPowerState(self.num_cores)
|
new = SystemPowerState(self.num_cores)
|
||||||
@ -154,8 +155,8 @@ class PowerStateProcessor(object):
|
|||||||
|
|
||||||
def __init__(self, core_clusters, num_idle_states,
|
def __init__(self, core_clusters, num_idle_states,
|
||||||
first_cluster_state=sys.maxint, first_system_state=sys.maxint,
|
first_cluster_state=sys.maxint, first_system_state=sys.maxint,
|
||||||
wait_for_start_marker=False):
|
wait_for_start_marker=False, no_idle=False):
|
||||||
self.power_state = SystemPowerState(len(core_clusters))
|
self.power_state = SystemPowerState(len(core_clusters), no_idle=no_idle)
|
||||||
self.requested_states = {} # cpu_id -> requeseted state
|
self.requested_states = {} # cpu_id -> requeseted state
|
||||||
self.wait_for_start_marker = wait_for_start_marker
|
self.wait_for_start_marker = wait_for_start_marker
|
||||||
self._saw_start_marker = False
|
self._saw_start_marker = False
|
||||||
@ -650,7 +651,7 @@ def report_power_stats(trace_file, idle_state_names, core_names, core_clusters,
|
|||||||
first_system_state=sys.maxint, use_ratios=False,
|
first_system_state=sys.maxint, use_ratios=False,
|
||||||
timeline_csv_file=None, cpu_utilisation=None,
|
timeline_csv_file=None, cpu_utilisation=None,
|
||||||
max_freq_list=None, start_marker_handling='error',
|
max_freq_list=None, start_marker_handling='error',
|
||||||
transitions_csv_file=None):
|
transitions_csv_file=None, no_idle=False):
|
||||||
# pylint: disable=too-many-locals,too-many-branches
|
# pylint: disable=too-many-locals,too-many-branches
|
||||||
trace = TraceCmdTrace(trace_file,
|
trace = TraceCmdTrace(trace_file,
|
||||||
filter_markers=False,
|
filter_markers=False,
|
||||||
@ -671,7 +672,8 @@ def report_power_stats(trace_file, idle_state_names, core_names, core_clusters,
|
|||||||
num_idle_states=num_idle_states,
|
num_idle_states=num_idle_states,
|
||||||
first_cluster_state=first_cluster_state,
|
first_cluster_state=first_cluster_state,
|
||||||
first_system_state=first_system_state,
|
first_system_state=first_system_state,
|
||||||
wait_for_start_marker=wait_for_start_marker)
|
wait_for_start_marker=wait_for_start_marker,
|
||||||
|
no_idle=no_idle)
|
||||||
reporters = [
|
reporters = [
|
||||||
ParallelStats(core_clusters, use_ratios),
|
ParallelStats(core_clusters, use_ratios),
|
||||||
PowerStateStats(core_names, idle_state_names, use_ratios)
|
PowerStateStats(core_names, idle_state_names, use_ratios)
|
||||||
@ -731,6 +733,7 @@ def main():
|
|||||||
max_freq_list=args.max_freq_list,
|
max_freq_list=args.max_freq_list,
|
||||||
start_marker_handling=args.start_marker_handling,
|
start_marker_handling=args.start_marker_handling,
|
||||||
transitions_csv_file=args.transitions_file,
|
transitions_csv_file=args.transitions_file,
|
||||||
|
no_idle=args.no_idle,
|
||||||
)
|
)
|
||||||
|
|
||||||
parallel_report = reports.pop(0)
|
parallel_report = reports.pop(0)
|
||||||
@ -833,6 +836,13 @@ def parse_arguments(): # NOQA
|
|||||||
error: An error will be raised if the start marker is not found in the trace.
|
error: An error will be raised if the start marker is not found in the trace.
|
||||||
try: If the start marker is not found, all events in the trace will be used.
|
try: If the start marker is not found, all events in the trace will be used.
|
||||||
''')
|
''')
|
||||||
|
parser.add_argument('-N', '--no-idle', action='store_true',
|
||||||
|
help='''
|
||||||
|
Assume that cpuidle is not present or disabled on the system, and therefore that the
|
||||||
|
initial state of the cores is that they are running. This flag is necessary because
|
||||||
|
the processor assumes the cores are in an unknown state until it sees the first idle
|
||||||
|
transition, which will never come if cpuidle is absent.
|
||||||
|
''')
|
||||||
|
|
||||||
args = parser.parse_args()
|
args = parser.parse_args()
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user