diff options
author | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-13 23:54:09 -0400 |
---|---|---|
committer | Bjoern B. Brandenburg <bbb@cs.unc.edu> | 2009-05-13 23:54:09 -0400 |
commit | b45afe309c61d9590ba523a5f0c37469fcdc4553 (patch) | |
tree | 5b251a81587e623a08d4a14e5bbd069d49aeb5a1 | |
parent | 39dafb73c941012d89021ca9e92a99b6fb5ec340 (diff) |
working plot ohead with paper mode
-rwxr-xr-x | plot_ohead.py | 144 |
1 files changed, 116 insertions, 28 deletions
diff --git a/plot_ohead.py b/plot_ohead.py index 974832b..430707e 100755 --- a/plot_ohead.py +++ b/plot_ohead.py | |||
@@ -1,38 +1,126 @@ | |||
1 | #!/usr/bin/env python | 1 | #!/usr/bin/env python |
2 | |||
3 | import defapp | ||
4 | from os.path import splitext, basename | ||
5 | from optparse import make_option as o | ||
6 | |||
2 | from gnuplot import gnuplot, FORMATS | 7 | from gnuplot import gnuplot, FORMATS |
3 | 8 | ||
4 | 9 | ||
5 | plugins = ['GSN-EDF', 'G-EDF', 'GQ-EDF', 'GHQ-EDF'] | 10 | PLUGINS = ['GSN-EDF', 'G-EDF', 'GQ-EDF', 'GHQ-EDF'] |
6 | master = ['NO_CPU', '3'] | 11 | MASTER = ['NO_CPU', '3'] |
7 | events = ['SCHED', 'SCHED2', 'TICK', 'CXS', 'RELEASE', 'SEND_RESCHED'] | 12 | EVENTS = ['SCHED', 'SCHED2', 'TICK', 'CXS', 'RELEASE', 'SEND_RESCHED'] |
13 | |||
14 | DATA = ['avg', 'wc'] | ||
15 | |||
16 | options = [ | ||
17 | o('-f', '--format', action='store', dest='format', type='choice', | ||
18 | choices=FORMATS, help='output format'), | ||
19 | o(None, '--paper', action='store_true', dest='paper'), | ||
20 | o('-e', '--events', action='append', dest='events', type='choice', | ||
21 | choices=EVENTS), | ||
22 | o('-m', '--master', action='append', dest='master', type='choice', | ||
23 | choices=MASTER), | ||
24 | o('-p', '--plugins', action='append', dest='plugins', type='choice', | ||
25 | choices=PLUGINS), | ||
26 | o('-d', '--data', action='append', dest='data', type='choice', | ||
27 | choices=DATA), | ||
28 | ] | ||
29 | |||
30 | defaults = { | ||
31 | 'format' : 'show', | ||
32 | 'xrange' : (45, 455), | ||
33 | 'yrange' : (0, 400), | ||
34 | 'xticks' : (50, 50), | ||
35 | 'yticks' : (0, 10), | ||
36 | 'title' : None, | ||
37 | 'xlabel' : 'number of tasks', | ||
38 | 'ylabel' : 'overhead (us)', | ||
39 | 'paper' : False, | ||
40 | 'events' : [], | ||
41 | 'plugins' : [], | ||
42 | 'master' : [], | ||
43 | 'data' : [], | ||
44 | } | ||
45 | |||
46 | |||
47 | ev_name = { | ||
48 | 'RELEASE' : 'release overhead', | ||
49 | 'TICK' : 'tick overhead', | ||
50 | 'SCHED' : 'scheduling overhead', | ||
51 | 'SCHED2' : 'timer re-arming overhead', | ||
52 | 'SEND_RESCHED' : 'IPI latency', | ||
53 | 'CXS' : 'context-switching overhead', | ||
54 | } | ||
8 | 55 | ||
9 | def graph(plugin, master, event, wc): | 56 | def graph(plugin, master, event, wc): |
10 | return ['%s.R-%s.%s.csv' % (plugin, master, event), 1, 3 if wc else 2, | 57 | return ['%s.R-%s.%s.csv' % (plugin, master, event), 1, 3 if wc else 2, |
11 | '%s %s %s %s' % (plugin, event, 'RM' if master != 'NO_CPU' else '', | 58 | '%s %s %s %s' % (plugin, event, 'RM' if master != 'NO_CPU' else '', |
12 | 'WC' if wc else 'AVG')] | 59 | 'WC' if wc else 'AVG')] |
13 | 60 | ||
14 | def by_event(wc): | 61 | class OheadPlotter(defapp.App): |
15 | for e in events: | 62 | def __init__(self): |
16 | gs = [] | 63 | defapp.App.__init__(self, options, defaults, no_std_opts=True) |
17 | for p in plugins: | 64 | if not self.options.events: |
18 | for m in master: | 65 | self.options.events = EVENTS |
19 | if (p != 'GHQ-EDF' or m == 'NO_CPU') and \ | 66 | if not self.options.plugins: |
20 | (p != 'GQ-EDF' or e != 'SEND_RESCHED'): | 67 | self.options.plugins = PLUGINS |
21 | gs += [graph(p, m, e, wc)] | 68 | if not self.options.master: |
22 | gnuplot(gs, title='%s %s' % (e, 'WC' if wc else 'AVG')) | 69 | self.options.master = MASTER |
23 | 70 | if not self.options.data: | |
24 | def by_plugin(wc): | 71 | self.options.data = DATA |
25 | for p in plugins: | 72 | |
26 | gs = [] | 73 | def plot(self, graphs, title, name, **xtra): |
27 | for e in events: | 74 | if self.options.paper: |
28 | for m in master: | 75 | tops = 'color solid font "Helvetica,10" linewidth 1.0 rounded size 16cm,8.5cm' |
29 | if (p != 'GHQ-EDF' or m == 'NO_CPU') and \ | 76 | gnuplot(graphs, title=title, |
30 | (p != 'GQ-EDF' or e != 'SEND_RESCHED'): | 77 | xlabel=self.options.xlabel, |
31 | gs += [graph(p, m, e, wc)] | 78 | ylabel=self.options.ylabel, |
32 | gnuplot(gs, title='%s %s' % (p, 'WC' if wc else 'AVG')) | 79 | xrange=self.options.xrange, |
33 | 80 | # yrange=self.options.yrange, | |
34 | #by_event(True) | 81 | xticks=self.options.xticks, |
35 | #by_event(False) | 82 | # yticks=self.options.yticks, |
36 | 83 | format=self.options.format, | |
37 | by_plugin(True) | 84 | fname=name, |
38 | by_plugin(False) | 85 | key='off', |
86 | style='lines lw 7', | ||
87 | term_opts=tops) | ||
88 | else: | ||
89 | gnuplot(graphs, title=title, | ||
90 | xlabel=self.options.xlabel, | ||
91 | ylabel=self.options.ylabel, | ||
92 | # xrange=self.options.xrange, | ||
93 | # yrange=self.options.yrange, | ||
94 | xticks=self.options.xticks, | ||
95 | # yticks=self.options.yticks, | ||
96 | format=self.options.format, | ||
97 | fname=name, **xtra) | ||
98 | |||
99 | def do_by_event(self, _): | ||
100 | for d in self.options.data: | ||
101 | wc = d == 'wc' | ||
102 | for e in self.options.events: | ||
103 | gs = [] | ||
104 | for p in self.options.plugins: | ||
105 | for m in self.options.master: | ||
106 | if (p != 'GHQ-EDF' or m == 'NO_CPU') and \ | ||
107 | (p != 'GQ-EDF' or e != 'SEND_RESCHED'): | ||
108 | gs += [graph(p, m, e, wc)] | ||
109 | fname = '%s.%s' % (e, d) | ||
110 | title = '%s %s' % ('worst-case' if wc else 'average-case' , ev_name[e]) | ||
111 | self.plot(gs, title=title, name=fname) | ||
112 | |||
113 | def do_by_plugin(self, _): | ||
114 | for p in self.options.plugins: | ||
115 | gs = [] | ||
116 | for d in self.options.data: | ||
117 | wc = d == 'wc' | ||
118 | for e in self.options.events: | ||
119 | for m in self.options.master: | ||
120 | if (p != 'GHQ-EDF' or m == 'NO_CPU') and \ | ||
121 | (p != 'GQ-EDF' or e != 'SEND_RESCHED'): | ||
122 | gs += [graph(p, m, e, wc)] | ||
123 | self.plot(gs, title='%s %s' % (p, 'WC' if wc else 'AVG'), name='') | ||
124 | |||
125 | if __name__ == "__main__": | ||
126 | OheadPlotter().launch() | ||