source: doc/theses/colby_parsons_MMAth/benchmarks/waituntil/plotData.py

Last change on this file was 14e1053, checked in by caparsons <caparson@…>, 2 years ago

first draft of full waituntil chapter and conclusion chapter. Lots of graph/plotting utilities cleanup. Reran all CFA actor benchmarks after recent changes. Small changes to actor.tex in performance section

  • Property mode set to 100644
File size: 9.9 KB
Line 
1import os
2import sys
3import time
4import itertools
5import matplotlib.pyplot as plt
6import matplotlib.ticker as ticks
7import math
8from scipy import stats as st
9import numpy as np
10from enum import Enum
11from statistics import median
12
13import matplotlib
14matplotlib.use("pgf")
15matplotlib.rcParams.update({
16 "pgf.texsystem": "pdflatex",
17 'font.family': 'serif',
18 'text.usetex': True,
19 'pgf.rcfonts': False,
20 'font.size': 16
21})
22marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
23
24readfile = open(sys.argv[1], "r")
25
26machineName = ""
27
28if len(sys.argv) > 2:
29 machineName = sys.argv[2]
30
31# first line has num times per experiment
32line = readfile.readline()
33numTimes = int(line)
34
35# second line has processor args
36line = readfile.readline()
37procs = []
38for val in line.split():
39 procs.append(int(val))
40
41# 3rd line has processor for side_chan bench
42line = readfile.readline()
43sideChanProcs = []
44for val in line.split():
45 sideChanProcs.append(int(val))
46
47# 4th line has number of variants
48line = readfile.readline()
49names = line.split()
50numVariants = len(names)
51
52lines = (line.rstrip() for line in readfile) # All lines including the blank ones
53lines = (line for line in lines if line) # Non-blank lines
54
55def sci_format(x, pos):
56 return '{:.1e}'.format(x).replace('+0', '')
57
58def sci_format_label(x):
59 return '{:.2e}'.format(x).replace('+0', '')
60
61class Bench(Enum):
62 Unset = 0
63 Contend2 = 1
64 Contend4 = 2
65 Contend8 = 3
66 Spin2 = 4
67 Spin4 = 5
68 Spin8 = 6
69 SideChan = 7
70 Future = 8
71 Order = 9
72
73nameSet = False
74currBench = Bench.Unset # default val
75count = 0
76procCount = 0
77currVariant = 0
78name = ""
79title = ""
80experiment_duration = 10.0
81var_name = ""
82future_variants=["CFA", "uC++"]
83future_names=["OR", "AND", "AND-OR", "OR-AND"]
84future_data=[[0.0 for i in range(len(future_names))] for j in range(2)]
85future_bars=[[[0.0 for i in range(len(future_names))],[0.0 for k in range(len(future_names))]] for j in range(2)]
86curr_future=0
87sendData = [0.0 for j in range(numVariants)]
88data = [[0.0 for i in range(len(procs))] for j in range(numVariants)]
89bars = [[[0.0 for i in range(len(procs))],[0.0 for k in range(len(procs))]] for j in range(numVariants)]
90sideData = [[0.0 for i in range(len(sideChanProcs))] for j in range(numVariants)]
91sideBars = [[[0.0 for i in range(len(sideChanProcs))],[0.0 for k in range(len(sideChanProcs))]] for j in range(numVariants)]
92tempData = [0.0 for i in range(numTimes)]
93orderData = [0.0 for i in range(numVariants)]
94for idx, line in enumerate(lines):
95 # print(line)
96
97 if currBench == Bench.Unset:
98 if line == "contend2:":
99 name = "Contend_2"
100 title = "2 Clause Contend"
101 currBench = Bench.Contend2
102 elif line == "contend4:":
103 name = "Contend_4"
104 title = "4 Clause Contend"
105 currBench = Bench.Contend4
106 elif line == "contend8:":
107 name = "Contend_8"
108 title = "8 Clause Contend"
109 currBench = Bench.Contend8
110 elif line == "spin2:":
111 name = "Spin_2"
112 title = "2 Clause Spin"
113 currBench = Bench.Spin2
114 elif line == "spin4:":
115 name = "Spin_4"
116 title = "4 Clause Spin"
117 currBench = Bench.Spin4
118 elif line == "spin8:":
119 name = "Spin_8"
120 title = "8 Clause Spin"
121 currBench = Bench.Spin8
122 elif line == "sidechan:":
123 name = "Sidechan"
124 currBench = Bench.SideChan
125 elif line[0:6] == "future":
126 name = "Future"
127 title = "Future Synchronization"
128 currBench = Bench.Future
129 elif line == "order:":
130 name = "order"
131 currBench = Bench.Order
132 else:
133 print("Expected benchmark name")
134 print("Line: " + line)
135 sys.exit()
136 continue
137
138 if line[0:5] == "cores":
139 continue
140
141 if not nameSet:
142 nameSet = True
143 continue
144
145 lineArr = line.split()
146 tempData[count] = float(lineArr[-1]) / experiment_duration
147 count += 1
148
149 if currBench == Bench.Future:
150 if count == numTimes:
151 currMedian = median( tempData )
152 future_data[currVariant][curr_future] = currMedian
153 lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
154 future_bars[currVariant][0][curr_future] = currMedian - lower
155 future_bars[currVariant][1][curr_future] = upper - currMedian
156 count = 0
157 nameSet = False
158 currVariant += 1
159 if currVariant == 2:
160 curr_future += 1
161 # reset
162 currBench = Bench.Unset
163 currVariant = 0
164 if curr_future == len(future_names):
165 x = np.arange(len(future_names)) # the label locations
166 width = 0.45 # the width of the bars
167 multiplier = .5
168 fig, ax = plt.subplots(layout='constrained')
169 plt.title(title + " Benchmark")
170 plt.ylabel("Throughput (statement completions per second)")
171 plt.xlabel("Operation")
172 ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
173 for idx, arr in enumerate(future_data):
174 offset = width * multiplier
175 rects = ax.bar(x + offset, arr, width, label=future_variants[idx], yerr=[future_bars[idx][0], future_bars[idx][1]])
176 # ax.bar_label(rects, padding=3, fmt='%.1e')
177 ax.bar_label(rects, padding=3, fmt=sci_format_label)
178 multiplier += 1
179 plt.xticks(x + width, future_names)
180
181 ax.legend(future_variants, loc='lower right')
182 # fig.savefig("plots/" + machineName + name + ".png")
183 plt.savefig("plots/" + machineName + name + ".pgf")
184 fig.clf()
185
186 elif currBench == Bench.Order:
187 if count == numTimes:
188 currMedian = median( tempData )
189 orderData[currVariant] = currMedian
190 count = 0
191 currVariant += 1
192 procCount = 0
193 nameSet = False
194 if currVariant == numVariants:
195 fileName = "data/" + machineName + "Order"
196 f = open(fileName, 'w')
197 f.write(" & ".join(map(lambda a: str(int(a)), orderData)))
198
199 # reset
200 currBench = Bench.Unset
201 currVariant = 0
202
203 elif currBench == Bench.SideChan:
204 if count == numTimes:
205 currMedian = median( tempData )
206 sideData[currVariant][procCount] = currMedian
207 lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
208 sideBars[currVariant][0][procCount] = currMedian - lower
209 sideBars[currVariant][1][procCount] = upper - currMedian
210 count = 0
211 procCount += 1
212 if procCount == len(sideChanProcs):
213 procCount = 0
214 nameSet = False
215 currVariant += 1
216
217 if currVariant == numVariants:
218 fig, ax = plt.subplots()
219 plt.title(name + " Benchmark")
220 plt.ylabel("Throughput (channel operations per second)")
221 plt.xlabel("Cores")
222 ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
223 for idx, arr in enumerate(sideData):
224 plt.errorbar( sideChanProcs, arr, [sideBars[idx][0], sideBars[idx][1]], capsize=2, marker=next(marker) )
225 plt.xticks(sideChanProcs)
226 marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
227 # plt.yscale("log")
228 ax.legend(names)
229 # fig.savefig("plots/" + machineName + name + ".png")
230 plt.savefig("plots/" + machineName + name + ".pgf")
231 fig.clf()
232
233 # reset
234 currBench = Bench.Unset
235 currVariant = 0
236 else:
237 if count == numTimes:
238 currMedian = median( tempData )
239 data[currVariant][procCount] = currMedian
240 lower, upper = st.t.interval(0.95, numTimes - 1, loc=np.mean(tempData), scale=st.sem(tempData))
241 bars[currVariant][0][procCount] = currMedian - lower
242 bars[currVariant][1][procCount] = upper - currMedian
243 count = 0
244 procCount += 1
245
246 if procCount == len(procs):
247 procCount = 0
248 nameSet = False
249 currVariant += 1
250
251 if currVariant == numVariants:
252 fig, ax = plt.subplots(layout='constrained')
253 plt.title(title + " Benchmark")
254 plt.ylabel("Throughput (channel operations per second)")
255 plt.xlabel("Cores")
256 ax.yaxis.set_major_formatter(ticks.FuncFormatter(sci_format))
257 for idx, arr in enumerate(data):
258 plt.errorbar( procs, arr, [bars[idx][0], bars[idx][1]], capsize=2, marker=next(marker) )
259 plt.xticks(procs)
260 marker = itertools.cycle(('o', 's', 'D', 'x', 'p', '^', 'h', '*', 'v' ))
261 # plt.yscale("log")
262 # plt.ylim(1, None)
263 # ax.get_yaxis().set_major_formatter(ticks.ScalarFormatter())
264 # else:
265 # plt.ylim(0, None)
266 ax.legend(names)
267 # fig.savefig("plots/" + machineName + name + ".png")
268 plt.savefig("plots/" + machineName + name + ".pgf")
269 fig.clf()
270
271 # reset
272 currBench = Bench.Unset
273 currVariant = 0
Note: See TracBrowser for help on using the repository browser.