From 825886d96e576c95725006ea7f2e35a4e9c334e9 Mon Sep 17 00:00:00 2001 From: Rafael Ravedutti <rafaelravedutti@gmail.com> Date: Thu, 8 Feb 2024 15:45:30 +0100 Subject: [PATCH] Generate interfaces Signed-off-by: Rafael Ravedutti <rafaelravedutti@gmail.com> --- runtime/boundary_weights.hpp | 10 +++++-- src/pairs/code_gen/cgen.py | 40 ++++++++++++++++++++++++++++ src/pairs/sim/domain_partitioning.py | 1 + src/pairs/sim/simulation.py | 1 + 4 files changed, 50 insertions(+), 2 deletions(-) diff --git a/runtime/boundary_weights.hpp b/runtime/boundary_weights.hpp index bf8ffbf..6f62547 100644 --- a/runtime/boundary_weights.hpp +++ b/runtime/boundary_weights.hpp @@ -5,7 +5,13 @@ //--- #include "pairs.hpp" #include "pairs_common.hpp" -#include "gen/interfaces.hpp" + +#define INTERFACE_DIR "interfaces/" +#define INTERFACE_EXT ".hpp" +#define INTERFACE_FILE(a, b, c) a ## b ## c +#define INCLUDE_FILE(filename) #filename + +#include INCLUDE_FILE(INTERFACE_FILE(INTERFACE_DIR, APPLICATION_REFERENCE, INTERFACE_EXT)) #pragma once @@ -51,4 +57,4 @@ void compute_boundary_weights( } } -} \ No newline at end of file +} diff --git a/src/pairs/code_gen/cgen.py b/src/pairs/code_gen/cgen.py index a053d94..7973f44 100644 --- a/src/pairs/code_gen/cgen.py +++ b/src/pairs/code_gen/cgen.py @@ -54,10 +54,50 @@ class CGen: def real_type(self): return Types.c_keyword(self.sim, Types.Real) + def generate_interfaces(self): + self.print = Printer(f"runtime/interfaces/{self.ref}.hpp") + self.print.start() + self.print("#include \"../pairs.hpp\"") + self.generate_interface_namespace('pairs_host_interface') + self.generate_interface_namespace('pairs_cuda_interface', "__inline__ __device__") + self.print.end() + + def generate_interface_namespace(self, namespace, prefix=None): + self.print("") + self.print(f"namespace {namespace} {{") + self.print("") + + for prop in self.sim.properties.all(): + prop_name = prop.name() + t = prop.type() + tkw = Types.c_keyword(self.sim, t) + func_decl = "" if prefix is None else f"{prefix} " + if Types.is_scalar(t): + func_decl += f"{tkw} get_{prop_name}({tkw} *{prop_name}, int i) {{ return {prop_name}[i]; }}" + + else: + nelems = Types.number_of_elements(self.sim, t) + func_decl += f"{tkw} get_{prop_name}({tkw} *{prop_name}, int i, int j, int capacity) {{ return {prop_name}[" + + if prop.layout() == Layouts.AoS: + func_decl += f"i * {nelems} + j" + + else: + func_decl += f"j * capacity + i" + + func_decl += "]; }" + + self.print(func_decl) + + self.print("") + self.print("}") + + def generate_program(self, ast_node): ext = ".cu" if self.target.is_gpu() else ".cpp" self.print = Printer(self.ref + ext) self.print.start() + self.print("#define APPLICATION_REFERENCE \"{self.ref}\"") if self.target.is_gpu(): self.print("#define PAIRS_TARGET_CUDA") diff --git a/src/pairs/sim/domain_partitioning.py b/src/pairs/sim/domain_partitioning.py index e3668be..a617300 100644 --- a/src/pairs/sim/domain_partitioning.py +++ b/src/pairs/sim/domain_partitioning.py @@ -1,5 +1,6 @@ from pairs.ir.assign import Assign from pairs.ir.branches import Filter +from pairs.ir.loops import For from pairs.ir.functions import Call_Int, Call_Void from pairs.ir.scalars import ScalarOp from pairs.ir.select import Select diff --git a/src/pairs/sim/simulation.py b/src/pairs/sim/simulation.py index defaf99..048f309 100644 --- a/src/pairs/sim/simulation.py +++ b/src/pairs/sim/simulation.py @@ -453,3 +453,4 @@ class Simulation: # Generate program #ASTGraph(self.functions, "functions.dot").render() self.code_gen.generate_program(program) + self.code_gen.generate_interfaces() -- GitLab