From 141d92d244aadd9db229307cfdbdeaaba543b2cf Mon Sep 17 00:00:00 2001 From: zachjweiner Date: Fri, 30 Nov 2018 17:33:47 -0600 Subject: [PATCH 1/5] andreas's start --- loopy/transform/iname.py | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/loopy/transform/iname.py b/loopy/transform/iname.py index 83598dcc2..0c0cd215a 100644 --- a/loopy/transform/iname.py +++ b/loopy/transform/iname.py @@ -1750,4 +1750,38 @@ def add_inames_to_insn(knl, inames, insn_match): # }}} +# {{{ nest_and_predicate_instructions + +def nest_and_predicate_instructions(kernel, iname, within): + from loopy.match import parse_insn_match + within = parse_insn_match(within) + + from pymbolic import var + from pymbolic.primitives import Comparison + + def rewrite_insn(insn): + if within(insn): + if iname in insn.within_inames: + raise LoopyError("instruction '%s' is already nested " + "within iname '%s'" % (insn.id, iname)) + return insn.copy( + within_inames=insn.within_inames | frozenset([iname]), + predicates=( + # FIXME Do a better job finding the lower bound + insn.predicates + | frozenset(Comparison(var(iname), "==", 0))) + ) + else: + return insn + + + return kernel.copy( + instructions=[rewrite_insn(insn) for insn in kernel.instructions] + ) + + + + +# }}} + # vim: foldmethod=marker -- GitLab From 78428af635509a2b52e4d1cc16d95267c51995d2 Mon Sep 17 00:00:00 2001 From: zachjweiner Date: Wed, 5 Dec 2018 14:00:03 -0600 Subject: [PATCH 2/5] parse_insn_match -> parse_match --- loopy/transform/iname.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/loopy/transform/iname.py b/loopy/transform/iname.py index 0c0cd215a..b8fb89d15 100644 --- a/loopy/transform/iname.py +++ b/loopy/transform/iname.py @@ -1753,8 +1753,8 @@ def add_inames_to_insn(knl, inames, insn_match): # {{{ nest_and_predicate_instructions def nest_and_predicate_instructions(kernel, iname, within): - from loopy.match import parse_insn_match - within = parse_insn_match(within) + from loopy.match import parse_match + within = parse_match(within) from pymbolic import var from pymbolic.primitives import Comparison -- GitLab From 5aa1ced225e25f4f55fab57cc7156b0ea459fc95 Mon Sep 17 00:00:00 2001 From: zachjweiner Date: Thu, 6 Dec 2018 13:28:18 -0600 Subject: [PATCH 3/5] fixes bugs so that function runs without error --- loopy/transform/iname.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/loopy/transform/iname.py b/loopy/transform/iname.py index b8fb89d15..42deb981d 100644 --- a/loopy/transform/iname.py +++ b/loopy/transform/iname.py @@ -1758,9 +1758,8 @@ def nest_and_predicate_instructions(kernel, iname, within): from pymbolic import var from pymbolic.primitives import Comparison - def rewrite_insn(insn): - if within(insn): + if within(kernel, insn): if iname in insn.within_inames: raise LoopyError("instruction '%s' is already nested " "within iname '%s'" % (insn.id, iname)) @@ -1769,7 +1768,7 @@ def nest_and_predicate_instructions(kernel, iname, within): predicates=( # FIXME Do a better job finding the lower bound insn.predicates - | frozenset(Comparison(var(iname), "==", 0))) + | frozenset([Comparison(var(iname), "==", 0)])) ) else: return insn -- GitLab From 8fd7ea487366112c6c331c1022e15423870d94fd Mon Sep 17 00:00:00 2001 From: zachjweiner Date: Thu, 6 Dec 2018 13:28:27 -0600 Subject: [PATCH 4/5] add docstring --- loopy/transform/iname.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/loopy/transform/iname.py b/loopy/transform/iname.py index 42deb981d..dbdde7924 100644 --- a/loopy/transform/iname.py +++ b/loopy/transform/iname.py @@ -1753,6 +1753,12 @@ def add_inames_to_insn(knl, inames, insn_match): # {{{ nest_and_predicate_instructions def nest_and_predicate_instructions(kernel, iname, within): + """ + Nests an instruction inside of a loop while only executing on one iteration. + Useful for instructions which don't require all local hardware axes. + :arg iname: loop iname to nest instruction inside + "arg within: instruction to nest and predicate + """ from loopy.match import parse_match within = parse_match(within) -- GitLab From 05f3bbeae0cc49a194b930d09020842af553b648 Mon Sep 17 00:00:00 2001 From: zachjweiner Date: Fri, 7 Dec 2018 17:24:07 -0600 Subject: [PATCH 5/5] appease flake8 --- loopy/transform/iname.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/loopy/transform/iname.py b/loopy/transform/iname.py index dbdde7924..ddc412d94 100644 --- a/loopy/transform/iname.py +++ b/loopy/transform/iname.py @@ -1764,6 +1764,7 @@ def nest_and_predicate_instructions(kernel, iname, within): from pymbolic import var from pymbolic.primitives import Comparison + def rewrite_insn(insn): if within(kernel, insn): if iname in insn.within_inames: @@ -1773,20 +1774,17 @@ def nest_and_predicate_instructions(kernel, iname, within): within_inames=insn.within_inames | frozenset([iname]), predicates=( # FIXME Do a better job finding the lower bound - insn.predicates + insn.predicates | frozenset([Comparison(var(iname), "==", 0)])) ) else: return insn - return kernel.copy( instructions=[rewrite_insn(insn) for insn in kernel.instructions] ) - - # }}} # vim: foldmethod=marker -- GitLab