From 4b7f9e3a15efa0eab3f646848a195c54174aade4 Mon Sep 17 00:00:00 2001 From: markus holzer <markus.holzer@fau.de> Date: Wed, 3 Mar 2021 10:27:54 +0100 Subject: [PATCH] Added test case --- pystencils/cpu/cpujit.py | 3 ++- .../test_vectorization_specific.py | 25 +++++++++++++++++++ 2 files changed, 27 insertions(+), 1 deletion(-) diff --git a/pystencils/cpu/cpujit.py b/pystencils/cpu/cpujit.py index 51538fa20..9ca8312eb 100644 --- a/pystencils/cpu/cpujit.py +++ b/pystencils/cpu/cpujit.py @@ -376,7 +376,8 @@ def create_function_boilerplate_code(parameter_info, name, ast_node, insert_chec item_size = np_dtype.itemsize aligned = any([a.lhs.args[2] for a in ast_node.assignments if - isinstance(a.lhs, cast_func) and isinstance(a.lhs.dtype, VectorType)]) + hasattr(a, 'lhs') and isinstance(a.lhs, cast_func) and + hasattr(a.lhs, 'dtype') and isinstance(a.lhs.dtype, VectorType)]) if ast_node.instruction_set and aligned: byte_width = ast_node.instruction_set['width'] * item_size diff --git a/pystencils_tests/test_vectorization_specific.py b/pystencils_tests/test_vectorization_specific.py index 9d9d4ac50..4842a38e7 100644 --- a/pystencils_tests/test_vectorization_specific.py +++ b/pystencils_tests/test_vectorization_specific.py @@ -5,6 +5,8 @@ import sympy as sp import pystencils as ps from pystencils.backends.simd_instruction_sets import get_supported_instruction_sets +from pystencils.backends.x86_instruction_sets import get_vector_instruction_set_x86 +from pystencils.data_types import cast_func, VectorType supported_instruction_sets = get_supported_instruction_sets() if get_supported_instruction_sets() else [] @@ -49,3 +51,26 @@ def test_vectorized_abs(instruction_set, dtype): dst = np.zeros_like(arr) func(g=dst, f=arr) np.testing.assert_equal(np.sum(dst[1:-1, 1:-1]), 2 ** 2 * 2 ** 3) + + +@pytest.mark.parametrize('dtype', ('float', 'double')) +@pytest.mark.parametrize('instruction_set', supported_instruction_sets) +def test_alignment_and_correct_ghost_layers(instruction_set, dtype): + itemsize = 8 if dtype == 'double' else 4 + alignment = get_vector_instruction_set_x86(dtype, instruction_set)['width'] * itemsize + dtype = np.float64 if dtype == 'double' else np.float32 + + domain_size = (128, 128) + dh = ps.create_data_handling(domain_size, periodicity=(True, True), default_target='cpu') + src = dh.add_array("src", values_per_cell=1, dtype=dtype, ghost_layers=1, alignment=alignment) + dh.fill(src.name, 1.0, ghost_layers=True) + dst = dh.add_array("dst", values_per_cell=1, dtype=dtype, ghost_layers=1, alignment=alignment) + dh.fill(dst.name, 1.0, ghost_layers=True) + + update_rule = ps.Assignment(dst[0, 0], src[0, 0]) + opt = {'instruction_set': instruction_set, 'assume_aligned': True, + 'nontemporal': True, 'assume_inner_stride_one': True} + ast = ps.create_kernel(update_rule, target=dh.default_target, cpu_vectorize_info=opt, ghost_layers=0) + kernel = ast.compile() + with pytest.raises(ValueError): + dh.run_kernel(kernel) \ No newline at end of file -- GitLab