diff --git a/loopy/codegen/__init__.py b/loopy/codegen/__init__.py index 4653adc533be1689779370bed4c6b5860a4613af..e4d1f83a18b0d648eae5f121ca476e6a21860cc4 100644 --- a/loopy/codegen/__init__.py +++ b/loopy/codegen/__init__.py @@ -267,13 +267,23 @@ def generate_code(kernel, with_annotation=False, # }}} - if kernel.preamble is not None: - if isinstance(kernel.preamble, str): - mod.extend([LiteralLines(kernel.preamble), Line()]) - else: - mod.extend( - [LiteralLines(lines) for lines in kernel.preamble] - +[Line()]) + # {{{ handle preambles + + seen_preamble_tags = set() + dedup_preambles = [] + + for tag, preamble in kernel.preambles: + if tag in seen_preamble_tags: + continue + + seen_preamble_tags.add(tag) + dedup_preambles.append(preamble) + + mod.extend( + [LiteralLines(lines) for lines in dedup_preambles] + +[Line()]) + + # }}} mod.extend([ LiteralLines(r""" diff --git a/loopy/kernel.py b/loopy/kernel.py index 7fc58debb5b326801153092fd94fe0dc4243a5e4..d74a9d7ba8f0713b00940a9e91b76fd331752dc2 100644 --- a/loopy/kernel.py +++ b/loopy/kernel.py @@ -360,9 +360,9 @@ class Instruction(Record): if isinstance(self.assignee, Variable): var_name = self.assignee.name elif isinstance(self.assignee, Subscript): - var = self.assignee.aggregate - assert isinstance(var, Variable) - var_name = var.name + agg = self.assignee.aggregate + assert isinstance(agg, Variable) + var_name = agg.name else: raise RuntimeError("invalid lvalue '%s'" % self.assignee) @@ -507,8 +507,8 @@ class LoopKernel(Record): :ivar args: :ivar schedule: :ivar name: - :ivar preamble: a string (or list of strings) that get included before - the kernel. + :ivar preambles: a list of (tag, code) tuples that identify preamble snippets. + Each tag's snippet is only included once, at its first occurrence. :ivar assumptions: the initial implemented_domain, captures assumptions on the parameters. (an isl.Set) :ivar iname_slab_increments: a dictionary mapping inames to (lower_incr, @@ -538,7 +538,7 @@ class LoopKernel(Record): def __init__(self, device, domain, instructions, args=None, schedule=None, name="loopy_kernel", - preamble=None, assumptions=None, + preambles=[], assumptions=None, iname_slab_increments={}, temporary_variables={}, local_sizes={}, @@ -738,7 +738,7 @@ class LoopKernel(Record): args=args, schedule=schedule, name=name, - preamble=preamble, + preambles=preambles, assumptions=assumptions, iname_slab_increments=iname_slab_increments, temporary_variables=temporary_variables,