diff options
| -rwxr-xr-x | gnuplot.py | 11 | ||||
| -rwxr-xr-x | plot_pm.py | 159 |
2 files changed, 72 insertions, 98 deletions
| @@ -56,8 +56,15 @@ def gnuplot_cmd(graphs, title=None, ylabel=None, xlabel=None, | |||
| 56 | g('set key %s' % key) | 56 | g('set key %s' % key) |
| 57 | plot = [] | 57 | plot = [] |
| 58 | for gr in graphs: | 58 | for gr in graphs: |
| 59 | par = (gr[0], gr[1], gr[2], gr[3], style) if len(gr) == 4 else gr | 59 | if len(gr) == 4: |
| 60 | plot += ["'%s' using %s:%s title '%s' with %s" % par] | 60 | par = (gr[0], gr[1], gr[2], gr[3], style) |
| 61 | plot += ["'%s' using %s:%s title '%s' with %s" % par] | ||
| 62 | elif len(gr) == 6: | ||
| 63 | par = (gr[0], gr[1], gr[2], gr[3], gr[4], style, gr[5]) | ||
| 64 | plot += ["'%s' using %s:%s:%s:%s with %s title '%s'" % par] | ||
| 65 | else: | ||
| 66 | par = gr | ||
| 67 | plot += ["'%s' using %s:%s title '%s' with %s" % par] | ||
| 61 | if plot: | 68 | if plot: |
| 62 | g('plot ' + ', '.join(plot)) | 69 | g('plot ' + ', '.join(plot)) |
| 63 | if format != 'show' and fname: | 70 | if format != 'show' and fname: |
| @@ -9,11 +9,8 @@ from gnuplot import gnuplot, FORMATS | |||
| 9 | 9 | ||
| 10 | options = [ | 10 | options = [ |
| 11 | o(None, '--shared-l3', action='store_true', dest='sharedL3'), | 11 | o(None, '--shared-l3', action='store_true', dest='sharedL3'), |
| 12 | o(None, '--all', action='store_true', dest='alloh', help='Print a single \ | ||
| 13 | plot for all overheads (assume the file list contains all different \ | ||
| 14 | overheads to plot)'), | ||
| 15 | o(None, '--name', action='store', dest='name', help='where to store the \ | 12 | o(None, '--name', action='store', dest='name', help='where to store the \ |
| 16 | output WHEN using --all'), | 13 | output'), |
| 17 | o(None, '--type', action='store', dest='type', type='choice', | 14 | o(None, '--type', action='store', dest='type', type='choice', |
| 18 | choices=['hard','soft'], help='type of plot'), | 15 | choices=['hard','soft'], help='type of plot'), |
| 19 | o('-f', '--format', action='store', dest='format', type='choice', | 16 | o('-f', '--format', action='store', dest='format', type='choice', |
| @@ -24,11 +21,11 @@ output WHEN using --all'), | |||
| 24 | 21 | ||
| 25 | defaults = { | 22 | defaults = { |
| 26 | 'sharedL3' : False, | 23 | 'sharedL3' : False, |
| 27 | 'alloh' : False, | 24 | 'name' : 'test', |
| 28 | 'type' : 'hard', | 25 | 'type' : 'hard', |
| 29 | 'format' : 'show', | 26 | 'format' : 'show', |
| 30 | 'xrange' : (74.5, 250.5), | 27 | 'xrange' : (74.5, 250.5), |
| 31 | 'yrange' : (0, 5000), | 28 | 'yrange' : (100, 1700), |
| 32 | 'xticks' : (0, 25), | 29 | 'xticks' : (0, 25), |
| 33 | 'yticks' : (0, 250), | 30 | 'yticks' : (0, 250), |
| 34 | 'title' : None, | 31 | 'title' : None, |
| @@ -37,7 +34,17 @@ defaults = { | |||
| 37 | 'paper' : False, | 34 | 'paper' : False, |
| 38 | 'split' : False, | 35 | 'split' : False, |
| 39 | 'wide' : False, | 36 | 'wide' : False, |
| 40 | } | 37 | } |
| 38 | |||
| 39 | JOB_TYPE = { | ||
| 40 | 'NP' : 'Non Preemptive jobs', | ||
| 41 | 'P' : 'Preemptive jobs' | ||
| 42 | } | ||
| 43 | |||
| 44 | BWORK = { | ||
| 45 | 'bg' : 'with background work', | ||
| 46 | 'idle' : 'without background work' | ||
| 47 | } | ||
| 41 | 48 | ||
| 42 | def overhead_heading(conf, sharedL3=False): | 49 | def overhead_heading(conf, sharedL3=False): |
| 43 | ovd_type = 'unknowkn overhead' | 50 | ovd_type = 'unknowkn overhead' |
| @@ -52,107 +59,76 @@ def overhead_heading(conf, sharedL3=False): | |||
| 52 | elif conf['ovd'] == 'l2cache': | 59 | elif conf['ovd'] == 'l2cache': |
| 53 | ovd_type = 'Shared L2' | 60 | ovd_type = 'Shared L2' |
| 54 | elif conf['ovd'] == 'offchip': | 61 | elif conf['ovd'] == 'offchip': |
| 55 | ovd_type = 'Off Chip' | 62 | ovd_type = 'Diff. Socket' |
| 56 | 63 | ||
| 57 | return ovd_type | 64 | return ovd_type |
| 58 | 65 | ||
| 59 | class PmPlotter(defapp.App): | 66 | class PmPlotter(defapp.App): |
| 60 | def __init__(self): | 67 | def __init__(self): |
| 61 | defapp.App.__init__(self, options, defaults, no_std_opts=True) | 68 | defapp.App.__init__(self, options, defaults, no_std_opts=True) |
| 62 | # "private" values needed when --all options is given | ||
| 63 | self.graphs_list = [] | 69 | self.graphs_list = [] |
| 64 | self.title = '' | 70 | self.title = '' |
| 71 | self.fname = {'ovd':set([]), 'wss':set([])} | ||
| 65 | self.tmpfile_list = [] | 72 | self.tmpfile_list = [] |
| 66 | self.conf = [] | 73 | self.conf = [] |
| 67 | 74 | ||
| 75 | def compose_name(self, conf): | ||
| 76 | name = 'pm_' | ||
| 77 | name += ('avg' if 'soft' in conf else 'wc') | ||
| 78 | name += '_wss=' | ||
| 79 | wsses = [] | ||
| 80 | for i in self.fname['wss']: | ||
| 81 | wsses.append(i) | ||
| 82 | for i in sorted(wsses, key=int): | ||
| 83 | name += str(i) + ',' | ||
| 84 | name = name[0:-1] | ||
| 85 | name += '_ovd=' | ||
| 86 | for i in self.fname['ovd']: | ||
| 87 | name += str(i) + ',' | ||
| 88 | name = name[0:-1] | ||
| 89 | return name | ||
| 90 | |||
| 68 | def plot(self, graphs, title, name, conf, **xtra): | 91 | def plot(self, graphs, title, name, conf, **xtra): |
| 92 | name = self.compose_name(conf) | ||
| 93 | print name | ||
| 69 | gnuplot(graphs, title=title, | 94 | gnuplot(graphs, title=title, |
| 70 | xlabel=self.options.xlabel, | 95 | xlabel=self.options.xlabel, |
| 71 | ylabel=self.options.ylabel + | 96 | ylabel=self.options.ylabel + |
| 72 | (' [avg]' if 'soft' in conf else ' [max]'), | 97 | (' [avg]' if 'soft' in conf else ' [max]'), |
| 73 | xrange=self.options.xrange, | 98 | #xrange=self.options.xrange, |
| 74 | yrange=self.options.yrange, | 99 | #yrange=self.options.yrange, |
| 75 | xticks=self.options.xticks, | 100 | #xticks=self.options.xticks, |
| 76 | yticks=self.options.yticks, | 101 | #yticks=self.options.yticks, |
| 77 | format=self.options.format, | 102 | format=self.options.format, |
| 103 | style=('yerrorlines' if 'soft' in conf else 'linespoints'), | ||
| 78 | fname=name, **xtra) | 104 | fname=name, **xtra) |
| 79 | 105 | ||
| 80 | def plot_wide(self, graphs, title, name, conf, **xtra): | 106 | def compose_title(self, conf): |
| 81 | tops = 'rounded size 16cm,6.5cm' | 107 | if self.title == '': |
| 82 | gnuplot(graphs, title=title, | 108 | if 'soft' in conf: |
| 83 | xlabel=self.options.xlabel, | 109 | self.title = 'measured average overhead to 2nd hot access' |
| 84 | ylabel=self.options.ylabel + | 110 | else: |
| 85 | (' [avg]' if 'soft' in conf else ' [max]'), | 111 | self.title = 'measured maximum overhead to 2nd hot access' |
| 86 | xrange=self.options.xrange, | ||
| 87 | yrange=self.options.yrange, | ||
| 88 | xticks=self.options.xticks, | ||
| 89 | yticks=self.options.yticks, | ||
| 90 | format=self.options.format, | ||
| 91 | fname=name, | ||
| 92 | term_opts=tops, | ||
| 93 | **xtra) | ||
| 94 | |||
| 95 | def plot_paper(self, graphs, title, name, conf, **xtra): | ||
| 96 | tops = 'color solid font "Helvetica,10" linewidth 1.0 rounded size 16cm,8.5cm' | ||
| 97 | gnuplot(graphs, title=title, | ||
| 98 | xlabel=self.options.xlabel, | ||
| 99 | ylabel=self.options.ylabel + | ||
| 100 | (' [avg]' if 'soft' in conf else ' [max]'), | ||
| 101 | xrange=self.options.xrange, | ||
| 102 | yrange=self.options.yrange, | ||
| 103 | xticks=self.options.xticks, | ||
| 104 | yticks=self.options.yticks, | ||
| 105 | format=self.options.format, | ||
| 106 | fname=name, | ||
| 107 | key='off', | ||
| 108 | style='lines lw 7', | ||
| 109 | term_opts=tops) | ||
| 110 | |||
| 111 | def plot_pm(self, tmpfile, name, conf): | ||
| 112 | title = overhead_heading(conf, sharedL3=self.options.sharedL3) | ||
| 113 | title += ' ; ' + scenario_heading(conf, want_period=True) | ||
| 114 | plugin = conf['plugin'] | ||
| 115 | if 'soft' in conf: | ||
| 116 | name = 'soft_' + name | ||
| 117 | else: | ||
| 118 | name = 'hard_' + name | ||
| 119 | wsslist = conf['wss'].split(',') | ||
| 120 | graphs = [] | ||
| 121 | wsspos = 2 | ||
| 122 | if 'soft' in conf: | ||
| 123 | wsspos += 1 | ||
| 124 | for i in wsslist: | ||
| 125 | label = plugin + ' WSS=' + i | ||
| 126 | graphs.append((tmpfile, 1, wsspos, label)) | ||
| 127 | wsspos += 2 | ||
| 128 | |||
| 129 | if self.options.paper and self.options.format == 'pdf': | ||
| 130 | self.plot_paper(graphs, title, name, conf) | ||
| 131 | elif self.options.wide and self.options.format == 'pdf': | ||
| 132 | self.plot_wide(graphs, title, name, conf) | ||
| 133 | else: | ||
| 134 | self.plot(graphs, title, name, conf) | ||
| 135 | 112 | ||
| 136 | def add_to_graph_list(self, tmpfile, name, conf): | 113 | def add_to_graph_list(self, tmpfile, name, conf): |
| 137 | #self.title += overhead_heading(conf, sharedL3=self.options.sharedL3) | 114 | self.compose_title(conf) |
| 138 | #self.title += ' ; ' | ||
| 139 | wsslist = conf['wss'].split(',') | 115 | wsslist = conf['wss'].split(',') |
| 116 | self.fname['ovd'].add(conf['ovd']) | ||
| 140 | wsspos = 2 | 117 | wsspos = 2 |
| 141 | if 'soft' in conf: | 118 | if 'soft' in conf: |
| 142 | wsspos += 1 | 119 | wsspos += 1 |
| 143 | for i in wsslist: | 120 | for i in wsslist: |
| 144 | label = conf['plugin'] + ' ' + conf['ovd'] + ' WSS=' + i | 121 | self.fname['wss'].add(i) |
| 145 | self.graphs_list.append((tmpfile, 1, wsspos, label)) | 122 | label = conf['ovd'] + ' WSS=' + i |
| 146 | wsspos += 2 | 123 | if 'soft' in conf: |
| 147 | 124 | self.graphs_list.append((tmpfile, 1, wsspos, wsspos+1, \ | |
| 148 | def plot_graph_list(self, type, name='blob'): | 125 | wsspos+2, label)) |
| 149 | self.title = self.title[0:-3] | 126 | else: |
| 150 | if self.options.paper and self.options.format == 'pdf': | 127 | self.graphs_list.append((tmpfile, 1, wsspos, label)) |
| 151 | self.plot_paper(self.graphs_list, self.title, name, type) | 128 | wsspos += 4 |
| 152 | elif self.options.wide and self.options.format == 'pdf': | 129 | |
| 153 | self.plot_wide(self.graphs_list, self.title, name, type) | 130 | def plot_graph_list(self, type, name): |
| 154 | else: | 131 | self.plot(self.graphs_list, self.title, name, type) |
| 155 | self.plot(self.graphs_list, self.title, name, type) | ||
| 156 | 132 | ||
| 157 | # delete temporary data files | 133 | # delete temporary data files |
| 158 | for tmp in self.tmpfile_list: | 134 | for tmp in self.tmpfile_list: |
| @@ -170,20 +146,12 @@ class PmPlotter(defapp.App): | |||
| 170 | if tmpfile: | 146 | if tmpfile: |
| 171 | if 'pm' in conf: | 147 | if 'pm' in conf: |
| 172 | conf[self.options.type] = None | 148 | conf[self.options.type] = None |
| 173 | if self.options.alloh: | 149 | self.add_to_graph_list(tmpfile.name, name, conf) |
| 174 | self.add_to_graph_list(tmpfile.name, name, conf) | ||
| 175 | else: | ||
| 176 | self.plot_pm(tmpfile.name, name, conf) | ||
| 177 | else: | 150 | else: |
| 178 | self.err("Skipped '%s'; unknown experiment type." | 151 | self.err("Skipped '%s'; unknown experiment type." |
| 179 | % bname) | 152 | % bname) |
| 180 | 153 | # keep a list of temporary data files | |
| 181 | if self.options.alloh: | 154 | self.tmpfile_list.append(tmpfile) |
| 182 | # keep a list of temporary data files | ||
| 183 | self.tmpfile_list.append(tmpfile) | ||
| 184 | |||
| 185 | else: | ||
| 186 | del tmpfile # removes temp file | ||
| 187 | else: | 155 | else: |
| 188 | self.err("Skipped '%s'; it dosn't appear to contain data." | 156 | self.err("Skipped '%s'; it dosn't appear to contain data." |
| 189 | % bname) | 157 | % bname) |
| @@ -192,9 +160,8 @@ class PmPlotter(defapp.App): | |||
| 192 | for datafile in self.args: | 160 | for datafile in self.args: |
| 193 | self.plot_file(datafile) | 161 | self.plot_file(datafile) |
| 194 | 162 | ||
| 195 | if self.options.alloh: | 163 | # also clean up tmp data files |
| 196 | # also clean up tmp data files | 164 | self.plot_graph_list(self.options.type, self.options.name) |
| 197 | self.plot_graph_list(self.options.type, self.options.name) | ||
| 198 | 165 | ||
| 199 | if __name__ == "__main__": | 166 | if __name__ == "__main__": |
| 200 | PmPlotter().launch() | 167 | PmPlotter().launch() |
