From 11d4c1ac37686bf94fd06eacabe81548c864fde2 Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Thu, 23 Nov 2017 17:03:25 -0600 Subject: [PATCH] Improve error message for prefech-on-indirect-access, add test (#104 on gitlab) --- loopy/symbolic.py | 17 ++++++++++++++++- loopy/transform/array_buffer_map.py | 15 +++++++-------- test/test_apps.py | 22 ++++++++++++++++++++++ 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/loopy/symbolic.py b/loopy/symbolic.py index 543c2743b..6e661f422 100644 --- a/loopy/symbolic.py +++ b/loopy/symbolic.py @@ -63,6 +63,8 @@ from islpy import dim_type import re import numpy as np +from loopy.diagnostic import LoopyError + # {{{ mappers with support for loopy-specific primitives @@ -1284,7 +1286,20 @@ def aff_from_expr(space, expr, vars_to_zero=frozenset()): def pwaff_from_expr(space, expr, vars_to_zero=frozenset()): - return PwAffEvaluationMapper(space, vars_to_zero)(expr) + eval_mapper = PwAffEvaluationMapper(space, vars_to_zero) + + from pymbolic.mapper.evaluator import UnknownVariableError + try: + return eval_mapper(expr) + except UnknownVariableError as e: + raise LoopyError("unable to build (piecewise) affine expression " + "in terms of variables '%s' " + "for expression '%s' " + "because '%s: %s'" + % ( + ", ".join(space.get_var_dict()), + expr, + type(e).__name__, e)) # }}} diff --git a/loopy/transform/array_buffer_map.py b/loopy/transform/array_buffer_map.py index 618e36f20..cdd45a069 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) @@ -92,9 +93,9 @@ def build_per_access_storage_to_domain_map(storage_axis_exprs, domain, from loopy.symbolic import 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 = 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 c4844d3a3..9e7c2ee5c 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' @@ -663,6 +665,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]) -- GitLab