#!/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 perf_analysis import PerfAnalysis from trace import Trace 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) # Define time ranges for all the temporal plots trace.setXTimeRange(args.tmin, args.tmax) # Tasks plots if 'tasks' in args.plots: trace.analysis.tasks.plotTasks(tasks) if pa: for task in tasks: pa.plotPerf(task) # Cluster and CPUs plots if 'clusters' in args.plots: trace.analysis.frequency.plotClusterFrequencies() if 'cpus' in args.plots: trace.analysis.cpus.plotCPU() # SchedTune plots if 'stune' in args.plots: trace.analysis.eas.plotSchedTuneConf() if 'ediff' in args.plots: trace.analysis.eas.plotEDiffTime(); if 'edspace' in args.plots: trace.analysis.eas.plotEDiffSpace(); if __name__ == "__main__": main()