From ecbc924dfa948780a7c558728565f5d63737ad30 Mon Sep 17 00:00:00 2001 From: markus holzer <markus.holzer@fau.de> Date: Sat, 18 Mar 2023 08:17:15 +0100 Subject: [PATCH] Added test case --- pystencils/gpucuda/indexing.py | 14 ++++++-- pystencils/transformations.py | 2 -- pystencils_tests/test_buffer.py | 54 ++++++++++++++++++---------- pystencils_tests/test_buffer_gpu.py | 56 +++++++++++++++++++++++++++++ 4 files changed, 104 insertions(+), 22 deletions(-) diff --git a/pystencils/gpucuda/indexing.py b/pystencils/gpucuda/indexing.py index 85b506e90..423b11583 100644 --- a/pystencils/gpucuda/indexing.py +++ b/pystencils/gpucuda/indexing.py @@ -169,7 +169,7 @@ class BlockIndexing(AbstractIndexing): conditions = [c < e for c, e in zip(self.coordinates, end)] for cuda_index, iter_slice in zip(self.cuda_indices, self._iterationSlice): - if iter_slice.step > 1: + if isinstance(iter_slice, slice) and iter_slice.step > 1: conditions.append(sp.Eq(sp.Mod(cuda_index, iter_slice.step), 0)) condition = conditions[0] @@ -316,10 +316,20 @@ def _get_end_from_slice(iteration_slice, arr_shape): return res +def _get_steps_from_slice(iteration_slice): + res = [] + for slice_component in iteration_slice: + if type(slice_component) is slice: + res.append(slice_component.step) + else: + res.append(1) + return res + + def _iteration_space(iteration_slice, arr_shape): starts = _get_start_from_slice(iteration_slice) ends = _get_end_from_slice(iteration_slice, arr_shape) - steps = [s.step for s in iteration_slice] + steps = _get_steps_from_slice(iteration_slice) return [slice(start, end, step) for start, end, step in zip(starts, ends, steps)] diff --git a/pystencils/transformations.py b/pystencils/transformations.py index d4c6df549..1811b60ee 100644 --- a/pystencils/transformations.py +++ b/pystencils/transformations.py @@ -179,7 +179,6 @@ def make_loop_over_domain(body, iteration_slice=None, ghost_layers=None, loop_or if iteration_slice is not None: iteration_slice = normalize_slice(iteration_slice, shape) - print(iteration_slice) if ghost_layers is None: required_ghost_layers = max([fa.required_ghost_layers for fa in field_accesses]) @@ -196,7 +195,6 @@ def make_loop_over_domain(body, iteration_slice=None, ghost_layers=None, loop_or current_body = ast.Block([new_loop]) else: slice_component = iteration_slice[loop_coordinate] - print(slice_component) if type(slice_component) is slice: sc = slice_component new_loop = ast.LoopOverCoordinate(current_body, loop_coordinate, sc.start, sc.stop, sc.step) diff --git a/pystencils_tests/test_buffer.py b/pystencils_tests/test_buffer.py index b8af6f53f..a21d68cc4 100644 --- a/pystencils_tests/test_buffer.py +++ b/pystencils_tests/test_buffer.py @@ -22,7 +22,7 @@ def _generate_fields(dt=np.uint64, num_directions=1, layout='numpy'): field_layout = layout_string_to_tuple(layout, len(size)) src_arr = create_numpy_array_with_layout(size, field_layout, dtype=dt) - array_data = np.reshape(np.arange(1, int(np.prod(size)+1)), size) + array_data = np.reshape(np.arange(1, int(np.prod(size) + 1)), size) # Use flat iterator to input data into the array src_arr.flat = add_ghost_layers(array_data, index_dimensions=1 if num_directions > 1 else 0).astype(dt).flat dst_arr = np.zeros(src_arr.shape, dtype=dt) @@ -41,7 +41,8 @@ def test_full_scalar_field(): field_type=FieldType.BUFFER, dtype=src_arr.dtype) pack_eqs = [Assignment(buffer.center(), src_field.center())] - pack_code = create_kernel(pack_eqs, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + pack_code = create_kernel(pack_eqs, config=config) code = ps.get_code_str(pack_code) ps.show_code(pack_code) @@ -49,7 +50,9 @@ def test_full_scalar_field(): pack_kernel(buffer=buffer_arr, src_field=src_arr) unpack_eqs = [Assignment(dst_field.center(), buffer.center())] - unpack_code = create_kernel(unpack_eqs, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + + config = ps.CreateKernelConfig(data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(dst_field=dst_arr, buffer=buffer_arr) @@ -73,14 +76,18 @@ def test_field_slice(): field_type=FieldType.BUFFER, dtype=src_arr.dtype) pack_eqs = [Assignment(buffer.center(), src_field.center())] - pack_code = create_kernel(pack_eqs, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + + config = ps.CreateKernelConfig(data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + pack_code = create_kernel(pack_eqs, config=config) pack_kernel = pack_code.compile() pack_kernel(buffer=bufferArr, src_field=src_arr[pack_slice]) # Unpack into ghost layer of dst_field in N direction unpack_eqs = [Assignment(dst_field.center(), buffer.center())] - unpack_code = create_kernel(unpack_eqs, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + + config = ps.CreateKernelConfig(data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(buffer=bufferArr, dst_field=dst_arr[unpack_slice]) @@ -105,7 +112,8 @@ def test_all_cell_values(): eq = Assignment(buffer(idx), src_field(idx)) pack_eqs.append(eq) - pack_code = create_kernel(pack_eqs, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + pack_code = create_kernel(pack_eqs, config=config) pack_kernel = pack_code.compile() pack_kernel(buffer=bufferArr, src_field=src_arr) @@ -115,7 +123,8 @@ def test_all_cell_values(): eq = Assignment(dst_field(idx), buffer(idx)) unpack_eqs.append(eq) - unpack_code = create_kernel(unpack_eqs, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(buffer=bufferArr, dst_field=dst_arr) @@ -141,7 +150,8 @@ def test_subset_cell_values(): eq = Assignment(buffer(buffer_idx), src_field(cell_idx)) pack_eqs.append(eq) - pack_code = create_kernel(pack_eqs, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + pack_code = create_kernel(pack_eqs, config=config) pack_kernel = pack_code.compile() pack_kernel(buffer=bufferArr, src_field=src_arr) @@ -151,7 +161,8 @@ def test_subset_cell_values(): eq = Assignment(dst_field(cell_idx), buffer(buffer_idx)) unpack_eqs.append(eq) - unpack_code = create_kernel(unpack_eqs, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(buffer=bufferArr, dst_field=dst_arr) @@ -176,7 +187,8 @@ def test_field_layouts(): eq = Assignment(buffer(idx), src_field(idx)) pack_eqs.append(eq) - pack_code = create_kernel(pack_eqs, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + pack_code = create_kernel(pack_eqs, config=config) pack_kernel = pack_code.compile() pack_kernel(buffer=bufferArr, src_field=src_arr) @@ -186,7 +198,8 @@ def test_field_layouts(): eq = Assignment(dst_field(idx), buffer(idx)) unpack_eqs.append(eq) - unpack_code = create_kernel(unpack_eqs, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(buffer=bufferArr, dst_field=dst_arr) @@ -202,7 +215,7 @@ def test_iteration_slices(): src_field = Field.create_generic("src_field", spatial_dimensions, index_shape=(num_cell_values,), dtype=dt) dst_field = Field.create_generic("dst_field", spatial_dimensions, index_shape=(num_cell_values,), dtype=dt) buffer = Field.create_generic("buffer", spatial_dimensions=1, index_dimensions=1, - field_type=FieldType.BUFFER, dtype=src_arr.dtype) + field_type=FieldType.BUFFER, dtype=src_arr.dtype) pack_eqs = [] # Since we are packing all cell values for all cells, then @@ -214,13 +227,16 @@ def test_iteration_slices(): dim = src_field.spatial_dimensions # Pack only the leftmost slice, only every second cell - pack_slice = (slice(None, None, 2),) * (dim-1) + (0, ) + pack_slice = (slice(None, None, 2),) * (dim - 1) + (0,) # Fill the entire array with data src_arr[(slice(None, None, 1),) * dim] = np.arange(num_cell_values) dst_arr.fill(0) - pack_code = create_kernel(pack_eqs, iteration_slice=pack_slice, data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(iteration_slice=pack_slice, + data_type={'src_field': src_arr.dtype, 'buffer': buffer.dtype}) + + pack_code = create_kernel(pack_eqs, config=config) pack_kernel = pack_code.compile() pack_kernel(buffer=bufferArr, src_field=src_arr) @@ -230,12 +246,14 @@ def test_iteration_slices(): eq = Assignment(dst_field(idx), buffer(idx)) unpack_eqs.append(eq) - unpack_code = create_kernel(unpack_eqs, iteration_slice=pack_slice, data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + config = ps.CreateKernelConfig(iteration_slice=pack_slice, + data_type={'dst_field': dst_arr.dtype, 'buffer': buffer.dtype}) + + unpack_code = create_kernel(unpack_eqs, config=config) unpack_kernel = unpack_code.compile() unpack_kernel(buffer=bufferArr, dst_field=dst_arr) # Check if only every second entry of the leftmost slice has been copied np.testing.assert_equal(dst_arr[pack_slice], src_arr[pack_slice]) - np.testing.assert_equal(dst_arr[(slice(1, None, 2),) * (dim-1) + (0,)], 0) - np.testing.assert_equal(dst_arr[(slice(None, None, 1),) * (dim-1) + (slice(1,None),)], 0) - + np.testing.assert_equal(dst_arr[(slice(1, None, 2),) * (dim - 1) + (0,)], 0) + np.testing.assert_equal(dst_arr[(slice(None, None, 1),) * (dim - 1) + (slice(1, None),)], 0) diff --git a/pystencils_tests/test_buffer_gpu.py b/pystencils_tests/test_buffer_gpu.py index dd20acd5d..ae0a15487 100644 --- a/pystencils_tests/test_buffer_gpu.py +++ b/pystencils_tests/test_buffer_gpu.py @@ -274,3 +274,59 @@ def test_buffer_indexing(): assert s in src_field_size assert len(spatial_shape_symbols) <= 3 + + +def test_iteration_slices(): + num_cell_values = 19 + dt = np.uint64 + fields = _generate_fields(dt=dt, stencil_directions=num_cell_values) + for (src_arr, gpu_src_arr, gpu_dst_arr, gpu_buffer_arr) in fields: + src_field = Field.create_from_numpy_array("src_field", gpu_src_arr, index_dimensions=1) + dst_field = Field.create_from_numpy_array("dst_field", gpu_src_arr, index_dimensions=1) + buffer = Field.create_generic("buffer", spatial_dimensions=1, index_dimensions=1, + field_type=FieldType.BUFFER, dtype=src_arr.dtype) + + pack_eqs = [] + # Since we are packing all cell values for all cells, then + # the buffer index is equivalent to the field index + for idx in range(num_cell_values): + eq = Assignment(buffer(idx), src_field(idx)) + pack_eqs.append(eq) + + dim = src_field.spatial_dimensions + + # Pack only the leftmost slice, only every second cell + pack_slice = (slice(None, None, 2),) * (dim - 1) + (0,) + + # Fill the entire array with data + src_arr[(slice(None, None, 1),) * dim] = np.arange(num_cell_values) + gpu_src_arr[(slice(None, None, 1),) * dim] = src_arr + gpu_dst_arr.fill(0) + + config = CreateKernelConfig(target=Target.GPU, iteration_slice=pack_slice, + data_type={'src_field': gpu_src_arr.dtype, 'buffer': gpu_buffer_arr.dtype}) + + pack_code = create_kernel(pack_eqs, config=config) + pack_kernel = pack_code.compile() + pack_kernel(buffer=gpu_buffer_arr, src_field=gpu_src_arr) + + unpack_eqs = [] + + for idx in range(num_cell_values): + eq = Assignment(dst_field(idx), buffer(idx)) + unpack_eqs.append(eq) + + config = CreateKernelConfig(target=Target.GPU, iteration_slice=pack_slice, + data_type={'dst_field': gpu_dst_arr.dtype, 'buffer': gpu_buffer_arr.dtype}) + + unpack_code = create_kernel(unpack_eqs, config=config) + unpack_kernel = unpack_code.compile() + unpack_kernel(buffer=gpu_buffer_arr, dst_field=gpu_dst_arr) + + dst_arr = gpu_dst_arr.get() + src_arr = gpu_src_arr.get() + + # Check if only every second entry of the leftmost slice has been copied + np.testing.assert_equal(dst_arr[pack_slice], src_arr[pack_slice]) + np.testing.assert_equal(dst_arr[(slice(1, None, 2),) * (dim - 1) + (0,)], 0) + np.testing.assert_equal(dst_arr[(slice(None, None, 1),) * (dim - 1) + (slice(1, None),)], 0) -- GitLab