aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChristopher Kenna <cjk@cs.unc.edu>2012-01-05 21:32:02 -0500
committerChristopher Kenna <cjk@cs.unc.edu>2012-01-05 21:32:02 -0500
commitc8b2f1313326bee25e847bd7f979c0eb2bba2883 (patch)
tree7b910621b6161a5f2bfbfdb0dc97c9b4ecae84a6
parent8a53287722d90631f08590e40c189fa89726eb72 (diff)
Plotting with different level-curves on the graphs.
-rwxr-xr-xplot_rtas12.py127
1 files changed, 69 insertions, 58 deletions
diff --git a/plot_rtas12.py b/plot_rtas12.py
index d5e9ed9..d65534e 100755
--- a/plot_rtas12.py
+++ b/plot_rtas12.py
@@ -50,26 +50,38 @@ def gnuplot_col(col_name):
50 return 1 + COLS[col_name] 50 return 1 + COLS[col_name]
51 51
52def get_sched_title(sched): 52def get_sched_title(sched):
53 SCHEDULERS = {'MC': 'Basic', 53 SCHEDULERS = {'MC': 'Basic:',
54 'MC-MERGE': 'IM + TM', 54 'MC-MERGE': 'IM + TM:',
55 'MC-MERGE-REDIR': 'IM + TM + WR'} 55 'MC-MERGE-REDIR': 'All:'}
56 return SCHEDULERS[sched] 56 return SCHEDULERS[sched]
57 57
58def get_overhead_title(ov): 58def get_overhead_title(ov):
59 OV = {'SCHED': '(A, B, C)', 59 OV = {'LVLA-SCHED': 'A',
60 'LVLA-SCHED': '(A)', 60 'LVLB-SCHED': 'B',
61 'RELEASE': '(A, B, C)', 61 'LVLC-SCHED': 'C',
62 'LVLA-RELEASE': '(A)'} 62 'LVLA-RELEASE': 'A',
63 'LVLB-RELEASE': 'B',
64 'LVLC-RELEASE': 'C',
65}
63 return OV[ov] 66 return OV[ov]
64 67
68def get_line_style(sched, o_type):
69 S = { 'MC' : {'LVLA': 1, 'LVLB': 4, 'LVLC': 7},
70 'MC-MERGE': {'LVLA': 2, 'LVLB': 5, 'LVLC': 8},
71 'MC-MERGE-REDIR': {'LVLA': 3, 'LVLB': 6, 'LVLC': 9}}
72 o = o_type.split('-')[0]
73 return 'linespoints linestyle {0}'.format(S[sched][o])
74
75def get_graph_fname(directory, o_type, levels, ycol_type):
76 return '{0}/overhead={1}-levels={2}-type={3}'.format(directory, o_type,
77 levels, ycol_type)
78
65def set_plot_opts(opts, p): 79def set_plot_opts(opts, p):
66 p.rounded_caps = True 80 p.rounded_caps = True
67 p.font = 'Helvetica' 81 p.font = 'Helvetica'
68 p.default_style = 'linespoints lw 2.5'
69 p.default_style += ' smooth bezier'
70 p.key = 'off' 82 p.key = 'off'
71 p.monochrome = False 83 p.monochrome = False
72 p.dashed_lines = False 84 p.dashed_lines = True
73 p.xrange = (18, 122) 85 p.xrange = (18, 122)
74 p.yrange = (0, '') 86 p.yrange = (0, '')
75 87
@@ -88,27 +100,18 @@ def set_plot_opts(opts, p):
88 p.output = '{0}.{1}'.format(p.output, ext) 100 p.output = '{0}.{1}'.format(p.output, ext)
89 p.format = ext 101 p.format = ext
90 102
91 for i, c in enumerate(p.curves):
92 c.style = "linespoints ls %d" % (i + 1)
93
94 try:
95 # don't use yellow if we have this curve
96 p.curves[5].style = "linespoints ls 7"
97 except IndexError:
98 pass
99
100 p.line_styles = [ 103 p.line_styles = [
101 (1, "lw {0} ps {1}".format(line_width, point_size)), 104 (1, 'lt 1 pt 1 lw {0} ps {1} lc rgbcolor "#ff0000"'.format(line_width, point_size)),
102 (2, "lw {0} ps {1}".format(line_width, point_size)), 105 (2, 'lt 1 pt 4 lw {0} ps {1} lc rgbcolor "#00ff00"'.format(line_width, point_size)),
103 (3, "lw {0} ps {1}".format(line_width, point_size)), 106 (3, 'lt 1 pt 7 lw {0} ps {1} lc rgbcolor "#0000ff"'.format(line_width, point_size)),
104 (4, "lw {0} ps {1}".format(line_width, point_size)), 107 (4, 'lt 2 pt 1 lw {0} ps {1} lc rgbcolor "#ff0000"'.format(line_width, point_size)),
105 (5, 'pt 6 lw {0} ps {1} lc rgbcolor "#ff910d"'.format(line_width, point_size)), 108 (5, 'lt 2 pt 4 lw {0} ps {1} lc rgbcolor "#00ff00"'.format(line_width, point_size)),
106 (6, "pt 7 lw {0} ps {1}".format(line_width, point_size)), 109 (6, 'lt 2 pt 7 lw {0} ps {1} lc rgbcolor "#0000ff"'.format(line_width, point_size)),
107 (7, 'lw {0} ps {1} lc rgbcolor "#000000"'.format(line_width, point_size)), 110 (7, 'lt 3 pt 1 lw {0} ps {1} lc rgbcolor "#ff0000"'.format(line_width, point_size)),
108 (8, "lw {0} ps {1}".format(line_width, point_size)), 111 (8, 'lt 3 pt 4 lw {0} ps {1} lc rgbcolor "#00ff00"'.format(line_width, point_size)),
112 (9, 'lt 3 pt 7 lw {0} ps {1} lc rgbcolor "#0000ff"'.format(line_width, point_size)),
109 ] 113 ]
110 114
111
112def get_data_matrix(fname): 115def get_data_matrix(fname):
113 ret = [] 116 ret = []
114 with open(fname, 'r') as f: 117 with open(fname, 'r') as f:
@@ -162,34 +165,36 @@ def include_level_a_releases(data_dir, o_type, scheduler, ycol):
162 f.file.flush() 165 f.file.flush()
163 return (f.name, f) 166 return (f.name, f)
164 167
168def add_key_to_plot(p):
169 p.key = 'on tmargin center horizontal maxcolumns 3'
170 p.size = ('8.5cm', '6.25cm')
165 171
166def plot_release(opts, data_dir, ycol, title, fname): 172def plot_release(opts, data_dir, ycol_name, title, levels):
167 p = Plot() 173 levels = levels.upper()
168 p.output = '{0}/{1}'.format(data_dir, fname)
169 refs = [] # need to save reference to file handle so it is not deleted 174 refs = [] # need to save reference to file handle so it is not deleted
175 p = Plot()
176 p.output = get_graph_fname(data_dir, 'RELEASE', levels, ycol_name)
170 177
171 for o_type in ['RELEASE', 'LVLA-RELEASE']: 178 for o_type in ['LVL{0}-RELEASE'.format(l) for l in levels]:
172 for sched in SCHEDULERS: 179 for sched in SCHEDULERS:
173 if o_type == 'RELEASE': 180 # if o_type == 'RELEASE':
174 # we have to make the regular release include the level-A 181 # # we have to make the regular release include the level-A
175 # releases 182 # # releases
176 fname, ref = include_level_a_releases(data_dir, o_type, 183 # fname, ref = include_level_a_releases(data_dir, o_type,
177 sched, ycol) 184 # sched, ycol)
178 refs.append(ref) 185 # refs.append(ref)
179 else: 186 # else:
180 fname = '{0}/scheduler={1}_overhead={2}.csv'.format(data_dir, sched, o_type) 187 fname = '{0}/scheduler={1}_overhead={2}.csv'.format(data_dir, sched, o_type)
181 ti = '{0} {1}'.format(get_sched_title(sched), get_overhead_title(o_type)) 188 ti = '{0} {1}'.format(get_sched_title(sched), get_overhead_title(o_type))
182 p.curves += [curve(fname=fname, xcol=gnuplot_col('n_tasks'), 189 c = curve(fname=fname, xcol=gnuplot_col('n_tasks'),
183 ycol=ycol, title=ti)] 190 ycol=gnuplot_col(ycol_name), title=ti,
191 style=get_line_style(sched, o_type))
192 p.curves += [c]
184 p.xlabel = 'number of tasks' 193 p.xlabel = 'number of tasks'
185 p.ylabel = 'overhead (microseconds)' 194 p.ylabel = 'overhead (microseconds)'
186 set_plot_opts(opts, p) 195 set_plot_opts(opts, p)
187 if gnuplot_col('avg') == ycol: 196 if 'avg' == ycol_name and 'ABC' == levels:
188 # make this graph's y-scale match the scale on the average-case 197 add_key_to_plot(p)
189 # scheduling overhead graph because they are next to each other
190 p.yrange = (0, 16)
191 # it gets the key
192 p.key = 'top left'
193 p.gnuplot_exec() 198 p.gnuplot_exec()
194 199
195def plot_release_jim(opts, data_dir, ycol, title, fname): 200def plot_release_jim(opts, data_dir, ycol, title, fname):
@@ -210,19 +215,24 @@ def plot_release_jim(opts, data_dir, ycol, title, fname):
210 p.title = 'level-A worst-case release overhead' 215 p.title = 'level-A worst-case release overhead'
211 p.gnuplot_exec() 216 p.gnuplot_exec()
212 217
213def plot_sched(opts, data_dir, ycol, title, fname): 218def plot_sched(opts, data_dir, ycol_name, title, levels):
219 levels = levels.upper()
214 p = Plot() 220 p = Plot()
215 p.output = '{0}/{1}'.format(data_dir, fname) 221 p.output = get_graph_fname(data_dir, 'SCHED', levels, ycol_name)
216 222
217 for o_type in ['SCHED', 'LVLA-SCHED']: 223 for o_type in ['LVL{0}-SCHED'.format(l) for l in levels]:
218 for sched in SCHEDULERS: 224 for sched in SCHEDULERS:
219 fname = '{0}/scheduler={1}_overhead={2}.csv'.format(data_dir, sched, o_type) 225 fname = '{0}/scheduler={1}_overhead={2}.csv'.format(data_dir, sched, o_type)
220 ti = '{0} {1}'.format(get_sched_title(sched), get_overhead_title(o_type)) 226 ti = '{0} {1}'.format(get_sched_title(sched), get_overhead_title(o_type))
221 p.curves += [curve(fname=fname, xcol=gnuplot_col('n_tasks'), 227 c = curve(fname=fname, xcol=gnuplot_col('n_tasks'),
222 ycol=ycol, title=ti)] 228 ycol=gnuplot_col(ycol_name), title=ti,
229 style=get_line_style(sched, o_type))
230 p.curves += [c]
223 p.xlabel = 'number of tasks' 231 p.xlabel = 'number of tasks'
224 p.ylabel = 'overhead (microseconds)' 232 p.ylabel = 'overhead (microseconds)'
225 set_plot_opts(opts, p) 233 set_plot_opts(opts, p)
234 if 'avg' == ycol_name and 'ABC' == levels:
235 add_key_to_plot(p)
226 p.gnuplot_exec() 236 p.gnuplot_exec()
227 237
228 238
@@ -234,11 +244,12 @@ def main():
234 usage('missing args') 244 usage('missing args')
235 245
236 data_dir = extra[0] 246 data_dir = extra[0]
237 plot_sched(opts, data_dir, gnuplot_col('max'), 'worst-case scheduling overhead', 'overhead=SCHED_type=MAX') 247 for levels in ('ABC', 'AC', 'BC'):
238 plot_release(opts, data_dir, gnuplot_col('max'), 'worst-case release overhead', 'overhead=RELEASE_type=MAX') 248 plot_sched(opts, data_dir, 'max', 'worst-case scheduling overhead', levels)
239 plot_sched(opts, data_dir, gnuplot_col('avg'), 'average-case scheduling overhead', 'overhead=SCHED_type=AVG') 249 plot_release(opts, data_dir, 'max', 'worst-case release overhead', levels)
240 plot_release(opts, data_dir, gnuplot_col('avg'), 'average-case release overhead', 'overhead=RELEASE_type=AVG') 250 plot_sched(opts, data_dir, 'avg', 'average-case scheduling overhead', levels)
241 plot_release_jim(opts, data_dir, gnuplot_col('max'), 'worst-case release overhead', 'overhead=RELEASE_type=MAX_for-jim=1') 251 plot_release(opts, data_dir, 'avg', 'average-case release overhead', levels)
252 #plot_release_jim(opts, data_dir, 'max', 'worst-case release overhead', 'overhead=RELEASE_type=MAX_for-jim=1')
242 253
243if __name__ == '__main__': 254if __name__ == '__main__':
244 main() 255 main()