From 3c7f639301bcedd72a5ed815b9bbf24fab3dc856 Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafaelravedutti@gmail.com> Date: Wed, 19 Oct 2022 23:45:11 +0200 Subject: [PATCH] Avoid kernel duplicates Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com> --- src/pairs/sim/simulation.py | 5 +++++ src/pairs/transformations/devices.py | 10 ++++++---- 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/src/pairs/sim/simulation.py b/src/pairs/sim/simulation.py index 2ed480c..495b5b9 100644 --- a/src/pairs/sim/simulation.py +++ b/src/pairs/sim/simulation.py @@ -89,6 +89,11 @@ class Simulation: def kernels(self): return self.kernel_list + def find_kernel_by_name(self, name): + matches = [k for k in self.kernel_list if k.name == name] + assert len(matches) < 2, "find_kernel_by_name(): More than one match for kernel name!" + return matches[0] if len(matches) == 1 else None + def ndims(self): return self.dims diff --git a/src/pairs/transformations/devices.py b/src/pairs/transformations/devices.py index a5b18f6..b77a0d4 100644 --- a/src/pairs/transformations/devices.py +++ b/src/pairs/transformations/devices.py @@ -72,12 +72,14 @@ class AddDeviceKernels(Mutator): for s in ast_node._block.stmts: if s is not None: if isinstance(s, For) and (not isinstance(s.min, Lit) or not isinstance(s.max, Lit)): - if s.kernel is None: - s.kernel = Kernel(ast_node.sim, f"{ast_node.name}_kernel{kernel_id}", - Filter(ast_node.sim, BinOp.inline(s.iterator < s.max), s.block), s.iterator) + kernel_name = f"{ast_node.name}_kernel{kernel_id}" + kernel = ast_node.sim.find_kernel_by_name(kernel_name) + if kernel is None: + kernel_body = Filter(ast_node.sim, BinOp.inline(s.iterator < s.max), s.block) + kernel = Kernel(ast_node.sim, kernel_name, kernel_body, s.iterator) kernel_id += 1 - new_stmts.append(KernelLaunch(ast_node.sim, s.kernel, s.iterator, s.min, s.max)) + new_stmts.append(KernelLaunch(ast_node.sim, kernel, s.iterator, s.min, s.max)) else: new_stmts.append(s) -- GitLab