Peano
Loading...
Searching...
No Matches
kernel-benchmarks-fv-rusanov-dsl.py
Go to the documentation of this file.
1# This file is part of the ExaHyPE2 project. For conditions of distribution and
2# use, please see the copyright notice at www.peano-framework.org
3import os
4import subprocess
5import argparse
6import jinja2
7
8import peano4.api
9import exahype2
10import exahype2.dslhype as DSL
11
12from CCZ4Solver import CCZ4Solver_FV_GlobalAdaptiveTimeStepWithEnclaveTasking
13
14parser = argparse.ArgumentParser(
15 description="ExaHyPE 2 - CCZ4 Finite Volume Rusanov Kernel Benchmarking Script"
16)
17parser.add_argument(
18 "-m",
19 "--build-mode",
20 choices=peano4.api.output.CompileModes,
21 default=peano4.api.output.CompileModes[0], # Release
22 help="|".join(peano4.api.output.CompileModes),
23)
24parser.add_argument(
25 "-t",
26 "--num-threads",
27 default=1,
28 type=int,
29 help="Number of launching threads",
30)
31parser.add_argument(
32 "-ps",
33 "--patch-size",
34 default=16,
35 type=int,
36 help="Number of finite volumes per axis (dimension) per patch.",
37)
38parser.add_argument(
39 "-p",
40 "--num-patches",
41 nargs="+",
42 default=[32, 64, 128, 256, 512, 1024, 2048],
43 type=int,
44 help="Number of patches to study",
45)
46parser.add_argument(
47 "-samples",
48 "--samples",
49 default=10,
50 type=int,
51 help="Number of samples per measurement",
52)
53parser.add_argument(
54 "-a",
55 "--accuracy",
56 default=0.0,
57 type=float,
58 help="Floating point accuracy to which the different kernel variants have to match (absolute). Pass in 0 to disable correctness check. Pass in values < 0 to use machine epsilon (default).",
59)
60parser.add_argument(
61 "-e",
62 "--eval-eig",
63 action="store_false",
64 help="Evaluate max. eigenvalue",
65)
66parser.add_argument(
67 "-cpu",
68 "--cpu",
69 action="store_true",
70 help="Assess host kernels",
71)
72parser.add_argument(
73 "-gpu",
74 "--gpu",
75 action="store_true",
76 help="Assess device kernels",
77)
78parser.add_argument(
79 "-serial",
80 "--serial",
81 action="store_true",
82 help="Assess serial kernels",
83)
84parser.add_argument(
85 "-parallel",
86 "--parallel",
87 action="store_true",
88 help="Assess parallel kernels",
89)
90parser.add_argument(
91 "-fpe",
92 "--fpe",
93 action="store_true",
94 help="Enable a floating-point exception handler.",
95)
96parser.add_argument(
97 "-d",
98 "--dimensions",
99 default=3,
100 choices = [3],
101 type=int,
102 help="Number of dimensions to use: only 3 makes sense for this application",
103)
104parser.add_argument(
105 "--enable-mlir",
106 dest="enable_mlir",
107 action="store_true",
108 help="Enable MLIR kernel compilation support",
109)
110parser.add_argument(
111 "--enable-cpp",
112 dest="enable_cpp",
113 action="store_true",
114 help="Enable CPP kernels",
115)
116parser.add_argument(
117 "--enable-memref-flattening",
118 dest="enable_memref_flattening",
119 action="store_true",
120 help="Enable CPP kernels",
121)
122parser.add_argument(
123 "--enable-function-inlining",
124 dest="enable_function_inlining",
125 action="store_true",
126 help="Enable inlining of Polygeist functions",
127)
128parser.add_argument(
129 "--enable-memory-reuse",
130 dest="enable_memory_reuse",
131 action="store_true",
132 help="Enable reuse of scratchpad memory allocations",
133)
134parser.add_argument(
135 "--enable-memory-fusion",
136 dest="enable_memory_fusion",
137 action="store_true",
138 help="Enable fusion of allocations into one",
139)
140parser.add_argument(
141 "--enable-loop-fusion",
142 dest="enable_loop_fusion",
143 action="store_true",
144 help="Enable fusion of loops with the same bounds",
145)
146parser.add_argument(
147 "--enable-imperfect-nested-loops-to-perfect",
148 dest="enable_imperfect_nested_loops_to_perfect",
149 action="store_true",
150 help="Enable conversion of imperfectly nested parallels into a perfectly nested parallels",
151)
152parser.add_argument(
153 "--enable-nested-parallel-ops-to-multidimensional",
154 dest="enable_nested_parallel_ops_to_multidimensional",
155 action="store_true",
156 help="Enable conversion of nested parallels into a single multidimensional operation",
157)
158parser.add_argument(
159 "--enable-omp-tasks",
160 dest="enable_omp_tasks",
161 action="store_true",
162 help="Enable use of OpenMP tasks as opposed to loop parallelism",
163)
164parser.add_argument(
165 "--omp-task-version",
166 choices=["task", "taskloop"],
167 default="taskloop"
168)
169parser.add_argument(
170 "--omp-single-region",
171 action="store_true",
172)
173parser.add_argument(
174 "--nested-parallel-count",
175 default=-1,
176 type=int,
177 help="Number of dimensions to use: 2 or 3. Conversion is enabled if the count is positive.",
178)
179parser.add_argument(
180 "-j",
181 default=-1,
182 type=int,
183 help="Number of parallel builds to use",
184)
185parser.add_argument(
186 "-o",
187 default="KernelBenchmarksFVRusanovDSL",
188 type=str,
189 help="Name of final application",
190)
191args = parser.parse_args()
192
194 name="FVRusanov",
195 patch_size=args.patch_size,
196 min_volume_h=0.001, # max_cell_size -> arbitrary value
197 max_volume_h=0.001, # min_cell_size -> arbitrary value
198 pde_terms_without_state=True
199)
200
201project = exahype2.Project(
202 namespace=["benchmarks", "exahype2", "kernelbenchmarks"],
203 project_name="KernelBenchmarksFVRusanovDSL",
204 directory=".",
205 executable=f"{args.o}.{args.build_mode}",
206)
207fv_rusanov_solver.add_all_solver_constants()
208project.add_solver(fv_rusanov_solver)
209
210project.set_global_simulation_parameters(
211 dimensions=args.dimensions,
212 size=[1.0] * args.dimensions,
213 offset=[0.0] * args.dimensions,
214 min_end_time=0.1,
215 max_end_time=0.1,
216 first_plot_time_stamp=0.0,
217 time_in_between_plots=0.0,
218 periodic_BC=[False] * args.dimensions
219)
220
221project.set_Peano4_installation("../../../../", mode=peano4.api.output.string_to_mode(args.build_mode))
222project = project.generate_Peano4_project(verbose=True)
223
224accuracy = args.accuracy
225if accuracy < 0:
226 import numpy
227 accuracy = default = numpy.finfo(float).eps
228project.constants.export_constexpr_with_type("Accuracy", str(accuracy), "double")
229
230project.constants.export_constexpr_with_type("NumberOfSamples", str(args.samples), "int")
231
232formatted_num_patches = "{{{}}}".format(", ".join(str(val) for val in args.num_patches))
233project.constants.export_const_with_type("NumberOfPatchesToStudy", str(formatted_num_patches), "tarch::la::Vector<%s, int>" % len(args.num_patches))
234
235project.constants.export_constexpr_with_type("NumberOfLaunchingThreads", str(args.num_threads), "int")
236
237if args.fpe:
238 project.constants.export_boolean("EnableFPE", True)
239else:
240 project.constants.export_boolean("EnableFPE", False)
241
242# CPU is enabled by default if neither CPU nor GPU are specified
243if args.cpu == False and args.gpu == False:
244 project.output.makefile.add_CXX_flag("-DASSESS_HOST_KERNELS")
245else:
246 if args.cpu: project.output.makefile.add_CXX_flag("-DASSESS_HOST_KERNELS")
247 if args.gpu: project.output.makefile.add_CXX_flag("-DASSESS_DEVICE_KERNELS")
248
249if args.serial == False and args.parallel == False:
250 project.output.makefile.add_CXX_flag("-DASSESS_SERIAL_KERNELS")
251 project.output.makefile.add_CXX_flag("-DASSESS_PARALLEL_KERNELS")
252else:
253 if args.serial: project.output.makefile.add_CXX_flag("-DASSESS_SERIAL_KERNELS")
254 if args.parallel: project.output.makefile.add_CXX_flag("-DASSESS_PARALLEL_KERNELS")
255
256project.constants.export_boolean("EvaluateFlux", False)
257project.constants.export_boolean("EvaluateNonconservativeProduct", True)
258project.constants.export_boolean("EvaluateSource", True)
259project.constants.export_boolean("EvaluateMaximumEigenvalueAfterTimeStep", True if args.eval_eig else False) # Reduction
260
261project.constants.define_value("GAMMA", str(1.0))
262
263# MLIR Integration Support
264if args.enable_mlir:
265 if args.enable_memory_reuse:
266 max_patch_size = (args.patch_size + 2) * (args.patch_size + 2) * (args.patch_size + 2) * 59
267 else:
268 max_patch_size = -1
269 DSL.set_mlir_environment(project, "rusanov", f"ccz4_physics.mlir", args.dimensions, args.gpu,
270 args.enable_memref_flattening,
271 args.enable_function_inlining,
272 args.nested_parallel_count,
273 args.enable_imperfect_nested_loops_to_perfect,
274 args.enable_nested_parallel_ops_to_multidimensional,
275 args.enable_omp_tasks,
276 args.omp_task_version,
277 args.omp_single_region,
278 max_patch_size,
279 args.enable_memory_fusion,
280 args.enable_loop_fusion
281 )
282 project.output.makefile.add_CXX_flag("-DASSESS_MLIR_KERNELS")
283
284# CPP is enabled by default if MLIR is not enabled
285if args.enable_cpp or not args.enable_mlir:
286 project.output.makefile.add_CXX_flag("-DASSESS_CPP_KERNELS")
287
288
289benchmark_main_file = "../../kernel-benchmarks/KernelBenchmarksFVRusanovDSL-main.cpp"
290os.system("cp {} KernelBenchmarksFVRusanovDSL-main.cpp".format(benchmark_main_file))
291
292project.output.makefile.add_CXX_flag("-DGRAV=9.81")
293
294fv_rusanov_solver.add_makefile_parameters(
295 project, "../../../../applications/exahype2/ccz4"
296)
297project.generate(throw_away_data_after_generation=False)
298print("Building...", flush=True)
299project.build(make=True, make_clean_first=True, throw_away_data_after_build=True, number_of_parallel_builds=args.j)
300
301print(project)
302print(fv_rusanov_solver, flush=True)
303
CCZ4 solver using finite volumes and global adaptive time stepping incl enclave tasking.