report.py revision 909185f2974e895696b155de92b168b84ea05266
10f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#!/usr/bin/python 20f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 30f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport argparse 40f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport fnmatch as fnm 50f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport json 60f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport math 70f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport numpy as np 80f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport os 90f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport re 100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport sys 110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom collections import defaultdict 130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasifrom colors import TestColors 14909185f2974e895696b155de92b168b84ea05266Patrick Bellasifrom results import Results 150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# Configure logging 170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport logging 180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasireload(logging) 190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasilogging.basicConfig( 200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi format='%(asctime)-9s %(levelname)-8s: %(message)s', 210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # level=logging.DEBUG, 220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi level=logging.INFO, 230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi datefmt='%I:%M:%S') 240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# By default compare all the possible combinations 260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiDEFAULT_COMPARE = [(r'.*', r'.*')] 270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2897f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasiclass Report(object): 290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi def __init__(self, results_dir, compare=None, numbers=False): 3297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results_json = results_dir + '/results.json' 3397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results = {} 3497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 3597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.compare = [] 3697f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 3797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Parse results (if required) 3897f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi if not os.path.isfile(self.results_json): 3997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi Results(results_dir) 4097f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 4197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Load results from file (if already parsed) 4297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi logging.info('%14s - Load results from [%s]...', 4397f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 'Results', self.results_json) 4497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi with open(self.results_json) as infile: 4597f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi self.results = json.load(infile) 460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Setup configuration comparisons 480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if compare is None: 490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi compare = DEFAULT_COMPARE 500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.warning('%14s - Comparing all the possible combination', 510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Results') 520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in compare: 530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi base_rexp = re.compile(base_rexp, re.DOTALL) 540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi test_rexp = re.compile(test_rexp, re.DOTALL) 550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.compare.append((base_rexp, test_rexp)) 560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 57cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi # Report all supported workload classes 58cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi self.__rtapp_report(numbers) 59cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 60cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi ############################### REPORT RTAPP ############################### 61cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 62cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi def __rtapp_report(self, numbers): 63cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 64cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi if 'rtapp' not in self.results.keys(): 65cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi logging.debug('%14s - No RTApp workloads to report', 'ReportRTApp') 66cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi return 67cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 68cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi logging.debug('%14s - Reporting RTApp workloads', 'ReportRTApp') 69cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi 70cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi # Setup lables depending on requested report 710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Absolute)' 730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Absolute)' 740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('') 750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Absolute comparisions:', 'Report') 760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Relative)' 790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Relative)' 800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('') 810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Relative comparisions:', 'Report') 820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 8497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi # Dump headers 850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '{:9s} {:15s} |'\ 860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:33s} | {:54s} |'\ 870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('Test Id', 'Comparision', 880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable, prf_lable) 890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '{:9s} {:15s} |'\ 900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} |'\ 910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\ 920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('', '', 930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'LITTLE', 'big', 'Total', 940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'PerfIndex', 'NegSlacks', 'EDP1', 'EDP2', 'EDP3') 950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each test 9797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi _results = self.results['rtapp'] 9897f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi for tid in sorted(_results.keys()): 990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = True 1000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each configuration... 10197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi for i, base_idx in enumerate(sorted(_results[tid].keys())): 1020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Which matches at least on base regexp 1030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in self.compare: 1040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not base_rexp.match(base_idx): 1050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Look for a configuration which matches the test regexp 10797f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi for test_idx in sorted(_results[tid].keys())[i+1:]: 1080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if test_idx == base_idx: 1090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if new_test: 11197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi print '{:-<28s}+{:-<35s}+{:-<56s}+'\ 11297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi .format('','', '') 1130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = False 1140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not test_rexp.match(test_idx): 1150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 116cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi self.__rtapp_compare(tid, base_idx, test_idx, numbers) 1170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 1190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 120cc2343c456bfabf56a06f2c93b07df2802913b7bPatrick Bellasi def __rtapp_compare(self, tid, base_idx, test_idx, numbers): 12197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi _results = self.results['rtapp'] 12297f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi 1230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('Test %s: compare %s with %s', 1240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi tid, base_idx, test_idx) 1250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_comp = '{0:s} vs {1:s}'.format(test_idx, base_idx) 1260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line = '{0:8s}: {1:15s} | '.format(tid, res_comp) 1270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Dump all energy metrics 1290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for cpus in ['LITTLE', 'big', 'Total']: 13097f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_base = _results[tid][base_idx]['energy'][cpus]['avg'] 13197f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_test = _results[tid][test_idx]['energy'][cpus]['avg'] 1320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_test - res_base 1330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 1340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 1350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 1370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:s}'\ 1380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format(TestColors.rate( 1390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct, 1400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi positive_is_good = False)) 1410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 1420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # If available, dump also performance results 14497f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi if 'performance' not in _results[tid][base_idx].keys(): 1450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 1460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return 1470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']: 14997f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_base = _results[tid][base_idx]['performance'][pidx]['avg'] 15097f727443b83ef54e3bcdcd167e76cc4e0a59ad1Patrick Bellasi res_test = _results[tid][test_idx]['performance'][pidx]['avg'] 1510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('idx: %s, base: %s, test: %s', 1530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi pidx, res_base, res_test) 1540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute difference base-vs-test 1560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = 0 1570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if res_base != 0: 1580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if pidx in ['perf_avg']: 1590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_test - res_base 1600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_base - res_test 1620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute speedup if required 1640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 0 1650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 1660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if 'edp' in pidx: 1670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2e}'.format(speedup_cnt) 1680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 1700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if res_base != 0: 1720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if pidx in ['perf_avg']: 1730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # speedup_pct = 100.0 * speedup_cnt / res_base 1740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = speedup_cnt 1750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 1770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(speedup_pct)) 1780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 1790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 1800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#vim :set tabstop=4 shiftwidth=4 expandtab 182