From cd824d73919d0204fba052c18dd4e3da5c23ee9f Mon Sep 17 00:00:00 2001 From: NAUD Maxence <maxence.naud@cea.fr> Date: Mon, 31 Mar 2025 15:26:45 +0200 Subject: [PATCH] fix: move back 'castFromFloat' function in GloabalAvgPoolingImpl_kernel as 'static_cast' truncates and does not round as intended --- .../operator/GlobalAveragePoolingImpl_kernels.hpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp index 40dd3a69..cbe4f110 100644 --- a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp +++ b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_kernels.hpp @@ -43,6 +43,18 @@ static stableMean(const T* vec, std::size_t size) { return mean; } +template <typename T> +typename std::enable_if_t<std::is_floating_point<T>::value, T> +static castFromFloat(T value) { + return value; +} + +template <typename T> +typename std::enable_if_t<!std::is_floating_point<T>::value, T> +static castFromFloat(double value) { + return static_cast<T>(std::nearbyint(value)); +} + template <DataType DT_I, DataType DT_O = DT_I> void GlobalAveragePoolingImpl_cpu_forward_kernel(const std::shared_ptr<Tensor>& inputTensor, void *output_) { @@ -61,7 +73,7 @@ void GlobalAveragePoolingImpl_cpu_forward_kernel(const std::shared_ptr<Tensor>& std::size_t output_idx = 0; for (DimSize_t batch = 0; batch < dims[0]; ++batch) { for (DimSize_t channel = 0; channel < dims[1]; ++channel) { - output[output_idx++] = static_cast<O>(stableMean<I>(input + input_idx, strides_channels)); + output[output_idx++] = castFromFloat<O>(stableMean<I>(input + input_idx, strides_channels)); input_idx += strides_channels; } } -- GitLab