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