report.py revision 0f8ac68fcd4e514ae6ee32a6496bd239fb9c03a
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 140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# Configure logging 160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiimport logging 170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasireload(logging) 180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasilogging.basicConfig( 190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi format='%(asctime)-9s %(levelname)-8s: %(message)s', 200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # level=logging.DEBUG, 210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi level=logging.INFO, 220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi datefmt='%I:%M:%S') 230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# By default compare all the possible combinations 250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiDEFAULT_COMPARE = [(r'.*', r'.*')] 260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Results(object): 280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, results_dir, verbose=False): 300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.results_dir = results_dir 320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.verbose = verbose 330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.results = {} 350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.results_json = results_dir + '/results.json' 360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.verbose = verbose 370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.compare = [] 390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Load results from file (if already parsed) 410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if os.path.isfile(self.results_json): 420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Load results from [%s]...', 430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Results', self.results_json) 440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi with open(self.results_json) as infile: 450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.results = json.load(infile) 460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return 470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Parse results folder 490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.parse() 500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ############################################################################ 520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Results Parsing 530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ############################################################################ 540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def parse(self): 570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.base_wls = defaultdict(list) 590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.test_wls = defaultdict(list) 600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Loading energy/perf data...', 'Parser') 620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for test_idx in sorted(os.listdir(self.results_dir)): 640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi test_dir = self.results_dir + '/' + test_idx 660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not os.path.isdir(test_dir): 670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi Test(test_idx, test_dir, self.results) 700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi results_json = self.results_dir + '/results.json' 720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Dump perf results on JSON file [%s]...', 730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Parser', results_json) 740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi with open(results_json, 'w') as outfile: 750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi json.dump(self.results, outfile, indent=4, sort_keys=True) 760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ############################################################################ 790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Results Reporting 800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ############################################################################ 810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def report(self, compare=None, numbers=False): 830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Setup configuration comparisons 850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if compare is None: 860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi compare = DEFAULT_COMPARE 870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.warning('%14s - Comparing all the possible combination', 880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Results') 890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in compare: 900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi base_rexp = re.compile(base_rexp, re.DOTALL) 910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi test_rexp = re.compile(test_rexp, re.DOTALL) 920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.compare.append((base_rexp, test_rexp)) 930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Absolute)' 960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Absolute)' 970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('') 980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Absolute comparisions:', 'Report') 990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 1000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable = 'Energy Indexes (Relative)' 1020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_lable = 'Performance Indexes (Relative)' 1030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('') 1040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.info('%14s - Relative comparisions:', 'Report') 1050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 1060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Dump headers 1080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '{:9s} {:15s} |'\ 1100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:33s} | {:54s} |'\ 1110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('Test Id', 'Comparision', 1120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_lable, prf_lable) 1130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '{:9s} {:15s} |'\ 1140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} |'\ 1150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ' {:>10s} {:>10s} {:>10s} {:>10s} {:>10s} |'\ 1160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format('', '', 1170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'LITTLE', 'big', 'Total', 1180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'PerfIndex', 'NegSlacks', 'EDP1', 'EDP2', 'EDP3') 1190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each test 1210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for tid in sorted(self.results.keys()): 1220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = True 1230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # For each configuration... 1240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for i, base_idx in enumerate(sorted(self.results[tid].keys())): 1250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Which matches at least on base regexp 1260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for (base_rexp, test_rexp) in self.compare: 1270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not base_rexp.match(base_idx): 1280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Look for a configuration which matches the test regexp 1300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for test_idx in sorted(self.results[tid].keys())[i+1:]: 1310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if test_idx == base_idx: 1320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if new_test: 1340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '{:-<28s}+{:-<35s}+{:-<56s}+'.format('','', '') 1350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi new_test = False 1360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not test_rexp.match(test_idx): 1370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 1380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.__compare(tid, base_idx, test_idx, numbers) 1390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print '' 1410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return True 1420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __compare(self, tid, base_idx, test_idx, numbers): 1440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('Test %s: compare %s with %s', 1450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi tid, base_idx, test_idx) 1460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_comp = '{0:s} vs {1:s}'.format(test_idx, base_idx) 1470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line = '{0:8s}: {1:15s} | '.format(tid, res_comp) 1480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Dump all energy metrics 1500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for cpus in ['LITTLE', 'big', 'Total']: 1510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_base = self.results[tid][base_idx]['energy'][cpus]['avg'] 1520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_test = self.results[tid][test_idx]['energy'][cpus]['avg'] 1530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_test - res_base 1540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 1550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 1560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 1580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:s}'\ 1590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi .format(TestColors.rate( 1600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct, 1610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi positive_is_good = False)) 1620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 1630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # If available, dump also performance results 1650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if 'performance' not in self.results[tid][base_idx].keys(): 1660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 1670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return 1680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for pidx in ['perf_avg', 'slack_pct', 'edp1', 'edp2', 'edp3']: 1700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_base = self.results[tid][base_idx]['performance'][pidx]['avg'] 1710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_test = self.results[tid][test_idx]['performance'][pidx]['avg'] 1720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('idx: %s, base: %s, test: %s', 1740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi pidx, res_base, res_test) 1750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute difference base-vs-test 1770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = 0 1780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if res_base != 0: 1790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if pidx in ['perf_avg']: 1800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_test - res_base 1810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_cnt = res_base - res_test 1830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 1840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute speedup if required 1850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 0 1860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if numbers: 1870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if 'edp' in pidx: 1880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2e}'.format(speedup_cnt) 1890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:10.2f}'.format(speedup_cnt) 1910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if res_base != 0: 1930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if pidx in ['perf_avg']: 1940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # speedup_pct = 100.0 * speedup_cnt / res_base 1950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = speedup_cnt 1960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 1970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi speedup_pct = 100.0 * speedup_cnt / res_base 1980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' {0:s}'.format(TestColors.rate(speedup_pct)) 1990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res_line += ' |' 2000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi print res_line 2010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Stats(object): 2030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, data): 2050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats = {} 2060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['count'] = len(data) 2070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['min'] = min(data) 2080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['max'] = max(data) 2090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['avg'] = sum(data)/len(data) 2100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi std = Stats.stdev(data) 2110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi c99 = Stats.ci99(data, std) 2120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['std'] = std 2130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.stats['c99'] = c99 2140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def get(self): 2160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return self.stats 2170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi @staticmethod 2190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def stdev(values): 2200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi sum1 = 0 2210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi sum2 = 0 2220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for value in values: 2230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi sum1 += value 2240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi sum2 += math.pow(value, 2) 2250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # print 'sum1: {}, sum2: {}'.format(sum1, sum2) 2260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi avg = sum1 / len(values) 2270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi var = (sum2 / len(values)) - (avg * avg) 2280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # print 'avg: {} var: {}'.format(avg, var) 2290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi std = math.sqrt(var) 2300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return float(std) 2310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi @staticmethod 2330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def ci99(values, std): 2340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi count = len(values) 2350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi ste = std / math.sqrt(count) 2360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi c99 = 2.58 * ste 2370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return c99 2380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Test(object): 2410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, test_idx, test_dir, res): 2430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.test_idx = test_idx 2440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Energy measures per each run of the workload 2460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi little = [] 2470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi total = [] 2480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi big = [] 2490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Performance measures per each run of the workload 2510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi slack_pct = [] 2520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi perf_avg = [] 2530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp1 = [] 2540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp2 = [] 2550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp3 = [] 2560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Create required JSON entries 2580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi wload_idx = self.wload() 2590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if wload_idx not in res.keys(): 2600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res[wload_idx] = {} 2610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi conf_idx = self.config() 2620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if conf_idx not in res[wload_idx].keys(): 2630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res[wload_idx][conf_idx] = {} 2640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('%14s - Parse [%s]...', 'Test', test_dir) 2660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for run_idx in sorted(os.listdir(test_dir)): 2670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Parse test's run results 2690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi run_dir = test_dir + '/' + run_idx 2700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi run = Run(run_idx, run_dir) 2710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Keep track of average energy of each run 2730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi little.append(run.little_nrg) 2740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi total.append(run.total_nrg) 2750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi big.append(run.big_nrg) 2760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Keep track of average performances of each run 2780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi slack_pct.extend(run.slack_pct) 2790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi perf_avg.extend(run.perf_avg) 2800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp1.extend(run.edp1) 2810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp2.extend(run.edp2) 2820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi edp3.extend(run.edp3) 2830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute energy stats over all run 2850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res[wload_idx][conf_idx]['energy'] = { 2860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'LITTLE' : Stats(little).get(), 2870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'big' : Stats(big).get(), 2880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Total' : Stats(total).get() 2890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi } 2900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 2910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Compute average performance over all run 2920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi res[wload_idx][conf_idx]['performance'] = { 2930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'slack_pct' : Stats(slack_pct).get(), 2940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'perf_avg' : Stats(perf_avg).get(), 2950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'edp1' : Stats(edp1).get(), 2960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'edp2' : Stats(edp2).get(), 2970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'edp3' : Stats(edp3).get(), 2980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi } 2990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def config(self): 3010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return self.test_idx.split(':')[0] 3020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def wload(self): 3040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return self.test_idx.split(':')[1] 3050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Run(object): 3080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, run_idx, run_dir): 3100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.run_idx = run_idx 3110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Set of exposed attibutes 3130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.little_nrg = None 3140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.total_nrg = None 3150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.big_nrg = None 3160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_pct = [] 3180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_avg = [] 3190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp1 = [] 3200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp2 = [] 3210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp3 = [] 3220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('%14s - Parse [%s]...', 'Run', run_dir) 3240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Load run's energy results 3260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg_file = run_dir + '/energy.json' 3270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if os.path.isfile(nrg_file): 3280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg = Energy(nrg_file) 3290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.little_nrg = nrg.little 3300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.total_nrg = nrg.total 3310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.big_nrg = nrg.big 3320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi else: 3330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg = None 3340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Load run's performance of each task 3360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi for perf_idx in sorted(os.listdir(run_dir)): 3370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if not fnm.fnmatch(perf_idx, 'rt-app-*.log'): 3390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi continue 3400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Parse run's performance results 3420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf_file = run_dir + '/' + perf_idx 3430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi prf = Perf(prf_file, nrg) 3440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Keep track of average performances of each task 3460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_pct.append(prf.slack_pct) 3470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_avg.append(prf.perf_avg) 3480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp1.append(prf.edp1) 3490f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp2.append(prf.edp2) 3500f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp3.append(prf.edp3) 3510f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3520f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Energy(object): 3530f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3540f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, nrg_file): 3550f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3560f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Set of exposed attributes 3570f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.little = None 3580f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.big = None 3590f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.total = None 3600f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3610f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('%14s - Parse [%s]...', 'Energy', nrg_file) 3620f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3630f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi with open(nrg_file, 'r') as infile: 3640f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi nrg = json.load(infile) 3650f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3660f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.little = float(nrg['LITTLE']) 3670f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.big = float(nrg['big']) 3680f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.total = self.little + self.big 3690f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3700f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('%14s - Energy LITTLE [%s], big [%s], Total [%s]', 3710f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 'Energy', self.little, self.big, self.total) 3720f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3730f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiclass Perf(object): 3740f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3750f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi def __init__(self, perf_file, nrg): 3760f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3770f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Set of exposed attibutes 3780f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_avg = None 3790f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_std = None 3800f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.run_sum = None 3810f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_sum = None 3820f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_pct = None 3830f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp1 = None 3840f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp2 = None 3850f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp3 = None 3860f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3870f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi logging.debug('%14s - Parse [%s]...', 'Perf', perf_file) 3880f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3890f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Load performance data for each RT-App task 3900f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.name = perf_file.split('-')[-2] 3910f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.data = np.loadtxt(perf_file, comments='#', unpack=False) 3920f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3930f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Max Slack (i.e. configured/expected slack): period - run 3940f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.max_slack = np.subtract( 3950f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.data[:,RTAPP_COL_PERIOD], self.data[:,RTAPP_COL_RUN]) 3960f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 3970f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Performance Index: 100 * slack / max_slack 3980f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi perf = np.divide(self.data[:,RTAPP_COL_SLACK], self.max_slack) 3990f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi perf = np.multiply(perf, 100) 4000f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_avg = np.mean(perf) 4010f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.perf_std = np.std(perf) 4020f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('perf [%s]: %6.2f,%6.2f', 4030f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # self.name, self.perf_mean, self.perf_std) 4040f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4050f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Negative slacks 4060f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi slacks = self.data[:,RTAPP_COL_SLACK] 4070f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi slacks = slacks[slacks < 0] 4080f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('Negative Slacks: %s', self.slacks) 4090f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_sum = slacks.sum() 4100f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('slack [%s]: %6.2f', self.name, self.slack_sum) 4110f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4120f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Slack over run-time 4130f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.run_sum = np.sum(self.data[:,RTAPP_COL_RUN]) 4140f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.slack_pct = 100 * self.slack_sum / self.run_sum 4150f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('SlackPct [%s]: %6.2f %%', self.name, self.slack_pct) 4160f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4170f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi if nrg is None: 4180f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi return 4190f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4200f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # Computing EDP 4210f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp1 = nrg.total * math.pow(self.run_sum, 1) 4220f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('EDP1 [%s]: {%6.2f}', self.name, self.edp1) 4230f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp2 = nrg.total * math.pow(self.run_sum, 2) 4240f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('EDP2 [%s]: %6.2f', self.name, self.edp2) 4250f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi self.edp3 = nrg.total * math.pow(self.run_sum, 3) 4260f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi # logging.debug('EDP3 [%s]: %6.2f', self.name, self.edp3) 4270f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4280f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4290f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi# Columns of the per-task rt-app log file 4300f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_IDX = 0 4310f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_PERF = 1 4320f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_RUN = 2 4330f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_PERIOD = 3 4340f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_START = 4 4350f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_END = 5 4360f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_REL_ST = 6 4370f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_SLACK = 7 4380f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_C_RUN = 8 4390f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_C_PERIOD = 9 4400f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick BellasiRTAPP_COL_WU_LAT = 10 4410f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4420f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasiif __name__ == '__main__': 4430f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4440f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi results = Results('.') 4450f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi results.report(numbers=True) 4460f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi results.report(numbers=False) 4470f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi 4480f8ac68fcd4e514ae6ee32a6496bd239fb9c03aPatrick Bellasi#vim :set tabstop=4 shiftwidth=4 expandtab 449