diff --git a/loopy/symbolic.py b/loopy/symbolic.py index 0cc8f4ba6a1531d748bd90492f570dbb563d962d..8927cd6fba97d847e425fe9b2eaa8960297cdb76 100644 --- a/loopy/symbolic.py +++ b/loopy/symbolic.py @@ -57,6 +57,8 @@ from pymbolic.mapper.constant_folder import \ from pymbolic.parser import Parser as ParserBase +from loopy.diagnostic import ExpressionToAffineConversionError + import islpy as isl from islpy import dim_type @@ -1401,16 +1403,9 @@ def simplify_using_aff(kernel, expr): domain = kernel.get_inames_domain(inames) - from pymbolic.mapper.evaluator import UnknownVariableError - try: - with isl.SuppressedWarnings(kernel.isl_context): - aff = aff_from_expr(domain.space, expr) - except isl.Error: - return expr - except TypeError: - return expr - except UnknownVariableError: + aff = guarded_aff_from_expr(domain.space, expr) + except ExpressionToAffineConversionError: return expr # FIXME: Deal with assumptions, too. diff --git a/loopy/transform/array_buffer_map.py b/loopy/transform/array_buffer_map.py index 618e36f20da8b3f9089ecf5ce88d6b3177528570..b62e13d6b268a9b84e209a5c8958dc949114eecf 100644 --- a/loopy/transform/array_buffer_map.py +++ b/loopy/transform/array_buffer_map.py @@ -1,5 +1,4 @@ from __future__ import division, absolute_import -from six.moves import range, zip __copyright__ = "Copyright (C) 2012-2015 Andreas Kloeckner" @@ -23,6 +22,8 @@ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. """ +from six.moves import range, zip + import islpy as isl from islpy import dim_type from loopy.symbolic import (get_dependencies, SubstitutionMapper) @@ -89,12 +90,12 @@ def build_per_access_storage_to_domain_map(storage_axis_exprs, domain, stor2sweep = None - from loopy.symbolic import aff_from_expr + from loopy.symbolic import guarded_aff_from_expr for saxis, sa_expr in zip(storage_axis_names, storage_axis_exprs): - cns = isl.Constraint.equality_from_aff( - aff_from_expr(set_space, - var(saxis+"'") - prime_sweep_inames(sa_expr))) + cns_expr = var(saxis+"'") - prime_sweep_inames(sa_expr) + cns_aff = guarded_aff_from_expr(set_space, cns_expr) + cns = isl.Constraint.equality_from_aff(cns_aff) cns_map = isl.BasicMap.from_constraint(cns) if stor2sweep is None: @@ -352,13 +353,11 @@ class ArrayToBufferMap(object): self.stor2sweep, except_inames=frozenset(self.primed_sweep_inames)).domain() - arg_inames = ( - set(global_s2s_par_dom.get_var_names(dim_type.param)) - & self.kernel.all_inames()) + arg_inames = set(global_s2s_par_dom.get_var_names(dim_type.param)) for arg in storage_axis_exprs: arg_inames.update(get_dependencies(arg)) - arg_inames = frozenset(arg_inames) + arg_inames = frozenset(arg_inames & self.kernel.all_inames()) from loopy.kernel import CannotBranchDomainTree try: diff --git a/test/test_apps.py b/test/test_apps.py index 2a88e0b7400d5330d652f1fc5c2b1ba37d19df9f..e7f4004fa0f2285920bdf9a0848c0d400e2c31b7 100644 --- a/test/test_apps.py +++ b/test/test_apps.py @@ -43,6 +43,8 @@ else: from pyopencl.tools import pytest_generate_tests_for_pyopencl \ as pytest_generate_tests +from loopy.diagnostic import LoopyError + __all__ = [ "pytest_generate_tests", "cl" # 'cl.create_some_context' @@ -670,6 +672,26 @@ def test_domain_tree_nesting(): assert depth(i) < 2 +def test_prefetch_through_indirect_access(): + knl = lp.make_kernel("{[i, j, k]: 0 <= i,k < 10 and 0<=j<2}", + """ + for i, j, k + a[map1[indirect[i], j], k] = 2 + end + """, + [ + lp.GlobalArg("a", strides=(2, 1), dtype=int), + lp.GlobalArg("map1", shape=(10, 10), dtype=int), + "..." + ], + target=lp.CTarget()) + + knl = lp.prioritize_loops(knl, "i,j,k") + + with pytest.raises(LoopyError): + knl = lp.add_prefetch(knl, "map1[:, j]") + + if __name__ == "__main__": if len(sys.argv) > 1: exec(sys.argv[1])