From aa0434b64dab93b29525bd2cdbe8a7bc1b0e66cd Mon Sep 17 00:00:00 2001 From: Andreas Kloeckner <inform@tiker.net> Date: Mon, 13 Aug 2012 01:28:14 -0400 Subject: [PATCH] Reenable domain check in multi-domain. --- MEMO | 11 +++++------ loopy/check.py | 26 +++++++++++++++++++------- loopy/codegen/__init__.py | 4 ++-- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/MEMO b/MEMO index cd91b7754..89b679863 100644 --- a/MEMO +++ b/MEMO @@ -46,9 +46,6 @@ To-do - Group instructions by dependency/inames for scheduling, to increase sched. scalability -- Multi-domain - - Reenable codegen sanity check. - - Kernel splitting (via what variables get computed in a kernel) - What if no universally valid precompute base index expression is found? @@ -56,8 +53,6 @@ To-do - Add dependencies after the fact -- Expose iname-duplicate-and-rename as a primitive. - - Fix all tests - Scalar insn priority @@ -71,6 +66,8 @@ To-do Future ideas ^^^^^^^^^^^^ +- Expose iname-duplicate-and-rename as a primitive. + - Array language - reg rolling @@ -121,7 +118,9 @@ Dealt with - What to do about constants in codegen? (...f suffix, complex types) -> dealt with by type contexts -- relating to Multi-Domain +- relating to Multi-Domain [DONE] + - Reenable codegen sanity check. [DONE] + - Incorporate loop-bound-mediated iname dependencies into domain parenthood. [DONE] diff --git a/loopy/check.py b/loopy/check.py index 17df483b4..93d268671 100644 --- a/loopy/check.py +++ b/loopy/check.py @@ -209,12 +209,7 @@ def run_automatic_checks(kernel): def check_implemented_domains(kernel, implemented_domains): from islpy import dim_type - parameter_inames = set( - kernel.domain.get_dim_name(dim_type.param, i) - for i in range(kernel.domain.dim(dim_type.param))) - - from islpy import align_spaces - assumptions = align_spaces(kernel.assumptions, kernel.domain) + from islpy import align_spaces, align_two for insn_id, idomains in implemented_domains.iteritems(): insn = kernel.id_to_insn[insn_id] @@ -224,17 +219,34 @@ def check_implemented_domains(kernel, implemented_domains): insn_impl_domain = idomains[0] for idomain in idomains[1:]: insn_impl_domain = insn_impl_domain | idomain + assumptions = align_spaces(kernel.assumptions, insn_impl_domain, + obj_bigger_ok=True) insn_impl_domain = ( (insn_impl_domain & assumptions) .project_out_except(kernel.insn_inames(insn), [dim_type.set])) - desired_domain = ((kernel.domain & assumptions) + insn_inames = kernel.insn_inames(insn) + insn_domain = kernel.get_inames_domain(insn_inames) + assumptions = align_spaces(kernel.assumptions, insn_domain, + obj_bigger_ok=True) + desired_domain = ((insn_domain & assumptions) .project_out_except(kernel.insn_inames(insn), [dim_type.set])) + insn_impl_domain, desired_domain = align_two( + insn_impl_domain, desired_domain) + + print insn_impl_domain + print desired_domain + print insn_impl_domain != desired_domain + if insn_impl_domain != desired_domain: i_minus_d = insn_impl_domain - desired_domain d_minus_i = desired_domain - insn_impl_domain + parameter_inames = set( + insn_domain.get_dim_name(dim_type.param, i) + for i in range(kernel.domain.dim(dim_type.param))) + lines = [] for kind, diff_set in [ ("implemented, but not desired", i_minus_d), diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py index c7135e550..953ea4918 100644 --- a/loopy/codegen/__init__.py +++ b/loopy/codegen/__init__.py @@ -331,8 +331,8 @@ def generate_code(kernel, with_annotation=False, ) """)) - #from loopy.check import check_implemented_domains - #assert check_implemented_domains(kernel, gen_code.implemented_domains) + from loopy.check import check_implemented_domains + assert check_implemented_domains(kernel, gen_code.implemented_domains) # {{{ handle preambles -- GitLab