| #!/usr/bin/python |
| # |
| # 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. |
| # |
| |
| import sys |
| # sys.path.insert(1, "./libs") |
| #from utils.perf_analysis import PerfAnalysis |
| #from utils.trace_analysis import TraceAnalysis |
| from perf_analysis import PerfAnalysis |
| from trace import Trace |
| from trace_analysis import TraceAnalysis |
| |
| import os |
| import re |
| import argparse |
| import json |
| |
| # Configure logging |
| import logging |
| reload(logging) |
| logging.basicConfig( |
| format='%(asctime)-9s %(levelname)-8s: %(message)s', |
| level=logging.DEBUG, |
| # level=logging.INFO, |
| datefmt='%I:%M:%S') |
| |
| # Regexp to match the format of a result folder |
| TEST_DIR_RE = re.compile( |
| r'([^:]*):([^:]*):([^:]*)' |
| ) |
| |
| parser = argparse.ArgumentParser( |
| description='EAS Performance and Trace Plotter') |
| parser.add_argument('--results', type=str, |
| default='./results_latest', |
| help='Folder containing experimental results') |
| parser.add_argument('--outdir', type=str, |
| default=None, |
| help='A single output folder we want to produce plots for') |
| parser.add_argument('--tmin', type=float, |
| default=None, |
| help='Minimum timestamp for all plots') |
| parser.add_argument('--tmax', type=float, |
| default=None, |
| help='Maximum timestamp for all plots') |
| parser.add_argument('--plots', type=str, |
| default='all', |
| help='List of plots to produce (all,') |
| |
| args = None |
| |
| def main(): |
| global args |
| args = parser.parse_args() |
| |
| # Setup plots to produce |
| if args.plots == 'all': |
| args.plots = 'tasks clusters cpus stune ediff edspace' |
| |
| # For each rtapp and each run |
| if args.outdir is not None: |
| |
| # Load platform descriptior |
| platform = None |
| plt_file = os.path.join(args.outdir, 'platform.json') |
| if os.path.isfile(plt_file): |
| with open(plt_file, 'r') as ifile: |
| platform = json.load(ifile) |
| logging.info('Platform description:') |
| logging.info(' %s', platform) |
| |
| # Plot the specified results folder |
| return plotdir(args.outdir, platform) |
| |
| for test_idx in sorted(os.listdir(args.results)): |
| |
| match = TEST_DIR_RE.search(test_idx) |
| if match == None: |
| continue |
| wtype = match.group(1) |
| conf_idx = match.group(2) |
| wload_idx = match.group(3) |
| |
| |
| # Generate performance plots only for RTApp workloads |
| if wtype != 'rtapp': |
| continue |
| |
| logging.debug('Processing [%s:%s:%s]...', |
| wtype, conf_idx, wload_idx) |
| |
| # For each run of an rt-app workload |
| test_dir = os.path.join(args.results, test_idx) |
| |
| # Load platform descriptior |
| platform = None |
| plt_file = os.path.join(test_dir, 'platform.json') |
| if os.path.isfile(plt_file): |
| with open(plt_file, 'r') as ifile: |
| platform = json.load(ifile) |
| logging.info('Platform description:') |
| logging.info(' %s', platform) |
| |
| for run_idx in sorted(os.listdir(test_dir)): |
| |
| run_dir = os.path.join(test_dir, run_idx) |
| try: |
| run_id = int(run_idx) |
| except ValueError: |
| continue |
| |
| logging.info('Generate plots for [%s]...', run_dir) |
| plotdir(run_dir, platform) |
| |
| def plotdir(run_dir, platform): |
| global args |
| tasks = None |
| pa = None |
| |
| # Load RTApp performance data |
| try: |
| pa = PerfAnalysis(run_dir) |
| |
| # Get the list of RTApp tasks |
| tasks = pa.tasks() |
| logging.info('Tasks: %s', tasks) |
| except ValueError: |
| pa = None |
| logging.info('No performance data found') |
| |
| # Load Trace Analysis modules |
| trace = Trace(platform, run_dir, tasks) |
| ta = TraceAnalysis(trace, platform, tasks) |
| |
| # Define time ranges for all the temporal plots |
| ta.setXTimeRange(args.tmin, args.tmax) |
| |
| # Tasks plots |
| if 'tasks' in args.plots: |
| ta.plotTasks() |
| if pa: |
| for task in tasks: |
| pa.plotPerf(task) |
| |
| # Cluster and CPUs plots |
| if 'clusters' in args.plots: |
| ta.plotClusterFrequencies() |
| if 'cpus' in args.plots: |
| ta.plotCPU() |
| |
| # SchedTune plots |
| if 'stune' in args.plots: |
| ta.plotSchedTuneConf() |
| if 'ediff' in args.plots: |
| ta.plotEDiffTime(); |
| if 'edspace' in args.plots: |
| ta.plotEDiffSpace(); |
| |
| if __name__ == "__main__": |
| main() |