diff options
author | Daniel Friesel <daniel.friesel@uos.de> | 2019-12-19 16:12:03 +0100 |
---|---|---|
committer | Daniel Friesel <daniel.friesel@uos.de> | 2019-12-19 16:12:03 +0100 |
commit | b69919229b075df69881666a6a152139d3f274b8 (patch) | |
tree | 1e56667c199719731055778ecd4e943c02ff39e2 /bin | |
parent | d46afd5dfc4e41b8a22d2531d89d02dc377e5ad9 (diff) |
workload: support multiple energy models, show energy distribution between models
Diffstat (limited to 'bin')
-rwxr-xr-x | bin/workload.py | 86 |
1 files changed, 56 insertions, 30 deletions
diff --git a/bin/workload.py b/bin/workload.py index c9d4e76..c0a03c7 100755 --- a/bin/workload.py +++ b/bin/workload.py @@ -5,39 +5,65 @@ import sys from utils import human_readable from lex import TimedSequence, TimedWord, Workload -ptafile, raw_word = sys.argv[1:] +args = sys.argv[1:] # TODO loops im raw_word: # init(); repeat { foo(); sleep(5m); bar(); ... } o.ä. # - Zeitangaben mit Einheit in sleep # - Ausgabe in Gesamt, Init und Schleifeninhalt aufdröseln -pta = PTA.from_file(ptafile) -timedword = TimedSequence(raw_word) - -print('Input: {}\n'.format(timedword)) - -prev_state = 'UNINITIALIZED' -prev_param = None -for trace_part in timedword: - print('Trace Part {}'.format(trace_part)) - if type(trace_part) is TimedWord: - result = pta.simulate(trace_part, orig_state=prev_state, orig_param=prev_param) - elif type(trace_part) is Workload: - result = pta.simulate(trace_part.word, orig_state=prev_state, orig_param=prev_param) - if prev_state != result.end_state: - print('Warning: loop starts in state {}, but terminates in {}'.format(prev_state, result.end_state.name)) - if prev_param != result.parameters: - print('Warning: loop starts with parameters {}, but terminates with {}'.format(prev_param, result.parameters)) - - print(' Duration: ' + human_readable(result.duration, 's')) - if result.duration_mae: - print(u' ± {} / {:.0f}%'.format(human_readable(result.duration_mae, 's'), result.duration_mape)) - print(' Energy: ' + human_readable(result.energy, 'J')) - if result.energy_mae: - print(u' ± {} / {:.0f}%'.format(human_readable(result.energy_mae, 'J'), result.energy_mape)) - print(' Mean Power: ' + human_readable(result.mean_power, 'W')) - print('') - - prev_state = result.end_state - prev_param = result.parameters +loops = dict() +ptafiles = list() +loop_names = set() + + +def simulate_word(timedword): + prev_state = 'UNINITIALIZED' + prev_param = None + ret = dict() + for trace_part in timedword: + print('Trace Part {}'.format(trace_part)) + if type(trace_part) is TimedWord: + result = pta.simulate(trace_part, orig_state=prev_state, orig_param=prev_param) + elif type(trace_part) is Workload: + result = pta.simulate(trace_part.word, orig_state=prev_state, orig_param=prev_param) + if prev_state != result.end_state: + print('Warning: loop starts in state {}, but terminates in {}'.format(prev_state, result.end_state.name)) + if prev_param != result.parameters: + print('Warning: loop starts with parameters {}, but terminates with {}'.format(prev_param, result.parameters)) + ret[trace_part.name] = result + loop_names.add(trace_part.name) + + print(' Duration: ' + human_readable(result.duration, 's')) + if result.duration_mae: + print(u' ± {} / {:.0f}%'.format(human_readable(result.duration_mae, 's'), result.duration_mape)) + print(' Energy: ' + human_readable(result.energy, 'J')) + if result.energy_mae: + print(u' ± {} / {:.0f}%'.format(human_readable(result.energy_mae, 'J'), result.energy_mape)) + print(' Mean Power: ' + human_readable(result.mean_power, 'W')) + print('') + + prev_state = result.end_state + prev_param = result.parameters + + return ret + + +for i in range(len(args) // 2): + ptafile, raw_word = args[i * 2], args[i * 2 + 1] + ptafiles.append(ptafile) + pta = PTA.from_file(ptafile) + timedword = TimedSequence(raw_word) + print('Input: {}\n'.format(timedword)) + loops[ptafile] = simulate_word(timedword) + +for loop_name in sorted(loop_names): + result_set = list() + total_power = 0 + for ptafile in sorted(ptafiles): + if loop_name in loops[ptafile]: + result_set.append(loops[ptafile][loop_name]) + total_power += loops[ptafile][loop_name].mean_power + print('{}: total mean power is {}'.format(loop_name, human_readable(total_power, 'W'))) + for i, result in enumerate(result_set): + print(' {:.0f}% {} (period: {})'.format(result.mean_power * 100 / total_power, ptafiles[i], human_readable(result.duration, 's'))) |