From 0807b98851b1c1d7956aa96ade7cb784a4524407 Mon Sep 17 00:00:00 2001 From: Stephan Seitz <stephan.seitz@fau.de> Date: Tue, 3 Dec 2019 13:33:13 +0100 Subject: [PATCH] Make OpenCL tests run again - int(...) is not a real cast for CUDA OpenCL - sympy.boolalg has moved to sympy.logic.boolalg --- pystencils/backends/cbackend.py | 9 +++++++-- pystencils/backends/opencl_backend.py | 2 +- pystencils/cpu/vectorization.py | 7 ++++++- pystencils/data_types.py | 15 ++++++++++----- pystencils/transformations.py | 7 ++++++- 5 files changed, 30 insertions(+), 10 deletions(-) diff --git a/pystencils/backends/cbackend.py b/pystencils/backends/cbackend.py index 70e2814f..dcf6e0a0 100644 --- a/pystencils/backends/cbackend.py +++ b/pystencils/backends/cbackend.py @@ -16,6 +16,11 @@ from pystencils.integer_functions import ( bit_shift_left, bit_shift_right, bitwise_and, bitwise_or, bitwise_xor, int_div, int_power_of_2, modulo_ceil) +try: + from sympy.boolalg import BooleanTrue, BooleanFalse +except Exception: + from sympy.logic.boolalg import BooleanTrue, BooleanFalse + try: from sympy.printing.ccode import C99CodePrinter as CCodePrinter except ImportError: @@ -293,9 +298,9 @@ class CBackend: return "" def _print_Conditional(self, node): - if type(node.condition_expr) is sp.boolalg.BooleanTrue: + if type(node.condition_expr) is BooleanTrue: return self._print_Block(node.true_block) - elif type(node.condition_expr) is sp.boolalg.BooleanFalse: + elif type(node.condition_expr) is BooleanFalse: return self._print_Block(node.false_block) cond_type = get_type_of_expression(node.condition_expr) if isinstance(cond_type, VectorType): diff --git a/pystencils/backends/opencl_backend.py b/pystencils/backends/opencl_backend.py index b5da806b..1c6dfbac 100644 --- a/pystencils/backends/opencl_backend.py +++ b/pystencils/backends/opencl_backend.py @@ -73,7 +73,7 @@ class OpenClSympyPrinter(CudaSympyPrinter): function_name, dimension = tuple(symbol_name.split(".")) dimension = self.DIMENSION_MAPPING[dimension] function_name = self.INDEXING_FUNCTION_MAPPING[function_name] - return f"int({function_name}({dimension}))" + return f"(int)({function_name}({dimension}))" def _print_TextureAccess(self, node): raise NotImplementedError() diff --git a/pystencils/cpu/vectorization.py b/pystencils/cpu/vectorization.py index 1e3a434b..c3bae67f 100644 --- a/pystencils/cpu/vectorization.py +++ b/pystencils/cpu/vectorization.py @@ -15,6 +15,11 @@ from pystencils.sympyextensions import fast_subs from pystencils.transformations import ( cut_loop, filtered_tree_iteration, replace_inner_stride_with_one) +try: + from sympy.boolalg import BooleanFunction +except ImportError: + from sympy.logic.boolalg import BooleanFunction + # noinspection PyPep8Naming class vec_any(sp.Function): @@ -177,7 +182,7 @@ def insert_vector_casts(ast_node): visit_expr(expr.args[4])) elif isinstance(expr, cast_func): return expr - elif expr.func in handled_functions or isinstance(expr, sp.Rel) or isinstance(expr, sp.boolalg.BooleanFunction): + elif expr.func in handled_functions or isinstance(expr, (sp.Rel, BooleanFunction)): new_args = [visit_expr(a) for a in expr.args] arg_types = [get_type_of_expression(a) for a in new_args] if not any(type(t) is VectorType for t in arg_types): diff --git a/pystencils/data_types.py b/pystencils/data_types.py index af085ab3..b4f8c931 100644 --- a/pystencils/data_types.py +++ b/pystencils/data_types.py @@ -4,14 +4,19 @@ from functools import partial from typing import Tuple import numpy as np - -import pystencils import sympy as sp import sympy.codegen.ast +from sympy.core.cache import cacheit + +import pystencils from pystencils.cache import memorycache, memorycache_if_hashable from pystencils.utils import all_equal -from sympy.core.cache import cacheit -from sympy.logic.boolalg import Boolean + +try: + from sympy.boolalg import Boolean, BooleanFunction +except Exception: + from sympy.logic.boolalg import Boolean, BooleanFunction + try: import llvmlite.ir as ir @@ -541,7 +546,7 @@ def get_type_of_expression(expr, elif isinstance(expr, sp.Indexed): typed_symbol = expr.base.label return typed_symbol.dtype.base_type - elif isinstance(expr, (sp.boolalg.Boolean, sp.boolalg.BooleanFunction)): + elif isinstance(expr, (Boolean, BooleanFunction)): # if any arg is of vector type return a vector boolean, else return a normal scalar boolean result = create_type("bool") vec_args = [get_type(a) for a in expr.args if isinstance(get_type(a), VectorType)] diff --git a/pystencils/transformations.py b/pystencils/transformations.py index 762c3613..244cd226 100644 --- a/pystencils/transformations.py +++ b/pystencils/transformations.py @@ -21,6 +21,11 @@ from pystencils.kernelparameters import FieldPointerSymbol from pystencils.simp.assignment_collection import AssignmentCollection from pystencils.slicing import normalize_slice +try: + from sympy.boolalg import BooleanFunction +except ImportError: + from sympy.logic.boolalg import BooleanFunction + class NestedScopes: """Symbol visibility model using nested scopes @@ -851,7 +856,7 @@ class KernelConstraintsCheck: return cast_func( self.process_expression(rhs.args[0], type_constants=False), rhs.dtype) - elif isinstance(rhs, sp.boolalg.BooleanFunction) or \ + elif isinstance(rhs, BooleanFunction) or \ type(rhs) in pystencils.integer_functions.__dict__.values(): new_args = [self.process_expression(a, type_constants) for a in rhs.args] types_of_expressions = [get_type_of_expression(a) for a in new_args] -- GitLab