aboutsummaryrefslogtreecommitdiffstats
path: root/plot_ohead.py
blob: 430707e58f85b426aee1ef0fe7a4ec0b7e8c50d1 (plain) (blame)
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
#!/usr/bin/env python

import defapp
from os.path  import splitext, basename
from optparse import make_option as o

from gnuplot import gnuplot, FORMATS


PLUGINS = ['GSN-EDF', 'G-EDF', 'GQ-EDF', 'GHQ-EDF']
MASTER  = ['NO_CPU', '3']
EVENTS  = ['SCHED', 'SCHED2', 'TICK', 'CXS', 'RELEASE', 'SEND_RESCHED']

DATA    = ['avg', 'wc']

options = [
    o('-f', '--format', action='store', dest='format', type='choice',
      choices=FORMATS, help='output format'),
    o(None, '--paper', action='store_true', dest='paper'),
    o('-e', '--events', action='append', dest='events', type='choice',
      choices=EVENTS),
    o('-m', '--master', action='append', dest='master', type='choice',
      choices=MASTER),
    o('-p', '--plugins', action='append', dest='plugins', type='choice',
      choices=PLUGINS),
    o('-d', '--data', action='append', dest='data', type='choice',
      choices=DATA),
    ]

defaults = {
    'format'  : 'show',
    'xrange'  : (45, 455),
    'yrange'  : (0, 400),
    'xticks'  : (50, 50),
    'yticks'  : (0, 10),
    'title'   : None,
    'xlabel'  : 'number of tasks',
    'ylabel'  : 'overhead (us)',
    'paper'   : False,
    'events'  : [],
    'plugins' : [],
    'master'  : [],
    'data'    : [],
    }


ev_name = {
    'RELEASE'         : 'release overhead',
    'TICK'            : 'tick overhead',
    'SCHED'           : 'scheduling overhead',
    'SCHED2'          : 'timer re-arming overhead',
    'SEND_RESCHED'    : 'IPI latency',
    'CXS'             : 'context-switching overhead',
}

def graph(plugin, master, event, wc):
    return ['%s.R-%s.%s.csv' % (plugin, master, event), 1, 3 if wc else 2,
            '%s %s %s %s' % (plugin, event, 'RM' if master != 'NO_CPU' else '',
                             'WC' if wc else 'AVG')]

class OheadPlotter(defapp.App):
    def __init__(self):
        defapp.App.__init__(self, options, defaults, no_std_opts=True)
        if not self.options.events:
            self.options.events = EVENTS
        if not self.options.plugins:
            self.options.plugins = PLUGINS
        if not self.options.master:
            self.options.master = MASTER
        if not self.options.data:
            self.options.data = DATA

    def plot(self, graphs, title, name, **xtra):
        if self.options.paper:
            tops = 'color solid  font "Helvetica,10" linewidth 1.0 rounded size 16cm,8.5cm'
            gnuplot(graphs, title=title,
                    xlabel=self.options.xlabel,
                    ylabel=self.options.ylabel,
                    xrange=self.options.xrange,
#                    yrange=self.options.yrange,
                    xticks=self.options.xticks,
#                    yticks=self.options.yticks,
                    format=self.options.format,
                    fname=name,
                    key='off',
                    style='lines lw 7',
                    term_opts=tops)
        else:
            gnuplot(graphs, title=title,
                    xlabel=self.options.xlabel,
                    ylabel=self.options.ylabel,
#                xrange=self.options.xrange,
#                yrange=self.options.yrange,
                    xticks=self.options.xticks,
#                yticks=self.options.yticks,
                    format=self.options.format,
                    fname=name, **xtra)

    def do_by_event(self, _):
        for d in self.options.data:
            wc = d == 'wc'
            for e in self.options.events:
                gs = []
                for p in self.options.plugins:
                    for m in self.options.master:
                        if (p != 'GHQ-EDF' or m == 'NO_CPU') and \
                                (p != 'GQ-EDF' or e != 'SEND_RESCHED'):
                            gs += [graph(p, m, e, wc)]
                fname = '%s.%s' % (e, d)
                title = '%s %s' % ('worst-case' if wc else 'average-case' , ev_name[e])
                self.plot(gs, title=title, name=fname)

    def do_by_plugin(self, _):
        for p in self.options.plugins:
            gs = []
            for d in self.options.data:
                wc = d == 'wc'
                for e in self.options.events:
                    for m in self.options.master:
                        if (p != 'GHQ-EDF' or m == 'NO_CPU') and \
                                (p != 'GQ-EDF' or e != 'SEND_RESCHED'):
                            gs += [graph(p, m, e, wc)]
            self.plot(gs, title='%s %s' % (p, 'WC' if wc else 'AVG'), name='')

if __name__ == "__main__":
    OheadPlotter().launch()