diff --git a/generate_packinfo.py b/generate_packinfo.py index d3d30dd54d977f34e80c31331fce6b6d3cd6b32c..6da4056fa96eb70f137356ac55a2cf65c15c3dc8 100644 --- a/generate_packinfo.py +++ b/generate_packinfo.py @@ -1,5 +1,5 @@ from itertools import product -from collections import defaultdict +from collections import defaultdict, OrderedDict from typing import Dict, Sequence, Tuple, Optional from jinja2 import Environment, PackageLoader from pystencils import Field, FieldType, Assignment, create_kernel @@ -45,6 +45,10 @@ def generate_pack_info(class_name: str, directions_to_pack_terms: Dict[Tuple[Tuple], Sequence[Field.Access]], namespace='pystencils', **create_kernel_params): + + items = [(e[0], sorted(e[1], key=lambda x: str(x))) for e in directions_to_pack_terms.items()] + items = sorted(items, key=lambda e: e[0]) + directions_to_pack_terms = OrderedDict(items) target = create_kernel_params.get('target', 'cpu') fields_accessed = set() @@ -60,10 +64,10 @@ def generate_pack_info(class_name: str, raise NotImplementedError("Fields of different data types are used - this is not supported") dtype = data_types.pop() - pack_kernels = {} - unpack_kernels = {} + pack_kernels = OrderedDict() + unpack_kernels = OrderedDict() all_accesses = set() - elements_per_cell = {} + elements_per_cell = OrderedDict() for direction_set, terms in directions_to_pack_terms.items(): for d in direction_set: if not all(abs(i) <= 1 for i in d): diff --git a/jinja_filters.py b/jinja_filters.py index 4e518b7a0b9193c59a2db2e7f2083c7bc76c4288..0dac492aa6eadb4e9bdadf2cb6b19213f3f2ea95 100644 --- a/jinja_filters.py +++ b/jinja_filters.py @@ -193,10 +193,11 @@ def generate_call(ctx, kernel_info, ghost_layers_to_include=0, cell_interval=Non if cell_interval is None: shape_names = ['xSize()', 'ySize()', 'zSize()'][:field_object.spatial_dimensions] offset = 2 * ghost_layers_to_include + 2 * required_ghost_layers - return ["%s->%s + %s" % (field_object.name, e, offset) for e in shape_names] + return ["cell_idx_c(%s->%s) + %s" % (field_object.name, e, offset) for e in shape_names] else: assert ghost_layers_to_include == 0 - return ["{ci}.{coord}Size() + {gl}".format(coord=coord_name, ci=cell_interval, gl=2 * required_ghost_layers) + return ["cell_idx_c({ci}.{coord}Size()) + {gl}".format(coord=coord_name, ci=cell_interval, + gl=2 * required_ghost_layers) for coord_name in ('x', 'y', 'z')] for param in ast_params: @@ -208,9 +209,11 @@ def generate_call(ctx, kernel_info, ghost_layers_to_include=0, cell_interval=Non if field.field_type == FieldType.BUFFER: kernel_call_lines.append("%s %s = %s;" % (param.symbol.dtype, param.symbol.name, param.field_name)) else: - coordinates = get_start_coordinates(field) + coordinates = set(get_start_coordinates(field)) + coordinates = sorted(coordinates, key=lambda e: str(e)) actual_gls = "int_c(%s->nrOfGhostLayers())" % (param.field_name, ) - for c in set(coordinates): + + for c in coordinates: kernel_call_lines.append("WALBERLA_ASSERT_GREATER_EQUAL(%s, -%s);" % (c, actual_gls)) while len(coordinates) < 4: diff --git a/sweep.py b/sweep.py index e594529689df6b57c5c192551f62bfbdbd9e88a9..1720b3bb9ab94f15b30e7845951310483efc72af 100644 --- a/sweep.py +++ b/sweep.py @@ -91,7 +91,8 @@ class Sweep: add_pystencils_filters_to_jinja_env(env) main_kernel_info = KernelInfo(ast, temporary_fields, field_swaps, varying_parameters) - representative_field = {p.field_name for p in main_kernel_info.parameters if p.is_field_parameter}.pop() + representative_field = {p.field_name for p in main_kernel_info.parameters if p.is_field_parameter} + representative_field = sorted(representative_field)[0] context = { 'kernel': main_kernel_info, diff --git a/templates/GpuPackInfo.tmpl.h b/templates/GpuPackInfo.tmpl.h index 4202ccdc8939884ec6f3b41f51e819061a7e650a..74bd12b1f66a4b6284dfaf1f1088e2f12bbb1c06 100644 --- a/templates/GpuPackInfo.tmpl.h +++ b/templates/GpuPackInfo.tmpl.h @@ -23,7 +23,7 @@ public: {{class_name}}( {{fused_kernel|generate_constructor_parameters(parameters_to_ignore=['buffer'])}} ) : {{ fused_kernel|generate_constructor_initializer_list(parameters_to_ignore=['buffer']) }} {}; - + virtual ~{{class_name}}() {} virtual void pack (stencil::Direction dir, unsigned char * buffer, IBlock * block, cudaStream_t stream); virtual void unpack(stencil::Direction dir, unsigned char * buffer, IBlock * block, cudaStream_t stream);