diff --git a/pystencils/gpucuda/kernelcreation.py b/pystencils/gpucuda/kernelcreation.py index 595cf8cb53a7bcd30c3cb09b80ac0f393bd53fd0..611c1e56b4975d3cad12440553032f67b6465c82 100644 --- a/pystencils/gpucuda/kernelcreation.py +++ b/pystencils/gpucuda/kernelcreation.py @@ -34,7 +34,7 @@ def create_cuda_kernel(assignments: Union[AssignmentCollection, NodeCollection], all_fields = fields_read.union(fields_written) read_only_fields = set([f.name for f in fields_read - fields_written]) - buffers = set([f for f in all_fields if FieldType.is_buffer(f) or FieldType.is_custom(f)]) + buffers = set([f for f in all_fields if FieldType.is_buffer(f)]) fields_without_buffers = all_fields - buffers field_accesses = set() diff --git a/pystencils/transformations.py b/pystencils/transformations.py index 1a690409d2696af5aafa8461a38ee20eb7a655c1..9f10a5f0a3bd1a1e23587ff58dcb2f3a7f50f6b6 100644 --- a/pystencils/transformations.py +++ b/pystencils/transformations.py @@ -161,9 +161,11 @@ def make_loop_over_domain(body, iteration_slice=None, ghost_layers=None, loop_or tuple of loop-node, ghost_layer_info """ # find correct ordering by inspecting participating FieldAccesses + absolut_accesses_only = False field_accesses = body.atoms(Field.Access) field_accesses = {e for e in field_accesses if not e.is_absolute_access} - + if len(field_accesses) == 0: # when kernel contains only absolute accesses + absolut_accesses_only = True # exclude accesses to buffers from field_list, because buffers are treated separately field_list = [e.field for e in field_accesses if not (FieldType.is_buffer(e.field) or FieldType.is_custom(e.field))] if len(field_list) == 0: # when kernel contains only custom fields @@ -174,14 +176,21 @@ def make_loop_over_domain(body, iteration_slice=None, ghost_layers=None, loop_or if loop_order is None: loop_order = get_optimal_loop_ordering(fields) - shape = get_common_shape(fields) + if absolut_accesses_only: + absolut_access_fields = {e.field for e in body.atoms(Field.Access)} + shape = get_common_shape(absolut_access_fields) + else: + shape = get_common_shape(fields) unify_shape_symbols(body, common_shape=shape, fields=fields) if iteration_slice is not None: iteration_slice = normalize_slice(iteration_slice, shape) if ghost_layers is None: - required_ghost_layers = max([fa.required_ghost_layers for fa in field_accesses]) + if absolut_accesses_only: + required_ghost_layers = 0 + else: + required_ghost_layers = max([fa.required_ghost_layers for fa in field_accesses]) ghost_layers = [(required_ghost_layers, required_ghost_layers)] * len(loop_order) if isinstance(ghost_layers, int): ghost_layers = [(ghost_layers, ghost_layers)] * len(loop_order)