1d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# SPDX-License-Identifier: Apache-2.0 2d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# 3d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Copyright (C) 2015, ARM Limited and contributors. 4d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# 5d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Licensed under the Apache License, Version 2.0 (the "License"); you may 6d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# not use this file except in compliance with the License. 7d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# You may obtain a copy of the License at 8d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# 9d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# http://www.apache.org/licenses/LICENSE-2.0 10d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# 11d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# Unless required by applicable law or agreed to in writing, software 12d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT 13d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# See the License for the specific language governing permissions and 15d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# limitations under the License. 16d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi# 17d95e98d88a6cf4347853427dc4ef6fd0222a3881Patrick Bellasi 180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport argparse 200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport fnmatch as fnm 210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport json 220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport math 230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport numpy as np 240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport os 250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport re 260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport sys 27c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasiimport logging 280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom collections import defaultdict 300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom colors import TestColors 31909185f2974e895696b155de92b168b84ea05266Patrick Bellasifrom results import Results 320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# By default compare all the possible combinations 35e3bebfc47781208a03169507b5bae5f22621579bPatrick BellasiDEFAULT_COMPARE = [(r'base_', r'test_')] 360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasiclass Report(object): 380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 40a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi def __init__(self, results_dir, compare=None, formats=['relative']): 4197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results_json = results_dir + '/results.json' 4297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results = {} 4397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 4497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.compare = [] 4597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 46c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi # Setup logging 47c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log = logging.getLogger('Report') 48c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi 4997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Parse results (if required) 5097f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi if not os.path.isfile(self.results_json): 5197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi Results(results_dir) 5297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 5397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Load results from file (if already parsed) 54c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Load results from [%s]...', 55c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self.results_json) 5697f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi with open(self.results_json) as infile: 5797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results = json.load(infile) 580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Setup configuration comparisons 600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if compare is None: 610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi compare = DEFAULT_COMPARE 62c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.warning('Comparing all the possible combination') 630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in compare: 64c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Configured regexps for comparisions ' 65c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi '(bases , tests): (%s, %s)', 66c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi base_rexp, test_rexp) 670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi base_rexp = re.compile(base_rexp, re.DOTALL) 680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi test_rexp = re.compile(test_rexp, re.DOTALL) 690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.compare.append((base_rexp, test_rexp)) 700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 71cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi # Report all supported workload classes 7221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi self.__rtapp_report(formats) 7321756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi self.__default_report(formats) 74cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 75cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi ############################### REPORT RTAPP ############################### 76cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 7721756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi def __rtapp_report(self, formats): 78cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 79cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi if 'rtapp' not in self.results.keys(): 80c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('No RTApp workloads to report') 81cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi return 82cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 83c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('Reporting RTApp workloads') 84cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 85cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi # Setup lables depending on requested report 8621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi if 'absolute' in formats: 870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Absolute)' 880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Absolute)' 89c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('') 90c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Absolute comparisions:') 910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Relative)' 940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Relative)' 95c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('') 96c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Relative comparisions:') 970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 9997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Dump headers 1004453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi print '{:13s} {:20s} |'\ 1010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:33s} | {:54s} |'\ 1020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('Test Id', 'Comparision', 1030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable, prf_lable) 1044453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi print '{:13s} {:20s} |'\ 1050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} |'\ 1060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\ 1070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('', '', 1080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'LITTLE', 'big', 'Total', 1090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'PerfIndex', 'NegSlacks', 'EDP1', 'EDP2', 'EDP3') 1100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each test 11297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi _results = self.results['rtapp'] 11397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi for tid in sorted(_results.keys()): 1140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = True 1150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each configuration... 116e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi for base_idx in sorted(_results[tid].keys()): 1170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Which matches at least on base regexp 1180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in self.compare: 1190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not base_rexp.match(base_idx): 1200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Look for a configuration which matches the test regexp 122e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi for test_idx in sorted(_results[tid].keys()): 1230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if test_idx == base_idx: 1240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if new_test: 1264453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi print '{:-<37s}+{:-<35s}+{:-<56s}+'\ 12797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi .format('','', '') 128a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi self.__rtapp_reference(tid, base_idx) 1290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = False 130e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi if test_rexp.match(test_idx) == None: 1310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 13221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi self.__rtapp_compare(tid, base_idx, test_idx, formats) 1330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 1350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 136a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi def __rtapp_reference(self, tid, base_idx): 137a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi _results = self.results['rtapp'] 138a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 139c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('Test %s: compare against [%s] base', 140c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi tid, base_idx) 1414453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi res_line = '{0:12s}: {1:22s} | '.format(tid, base_idx) 142a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 143a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi # Dump all energy metrics 144a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi for cpus in ['LITTLE', 'big', 'Total']: 145a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_base = _results[tid][base_idx]['energy'][cpus]['avg'] 146a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi # Dump absolute values 147a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_line += ' {0:10.3f}'.format(res_base) 148a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_line += ' |' 149a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 150a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi # If available, dump also performance results 151a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi if 'performance' not in _results[tid][base_idx].keys(): 152a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi print res_line 153a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi return 154a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 155a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']: 156a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_base = _results[tid][base_idx]['performance'][pidx]['avg'] 157a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 158c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('idx: %s, base: %s', pidx, res_base) 159a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 1608720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if pidx in ['perf_avg']: 1618720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(res_base)) 1628720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi continue 1638720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if pidx in ['slack_pct']: 1648720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi res_line += ' {0:s}'.format( 1658720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi TestColors.rate(res_base, positive_is_good = False)) 1668720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi continue 167a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi if 'edp' in pidx: 168a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_line += ' {0:10.2e}'.format(res_base) 1698720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi continue 170a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi res_line += ' |' 171a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi print res_line 172a0c6af17b243d7e84a68449eb497fd91d59f1e6fPatrick Bellasi 17321756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi def __rtapp_compare(self, tid, base_idx, test_idx, formats): 17497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi _results = self.results['rtapp'] 17597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 176c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('Test %s: compare %s with %s', 177c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi tid, base_idx, test_idx) 1784453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi res_line = '{0:12s}: {1:20s} | '.format(tid, test_idx) 1790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Dump all energy metrics 1810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for cpus in ['LITTLE', 'big', 'Total']: 18297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_base = _results[tid][base_idx]['energy'][cpus]['avg'] 18397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_test = _results[tid][test_idx]['energy'][cpus]['avg'] 1840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_test - res_base 18521756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi if 'absolute' in formats: 1860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 1870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 188e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi speedup_pct = 0 189e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi if res_base != 0: 190e85295e802a078b114839dd7612c16b86cc7df01Patrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 1910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:s}'\ 1920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format(TestColors.rate( 1930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct, 1940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi positive_is_good = False)) 1950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 1960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # If available, dump also performance results 19897f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi if 'performance' not in _results[tid][base_idx].keys(): 1990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 2000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return 2010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']: 20397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_base = _results[tid][base_idx]['performance'][pidx]['avg'] 20497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_test = _results[tid][test_idx]['performance'][pidx]['avg'] 2050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 206c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('idx: %s, base: %s, test: %s', 207c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi pidx, res_base, res_test) 2080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2098720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if pidx in ['perf_avg']: 2108720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(res_test)) 2118720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi continue 2128720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi 2138720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if pidx in ['slack_pct']: 2148720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi res_line += ' {0:s}'.format( 2158720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi TestColors.rate(res_test, positive_is_good = False)) 2168720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi continue 2170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2188720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi # Compute difference base-vs-test 2198720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if 'edp' in pidx: 2208720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi speedup_cnt = res_base - res_test 2218720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi if 'absolute': 2220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2e}'.format(speedup_cnt) 2230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 2248720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(speedup_pct)) 2258720abc26202a8f25dce60d4bdefed5dfeb76b4fPatrick Bellasi 2260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 2270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 2280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 229f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi ############################### REPORT DEFAULT ############################# 230f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 23121756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi def __default_report(self, formats): 232f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 233f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Build list of workload types which can be rendered using the default parser 234f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi wtypes = [] 235f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for supported_wtype in DEFAULT_WTYPES: 236f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if supported_wtype in self.results.keys(): 237f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi wtypes.append(supported_wtype) 238f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 239f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if len(wtypes) == 0: 240c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('No Default workloads to report') 241f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi return 242f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 243c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('Reporting Default workloads') 244f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 245f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Setup lables depending on requested report 24621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi if 'absolute' in formats: 247f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi nrg_lable = 'Energy Indexes (Absolute)' 248f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi prf_lable = 'Performance Indexes (Absolute)' 249c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('') 250c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Absolute comparisions:') 251f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi print '' 252f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 253f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi nrg_lable = 'Energy Indexes (Relative)' 254f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi prf_lable = 'Performance Indexes (Relative)' 255c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('') 256c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.info('Relative comparisions:') 257f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi print '' 258f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 259f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Dump headers 260faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi print '{:9s} {:20s} |'\ 261f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi ' {:33s} | {:54s} |'\ 262f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi .format('Test Id', 'Comparision', 263f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi nrg_lable, prf_lable) 264faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi print '{:9s} {:20s} |'\ 265f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi ' {:>10s} {:>10s} {:>10s} |'\ 266f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\ 267f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi .format('', '', 268f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 'LITTLE', 'big', 'Total', 269f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 'Perf', 'CTime', 'EDP1', 'EDP2', 'EDP3') 270f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 271f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # For each default test 272f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for wtype in wtypes: 273f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi _results = self.results[wtype] 274f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for tid in sorted(_results.keys()): 275f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi new_test = True 276f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # For each configuration... 277e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi for base_idx in sorted(_results[tid].keys()): 278f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Which matches at least on base regexp 279f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for (base_rexp, test_rexp) in self.compare: 280f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if not base_rexp.match(base_idx): 281f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi continue 282f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Look for a configuration which matches the test regexp 283e3bebfc47781208a03169507b5bae5f22621579bPatrick Bellasi for test_idx in sorted(_results[tid].keys()): 284f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if test_idx == base_idx: 285f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi continue 286f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if new_test: 2874453a39ca52499a0c59df2d82e800bf9465a5f27Patrick Bellasi print '{:-<37s}+{:-<35s}+{:-<56s}+'\ 288f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi .format('','', '') 289f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi new_test = False 290f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if not test_rexp.match(test_idx): 291f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi continue 29221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi self.__default_compare(wtype, tid, base_idx, test_idx, formats) 293f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 294f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi print '' 295f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 29621756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi def __default_compare(self, wtype, tid, base_idx, test_idx, formats): 297f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi _results = self.results[wtype] 298f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 299c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('Test %s: compare %s with %s', 300c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi tid, base_idx, test_idx) 301f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_comp = '{0:s} vs {1:s}'.format(test_idx, base_idx) 302faf58b49b3246516c719d3bfdb000e22e4c6a431Patrick Bellasi res_line = '{0:8s}: {1:22s} | '.format(tid, res_comp) 303f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 304f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Dump all energy metrics 305f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for cpus in ['LITTLE', 'big', 'Total']: 306f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 307f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # If either base of test have a 0 MAX energy, this measn that 308f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # energy has not been collected 309f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi base_max = _results[tid][base_idx]['energy'][cpus]['max'] 310f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi test_max = _results[tid][test_idx]['energy'][cpus]['max'] 311f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if base_max == 0 or test_max == 0: 312f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:10s}'.format('NA') 313f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi continue 314f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 315f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Otherwise, report energy values 316f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_base = _results[tid][base_idx]['energy'][cpus]['avg'] 317f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_test = _results[tid][test_idx]['energy'][cpus]['avg'] 318f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 319f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_cnt = res_test - res_base 32021756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi if 'absolute' in formats: 321f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 322f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 323f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 324f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:s}'\ 325f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi .format(TestColors.rate( 326f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_pct, 327f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi positive_is_good = False)) 328f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' |' 329f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 330f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # If available, dump also performance results 331f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if 'performance' not in _results[tid][base_idx].keys(): 332f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi print res_line 333f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi return 334f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 335f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi for pidx in ['perf_avg', 'ctime_avg', 'edp1', 'edp2', 'edp3']: 336f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_base = _results[tid][base_idx]['performance'][pidx]['avg'] 337f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_test = _results[tid][test_idx]['performance'][pidx]['avg'] 338f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 339c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi self._log.debug('idx: %s, base: %s, test: %s', 340c278c2343c7f25083a80cb164b6bdc761d50050bPatrick Bellasi pidx, res_base, res_test) 341f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 342f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Compute difference base-vs-test 343f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_cnt = 0 344f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if res_base != 0: 345f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if pidx in ['perf_avg']: 346f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_cnt = res_test - res_base 347f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 348f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_cnt = res_base - res_test 349f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 350f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # Compute speedup if required 351f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_pct = 0 35221756b552403589da5720eb04b85c9bfee83fd22Patrick Bellasi if 'absolute' in formats: 353f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if 'edp' in pidx: 354f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:10.2e}'.format(speedup_cnt) 355f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 356f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 357f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 358f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if res_base != 0: 359f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi if pidx in ['perf_avg']: 360f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi # speedup_pct = 100.0 * speedup_cnt / res_base 361f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_pct = speedup_cnt 362f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi else: 363f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 364f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(speedup_pct)) 365f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi res_line += ' |' 366f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi print res_line 367f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 368f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi# List of workload types which can be parsed using the default test parser 369f97104f5c525f13f8375625062b0b7311a516d59Patrick BellasiDEFAULT_WTYPES = ['perf_bench_messaging', 'perf_bench_pipe'] 370f97104f5c525f13f8375625062b0b7311a516d59Patrick Bellasi 3710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#vim :set tabstop=4 shiftwidth=4 expandtab 372