diff --git a/include/aidge/backend/cpu/operator/GatherImpl.hpp b/include/aidge/backend/cpu/operator/GatherImpl.hpp
index 0f10c02a0fbfb5c08b190dff5eb238cf70db619c..d22e484e3a80f70753bbc083a5d89562774a3870 100644
--- a/include/aidge/backend/cpu/operator/GatherImpl.hpp
+++ b/include/aidge/backend/cpu/operator/GatherImpl.hpp
@@ -24,10 +24,10 @@ namespace Aidge {
 
 // compute kernel registry for forward and backward
 class GatherImplForward_cpu
-    : public Registrable<GatherImplForward_cpu, std::tuple<DataType, DataType>, void(const int, const std::vector<DimSize_t>, const std::vector<DimSize_t>, const void*, const void*, void*)> {
+    : public Registrable<GatherImplForward_cpu, std::tuple<DataType, DataType>, void(std::size_t, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, const void*, void*)> {
 };
 class GatherImplBackward_cpu
-    : public Registrable<GatherImplBackward_cpu, std::tuple<DataType, DataType>, void(const int, const std::vector<DimSize_t>, const std::vector<DimSize_t>, const void*, const void*, void*)> {
+    : public Registrable<GatherImplBackward_cpu, std::tuple<DataType, DataType>, void(std::size_t, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, const void*, void*)> {
 };
 
 class GatherImpl_cpu : public OperatorImpl {
diff --git a/include/aidge/backend/cpu/operator/GatherImpl_forward_kernels.hpp b/include/aidge/backend/cpu/operator/GatherImpl_forward_kernels.hpp
index d8734d1ab47aa06ed8b6b48268d493d32b54c38a..31119e27f213a8698a8ff07f7690155d4753a05a 100644
--- a/include/aidge/backend/cpu/operator/GatherImpl_forward_kernels.hpp
+++ b/include/aidge/backend/cpu/operator/GatherImpl_forward_kernels.hpp
@@ -22,38 +22,31 @@
 
 namespace Aidge {
 template <class I, class O>
-void GatherImpl_cpu_forward_kernel(const int& axisIdx_, std::vector<DimSize_t> inputDims, const std::vector<DimSize_t> indicesDims, const void* input_, const void* indexes_, void* output_)
+void GatherImpl_cpu_forward_kernel(std::size_t axisIdx, const std::vector<DimSize_t>& inputDims, const std::vector<DimSize_t>& indicesDims, const void* input_, const void* indexes_, void* output_)
 {
     const I* input = static_cast<const I*>(input_);
     const int* indexes = static_cast<const int*>(indexes_);
-    const std::size_t axisIdx = axisIdx_;
     O* output = static_cast<O*>(output_);
 
-    // Calculate the total number of elements in the input array
-    size_t totalElements = 1;
-    for (size_t dimSize : inputDims) {
-        totalElements *= dimSize;
+    std::size_t postAxisElems = 1;
+    for (std::size_t i = axisIdx + 1; i < inputDims.size(); ++i) {
+        postAxisElems *= inputDims[i];
     }
-    std::size_t nbElemAfterAxis = 1;
-    std::size_t nbElemBeforeAxis = 1;
-
-    for (size_t d = 0; d < inputDims.size(); ++d) {
-        if( d < axisIdx )
-            nbElemBeforeAxis *= inputDims[d];
-        else if ( d > axisIdx )
-            nbElemAfterAxis *= inputDims[d];
+    std::size_t preAxisElems = 1;
+    for (std::size_t i = 0; i < axisIdx; ++i) {
+        preAxisElems *= inputDims[i];
     }
 
-    for (std::size_t i=0; i<nbElemBeforeAxis; ++i)
+    for (std::size_t i=0; i<preAxisElems; ++i)
     {
         for(std::size_t idxRow=0; idxRow<indicesDims[0]; ++idxRow)
         {
             for(std::size_t idxCol=0; idxCol<indicesDims[1]; ++idxCol)
             {
                 std::size_t idx = indexes[indicesDims[1] *  idxRow + idxCol];
-                const I* startPtr = std::next(input, i * nbElemAfterAxis * inputDims[axisIdx] + idx * nbElemAfterAxis);
-                std::copy_n(startPtr, nbElemAfterAxis, output);
-                output += nbElemAfterAxis;
+                const I* startPtr = std::next(input, i * postAxisElems * inputDims[axisIdx] + idx * postAxisElems);
+                std::copy_n(startPtr, postAxisElems, output);
+                output += postAxisElems;
             }
         }
     }
diff --git a/include/aidge/backend/cpu/operator/ReshapeImpl.hpp b/include/aidge/backend/cpu/operator/ReshapeImpl.hpp
index c21f205a35d4b9d28268c96772dfea9682360879..d5754b34e952d52b2071744e9f8e863074ef9fa3 100644
--- a/include/aidge/backend/cpu/operator/ReshapeImpl.hpp
+++ b/include/aidge/backend/cpu/operator/ReshapeImpl.hpp
@@ -24,10 +24,10 @@ namespace Aidge {
 
 // compute kernel registry for forward and backward
 class ReshapeImplForward_cpu
-    : public Registrable<ReshapeImplForward_cpu, std::tuple<DataType, DataType>, void(const std::size_t, const void*, void*)> {
+    : public Registrable<ReshapeImplForward_cpu, std::tuple<DataType, DataType>, void(std::size_t, const void*, void*)> {
 };
 class ReshapeImplBackward_cpu
-    : public Registrable<ReshapeImplBackward_cpu, std::tuple<DataType, DataType>, void(const std::size_t, const void*, void*)> {
+    : public Registrable<ReshapeImplBackward_cpu, std::tuple<DataType, DataType>, void(std::size_t, const void*, void*)> {
 };
 
 class ReshapeImpl_cpu : public OperatorImpl {
diff --git a/src/operator/GatherImpl.cpp b/src/operator/GatherImpl.cpp
index c5f4f1f37aea64b27913fea4af9885d01dc20f6b..fb0c8713d0683c5cc4770540fc548d82dc824d00 100644
--- a/src/operator/GatherImpl.cpp
+++ b/src/operator/GatherImpl.cpp
@@ -21,8 +21,6 @@
 #include "aidge/backend/cpu/operator/GatherImpl.hpp"
 #include "aidge/backend/cpu/operator/GatherImpl_forward_kernels.hpp"
 
-#include <iostream>
-
 Aidge::NbElts_t Aidge::GatherImpl_cpu::getNbRequiredProtected(const Aidge::IOIndex_t /*inputIdx*/) const {
     // this implementation can be in-place
     return 0;
diff --git a/unit_tests/operator/Test_ErfImpl.cpp b/unit_tests/operator/Test_ErfImpl.cpp
index 9d550310eeca0f24bb77ccfa915e95f7afd0cd92..d7ce4d6ab0ccc5d05c1a9a947f046598e12ea926 100644
--- a/unit_tests/operator/Test_ErfImpl.cpp
+++ b/unit_tests/operator/Test_ErfImpl.cpp
@@ -41,7 +41,7 @@ TEST_CASE("[cpu/operator] Erf(forward)") {
 
         float* resPtr = static_cast<float*>(myErf->getOperator()->getOutput(0)->getImpl()->rawPtr());
         float* expectedPtr = static_cast<float*>(expectedOutput->getImpl()->rawPtr());
-        for (std::size_t i = 0; i< 10; ++i) {
+        for (std::size_t i = 0; i< expectedOutput->size(); ++i) {
             REQUIRE(std::abs(resPtr[i]-expectedPtr[i]) < 0.00001);
         }
     }
@@ -81,7 +81,7 @@ TEST_CASE("[cpu/operator] Erf(forward)") {
 
         float* resPtr = static_cast<float*>(myErf->getOperator()->getOutput(0)->getImpl()->rawPtr());
         float* expectedPtr = static_cast<float*>(expectedOutput->getImpl()->rawPtr());
-        for (std::size_t i = 0; i< 12; ++i) {
+        for (std::size_t i = 0; i< expectedOutput->size(); ++i) {
             REQUIRE(std::abs(resPtr[i]-expectedPtr[i]) < 0.00001);
         }
     }
diff --git a/unit_tests/operator/Test_ReshapeImpl.cpp b/unit_tests/operator/Test_ReshapeImpl.cpp
index 6df5ab01baeb7e21aadc6f06699d01614e9bfab8..b978367da861c8ea87a182de011d7ef4b9188c9c 100644
--- a/unit_tests/operator/Test_ReshapeImpl.cpp
+++ b/unit_tests/operator/Test_ReshapeImpl.cpp
@@ -22,10 +22,10 @@ using namespace Aidge;
 
 TEST_CASE("[cpu/operator] Reshape(forward)") {
     SECTION("1D Tensor") {
-        std::shared_ptr<Tensor> input_1 = std::make_shared<Tensor>(Array1D<float,6> {
+        std::shared_ptr<Tensor> input = std::make_shared<Tensor>(Array1D<float,6> {
             {1.0, 2.0, 3.0, 4.0, 5.0, 6.0}
         });
-        std::shared_ptr<Tensor> input_2 =  std::make_shared<Tensor>(Array1D<int,2>{{2, 3}});
+        std::shared_ptr<Tensor> shape =  std::make_shared<Tensor>(Array1D<int,2>{{2, 3}});
         std::shared_ptr<Tensor> expectedOutput = std::make_shared<Tensor>(Array2D<float,2,3> {
             {
                 {1.0, 2.0, 3.0},
@@ -36,28 +36,22 @@ TEST_CASE("[cpu/operator] Reshape(forward)") {
         std::shared_ptr<Node> myReshape = Reshape();
         myReshape->getOperator()->setDatatype(DataType::Float32);
         myReshape->getOperator()->setBackend("cpu");
-        myReshape->getOperator()->associateInput(0, input_1);
-        myReshape->getOperator()->associateInput(1, input_2);
+        myReshape->getOperator()->associateInput(0, input);
+        myReshape->getOperator()->associateInput(1, shape);
         myReshape->getOperator()->computeOutputDims();
         myReshape->forward();
 
-        float* resPtr = static_cast<float*>(myReshape->getOperator()->getOutput(0)->getImpl()->rawPtr());
-        float* expectedPtr = static_cast<float*>(expectedOutput->getImpl()->rawPtr());
-        for (std::size_t i = 0; i< 6; ++i) {
-            printf("res %f, expected %f", resPtr[i], expectedPtr[i]);
-            REQUIRE(std::abs(resPtr[i]-expectedPtr[i]) < 0.00001);
-        }
-
+        REQUIRE(*(myReshape->getOperator()->getOutput(0)) == *expectedOutput);
     }
     SECTION("2D Tensor") {
-        std::shared_ptr<Tensor> input_1 = std::make_shared<Tensor>(Array2D<float,2,3> {
+        std::shared_ptr<Tensor> input = std::make_shared<Tensor>(Array2D<float,2,3> {
             {
                 {1.0, 2.0, 3.0},
                 {4.0, 5.0, 6.0}
             }
 
         });
-        std::shared_ptr<Tensor> input_2 =  std::make_shared<Tensor>(Array1D<int,2>{{3, 2}});
+        std::shared_ptr<Tensor> shape =  std::make_shared<Tensor>(Array1D<int,2>{{3, 2}});
         std::shared_ptr<Tensor> expectedOutput = std::make_shared<Tensor>(Array2D<float,3,2> {
             {
                 {1.0, 2.0},
@@ -69,17 +63,11 @@ TEST_CASE("[cpu/operator] Reshape(forward)") {
         std::shared_ptr<Node> myReshape = Reshape();
         myReshape->getOperator()->setDatatype(DataType::Float32);
         myReshape->getOperator()->setBackend("cpu");
-        myReshape->getOperator()->associateInput(0, input_1);
-        myReshape->getOperator()->associateInput(1, input_2);
+        myReshape->getOperator()->associateInput(0, input);
+        myReshape->getOperator()->associateInput(1, shape);
         myReshape->getOperator()->computeOutputDims();
         myReshape->forward();
 
-        float* resPtr = static_cast<float*>(myReshape->getOperator()->getOutput(0)->getImpl()->rawPtr());
-        float* expectedPtr = static_cast<float*>(expectedOutput->getImpl()->rawPtr());
-        for (std::size_t i = 0; i< 6; ++i) {
-            printf("res %f, expected %f", resPtr[i], expectedPtr[i]);
-            REQUIRE(std::abs(resPtr[i]-expectedPtr[i]) < 0.00001);
-        }
-
+        REQUIRE(*(myReshape->getOperator()->getOutput(0)) == *expectedOutput);
     }
 }
\ No newline at end of file