# SPDX-License-Identifier: Apache-2.0
#
# Copyright (C) 2015, ARM Limited and contributors.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
""" Functions Analysis Module """
from trappy.utils import listify
from analysis_module import AnalysisModule
class FunctionsAnalysis(AnalysisModule):
"""
Support for kernel functions profiling and analysis
:param trace: input Trace object
:type trace: :mod:`libs.utils.Trace`
"""
def __init__(self, trace):
super(FunctionsAnalysis, self).__init__(trace)
def plotProfilingStats(self, functions=None, metrics='avg'):
"""
Plot functions profiling metrics for the specified kernel functions.
For each speficied metric a barplot is generated which report the value
of the metric when the kernel function has been executed on each CPU.
By default all the kernel functions are plotted.
:param functions: the name of list of name of kernel functions to plot
:type functions: str or list(str)
:param metrics: the metrics to plot
avg - average execution time
time - total execution time
:type metrics: srt or list(str)
"""
if not hasattr(self._trace, '_functions_stats_df'):
self._log.warning('Functions stats data not available')
return
metrics = listify(metrics)
df = self._trace.data_frame.functions_stats(functions)
# Check that all the required metrics are acutally availabe
available_metrics = df.columns.tolist()
if not set(metrics).issubset(set(available_metrics)):
msg = 'Metrics {} not supported, available metrics are {}'\
.format(set(metrics) - set(available_metrics),
available_metrics)
raise ValueError(msg)
for metric in metrics:
if metric.upper() == 'AVG':
title = 'Average Completion Time per CPUs'
ylabel = 'Completion Time [us]'
if metric.upper() == 'TIME':
title = 'Total Execution Time per CPUs'
ylabel = 'Execution Time [us]'
data = df[metric.lower()].unstack()
axes = data.plot(kind='bar',
figsize=(16, 8), legend=True,
title=title, table=True)
axes.set_ylabel(ylabel)
axes.get_xaxis().set_visible(False)
# vim :set tabstop=4 shiftwidth=4 expandtab