analysis.py 3.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
#!/usr/bin/env python3

import argparse
import math

def calc_utilization(tasks):
    util = 0
    for task in tasks:
        util += task['wcet'] / task['period']
    return util

def main():
    parser = argparse.ArgumentParser(description='Generate plotable results from the experiments.')
    parser.add_argument('results', type=str, nargs='+', help='file containing experiment results.')

    args = parser.parse_args()

    out = {}

    for result in args.results:
        with open(result, 'r') as result_file:
            tasks = {}
            instances = {}

            for line in result_file:
                tokens = line.strip().split(' ')
                if tokens[0] == 'task':
                    #task 0 wcet 5 period 39 deadline 32 executions 15480

                    task_id = int(tokens[1])
                    wcet = int(tokens[3])
                    period = int(tokens[5])
                    deadline = int(tokens[7])
                    executions = int(tokens[9])

                    tasks[task_id] = { 'id': task_id, 'wcet': wcet, 'period': period, 'deadline': deadline, 'executions': executions }
                    instances[task_id] = { 's2s':0, 'e2e':0, 'misses':0, 'response':0 }

                elif tokens[0] == 'instance':
                    #instance 12 start 478 end 487 core_id 0

                    start = int(tokens[3])
                    end = int(tokens[5])

                    if start == 0 and end == 0:
                        # Ignore not executed tasks, not realy that clean but it
                        # happens hardly, so nobody should care...
                        tasks[task_id]['executions'] -= 1
                        continue

                    release = start - (start % tasks[task_id]['period'])
                    abs_deadline = release + tasks[task_id]['deadline']

                    instances[task_id]['s2s'] += start - release
                    instances[task_id]['e2e'] += end - release
                    instances[task_id]['response'] += end - release
                    if end > abs_deadline:
                        instances[task_id]['misses'] += 1
                else:
                    continue

        util = calc_utilization(tasks.values())
        s2s = 0
        e2e = 0
        misses = 0
66 67
        misses_avrg = 0
        exec_cnt = 0
68 69
        response = 0
        for task_id, task in instances.items():
70
            exec_cnt += tasks[task_id]['executions']
71 72 73 74 75 76 77 78
            s2s += math.sqrt(task['s2s'] / tasks[task_id]['executions'])
            e2e += math.sqrt(task['e2e'] / tasks[task_id]['executions'])
            misses += task['misses']
            response += (task['response'] / tasks[task_id]['executions']) / tasks[task_id]['period']

        s2s /= len(tasks)
        e2e /= len(tasks)
        response /= len(tasks)
79
        misses_avrg /= exec_cnt
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102

        outkey = round(util, 2)

        try:
            out[outkey].append((s2s, e2e, misses, response))
        except KeyError:
            out[outkey] = [(s2s, e2e, misses, response)]

    with open('analysis/s2s.dat', 'w') as s2sfile:
        for key, value in out.items():
            for elem in value:
                print('{}; {}'.format(key, elem[0]), file=s2sfile)

    with open('analysis/e2e.dat', 'w') as e2efile:
        for key, value in out.items():
            for elem in value:
                print('{}; {}'.format(key, elem[1]), file=e2efile)

    with open('analysis/misses.dat', 'w') as missesfile:
        for key, value in out.items():
            for elem in value:
                print('{}; {}'.format(key, elem[2]), file=missesfile)

103 104 105 106 107
    with open('analysis/misses_avrg.dat', 'w') as missesavrgfile:
        for key, value in out.items():
            for elem in value:
                print('{}; {}'.format(key, elem[3]), file=missesavrgfile)

108 109 110 111 112 113 114
    with open('analysis/response.dat', 'w') as responsefile:
        for key, value in out.items():
            for elem in value:
                print('{}; {}'.format(key, elem[3]), file=responsefile)

if __name__ == '__main__':
    main()