diff --git a/conftest.py b/conftest.py index 78164d005760abacfac7f13ab7fab365f8f31c19..272f42303e620cd13fc7f26648bc03d437b1fda6 100644 --- a/conftest.py +++ b/conftest.py @@ -1,8 +1,8 @@ import os import runpy import sys -import warnings import tempfile +import warnings import nbformat import pytest @@ -34,7 +34,7 @@ def add_path_to_ignore(path): collect_ignore = [os.path.join(SCRIPT_FOLDER, "doc", "conf.py"), - os.path.join(SCRIPT_FOLDER, "pystencils", "opencl", "opencl.autoinit")] + os.path.join(SCRIPT_FOLDER, "pystencils", "opencl", "opencl.autoinit")] add_path_to_ignore('pystencils_tests/benchmark') add_path_to_ignore('_local_tmp') @@ -98,8 +98,6 @@ for root, sub_dirs, files in os.walk('.'): collect_ignore.append(f) - - class IPythonMockup: def run_line_magic(self, *args, **kwargs): pass diff --git a/pystencils/__init__.py b/pystencils/__init__.py index ed08ff1327c68a1a116edb21547a86f8b27a8c81..18679382f0014ba12844c72fa965a3ad4fe6e196 100644 --- a/pystencils/__init__.py +++ b/pystencils/__init__.py @@ -5,7 +5,7 @@ from . import stencil as stencil from .assignment import Assignment, assignment_from_stencil from .data_types import TypedSymbol from .datahandling import create_data_handling -from .display_utils import show_code, to_dot +from .display_utils import show_code, get_code_obj, get_code_str, to_dot from .field import Field, FieldType, fields from .kernel_decorator import kernel from .kernelcreation import create_indexed_kernel, create_kernel, create_staggered_kernel @@ -25,7 +25,7 @@ __all__ = ['Field', 'FieldType', 'fields', 'TypedSymbol', 'make_slice', 'create_kernel', 'create_indexed_kernel', 'create_staggered_kernel', - 'show_code', 'to_dot', + 'show_code', 'to_dot', 'get_code_obj', 'get_code_str', 'AssignmentCollection', 'Assignment', 'assignment_from_stencil', diff --git a/pystencils/assignment.py b/pystencils/assignment.py index 0bf68799491be29886d215d5ff76010c034bd174..92027f7773d2202765ab2ef09c5269654098060e 100644 --- a/pystencils/assignment.py +++ b/pystencils/assignment.py @@ -1,4 +1,3 @@ -# -*- coding: utf-8 -*- import numpy as np import sympy as sp from sympy.printing.latex import LatexPrinter @@ -24,9 +23,20 @@ def assignment_str(assignment): if Assignment: + _old_new = sp.codegen.ast.Assignment.__new__ + + def _Assignment__new__(cls, lhs, rhs, *args, **kwargs): + if isinstance(lhs, (list, tuple, sp.Matrix)) and isinstance(rhs, (list, tuple, sp.Matrix)): + assert len(lhs) == len(rhs), f'{lhs} and {rhs} must have same length when performing vector assignment!' + return tuple(_old_new(cls, a, b, *args, **kwargs) for a, b in zip(lhs, rhs)) + return _old_new(cls, lhs, rhs, *args, **kwargs) + Assignment.__str__ = assignment_str + Assignment.__new__ = _Assignment__new__ LatexPrinter._print_Assignment = print_assignment_latex + sp.MutableDenseMatrix.__hash__ = lambda self: hash(tuple(self)) + else: # back port for older sympy versions that don't have Assignment yet diff --git a/pystencils/display_utils.py b/pystencils/display_utils.py index 610c404b709885e7445eba3be412f6811fca0241..0bdad7ac16ba6c600cd66e5c82721c8ac46bb0dd 100644 --- a/pystencils/display_utils.py +++ b/pystencils/display_utils.py @@ -1,4 +1,4 @@ -from typing import Any, Dict, Optional +from typing import Any, Dict, Optional, Union import sympy as sp @@ -35,10 +35,10 @@ def highlight_cpp(code: str): return HTML(highlight(code, CppLexer(), HtmlFormatter())) -def show_code(ast: KernelFunction, custom_backend=None): +def get_code_obj(ast: Union[KernelFunction, KernelWrapper], custom_backend=None): """Returns an object to display generated code (C/C++ or CUDA) - Can either be displayed as HTML in Jupyter notebooks or printed as normal string. + Can either be displayed as HTML in Jupyter notebooks or printed as normal string. """ from pystencils.backends.cbackend import generate_c @@ -65,3 +65,17 @@ def show_code(ast: KernelFunction, custom_backend=None): def __repr__(self): return generate_c(self.ast, dialect=dialect, custom_backend=custom_backend) return CodeDisplay(ast) + + +def get_code_str(ast, custom_backend=None): + return str(get_code_obj(ast, custom_backend)) + + +def show_code(ast: Union[KernelFunction, KernelWrapper], custom_backend=None): + code = get_code_obj(ast, custom_backend) + + try: + from IPython.display import display + display(code) + except Exception: + print(code) diff --git a/pystencils/kernel_wrapper.py b/pystencils/kernel_wrapper.py index 0e327711e5a355219cc2664ac9a6c8a02d88bc09..b76ec4e3d79c1b345c9f0a8b2bd8a97b59866b8d 100644 --- a/pystencils/kernel_wrapper.py +++ b/pystencils/kernel_wrapper.py @@ -1,11 +1,14 @@ -""" -Light-weight wrapper around a compiled kernel -""" import pystencils class KernelWrapper: - def __init__(self, kernel, parameters, ast_node): + """ + Light-weight wrapper around a compiled kernel. + + Can be called while still providing access to underlying AST. + """ + + def __init__(self, kernel, parameters, ast_node: pystencils.astnodes.KernelFunction): self.kernel = kernel self.parameters = parameters self.ast = ast_node @@ -16,4 +19,4 @@ class KernelWrapper: @property def code(self): - return str(pystencils.show_code(self.ast)) + return pystencils.get_code_str(self.ast) diff --git a/pystencils/simp/assignment_collection.py b/pystencils/simp/assignment_collection.py index 3a8bb2bd3b315e23fb9e11ef6385f264428c7bd5..22968eb72361b15dd24a0ebc72fd284ddeddd2b7 100644 --- a/pystencils/simp/assignment_collection.py +++ b/pystencils/simp/assignment_collection.py @@ -1,3 +1,4 @@ +import itertools from copy import copy from typing import Any, Dict, Iterable, Iterator, List, Optional, Sequence, Set, Union @@ -43,6 +44,11 @@ class AssignmentCollection: subexpressions = [Assignment(k, v) for k, v in subexpressions.items()] + main_assignments = list(itertools.chain.from_iterable( + [(a if isinstance(a, Iterable) else [a]) for a in main_assignments])) + subexpressions = list(itertools.chain.from_iterable( + [(a if isinstance(a, Iterable) else [a]) for a in subexpressions])) + self.main_assignments = main_assignments self.subexpressions = subexpressions diff --git a/pystencils/test_type_interference.py b/pystencils/test_type_interference.py index 0daa6f9d2a36948184d537809457b4aaf8001d29..953b87742304b2d629a1bd564fc23e0982d4f6d9 100644 --- a/pystencils/test_type_interference.py +++ b/pystencils/test_type_interference.py @@ -18,8 +18,7 @@ def test_type_interference(): ast = pystencils.create_kernel(assignments) - code = str(pystencils.show_code(ast)) - print(code) + code = str(pystencils.get_code_str(ast)) assert 'double a' in code assert 'uint16_t b' in code assert 'uint16_t f' in code diff --git a/pystencils_tests/test_address_of.py b/pystencils_tests/test_address_of.py index b4c46c1c6045520e30826fe84ac91ae76339ad1b..717f6e43720a4ddddfca8c7a3fce3ff9e15982ff 100644 --- a/pystencils_tests/test_address_of.py +++ b/pystencils_tests/test_address_of.py @@ -17,16 +17,14 @@ def test_address_of(): }, {}) ast = pystencils.create_kernel(assignments) - code = pystencils.show_code(ast) - print(code) + pystencils.show_code(ast) assignments = pystencils.AssignmentCollection({ y[0, 0]: cast_func(address_of(x[0, 0]), create_type('int64')) }, {}) ast = pystencils.create_kernel(assignments) - code = pystencils.show_code(ast) - print(code) + pystencils.show_code(ast) def test_address_of_with_cse(): @@ -39,9 +37,8 @@ def test_address_of_with_cse(): }, {}) ast = pystencils.create_kernel(assignments) - code = pystencils.show_code(ast) + pystencils.show_code(ast) assignments_cse = sympy_cse(assignments) ast = pystencils.create_kernel(assignments_cse) - code = pystencils.show_code(ast) - print(code) + pystencils.show_code(ast) diff --git a/pystencils_tests/test_assignment_collection.py b/pystencils_tests/test_assignment_collection.py index 42e3791ab331cc111343bfe410bc59e3f52ba80b..a16d51db44bb722ee1a9da9a20ad4192d4f6188e 100644 --- a/pystencils_tests/test_assignment_collection.py +++ b/pystencils_tests/test_assignment_collection.py @@ -1,3 +1,4 @@ +import pytest import sympy as sp from pystencils import Assignment, AssignmentCollection @@ -40,3 +41,39 @@ def test_free_and_defined_symbols(): print(ac) print(ac.__repr__) + + +def test_vector_assignments(): + """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)""" + + import pystencils as ps + import sympy as sp + a, b, c = sp.symbols("a b c") + assignments = ps.Assignment(sp.Matrix([a,b,c]), sp.Matrix([1,2,3])) + print(assignments) + + +def test_wrong_vector_assignments(): + """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)""" + + import pystencils as ps + import sympy as sp + a, b = sp.symbols("a b") + + with pytest.raises(AssertionError, + match=r'Matrix(.*) and Matrix(.*) must have same length when performing vector assignment!'): + ps.Assignment(sp.Matrix([a,b]), sp.Matrix([1,2,3])) + + +def test_vector_assignment_collection(): + """From #17 (https://i10git.cs.fau.de/pycodegen/pystencils/issues/17)""" + + import pystencils as ps + import sympy as sp + a, b, c = sp.symbols("a b c") + y, x = sp.Matrix([a,b,c]), sp.Matrix([1,2,3]) + assignments = ps.AssignmentCollection({y: x}) + print(assignments) + + assignments = ps.AssignmentCollection([ps.Assignment(y,x)]) + print(assignments) diff --git a/pystencils_tests/test_complex_numbers.py b/pystencils_tests/test_complex_numbers.py index b1c0569d05e73a786a780d7f4826eedf8d71b533..41dc76a40411129c4ee68f0ee42028b57875d71e 100644 --- a/pystencils_tests/test_complex_numbers.py +++ b/pystencils_tests/test_complex_numbers.py @@ -52,7 +52,7 @@ def test_complex_numbers(assignment, scalar_dtypes, target): ast = pystencils.create_kernel(assignment, target=target, data_type=scalar_dtypes) - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) print(code) assert "Not supported" not in code @@ -98,7 +98,7 @@ def test_complex_numbers_64(assignment, target): ast = pystencils.create_kernel(assignment, target=target, data_type='double') - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) print(code) assert "Not supported" not in code diff --git a/pystencils_tests/test_conditional_field_access.py b/pystencils_tests/test_conditional_field_access.py index f68b34679ae5de0996a09a30921c85ec49bece58..a4bd53228476ea49f977e08f71acfd1d596231fe 100644 --- a/pystencils_tests/test_conditional_field_access.py +++ b/pystencils_tests/test_conditional_field_access.py @@ -63,7 +63,7 @@ def test_boundary_check(with_cse): print(assignments) kernel_checked = ps.create_kernel(assignments, ghost_layers=0).compile() - print(ps.show_code(kernel_checked)) + ps.show_code(kernel_checked) # No SEGFAULT, please!! kernel_checked(f=f_arr, g=g_arr) diff --git a/pystencils_tests/test_cuda_known_functions.py b/pystencils_tests/test_cuda_known_functions.py index 99810a55af73907b686f342a8dba1f2053cbabe7..dcdabeaef6934e06b289351127b168d77d803be9 100644 --- a/pystencils_tests/test_cuda_known_functions.py +++ b/pystencils_tests/test_cuda_known_functions.py @@ -20,8 +20,8 @@ def test_cuda_known_functions(): }) ast = pystencils.create_kernel(assignments, 'gpu') - print(pystencils.show_code(ast)) pytest.importorskip('pycuda') + pystencils.show_code(ast) kernel = ast.compile() assert(kernel is not None) @@ -35,7 +35,7 @@ def test_cuda_but_not_c(): }) ast = pystencils.create_kernel(assignments, 'cpu') - print(pystencils.show_code(ast)) + pystencils.show_code(ast) def test_cuda_unknown(): @@ -46,5 +46,4 @@ def test_cuda_unknown(): }) ast = pystencils.create_kernel(assignments, 'gpu') - code = str(pystencils.show_code(ast)) - print(code) + pystencils.show_code(ast) diff --git a/pystencils_tests/test_custom_backends.py b/pystencils_tests/test_custom_backends.py index 692f78894e253cb22292555389d9f9c21a5e5ade..6500076ce278bff4fc2a81f65c55553bd9523d78 100644 --- a/pystencils_tests/test_custom_backends.py +++ b/pystencils_tests/test_custom_backends.py @@ -3,6 +3,7 @@ from subprocess import CalledProcessError import pytest import sympy +import pycuda.driver import pystencils import pystencils.cpu.cpujit import pystencils.gpucuda.cudajit @@ -31,7 +32,7 @@ def test_custom_backends_cpu(): z[0, 0], x[0, 0] * sympy.log(x[0, 0] * y[0, 0]))], []) ast = pystencils.create_kernel(normal_assignments, target='cpu') - print(pystencils.show_code(ast, ScreamingBackend())) + pystencils.show_code(ast, ScreamingBackend()) with pytest.raises(CalledProcessError): pystencils.cpu.cpujit.make_python_function(ast, custom_backend=ScreamingBackend()) @@ -46,6 +47,6 @@ def test_custom_backends_gpu(): z[0, 0], x[0, 0] * sympy.log(x[0, 0] * y[0, 0]))], []) ast = pystencils.create_kernel(normal_assignments, target='gpu') - print(pystencils.show_code(ast, ScreamingGpuBackend())) + pystencils.show_code(ast, ScreamingGpuBackend()) with pytest.raises(pycuda.driver.CompileError): pystencils.gpucuda.cudajit.make_python_function(ast, custom_backend=ScreamingGpuBackend()) diff --git a/pystencils_tests/test_fast_approximation.py b/pystencils_tests/test_fast_approximation.py index 76bef174eb7451234dcf347818fdb2d456ce7005..6c9539f64ee2a911123a8fd9f10845a3c67dcbea 100644 --- a/pystencils_tests/test_fast_approximation.py +++ b/pystencils_tests/test_fast_approximation.py @@ -12,7 +12,7 @@ def test_fast_sqrt(): assert len(insert_fast_sqrts(expr).atoms(fast_sqrt)) == 1 assert len(insert_fast_sqrts([expr])[0].atoms(fast_sqrt)) == 1 ast = ps.create_kernel(ps.Assignment(g[0, 0], insert_fast_sqrts(expr)), target='gpu') - code_str = str(ps.show_code(ast)) + code_str = ps.get_code_str(ast) assert '__fsqrt_rn' in code_str expr = ps.Assignment(sp.Symbol("tmp"), 3 / sp.sqrt(f[0, 0] + f[1, 0])) @@ -21,7 +21,7 @@ def test_fast_sqrt(): ac = ps.AssignmentCollection([expr], []) assert len(insert_fast_sqrts(ac).main_assignments[0].atoms(fast_inv_sqrt)) == 1 ast = ps.create_kernel(insert_fast_sqrts(ac), target='gpu') - code_str = str(ps.show_code(ast)) + code_str = ps.get_code_str(ast) assert '__frsqrt_rn' in code_str @@ -34,5 +34,5 @@ def test_fast_divisions(): assert len(insert_fast_divisions(expr).atoms(fast_division)) == 1 ast = ps.create_kernel(ps.Assignment(g[0, 0], insert_fast_divisions(expr)), target='gpu') - code_str = str(ps.show_code(ast)) + code_str = ps.get_code_str(ast) assert '__fdividef' in code_str diff --git a/pystencils_tests/test_interpolation.py b/pystencils_tests/test_interpolation.py index 477765bb31289dbfdc48927e3cc55f10d49f16a0..d53b24032d8c8ee5f3a5b862b95cad5311ba5aca 100644 --- a/pystencils_tests/test_interpolation.py +++ b/pystencils_tests/test_interpolation.py @@ -49,7 +49,7 @@ def test_interpolation(): print(assignments) ast = pystencils.create_kernel(assignments) print(ast) - print(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() pyconrad.imshow(lenna) @@ -69,7 +69,7 @@ def test_scale_interpolation(): print(assignments) ast = pystencils.create_kernel(assignments) print(ast) - print(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() out = np.zeros_like(lenna) @@ -81,9 +81,9 @@ def test_scale_interpolation(): ['border', 'clamp', pytest.param('warp', marks=pytest.mark.xfail( - reason="requires interpolation-refactoring branch")), + reason="Fails on newer SymPy version due to complex conjugate()")), pytest.param('mirror', marks=pytest.mark.xfail( - reason="requires interpolation-refactoring branch")), + reason="Fails on newer SymPy version due to complex conjugate()")), ]) def test_rotate_interpolation(address_mode): """ @@ -100,7 +100,7 @@ def test_rotate_interpolation(address_mode): print(assignments) ast = pystencils.create_kernel(assignments) print(ast) - print(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() out = np.zeros_like(lenna) @@ -108,90 +108,93 @@ def test_rotate_interpolation(address_mode): pyconrad.imshow(out, "out " + address_mode) -@pytest.mark.parametrize('dtype', (np.int32, np.float32, np.float64)) -@pytest.mark.parametrize('address_mode', ('border', 'wrap', 'clamp', 'mirror')) -@pytest.mark.parametrize('use_textures', ('use_textures', False)) -def test_rotate_interpolation_gpu(dtype, address_mode, use_textures): +@pytest.mark.parametrize('address_mode', ['border', 'wrap', 'clamp', 'mirror']) +def test_rotate_interpolation_gpu(address_mode): pytest.importorskip('pycuda') - + import pycuda.autoinit # NOQA import pycuda.gpuarray as gpuarray - import pycuda.autoinit # noqa + rotation_angle = sympy.pi / 5 scale = 1 - if dtype == np.int32: - lenna_gpu = gpuarray.to_gpu( - np.ascontiguousarray(lenna * 255, dtype)) - else: - lenna_gpu = gpuarray.to_gpu( - np.ascontiguousarray(lenna, dtype)) - x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0) - - transformed = scale * \ - sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) - sympy.Matrix([2, 2]) - assignments = pystencils.AssignmentCollection({ - y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed) - }) - print(assignments) - ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures) - print(ast) - print(pystencils.show_code(ast)) - kernel = ast.compile() - - out = gpuarray.zeros_like(lenna_gpu) - kernel(x=lenna_gpu, y=out) - pyconrad.imshow(out, - f"out {address_mode} texture:{use_textures} {type_map[dtype]}") - - -@pytest.mark.parametrize('address_mode', ['border', 'wrap', - pytest.param('warp', marks=pytest.mark.xfail( - reason="% printed as fmod on old sympy")), - pytest.param('mirror', marks=pytest.mark.xfail( - reason="% printed as fmod on old sympy")), - ]) -@pytest.mark.parametrize('dtype', [np.float64, np.float32, np.int32]) -@pytest.mark.parametrize('use_textures', ('use_textures', False,)) -def test_shift_interpolation_gpu(address_mode, dtype, use_textures): - sver = sympy.__version__.split(".") - if (int(sver[0]) == 1 and int(sver[1]) < 2) and address_mode in ['mirror', 'warp']: - pytest.skip() + previous_result = None + for dtype in [np.int32, np.float32, np.float64]: + if dtype == np.int32: + lenna_gpu = gpuarray.to_gpu( + np.ascontiguousarray(lenna * 255, dtype)) + else: + lenna_gpu = gpuarray.to_gpu( + np.ascontiguousarray(lenna, dtype)) + for use_textures in [True, False]: + x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0) + + transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * \ + sympy.Matrix((x_, y_)) - sympy.Matrix([2, 2]) + assignments = pystencils.AssignmentCollection({ + y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed) + }) + print(assignments) + ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures) + print(ast) + pystencils.show_code(ast) + kernel = ast.compile() + + out = gpuarray.zeros_like(lenna_gpu) + kernel(x=lenna_gpu, y=out) + pyconrad.imshow(out, + f"out {address_mode} texture:{use_textures} {type_map[dtype]}") + skimage.io.imsave(f"/tmp/out {address_mode} texture:{use_textures} {type_map[dtype]}.tif", + np.ascontiguousarray(out.get(), np.float32)) + if previous_result is not None: + try: + assert np.allclose(previous_result[4:-4, 4:-4], out.get()[4:-4, 4:-4], rtol=100, atol=1e-3) + except AssertionError: # NOQA + print("Max error: %f" % np.max(previous_result - out.get())) + # pyconrad.imshow(previous_result - out.get(), "Difference image") + # raise e + previous_result = out.get() + + +@pytest.mark.parametrize('address_mode', ['border', 'wrap', 'clamp', 'mirror']) +def test_shift_interpolation_gpu(address_mode): pytest.importorskip('pycuda') - + import pycuda.autoinit # NOQA import pycuda.gpuarray as gpuarray - import pycuda.autoinit # noqa rotation_angle = 0 # sympy.pi / 5 scale = 1 # shift = - sympy.Matrix([1.5, 1.5]) shift = sympy.Matrix((0.0, 0.0)) - if dtype == np.int32: - lenna_gpu = gpuarray.to_gpu( - np.ascontiguousarray(lenna * 255, dtype)) - else: - lenna_gpu = gpuarray.to_gpu( - np.ascontiguousarray(lenna, dtype)) - - x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0) - - if use_textures: - transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift - else: - transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift - assignments = pystencils.AssignmentCollection({ - y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed) - }) - # print(assignments) - ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures) - # print(ast) - print(pystencils.show_code(ast)) - kernel = ast.compile() - - out = gpuarray.zeros_like(lenna_gpu) - kernel(x=lenna_gpu, y=out) - pyconrad.imshow(out, - f"out {address_mode} texture:{use_textures} {type_map[dtype]}") + for dtype in [np.float64, np.float32, np.int32]: + if dtype == np.int32: + lenna_gpu = gpuarray.to_gpu( + np.ascontiguousarray(lenna * 255, dtype)) + else: + lenna_gpu = gpuarray.to_gpu( + np.ascontiguousarray(lenna, dtype)) + for use_textures in [True, False]: + x_f, y_f = pystencils.fields('x,y: %s [2d]' % type_map[dtype], ghost_layers=0) + + if use_textures: + transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift + else: + transformed = scale * sympy.rot_axis3(rotation_angle)[:2, :2] * sympy.Matrix((x_, y_)) + shift + assignments = pystencils.AssignmentCollection({ + y_f.center(): LinearInterpolator(x_f, address_mode=address_mode).at(transformed) + }) + # print(assignments) + ast = pystencils.create_kernel(assignments, target='gpu', use_textures_for_interpolation=use_textures) + # print(ast) + pystencils.show_code(ast) + kernel = ast.compile() + + out = gpuarray.zeros_like(lenna_gpu) + kernel(x=lenna_gpu, y=out) + pyconrad.imshow(out, + f"out {address_mode} texture:{use_textures} {type_map[dtype]}") + skimage.io.imsave(f"/tmp/out {address_mode} texture:{use_textures} {type_map[dtype]}.tif", + np.ascontiguousarray(out.get(), np.float32)) @pytest.mark.parametrize('address_mode', ['border', 'clamp']) @@ -210,7 +213,7 @@ def test_rotate_interpolation_size_change(address_mode): print(assignments) ast = pystencils.create_kernel(assignments) print(ast) - print(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() out = np.zeros((100, 150), np.float64) @@ -219,7 +222,7 @@ def test_rotate_interpolation_size_change(address_mode): @pytest.mark.parametrize('address_mode, target', - itertools.product(['border', 'wrap', 'clamp', 'mirror'], ['cpu'])) + itertools.product(['border', 'wrap', 'clamp', 'mirror'], ['cpu', 'gpu'])) def test_field_interpolated(address_mode, target): x_f, y_f = pystencils.fields('x,y: float64 [2d]') @@ -227,19 +230,13 @@ def test_field_interpolated(address_mode, target): y_f.center(): x_f.interpolated_access([0.5 * x_ + 2.7, 0.25 * y_ + 7.2], address_mode=address_mode) }) print(assignments) - ast = pystencils.create_kernel(assignments, target=target) + ast = pystencils.create_kernel(assignments) print(ast) - print(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() out = np.zeros_like(lenna) kernel(x=lenna, y=out) pyconrad.imshow(out, "out " + address_mode) - - -def test_spatial_derivative(): - x, y = pystencils.fields('x, y: float32[2d]') - tx, ty = pystencils.fields('t_x, t_y: float32[2d]') - - diff = sympy.diff(x.interpolated_access((tx.center, ty.center)), tx.center) - print("diff: " + str(diff)) + kernel(x=lenna, y=out) + pyconrad.imshow(out, "out " + address_mode) diff --git a/pystencils_tests/test_jacobi_cbackend.py b/pystencils_tests/test_jacobi_cbackend.py index 9206aeedaf4bb035444f9280cf58968c9ca385c9..6d86ecb05f920f7a6c54b018ea5dd3508172b727 100644 --- a/pystencils_tests/test_jacobi_cbackend.py +++ b/pystencils_tests/test_jacobi_cbackend.py @@ -1,6 +1,6 @@ import numpy as np -from pystencils import show_code +from pystencils import get_code_obj from pystencils.astnodes import Block, KernelFunction, SympyAssignment from pystencils.cpu import make_python_function from pystencils.field import Field @@ -36,7 +36,7 @@ def test_jacobi_fixed_field_size(): error = np.sum(np.abs(dst_field_py - dst_field_c)) np.testing.assert_allclose(error, 0.0, atol=1e-13) - code_display = show_code(ast_node) + code_display = get_code_obj(ast_node) assert 'for' in str(code_display) assert 'for' in code_display._repr_html_() diff --git a/pystencils_tests/test_jacobi_llvm.py b/pystencils_tests/test_jacobi_llvm.py index 13b22aa4b0235bb98b4789e3b9266bf672985111..95bd52d2edd706fc3e8b6c595c7ad9855ae5e4f6 100644 --- a/pystencils_tests/test_jacobi_llvm.py +++ b/pystencils_tests/test_jacobi_llvm.py @@ -52,7 +52,7 @@ def test_jacobi_fixed_field_size_gpu(): jacobi = Assignment(d[0, 0], (f[1, 0] + f[-1, 0] + f[0, 1] + f[0, -1]) / 4) ast = create_kernel([jacobi], target='gpu') - print(show_code(ast)) + show_code(ast) for x in range(1, size[0] - 1): for y in range(1, size[1] - 1): diff --git a/pystencils_tests/test_opencl.py b/pystencils_tests/test_opencl.py index af13c51c168cb826ee6499f0d0d09db10a388e4c..830cf60633e4fc651257201379d42a2a630c334d 100644 --- a/pystencils_tests/test_opencl.py +++ b/pystencils_tests/test_opencl.py @@ -27,10 +27,9 @@ def test_print_opencl(): print(ast) - code = pystencils.show_code(ast, custom_backend=CudaBackend()) - print(code) + pystencils.show_code(ast, custom_backend=CudaBackend()) - opencl_code = pystencils.show_code(ast, custom_backend=OpenClBackend()) + opencl_code = pystencils.get_code_str(ast, custom_backend=OpenClBackend()) print(opencl_code) assert "__global double * RESTRICT const _data_x" in str(opencl_code) @@ -108,10 +107,9 @@ def test_opencl_jit(): print(ast) - code = pystencils.show_code(ast, custom_backend=CudaBackend()) - print(code) - opencl_code = pystencils.show_code(ast, custom_backend=OpenClBackend()) - print(opencl_code) + pystencils.show_code(ast, custom_backend=CudaBackend()) + + pystencils.show_code(ast, custom_backend=OpenClBackend()) cuda_kernel = ast.compile() assert cuda_kernel is not None diff --git a/pystencils_tests/test_source_code_comment.py b/pystencils_tests/test_source_code_comment.py index 6cc66feb6f7f92174029e274feee22dfc4455b8d..16e6e5a9647843db4483b951aa631b591240dac5 100644 --- a/pystencils_tests/test_source_code_comment.py +++ b/pystencils_tests/test_source_code_comment.py @@ -27,4 +27,5 @@ def test_source_code_comment(): print(ast) compiled = ast.compile() assert compiled is not None - print(pystencils.show_code(ast)) + + pystencils.show_code(ast) diff --git a/pystencils_tests/test_sum_prod.py b/pystencils_tests/test_sum_prod.py index 4fa5c0618612b013edda4d164dd035dafdd2438a..4b4cd7131ad4b860c754865cd35f3960399e9b5a 100644 --- a/pystencils_tests/test_sum_prod.py +++ b/pystencils_tests/test_sum_prod.py @@ -30,7 +30,7 @@ def test_sum(): }) ast = pystencils.create_kernel(assignments) - code = str(pystencils.show_code(ast)) + code = str(pystencils.get_code_obj(ast)) kernel = ast.compile() print(code) @@ -58,11 +58,11 @@ def test_sum_use_float(): }) ast = pystencils.create_kernel(assignments, data_type=create_type('float32')) - code = str(pystencils.show_code(ast)) + code = str(pystencils.get_code_obj(ast)) kernel = ast.compile() print(code) - print(pystencils.show_code(ast)) + print(pystencils.get_code_obj(ast)) assert 'float sum' in code array = np.zeros((10,), np.float32) @@ -89,7 +89,7 @@ def test_product(): }) ast = pystencils.create_kernel(assignments) - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) kernel = ast.compile() print(code) @@ -120,11 +120,9 @@ def test_prod_var_limit(): }) ast = pystencils.create_kernel(assignments) - code = str(pystencils.show_code(ast)) + pystencils.show_code(ast) kernel = ast.compile() - print(code) - array = np.zeros((10,), np.int64) kernel(x=array, limit=100) diff --git a/pystencils_tests/test_sympy_optimizations.py b/pystencils_tests/test_sympy_optimizations.py index 745b936ea7d0e3ce5da6c684dee42c56c09dd835..0899d5b10cd87ff1e6acc630c8c88ea865005be5 100644 --- a/pystencils_tests/test_sympy_optimizations.py +++ b/pystencils_tests/test_sympy_optimizations.py @@ -18,7 +18,7 @@ def test_sympy_optimizations(): assignments = optimize_assignments(assignments, optims_pystencils_cpu) ast = pystencils.create_kernel(assignments, target=target) - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) assert 'expm1(' in code @@ -35,7 +35,7 @@ def test_evaluate_constant_terms(): assignments = optimize_assignments(assignments, optims_pystencils_cpu) ast = pystencils.create_kernel(assignments, target=target) - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) assert 'cos(' not in code print(code) @@ -55,6 +55,6 @@ def test_do_not_evaluate_constant_terms(): optimize_assignments(assignments, optimizations) ast = pystencils.create_kernel(assignments, target=target) - code = str(pystencils.show_code(ast)) + code = pystencils.get_code_str(ast) assert 'cos(' in code print(code)