From dec8439d8f0767f9a14ee1043ccb9fede83ec58e Mon Sep 17 00:00:00 2001 From: Martin Bauer <martin.bauer@fau.de> Date: Wed, 9 Jan 2019 17:11:31 +0100 Subject: [PATCH] Bugfix in waLBerla code generation: temporary fields were not freed --- jinja_filters.py | 20 ++++++++++++++++++++ templates/Sweep.tmpl.h | 2 ++ templates/SweepInnerOuter.tmpl.h | 3 +++ 3 files changed, 25 insertions(+) diff --git a/jinja_filters.py b/jinja_filters.py index 3ec11f2..4e518b7 100644 --- a/jinja_filters.py +++ b/jinja_filters.py @@ -24,6 +24,15 @@ else }} """ +temporary_constructor = """ +~{class_name}() {{ {contents} }} +""" + +delete_loop = """ + for(auto p: cache_{original_field_name}_) {{ + delete p; + }} +""" def make_field_type(dtype, f_size, is_gpu): if is_gpu: @@ -318,6 +327,16 @@ def generate_members(ctx, kernel_info, parameters_to_ignore=(), only_fields=Fals return "\n".join(result) +def generate_destructor(kernel_info, class_name): + if not kernel_info.temporary_fields: + return "" + else: + contents = "" + for field_name in kernel_info.temporary_fields: + contents += delete_loop.format(original_field_name=field_name[:-len('_tmp')]) + return temporary_constructor.format(contents=contents, class_name=class_name) + + def add_pystencils_filters_to_jinja_env(jinja_env): jinja_env.filters['generate_definition'] = generate_definition jinja_env.filters['generate_declaration'] = generate_declaration @@ -328,3 +347,4 @@ def add_pystencils_filters_to_jinja_env(jinja_env): jinja_env.filters['generate_block_data_to_field_extraction'] = generate_block_data_to_field_extraction jinja_env.filters['generate_swaps'] = generate_swaps jinja_env.filters['generate_refs_for_kernel_parameters'] = generate_refs_for_kernel_parameters + jinja_env.filters['generate_destructor'] = generate_destructor diff --git a/templates/Sweep.tmpl.h b/templates/Sweep.tmpl.h index 8f97621..bda958e 100644 --- a/templates/Sweep.tmpl.h +++ b/templates/Sweep.tmpl.h @@ -54,6 +54,8 @@ public: : {{ kernel|generate_constructor_initializer_list }}, stream_(stream) {}; + {{ kernel| generate_destructor(class_name) |indent(4) }} + void operator() ( IBlock * block ); private: {{kernel|generate_members|indent(4)}} diff --git a/templates/SweepInnerOuter.tmpl.h b/templates/SweepInnerOuter.tmpl.h index 2bdde0a..a9377dd 100644 --- a/templates/SweepInnerOuter.tmpl.h +++ b/templates/SweepInnerOuter.tmpl.h @@ -55,6 +55,9 @@ public: : {{ kernel|generate_constructor_initializer_list }} {}; + {{ kernel| generate_destructor(class_name) |indent(4) }} + + void operator() ( IBlock * block{%if target is equalto 'gpu'%} , cudaStream_t stream = 0{% endif %} ); void inner( IBlock * block{%if target is equalto 'gpu'%} , cudaStream_t stream = 0{% endif %} ); -- GitLab