25 """Create a radar chart with num_vars axes."""
27 theta = 2*np.pi * np.linspace(0, 1-1./num_vars, num_vars)
31 def draw_poly_frame(self, x0, y0, r):
33 verts = [(r*np.cos(t) + x0, r*np.sin(t) + y0)
for t
in theta]
34 return plt.Polygon(verts, closed=
True, edgecolor=
'k')
36 def draw_circle_frame(self, x0, y0, r):
37 return plt.Circle((x0, y0), r)
39 frame_dict = {
'polygon': draw_poly_frame,
'circle': draw_circle_frame}
40 if frame
not in frame_dict:
41 raise ValueError(
"unknown value for `frame`: %s" % frame)
43 class RadarAxes(PolarAxes):
45 Class for creating a radar chart (a.k.a. a spider or star chart)
47 http://en.wikipedia.org/wiki/Radar_chart
53 draw_frame = frame_dict[frame]
55 def fill(self, *args, **kwargs):
56 """Override fill so that line is closed by default"""
57 closed = kwargs.pop(
'closed',
True)
58 return super(RadarAxes, self).fill(closed=closed, *args, **kwargs)
60 def plot(self, *args, **kwargs):
61 """Override plot so that line is closed by default"""
62 lines = super(RadarAxes, self).plot(*args, **kwargs)
66 def set_varlabels(self, labels):
67 self.set_thetagrids(theta * 180/np.pi, labels,fontsize=14)
69 def _gen_axes_patch(self):
72 return self.draw_frame(x0, y0, r)
74 register_projection(RadarAxes)
178def setRadarFigure(titles):
179 """Set the attributes for the radar plots"""
180 fig = plt.figure(figsize=(9,9))
181 rect = [0.1, 0.1, 0.8, 0.8]
182 labels = [0.2, 0.4, 0.6, 0.8, 1, 2, 3, 4, 5, 10]
183 matplotlib.rcParams.update({'font.size':13})
184 theta = radar_factory(len(titles))
185 ax = fig.add_axes(rect, projection='radar')
186 ax.set_rgrids(labels)
187 ax.set_varlabels(titles)
188 ax.text(theta[2], 1, "Linear->Log", horizontalalignment='center', color='green', fontsize=18)
189 return {'ax':ax, 'theta':theta}
192def drawRadarChart(data, kind, filebase, params, color):
193 """Draw the radar plots"""
196 for key in data.keys():
198 tmp_log[key] = np.log10(data[key])
200 tmp_lin[key] = (data[key])
201 params['ax'].plot(params['theta'], tmp_log, color='b', label=filebase+"_"+kind+"_log")
202 params['ax'].plot(params['theta'], tmp_lin, color='r', label=filebase+"_"+kind+"_linear")
203 params['ax'].legend(loc='best', bbox_to_anchor=(1.4,1.2))
204 params['ax'].set_rlim((0, np.ceil(max(tmp_log))))
206def multiAppBarChartSettings(ax, plt, index, width, n, tmp, s):
209 ax.set_xticks(index + width * n / 2)
210 ax.set_xticklabels(tmp[s]['Total'].keys(), rotation=50, horizontalalignment='right')
211 plt.xlabel("OMP Constructs")
212 plt.ylabel(statProperties[s][0])
213 plt.title(statProperties[s][1])
216def derivedTimerStats(data):
218 for key in data.keys():
219 if key == 'OMP_worker_thread_life':
220 totalRuntime = data['OMP_worker_thread_life']
221 elif key in ('FOR_static_iterations', 'OMP_PARALLEL_args',
222 'OMP_set_numthreads', 'FOR_dynamic_iterations'):
225 stats[key] = 100 * data[key] / totalRuntime
231 for key in data.keys():
232 if key in ('OMP_critical', 'OMP_single', 'OMP_serial',
233 'OMP_parallel', 'OMP_master', 'OMP_task_immediate',
234 'OMP_task_taskwait', 'OMP_task_taskyield', 'OMP_task_taskgroup',
235 'OMP_task_join_bar', 'OMP_task_plain_bar', 'OMP_task_taskyield'):
236 compKeys[key] = data[key]
238 nonCompKeys[key] = data[key]
239 print("comp keys:", compKeys, "\n\n non comp keys:", nonCompKeys)
240 return [compKeys, nonCompKeys]
242def drawMainPie(data, filebase, colors):
243 sizes = [sum(data[0].values()), sum(data[1].values())]
245 labels = ["Compute - " + "%.2f" % sizes[0], "Non Compute - " + "%.2f" % sizes[1]]
246 patches = plt.pie(sizes, explode, colors=colors, startangle=90)
247 plt.title("Time Division")
249 plt.legend(patches[0], labels, loc='best', bbox_to_anchor=(-0.1,1), fontsize=16)
250 plt.savefig(filebase+"_main_pie", bbox_inches='tight')
252def drawSubPie(data, tag, filebase, colors):
255 sizes = data.values()
258 for i in range(len(sizes)):
260 percent.append(100 * sizes[i] / total)
261 labels[i] = labels[i] + " - %.2f" % percent[i]
262 patches = plt.pie(sizes, explode=explode, colors=colors, startangle=90)
263 plt.title(tag+"(Percentage of Total:"+" %.2f" % (sum(data.values()))+")")
266 plt.legend(patches[0], labels, loc='best', bbox_to_anchor=(-0.1,1), fontsize=16)
267 plt.savefig(filebase+"_"+tag, bbox_inches='tight')
270 parser = argparse.ArgumentParser(description='''This script takes a list
271 of files containing each of which contain output from a stats-gathering
272 enabled OpenMP runtime library. Each stats file is read, parsed, and
273 used to produce a summary of the statistics''')
274 parser.add_argument('files', nargs='+',
275 help='files to parse which contain stats-gathering output')
276 command_args = parser.parse_args()
277 colors = ['orange', 'b', 'r', 'yellowgreen', 'lightsage', 'lightpink',
278 'green', 'purple', 'yellow', 'cyan', 'mediumturquoise',
281 matplotlib.rcParams.update({'font.size':22})
282 for s in interestingStats:
283 fig, ax = plt.subplots()
288 for f in command_args.files:
289 filebase = os.path.splitext(f)[0]
291 data = tmp[s]['Total']
292 """preventing repetition by removing rows similar to Total_OMP_work
293 as Total_OMP_work['Total'] is same as OMP_work['Total']"""
295 elapsedTime = tmp["timers"]["Mean"]["OMP_worker_thread_life"]
296 normalizeValues(tmp["counters"], "SampleCount",
298 """Plotting radar charts"""
299 params = setRadarFigure(data.keys())
301 drawRadarChart(data, s, filebase, params, colors[n])
302 """radar Charts finish here"""
303 plt.savefig(filebase + "_" + s + "_" + chartType, bbox_inches="tight")
305 print("overheads in " + filebase)
306 numThreads = tmp[s]["SampleCount"]["Total_OMP_parallel"]
307 for key in data.keys():
308 if key[0:5] == 'Total':
310 stats[filebase] = derivedTimerStats(data)
311 dataSubSet = compPie(stats[filebase])
312 drawMainPie(dataSubSet, filebase, colors)
314 drawSubPie(dataSubSet[0], "Computational Time", filebase, colors)
316 drawSubPie(dataSubSet[1], "Non Computational Time", filebase, colors)
317 with open('derivedStats_{}.csv'.format(filebase), 'w') as f:
318 f.write('================={}====================\n'.format(filebase))
319 f.write(pd.DataFrame(stats[filebase].items()).to_csv()+'\n')