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