From 2844e3887b4ff635dfa85e9b2ec773b06fe9af4f Mon Sep 17 00:00:00 2001 From: Jonathan Herman Date: Fri, 28 Sep 2012 16:55:30 -0400 Subject: Added option to parse scaling factors against a base task set. --- parse_exps.py | 67 +++++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 56 insertions(+), 11 deletions(-) (limited to 'parse_exps.py') diff --git a/parse_exps.py b/parse_exps.py index ecb1cac..3a1d1b9 100755 --- a/parse_exps.py +++ b/parse_exps.py @@ -2,9 +2,11 @@ from __future__ import print_function import config.config as conf +import copy import os import parse.ft as ft import parse.sched as st +import re from collections import namedtuple from common import load_params @@ -17,6 +19,9 @@ def parse_args(): parser.add_option('-o', '--out-dir', dest='out_dir', help='directory for data output', default=os.getcwd()) + parser.add_option('-s', '--scale-against', dest='scale_against', + metavar='PARAM=VALUE', default="", + help='calculate task scaling factors against these configs') return parser.parse_args() @@ -41,8 +46,10 @@ def get_exp_params(data_dir, col_map): return params -def gen_exp_data(exp_dirs, col_map): - exps = [] +def gen_exp_data(exp_dirs, base_conf, col_map): + plain_exps = [] + scaling_bases = [] + for data_dir in exp_dirs: if not os.path.isdir(data_dir): raise IOError("Invalid experiment '%s'" % os.path.abspath(data_dir)) @@ -51,34 +58,72 @@ def gen_exp_data(exp_dirs, col_map): if not os.path.exists(tmp_dir): os.mkdir(tmp_dir) + # Read and translate exp output files params = get_exp_params(data_dir, col_map) st_output = st.get_st_output(data_dir, tmp_dir) ft_output = ft.get_ft_output(data_dir, tmp_dir) + # Create experiment named after the data dir exp_data = ExpData(data_dir, params, DataFiles(ft_output, st_output)) - exps += [exp_data] - return exps + if base_conf and base_conf.viewitems() & params.viewitems(): + if not st_output: + raise Exception("Scaling base '%s' useless without sched data!" + % data_dir) + params.pop(base_conf.keys()[0]) + scaling_bases += [exp_data] + else: + plain_exps += [exp_data] + + return (plain_exps, scaling_bases) def main(): opts, args = parse_args() args = args or [os.getcwd()] + + # Configuration key for task systems used to calculate task + # execution scaling factors + base_conf = dict(re.findall("(.*)=(.*)", opts.scale_against)) + col_map = ColMap() - exps = gen_exp_data(args, col_map) - table = TupleTable(col_map) + (plain_exps, scaling_bases) = gen_exp_data(args, base_conf, col_map) + + base_table = TupleTable(col_map) + result_table = TupleTable(col_map) - for exp in exps: + # Used to find matching scaling_base for each experiment + for base in scaling_bases: + base_table.add_exp(base.params, base) + + for exp in plain_exps: result = ExpPoint(exp.name) + if exp.data_files.ft: - ft.get_ft_data(exp.data_files.ft, result, conf.BASE_EVENTS) + # Write overheads into result + ft.extract_ft_data(exp.data_files.ft, result, conf.BASE_EVENTS) + if exp.data_files.st: - st.get_sched_data(exp.data_files.st, result) + if base_conf: + # Try to find a scaling base + base_params = copy.deepcopy(exp.params) + base_params.pop(base_conf.keys()[0]) + base = base_table.get_exps(base_params)[0] + if base: + # Write scaling factor (vs base) into result + st.extract_scaling_data(exp.data_files.st, + base.data_files.st, + result) + # Write deadline misses / tardiness into result + st.extract_sched_data(exp.data_files.st, result) + + result_table.add_exp(exp.params, result) + + print(result) - table.add_exp(exp.params, result) - table.write_result(opts.out_dir) + result_table.write_result(opts.out_dir) if __name__ == '__main__': main() -- cgit v1.2.2