From 3b66800a20dca0b15cc7236e0ea7c39bcfad8566 Mon Sep 17 00:00:00 2001 From: cmoineau <cyril.moineau@cea.fr> Date: Tue, 24 Sep 2024 13:07:01 +0000 Subject: [PATCH] Add support for Atan and Sub operators. --- .../_Aidge_Arm/kernels/Atan/aidge_atan.hpp | 10 +++++++ .../kernels/Atan/aidge_atan_float32.c | 10 ------- .../templates/configuration/atan.jinja | 9 +++++++ .../templates/configuration/elemwise.jinja | 1 - .../templates/forward_call/atan.jinja | 4 +++ .../templates/forward_call/elemwise.jinja | 2 +- aidge_export_arm_cortexm/operators.py | 27 +++++++++++++++++++ 7 files changed, 51 insertions(+), 12 deletions(-) create mode 100644 aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp delete mode 100644 aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c create mode 100644 aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja create mode 100644 aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp new file mode 100644 index 0000000..d4da329 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan.hpp @@ -0,0 +1,10 @@ +#include <cmath> + +template <unsigned int SIZE, typename Input_T, typename Output_T> +__attribute__((always_inline)) inline static +void aidge_atan(Input_T* __restrict input, Output_T* __restrict output) { + for (unsigned int i = 0; i < SIZE; ++i) { + // Note : no cast to get compiler warning if we lose precision during auto cast! + output[i] = std::atan(input[i]); + } +} diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c b/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c deleted file mode 100644 index 469f3ae..0000000 --- a/aidge_export_arm_cortexm/_Aidge_Arm/kernels/Atan/aidge_atan_float32.c +++ /dev/null @@ -1,10 +0,0 @@ -#include <math.h> - -void aidge_atan_float32 (float* input, - float* output, - unsigned int size) -{ - for (unsigned int i = 0; i < size; ++i) { - output[i] = atanf(input[i]); - } -} diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja new file mode 100644 index 0000000..70ab970 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/atan.jinja @@ -0,0 +1,9 @@ +{#- For name header -#} +#ifndef {{ name|upper }}_LAYER_H +#define {{ name|upper }}_LAYER_H + +{% include "./_meminfo.jinja" %} + +#define {{ name|upper }}_OUTPUTS_SIZE {{ out_chan[0] * out_height[0] * out_width[0] }} + +#endif /* {{ name|upper }}_LAYER_H */ diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja index dc3bdc0..4651bd4 100644 --- a/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/configuration/elemwise.jinja @@ -16,6 +16,5 @@ #define {{in_name[0]|upper}}_NB_DIM {{ in_dims[0]|length}} #define {{in_name[1]|upper}}_NB_DIM {{ in_dims[1]|length}} #define {{out_name[0]|upper}}_NB_DIM {{ out_dims[0]|length}} -#define {{ name|upper }}_ELEM_OP {{ elemwise_op }} #endif /* {{ name|upper }}_LAYER_H */ diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja new file mode 100644 index 0000000..3bd5ea1 --- /dev/null +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/atan.jinja @@ -0,0 +1,4 @@ +{% if not is_output %} +{{out_cdtype[0]}}* {{out_name[0]}} = ({{out_cdtype[0]}}*) mem + {{out_name[0]|upper}}_OFFSET; +{% endif %} +aidge_atan <{{name|upper}}_OUTPUTS_SIZE> ({{in_name[0]}}, {{out_name[0]}}); diff --git a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja index c4ca30d..98d6cc9 100644 --- a/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja +++ b/aidge_export_arm_cortexm/_Aidge_Arm/templates/forward_call/elemwise.jinja @@ -1 +1 @@ -aidge_{{elemwise_type|lower}}_{{dtype[0]}} ({{in_name[0]}}, {{in_name[1]}}, {{out_name[0]}}, {{in_name[0]}}_DIMS, {{in_name[1]}}_DIMS, {{out_name[0]}}_DIMS,{{in_name[0]|upper}}_NB_DIM,{{in_name[1]|upper}}_NB_DIM,{{out_name[0]|upper}}_NB_DIM, {{name|upper}}_OUTPUTS_SIZE); +aidge_{{elemwise_op|lower}}_{{out_dtype[0]}} ({{in_name[0]}}, {{in_name[1]}}, {{out_name[0]}}, {{in_name[0]}}_DIMS, {{in_name[1]}}_DIMS, {{out_name[0]}}_DIMS,{{in_name[0]|upper}}_NB_DIM,{{in_name[1]|upper}}_NB_DIM,{{out_name[0]|upper}}_NB_DIM, {{name|upper}}_OUTPUTS_SIZE); diff --git a/aidge_export_arm_cortexm/operators.py b/aidge_export_arm_cortexm/operators.py index dd6ce2e..8df1bfe 100644 --- a/aidge_export_arm_cortexm/operators.py +++ b/aidge_export_arm_cortexm/operators.py @@ -345,6 +345,20 @@ class Add_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") ] +@ExportLibAidgeARM.register("Sub", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) +class Add_ARMCortexM(ExportNodeCpp): + def __init__(self, node, mem_info, is_input, is_output): + super().__init__(node, mem_info, is_input, is_output) + self.attributes["elemwise_op"] = "\"SUB\"" + + self.config_template = str(ROOT / "_Aidge_Arm" / "templates" / "configuration" / "elemwise.jinja") + self.forward_template = str(ROOT / "_Aidge_Arm" / "templates" / "forward_call" / "elemwise.jinja") + self.include_list = [] + self.kernels_to_copy = [ + str(ROOT / "_Aidge_Arm" / "kernels" / "Sub" / "aidge_sub_float32.h"), + str(ROOT / "_Aidge_Arm" / "kernels" / "Utils" / "aidge_supportfunctions.h") + ] + @ExportLibAidgeARM.register("Mul", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Mul_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): @@ -372,6 +386,19 @@ class Softmax_ARMCortexM(ExportNodeCpp): str(ROOT / "_Aidge_Arm" / "kernels" / "Softmax" / "aidge_softmax_chw_float32.h"), ] +@ExportLibAidgeARM.register("Atan", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) +class Atan_ARMCortexM(ExportNodeCpp): + def __init__(self, node, mem_info, is_input, is_output): + super().__init__(node, mem_info, is_input, is_output) + + self.config_template = str(ROOT / "_Aidge_Arm" / "templates" / "configuration" / "atan.jinja") + self.forward_template = str(ROOT / "_Aidge_Arm" / "templates" / "forward_call" / "atan.jinja") + self.include_list = [] + self.kernels_to_copy = [ + str(ROOT / "_Aidge_Arm" / "kernels" / "Atan" / "aidge_atan.hpp"), + ] + + @ExportLibAidgeARM.register("Sigmoid", aidge_core.ImplSpec(aidge_core.IOSpec(aidge_core.dtype.float32))) class Sigmoid_ARMCortexM(ExportNodeCpp): def __init__(self, node, mem_info, is_input, is_output): -- GitLab