def map_subscript(self, expr): subscript = expr.index if not isinstance(subscript, tuple): subscript = (subscript, ) from loopy.symbolic import get_access_range try: access_range = get_access_range(self.domain, subscript, self.kernel.assumptions) except isl.Error: # Likely: index was non-linear, nothing we can do. if self.ignore_uncountable: return {} else: raise LoopyError("failed to gather footprint: %s" % expr) except TypeError: # Likely: index was non-linear, nothing we can do. if self.ignore_uncountable: return {} else: raise LoopyError("failed to gather footprint: %s" % expr) from pymbolic.primitives import Variable assert isinstance(expr.aggregate, Variable) return self.combine( [self.rec(expr.index), { expr.aggregate.name: access_range }])
def map_subscript(self, expr): subscript = expr.index if not isinstance(subscript, tuple): subscript = (subscript,) from loopy.symbolic import get_access_range try: access_range = get_access_range(self.domain, subscript, self.kernel.assumptions) except isl.Error: # Likely: index was non-linear, nothing we can do. if self.ignore_uncountable: return {} else: raise LoopyError("failed to gather footprint: %s" % expr) except TypeError: # Likely: index was non-linear, nothing we can do. if self.ignore_uncountable: return {} else: raise LoopyError("failed to gather footprint: %s" % expr) from pymbolic.primitives import Variable assert isinstance(expr.aggregate, Variable) return self.combine([ self.rec(expr.index), {expr.aggregate.name: access_range}])
def _get_access_range(self, domain, subscript): from loopy.symbolic import (get_access_range, UnableToDetermineAccessRange) try: return get_access_range(domain, subscript) except UnableToDetermineAccessRange: return None
def map_subscript(self, expr): WalkMapper.map_subscript(self, expr) from pymbolic.primitives import Variable assert isinstance(expr.aggregate, Variable) shape = None var_name = expr.aggregate.name if var_name in self.kernel.arg_dict: arg = self.kernel.arg_dict[var_name] shape = arg.shape elif var_name in self.kernel.temporary_variables: tv = self.kernel.temporary_variables[var_name] shape = tv.shape if shape is not None: subscript = expr.index if not isinstance(subscript, tuple): subscript = (subscript,) from loopy.symbolic import (get_dependencies, get_access_range, UnableToDetermineAccessRange) available_vars = set(self.domain.get_var_dict()) shape_deps = set() for shape_axis in shape: if shape_axis is not None: shape_deps.update(get_dependencies(shape_axis)) if not (get_dependencies(subscript) <= available_vars and shape_deps <= available_vars): return if len(subscript) != len(shape): raise LoopyError("subscript to '%s' in '%s' has the wrong " "number of indices (got: %d, expected: %d)" % ( expr.aggregate.name, expr, len(subscript), len(shape))) try: access_range = get_access_range(self.domain, subscript, self.kernel.assumptions) except UnableToDetermineAccessRange: # Likely: index was non-affine, nothing we can do. return shape_domain = isl.BasicSet.universe(access_range.get_space()) for idim in range(len(subscript)): shape_axis = shape[idim] if shape_axis is not None: from loopy.isl_helpers import make_slab slab = make_slab( shape_domain.get_space(), (dim_type.in_, idim), 0, shape_axis) shape_domain = shape_domain.intersect(slab) if not access_range.is_subset(shape_domain): raise LoopyError("'%s' in instruction '%s' " "accesses out-of-bounds array element (could not" " establish '%s' is a subset of '%s')." % (expr, self.insn_id, access_range, shape_domain))
def map_subscript(self, expr): WalkMapper.map_subscript(self, expr) from pymbolic.primitives import Variable assert isinstance(expr.aggregate, Variable) shape = None var_name = expr.aggregate.name if var_name in self.kernel.arg_dict: arg = self.kernel.arg_dict[var_name] shape = arg.shape elif var_name in self.kernel.temporary_variables: tv = self.kernel.temporary_variables[var_name] shape = tv.shape if shape is not None: subscript = expr.index if not isinstance(subscript, tuple): subscript = (subscript,) from loopy.symbolic import get_dependencies, get_access_range available_vars = set(self.domain.get_var_dict()) shape_deps = set() for shape_axis in shape: if shape_axis is not None: shape_deps.update(get_dependencies(shape_axis)) if not (get_dependencies(subscript) <= available_vars and shape_deps <= available_vars): return if len(subscript) != len(shape): raise LoopyError("subscript to '%s' in '%s' has the wrong " "number of indices (got: %d, expected: %d)" % ( expr.aggregate.name, expr, len(subscript), len(shape))) try: access_range = get_access_range(self.domain, subscript, self.kernel.assumptions) except isl.Error: # Likely: index was non-linear, nothing we can do. return except TypeError: # Likely: index was non-linear, nothing we can do. return shape_domain = isl.BasicSet.universe(access_range.get_space()) for idim in range(len(subscript)): shape_axis = shape[idim] if shape_axis is not None: from loopy.isl_helpers import make_slab slab = make_slab( shape_domain.get_space(), (dim_type.in_, idim), 0, shape_axis) shape_domain = shape_domain.intersect(slab) if not access_range.is_subset(shape_domain): raise LoopyError("'%s' in instruction '%s' " "accesses out-of-bounds array element" % (expr, self.insn_id))