From 59c4412dc42a87dea47b8b5b4d21ca45181459f7 Mon Sep 17 00:00:00 2001 From: Olivier BICHLER <olivier.bichler@cea.fr> Date: Tue, 2 Apr 2024 10:37:33 +0200 Subject: [PATCH] Improved average pooling precision --- .../operator/GlobalAveragePoolingImpl_forward_kernels.hpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_forward_kernels.hpp b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_forward_kernels.hpp index 2bb78b2f..81f10975 100644 --- a/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_forward_kernels.hpp +++ b/include/aidge/backend/cpu/operator/GlobalAveragePoolingImpl_forward_kernels.hpp @@ -49,12 +49,12 @@ void GlobalAveragePoolingImpl_cpu_forward_kernel( for (DimSize_t channel = 0; channel < dims[1]; ++channel) { const I *filter_start = std::next( input, (batch * in_batch_nb_elems) + (channel * in_channel_nb_elems)); - I sum = 0; + I mean = 0; for (size_t i = 0; i < in_channel_nb_elems; ++i) { - sum += filter_start[i]; + // Single pass numerically stable mean, using the fmaf + mean = fmaf(filter_start[i] - mean, 1.0f/(i+1), mean); } - output[batch * out_batch_nb_elems + channel] = - sum / static_cast<I>(in_channel_nb_elems); + output[batch * out_batch_nb_elems + channel] = mean; } } } -- GitLab