Peano
Loading...
Searching...
No Matches
print-kernel-speedup.py
Go to the documentation of this file.
1import matplotlib.pyplot as plt
2import matplotlib as mpl
3import numpy as np
4import re
5from math import log
6import sys
7import os.path
8import math
9from pathlib import Path
10import matplotlib.ticker as mticker
11from matplotlib.lines import Line2D
12
13def log10_tick_formatter(val, pos=None):
14 return r"$10^{:.0f}$".format(val)
15
16def log2_tick_formatter(val, pos=None):
17 return r"$2^{:.0f}$".format(val)
18
19params = {
20 "axes.labelsize": 20,
21 "axes.titlesize": 20,
22 "font.size": 20,
23 "font.family": "serif",
24 "legend.fontsize": 20,
25 "xtick.labelsize": 16,
26 "ytick.labelsize": 16,
27 "xtick.direction": "in",
28 "ytick.direction": "in",
29 "xtick.top": True,
30 "ytick.right": True,
31 "xtick.major.width": 1.5,
32 "ytick.major.width": 1.5,
33 "axes.linewidth": 1.5,
34 "axes.labelsize": 20,
35 "text.usetex": True,
36 "figure.dpi": 300,
37 "figure.autolayout": True,
38 # 'figure.figsize': (10,10),
39}
40mpl.rcParams.update(params)
41
42cells = ['0064', '0128', '0256', '0512', '1024']
43arches = ['x64', 'aarch64']
44predicates = ['true', 'false']
45symmetry = ['true', 'false']
46
47kernels = {
48 'force': ['scattered,generic',
49 'continuous,generic',
50 'continuous,local-active-coalesced',
51 'continuous,active-local-coalesced'],
52 'density': ['scattered,generic',
53 'continuous,generic',
54 'continuous,local-active-coalesced',
55 'continuous,active-local-coalesced'],
56 'kick1': ['scattered,generic',
57 'continuous,generic',
58 'continuous,coalesced'],
59 'kick2': ['scattered,generic',
60 'continuous,generic',
61 'continuous,coalesced'],
62 'drift': ['scattered,generic',
63 'continuous,generic',
64 'continuous,coalesced'],
65}
66
67kernel_names = {
68 'scattered,generic': 'generic scat.',
69 'continuous,generic': 'generic cont.',
70 'continuous,coalesced': 'coalesced cont.',
71 'continuous,local-active-coalesced': 'coalesced local-active cont.',
72 'continuous,active-local-coalesced': 'coalesced active-local cont.',
73}
74
75def read_kernel_speedup(data_aos, data_soa, kernel, kernel_variant):
76 variant_prefix = f'{kernel} ({kernel_variant}):\t'
77 variant_times_aos = [float(line.split(variant_prefix)[1].split(' ')[0]) for line in data_aos.split('\n') if variant_prefix in line]
78 variant_times_soa = [float(line.split(variant_prefix)[1].split(' ')[0]) for line in data_soa.split('\n') if variant_prefix in line]
79 variant_speedups = np.array(variant_times_aos) / np.array(variant_times_soa)
80
81 particle_sizes = [int(line.split( "Experiment:" )[1].split( "particles" )[0]) for line in data_aos.split('\n') if 'Experiment' in line]
82 return particle_sizes, variant_speedups
83
84def read_kernel_speedup_classic(folder, arch, kernel, kernel_variant, pred, sym='false', cell=cells[-1]):
85 data_aos = Path(f'{folder}/out-{arch}-soafalse-cell{cell}-pred{pred}-sym{sym}.log').read_text()
86 data_soa = Path(f'{folder}/out-{arch}-soatrue-cell{cell}-pred{pred}-sym{sym}.log').read_text()
87 return read_kernel_speedup(data_aos, data_soa, kernel, kernel_variant)
88
89def read_kernel_speedup_offload(folder, arch, kernel, kernel_variant, cell=cells[-1]):
90 data_aos = Path(f'{folder}/out-{arch}-soafalse-cell{cell}-predfalse-symfalse-gpufalse.log').read_text()
91 data_soa = Path(f'{folder}/out-{arch}-soatrue-cell{cell}-predfalse-symfalse-gputrue.log').read_text()
92 return read_kernel_speedup(data_aos, data_soa, kernel, kernel_variant)
93
94def read_kernel_speedup_offload_shmem(folder, arch, kernel, kernel_variant, cell=cells[-1]):
95 data_aos = Path(f'{folder}/out-{arch}-soafalse-cell{cell}-predfalse-symfalse-gpufalse-shmem.log').read_text()
96 data_soa = Path(f'{folder}/out-{arch}-soatrue-cell{cell}-predfalse-symfalse-gputrue-shmem.log').read_text()
97 return read_kernel_speedup(data_aos, data_soa, kernel, kernel_variant)
98
99Colors = [ "#20a040", "#a04020", "#4020a0", "#f0a0f0", "#f06030", "#6030f0" ]
100Symbols = [ "-s", "-o", "-^", "-v", "-<", "->" ]
101
102# Graph1 is a 2d graph that shows the normalised speedup over the AoS version
103# for a given cell size (a default in `read_kernel_speedup`)
104def print_graph_1(folder, arch, kernel):
105 plt.clf()
106 mpl.rcParams.update(params)
107
108 for counter, variant in enumerate(kernels[kernel]):
109 for pred in predicates:
110 particle_sizes, speedups = read_kernel_speedup_classic(folder, arch, kernel, variant, pred)
111 pred = True if pred == 'true' else False
112 symbol = f'{'-' if not pred else ''}{Symbols[counter]}'
113 variant_name = kernel_names[variant]
114 plt.plot(particle_sizes, speedups, symbol, color=Colors[counter], label=f'{variant_name}(pred. {'on' if pred else 'off'})')
115
116 plt.xlabel("Particles")
117 plt.ylabel("Norm kernel speedup over AoS version")
118
119 plt.xscale('log', base=10)
120
121 plt.minorticks_on()
122 plt.grid(True, which='both')
123
124 plt.axhline(y = 1, color = 'k', linestyle = '--')
125
126 plt.savefig(f"{folder}/plot-1-{arch}-{kernel}.pdf")
127 plt.savefig(f"{folder}/plot-1-{arch}-{kernel}.png")
128
129 legend = plt.legend()
130 fig_legend = plt.figure(figsize=(14, 2))
131 ax_legend = fig_legend.add_subplot(111)
132 ax_legend.axis("off")
133 ax_legend.legend(handles=legend.legend_handles, labels=[text.get_text() for text in legend.get_texts()], loc="center", ncol=4, frameon=False)
134 fig_legend.savefig(f"{folder}/plot-1-{arch}-{kernel}-legend.pdf", bbox_inches='tight', dpi=300)
135 fig_legend.savefig(f"{folder}/plot-1-{arch}-{kernel}-legend.png", bbox_inches='tight', dpi=300)
136
137 plt.close('all') # Close all figures
138 plt.rcdefaults() # Reset rcParams to defaults
139
140# Graph2 is a 3d graph that shows the normalised speedup over the AoS version
141# over all cell sizes but turned off predicates and symmetric interactions
142def print_graph_2(folder, arch, kernel):
143 plt.clf()
144 mpl.rcParams.update(params)
145
146 ax = plt.axes(projection='3d')
147
148 ax.set_xlabel("Particles")
149 ax.set_ylabel("Cell size")
150 ax.set_zlabel('Norm kernel speedup over AoS version', rotation=60)
151
152 ax.xaxis.set_major_formatter(mticker.FuncFormatter(log10_tick_formatter))
153 ax.yaxis.set_major_formatter(mticker.FuncFormatter(log2_tick_formatter))
154
155 legend_handles = []
156 for counter, variant in enumerate(kernels[kernel]):
157 variant_name = kernel_names[variant]
158 marker = f'{Symbols[counter][-1]}'
159 colour = Colors[counter]
160 legend_handles += [Line2D([0], [0], marker=marker, color=colour, label=f'{variant_name}', linestyle='--')]
161 for cell in cells:
162 particle_sizes, speedups = read_kernel_speedup_classic(folder, arch, kernel, variant, pred='false', sym='false', cell=cell)
163 ax.plot(np.log10(particle_sizes), np.log2(np.full_like(particle_sizes, int(cell))), speedups, color=colour, marker=marker, linestyle='--')
164
165 plt.savefig(f"{folder}/plot-2-{arch}-{kernel}.pdf")
166 plt.savefig(f"{folder}/plot-2-{arch}-{kernel}.png")
167
168 fig_legend = plt.figure(figsize=(14, 1))
169 ax_legend = fig_legend.add_subplot(111)
170 ax_legend.axis("off")
171 ax_legend.legend(handles=legend_handles, loc="center", ncol=4, frameon=False)
172 fig_legend.savefig(f"{folder}/plot-2-{arch}-{kernel}-legend.pdf", bbox_inches='tight', dpi=300)
173 fig_legend.savefig(f"{folder}/plot-2-{arch}-{kernel}-legend.png", bbox_inches='tight', dpi=300)
174
175 plt.close('all') # Close all figures
176 plt.rcdefaults() # Reset rcParams to defaults
177
178# Graph3 is a 3d graph that shows normalised speedups for offloaded kernels over vanilla AoS version
179# Only generic schemes are tested
180def print_graph_3(folder, arch, kernel):
181 plt.clf()
182 mpl.rcParams.update(params)
183
184 ax = plt.axes(projection='3d')
185
186 ax.set_xlabel("Particles")
187 ax.set_ylabel("Cell size")
188 ax.set_zlabel('Norm kernel speedup over AoS version')
189
190 ax.xaxis.set_major_formatter(mticker.FuncFormatter(log10_tick_formatter))
191 ax.yaxis.set_major_formatter(mticker.FuncFormatter(log2_tick_formatter))
192
193 legend_handles = []
194 for counter, variant in enumerate(kernels[kernel][0:2]):
195 variant_name = kernel_names[variant]
196 marker = f'{Symbols[counter][-1]}'
197 colour = Colors[counter]
198 legend_handles += [Line2D([0], [0], marker=marker, color=colour, label=f'{variant_name}', linestyle='--')]
199 for cell in cells:
200 particle_sizes, speedups = read_kernel_speedup_offload(folder, arch, kernel, variant, cell=cell)
201 ax.plot(np.log10(particle_sizes), np.log2(np.full_like(particle_sizes, int(cell))), speedups, color=colour, marker=marker, linestyle='--')
202
203 plt.savefig(f"{folder}/plot-3-{arch}-{kernel}.pdf")
204 plt.savefig(f"{folder}/plot-3-{arch}-{kernel}.png")
205
206 fig_legend = plt.figure(figsize=(14, 1))
207 ax_legend = fig_legend.add_subplot(111)
208 ax_legend.axis("off")
209 ax_legend.legend(handles=legend_handles, loc="center", ncol=4, frameon=False)
210 fig_legend.savefig(f"{folder}/plot-3-{arch}-{kernel}-legend.pdf", bbox_inches='tight', dpi=300)
211 fig_legend.savefig(f"{folder}/plot-3-{arch}-{kernel}-legend.png", bbox_inches='tight', dpi=300)
212
213 plt.close('all') # Close all figures
214 plt.rcdefaults() # Reset rcParams to defaults
215
216# Graph4 is a 3d graph that shows normalised speedups for offloaded kernels over vanilla AoS version
217# using shared memory
218# Only generic schemes are tested
219def print_graph_4(folder, arch, kernel):
220 plt.clf()
221 mpl.rcParams.update(params)
222
223 ax = plt.axes(projection='3d')
224
225 ax.set_xlabel("Particles")
226 ax.set_ylabel("Cell size")
227 ax.set_zlabel('Norm kernel speedup over AoS version')
228
229 ax.xaxis.set_major_formatter(mticker.FuncFormatter(log10_tick_formatter))
230 ax.yaxis.set_major_formatter(mticker.FuncFormatter(log2_tick_formatter))
231
232 legend_handles = []
233 for counter, variant in enumerate(kernels[kernel][0:2]):
234 variant_name = kernel_names[variant]
235 marker = f'{Symbols[counter][-1]}'
236 colour = Colors[counter]
237 legend_handles += [Line2D([0], [0], marker=marker, color=colour, label=f'{variant_name}', linestyle='--')]
238 for cell in cells:
239 particle_sizes, speedups = read_kernel_speedup_offload_shmem(folder, arch, kernel, variant, cell=cell)
240 ax.plot(np.log10(particle_sizes), np.log2(np.full_like(particle_sizes, int(cell))), speedups, color=colour, marker=marker, linestyle='--')
241
242 plt.savefig(f"{folder}/plot-4-{arch}-{kernel}.pdf")
243 plt.savefig(f"{folder}/plot-4-{arch}-{kernel}.png")
244
245 fig_legend = plt.figure(figsize=(14, 1))
246 ax_legend = fig_legend.add_subplot(111)
247 ax_legend.axis("off")
248 ax_legend.legend(handles=legend_handles, loc="center", ncol=4, frameon=False)
249 fig_legend.savefig(f"{folder}/plot-4-{arch}-{kernel}-legend.pdf", bbox_inches='tight', dpi=300)
250 fig_legend.savefig(f"{folder}/plot-4-{arch}-{kernel}-legend.png", bbox_inches='tight', dpi=300)
251
252 plt.close('all') # Close all figures
253 plt.rcdefaults() # Reset rcParams to defaults
254
255def print_graphs(folder):
256 for arch in arches:
257 for kernel in kernels:
258 try:
259 print_graph_1(folder, arch, kernel)
260 except:
261 pass
262 for arch in arches:
263 for kernel in kernels:
264 try:
265 print_graph_2(folder, arch, kernel)
266 except:
267 pass
268 for arch in arches:
269 for kernel in kernels:
270 try:
271 print_graph_3(folder, arch, kernel)
272 except:
273 pass
274 for arch in arches:
275 for kernel in kernels:
276 try:
277 print_graph_4(folder, arch, kernel)
278 except:
279 pass
280
281if __name__== "__main__":
282 if len(sys.argv) < 2:
283 print( "ERROR: Please pass in folders to work on. ")
284 else:
285 for folder in sys.argv[1:]:
286 print_graphs(folder)
log10_tick_formatter(val, pos=None)
print_graph_3(folder, arch, kernel)
log2_tick_formatter(val, pos=None)
print_graph_2(folder, arch, kernel)
read_kernel_speedup_classic(folder, arch, kernel, kernel_variant, pred, sym='false', cell=cells[-1])
read_kernel_speedup_offload(folder, arch, kernel, kernel_variant, cell=cells[-1])
print_graph_1(folder, arch, kernel)
print_graph_4(folder, arch, kernel)
read_kernel_speedup(data_aos, data_soa, kernel, kernel_variant)
read_kernel_speedup_offload_shmem(folder, arch, kernel, kernel_variant, cell=cells[-1])