From bb11a67a41566c4377ebdf17caae9168ce9fc96c Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Tue, 8 Nov 2011 00:06:35 -0500 Subject: [PATCH] A few CSE fixes, plus new error checks. --- loopy/cse.py | 29 ++++++++++++++++++++--------- loopy/kernel.py | 3 +-- 2 files changed, 21 insertions(+), 11 deletions(-) diff --git a/loopy/cse.py b/loopy/cse.py index 45579e532..2cbf7f8d8 100644 --- a/loopy/cse.py +++ b/loopy/cse.py @@ -80,11 +80,6 @@ def to_parameters_or_project_out(param_inames, set_inames, set): def process_cses(kernel, uni_template, independent_inames, matching_vars, cse_descriptors): - if not independent_inames: - for csed in cse_descriptors: - csed.lead_index_exprs = [] - return None - from loopy.symbolic import UnidirectionalUnifier ind_inames_set = set(independent_inames) @@ -129,11 +124,15 @@ def process_cses(kernel, uni_template, var_map = None + rhs_deps = set() + from loopy.symbolic import aff_from_expr for lhs, rhs in unifier.equations: cns = isl.Constraint.equality_from_aff( aff_from_expr(set_space, lhs - rhs)) + rhs_deps.update(get_dependencies(rhs)) + cns_map = isl.BasicMap.from_constraint(cns) if var_map is None: var_map = cns_map @@ -154,10 +153,13 @@ def process_cses(kernel, uni_template, if restr_rhs_map.range() != kernel.domain: continue + restr_rhs_map = restr_rhs_map.project_out_except( + rhs_deps, [dim_type.out]) + # Sanity check: Injectivity here means that unique lead indices # can be found for each - if not var_map.is_injective(): + if not restr_rhs_map.is_injective(): raise RuntimeError("In CSEs '%s' and '%s': " "cannot find lead indices uniquely" % (uni_template, csed.cse.child)) @@ -193,6 +195,10 @@ def process_cses(kernel, uni_template, # }}} + assert (footprint + .project_out_except(independent_inames, [dim_type.set]) + .is_bounded()) + return footprint, matching_var_values, @@ -378,9 +384,11 @@ def realize_cse(kernel, cse_tag, dtype, independent_inames=[], based_on = iname if new_inames is not None and i < len(new_inames): based_on = new_inames[i] + elif cse_tag is not None: + based_on = "%s_%s" % (iname, cse_tag) new_iname = kernel.make_unique_var_name( - based_on=iname, extra_used_vars=newly_created_var_names) + based_on=based_on, extra_used_vars=newly_created_var_names) old_to_new[iname] = var(new_iname) newly_created_var_names.add(new_iname) new_independent_inames.append(new_iname) @@ -397,6 +405,11 @@ def realize_cse(kernel, cse_tag, dtype, independent_inames=[], # }}} + if not set(independent_inames) <= get_dependencies(uni_template): + raise RuntimeError("independent iname(s) '%s' do not occur in unification " + "template" % (",".join( + set(independent_inames)-get_dependencies(uni_template)))) + # {{{ deal with iname deps of uni_template that are not independent_inames # (We call these 'matching_vars', because they have to match exactly in @@ -471,8 +484,6 @@ def realize_cse(kernel, cse_tag, dtype, independent_inames=[], # }}} - # }}} - # {{{ set up temp variable var_base = cse_tag diff --git a/loopy/kernel.py b/loopy/kernel.py index 8ae0482a7..b3acea7ff 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -948,9 +948,8 @@ class LoopKernel(Record): assert cur_axis is not None while cur_axis > len(size_list): - from loopy import LoopyAdvisory raise RuntimeError("%s axis %d unused" % ( - which, len(size_list)), LoopyAdvisory) + which, len(size_list))) size_list.append(zero_aff + 1) size_list.append(size_dict[cur_axis]) -- GitLab