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