Peano
Loading...
Searching...
No Matches
generate-submission-script-gpu-parallel.py
Go to the documentation of this file.
1from itertools import combinations
2import os
3from pathlib import Path
4
5# Configurable Options
6application = "euler"
7solver = "fd4"
8machine = "grace_hopper"
9runtime_hours = 24
10patch_sizes = [3, 6, 16]
11number_of_samples = 10
12
13numbers_of_patches = {
14 3: ["1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192"],
15 6: ["1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192"],
16 16: ["1", "2", "4", "8", "16", "32", "64", "128", "256", "512", "1024", "2048", "4096", "8192"]
17}
18
19if machine == "grace_hopper":
20 partition = "gracehopper"
21 account = "do016"
22 set_environment = f"source {Path.home()}/set_env_arm.sh"
23if machine == "a100":
24 partition = "cosma8-shm"
25 account = "do016"
26 set_environment = f"source {Path.home()}/set_env_x86_nvidia.sh"
27
28
29optional_passes = {
30 "memory-reuse": "--enable-memory-reuse",
31 "perfect-loop-nesting": "--enable-imperfect-nested-loops-to-perfect",
32 "memory-fusion": "--enable-memory-fusion",
33 "loop-fusion": "--enable-loop-fusion"
34}
35
36output_name = f"{application}_kernel_benchmark"
37job_name = f"{application}_kernel_benchmark"
38output_root = f"{Path.home()}/Peano/benchmarks/exahype2/kernel-benchmarks/"
39script_name = f"submit_kernel_benchmark-gpu-parallel-{application}-{solver}.sh"
40compile_script_name = f"compile_kernel_benchmark-gpu-parallel-{application}-{solver}.sh"
41run_script_name = f"run_kernel_benchmark-gpu-parallel-{application}-{solver}.sh"
42
43if solver == "fd4":
44 benchmark_script_name = "kernel-benchmarks-fd4-dsl.py"
45 benchmark_app_name = "KernelBenchmarksFD4DSL.Release"
46if solver == "rusanov":
47 benchmark_script_name = "kernel-benchmarks-fv-rusanov-dsl.py"
48 benchmark_app_name = "KernelBenchmarksFVRusanovDSL.Release"
49
50def generate_submission_script_fragment(use_cpp: bool, patch_size: int, number_of_patches: list[str], passes: list[str], output_directory: str):
51 if use_cpp:
52 print_statement = f"""echo "Patch Size: {patch_size}, C++" """
53 else:
54 print_statement = f"""echo "Patch Size: {patch_size}, MLIR, {", ".join(passes)}" """
55 pass_flags = [optional_passes[enabled_pass] for enabled_pass in passes]
56 return f"""{print_statement}
57python {benchmark_script_name} -d 3 -gpu {"--enable-cpp" if use_cpp else "--enable-mlir"} -ps {patch_size} -p {" ".join(number_of_patches)} -samples {number_of_samples} {" ".join(pass_flags)}
58./{benchmark_app_name} > {output_directory}/patch_size_{patch_size}.txt
59"""
60
61def generate_compilation_script_fragment(use_cpp: bool, patch_size: int, number_of_patches: list[int], passes: list[str], output_directory: str):
62 if use_cpp:
63 print_statement = f"""echo "Patch Size: {patch_size}, C++" """
64 benchmark_executable_name = f"cpp_{patch_size}"
65 else:
66 print_statement = f"""echo "Patch Size: {patch_size}, MLIR, {", ".join(passes)}" """
67 if len(passes) == 0:
68 benchmark_executable_name = f"no-passes_{patch_size}"
69 else:
70 benchmark_executable_name = f"{'_'.join(passes)}_{patch_size}"
71 pass_flags = [optional_passes[enabled_pass] for enabled_pass in passes]
72 return f"""{print_statement}
73python {benchmark_script_name} -d 3 -gpu {"--enable-cpp" if use_cpp else "--enable-mlir"} -ps {patch_size} -p {" ".join(number_of_patches)} -samples {number_of_samples} {" ".join(pass_flags)} -o {benchmark_executable_name}
74"""
75
76def generate_running_script_fragment(use_cpp: bool, patch_size: int, number_of_patches: list[int], passes: list[str], output_directory: str):
77 if use_cpp:
78 print_statement = f"""echo "Patch Size: {patch_size}, C++" """
79 benchmark_executable_name = f"cpp_{patch_size}"
80 else:
81 print_statement = f"""echo "Patch Size: {patch_size}, MLIR, {", ".join(passes)}" """
82 if len(passes) == 0:
83 benchmark_executable_name = f"no-passes_{patch_size}"
84 else:
85 benchmark_executable_name = f"{'_'.join(passes)}_{patch_size}"
86 return f"""{print_statement}
87./{benchmark_executable_name}.Release > {output_directory}/patch_size_{patch_size}.txt
88"""
89
90compile_scripts = []
91run_scripts = []
92submission_scripts = []
93
94for patch_size in patch_sizes:
95 number_of_patches = numbers_of_patches[patch_size]
96
97 pass_list = []
98 for i in range(0, len(optional_passes) + 1):
99 for combination in list(combinations(optional_passes, i)):
100 pass_list.append(combination)
101
102 # CPP
103 output_directory = output_root + f"results/{application}/{solver}/gpu_parallel/{machine}/cpp"
104 if not os.path.exists(output_directory):
105 os.makedirs(output_directory)
106 submission_scripts.append(generate_submission_script_fragment(True, patch_size, number_of_patches, [], output_directory))
107 compile_scripts.append(generate_compilation_script_fragment(True, patch_size, number_of_patches, [], output_directory))
108 run_scripts.append(generate_running_script_fragment(True, patch_size, number_of_patches, [], output_directory))
109
110 # MLIR No Passes
111 output_directory = output_root + f"results/{application}/{solver}/gpu_parallel/{machine}/no-passes"
112 if not os.path.exists(output_directory):
113 os.makedirs(output_directory)
114 submission_scripts.append(generate_submission_script_fragment(False, patch_size, number_of_patches, [], output_directory))
115 compile_scripts.append(generate_compilation_script_fragment(False, patch_size, number_of_patches, [], output_directory))
116 run_scripts.append(generate_running_script_fragment(False, patch_size, number_of_patches, [], output_directory))
117
118 # MLIR Passes
119 for optional_pass in optional_passes.keys():
120 output_directory = output_root + f"results/{application}/{solver}/gpu_parallel/{machine}/{optional_pass}"
121 if not os.path.exists(output_directory):
122 os.makedirs(output_directory)
123 submission_scripts.append(generate_submission_script_fragment(False, patch_size, number_of_patches, [optional_pass], output_directory))
124 compile_scripts.append(generate_compilation_script_fragment(False, patch_size, number_of_patches, [optional_pass], output_directory))
125 run_scripts.append(generate_running_script_fragment(False, patch_size, number_of_patches, [optional_pass], output_directory))
126
127with open(compile_script_name, "w") as file:
128 file.write(f"""#!/bin/bash -l
129
130#SBATCH -o {output_name}.out
131#SBATCH -e {output_name}.err
132#SBATCH -t {runtime_hours}:00:00
133#SBATCH --nodes=1
134#SBATCH -J {job_name}
135#SBATCH -p {partition}
136#SBATCH -A {account}
137
138export PATH=~/Peano/src/exahype2/mlir/build/bin/:$PATH
139export PYTHONPATH=~/Peano/python/:~/Peano/applications/exahype2/ccz4/:~/Peano/src/
140{set_environment}
141""")
142 for script in compile_scripts:
143 file.write(script + "\n")
144
145with open(run_script_name, "w") as file:
146 file.write(f"""#!/bin/bash -l
147
148#SBATCH -o {output_name}.out
149#SBATCH -e {output_name}.err
150#SBATCH -t {runtime_hours}:00:00
151#SBATCH --nodes=1
152#SBATCH -J {job_name}
153#SBATCH -p {partition}
154#SBATCH -A {account}
155
156export PATH=~/Peano/src/exahype2/mlir/build/bin/:$PATH
157export PYTHONPATH=~/Peano/python/:~/Peano/applications/exahype2/ccz4/:~/Peano/src/
158{set_environment}
159""")
160 for script in run_scripts:
161 file.write(script + "\n")
162
163with open(script_name, "w") as file:
164 file.write(f"""#!/bin/bash -l
165
166#SBATCH -o {output_name}.out
167#SBATCH -e {output_name}.err
168#SBATCH -t {runtime_hours}:00:00
169#SBATCH --nodes=1
170#SBATCH -J {job_name}
171#SBATCH -p {partition}
172#SBATCH -A {account}
173
174export PATH=~/Peano/src/exahype2/mlir/build/bin/:$PATH
175export PYTHONPATH=~/Peano/python/:~/Peano/applications/exahype2/ccz4/:~/Peano/src/
176{set_environment}
177""")
178
179 for script in submission_scripts:
180 file.write(script + "\n")
181
generate_compilation_script_fragment(bool use_cpp, int patch_size, list[int] number_of_patches, list[str] passes, str output_directory)
generate_running_script_fragment(bool use_cpp, int patch_size, list[int] number_of_patches, list[str] passes, str output_directory)
generate_submission_script_fragment(bool use_cpp, int patch_size, list[str] number_of_patches, list[str] passes, str output_directory)