diff --git a/include/aidge/backend/cpu.hpp b/include/aidge/backend/cpu.hpp index 24bc51224793f7d566d7b87bdb4b9a25b4a6b1a6..13d2aae47491185e119a88dbf7a3527ba0420ac3 100644 --- a/include/aidge/backend/cpu.hpp +++ b/include/aidge/backend/cpu.hpp @@ -36,7 +36,6 @@ #include "aidge/backend/cpu/operator/SoftmaxImpl.hpp" #include "aidge/backend/cpu/operator/SubImpl.hpp" #include "aidge/backend/cpu/operator/TanhImpl.hpp" -#include "aidge/backend/cpu/operator/TransposeImpl.hpp" #include "aidge/backend/cpu/data/TensorImpl.hpp" diff --git a/include/aidge/backend/cpu/operator/TransposeImpl.hpp b/include/aidge/backend/cpu/operator/TransposeImpl.hpp deleted file mode 100644 index 8bdcc612ea434e266a97724d45aaeefc8e033bf0..0000000000000000000000000000000000000000 --- a/include/aidge/backend/cpu/operator/TransposeImpl.hpp +++ /dev/null @@ -1,118 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 CEA-List - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - ********************************************************************************/ - -#ifndef AIDGE_CPU_OPERATOR_TransposeIMPL_H_ -#define AIDGE_CPU_OPERATOR_TransposeIMPL_H_ - -#include "aidge/backend/OperatorImpl.hpp" -#include "aidge/operator/Transpose.hpp" -#include "aidge/utils/Registrar.hpp" -#include "aidge/utils/Types.h" -#include <memory> -#include <vector> - -namespace Aidge { -// class Transpose_Op; - -// compute kernel registry for forward and backward -class TransposeImpl2DForward_cpu - : public Registrable<TransposeImpl2DForward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<2>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl3DForward_cpu - : public Registrable<TransposeImpl3DForward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<3>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl4DForward_cpu - : public Registrable<TransposeImpl4DForward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<4>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl5DForward_cpu - : public Registrable<TransposeImpl5DForward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<5>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl6DForward_cpu - : public Registrable<TransposeImpl6DForward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<6>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl2DBackward_cpu - : public Registrable<TransposeImpl2DBackward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<2>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl3DBackward_cpu - : public Registrable<TransposeImpl3DBackward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<3>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl4DBackward_cpu - : public Registrable<TransposeImpl4DBackward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<4>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl5DBackward_cpu - : public Registrable<TransposeImpl5DBackward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<5>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; -class TransposeImpl6DBackward_cpu - : public Registrable<TransposeImpl6DBackward_cpu, std::tuple<DataType, DataType>, void( const typename Transpose_Op<6>::Attrs& attrs, const std::vector<DimSize_t>&, const std::vector<DimSize_t>&, const void*, void*)> { -}; - - -class TransposeImpl2D_cpu : public OperatorImpl { -public: - TransposeImpl2D_cpu(const Transpose_Op<2>& op) : OperatorImpl(op, "cpu") {} - - static std::unique_ptr<TransposeImpl2D_cpu> create(const Transpose_Op<2>& op) { - return std::make_unique<TransposeImpl2D_cpu>(op); - } - - void forward() override; -}; -class TransposeImpl3D_cpu : public OperatorImpl { -public: - TransposeImpl3D_cpu(const Transpose_Op<3>& op) : OperatorImpl(op, "cpu") {} - - static std::unique_ptr<TransposeImpl3D_cpu> create(const Transpose_Op<3>& op) { - return std::make_unique<TransposeImpl3D_cpu>(op); - } - - void forward() override; -}; -class TransposeImpl4D_cpu : public OperatorImpl { -public: - TransposeImpl4D_cpu(const Transpose_Op<4>& op) : OperatorImpl(op, "cpu") {} - - static std::unique_ptr<TransposeImpl4D_cpu> create(const Transpose_Op<4>& op) { - return std::make_unique<TransposeImpl4D_cpu>(op); - } - - void forward() override; -}; -class TransposeImpl5D_cpu : public OperatorImpl { -public: - TransposeImpl5D_cpu(const Transpose_Op<5>& op) : OperatorImpl(op, "cpu") {} - - static std::unique_ptr<TransposeImpl5D_cpu> create(const Transpose_Op<5>& op) { - return std::make_unique<TransposeImpl5D_cpu>(op); - } - - void forward() override; -}; -class TransposeImpl6D_cpu : public OperatorImpl { -public: - TransposeImpl6D_cpu(const Transpose_Op<6>& op) : OperatorImpl(op, "cpu") {} - - static std::unique_ptr<TransposeImpl6D_cpu> create(const Transpose_Op<6>& op) { - return std::make_unique<TransposeImpl6D_cpu>(op); - } - - void forward() override; -}; - -namespace { -static Registrar<Transpose_Op<2>> registrarTransposeImpl2D_cpu("cpu", Aidge::TransposeImpl2D_cpu::create); -static Registrar<Transpose_Op<3>> registrarTransposeImpl3D_cpu("cpu", Aidge::TransposeImpl3D_cpu::create); -static Registrar<Transpose_Op<4>> registrarTransposeImpl4D_cpu("cpu", Aidge::TransposeImpl4D_cpu::create); -static Registrar<Transpose_Op<5>> registrarTransposeImpl5D_cpu("cpu", Aidge::TransposeImpl5D_cpu::create); -static Registrar<Transpose_Op<6>> registrarTransposeImpl6D_cpu("cpu", Aidge::TransposeImpl6D_cpu::create); -} -} // namespace Aidge - -#endif /* AIDGE_CPU_OPERATOR_TransposeIMPL_H_ */ diff --git a/include/aidge/backend/cpu/operator/TransposeImpl_forward_kernels.hpp b/include/aidge/backend/cpu/operator/TransposeImpl_forward_kernels.hpp deleted file mode 100644 index 9fd5e5b58ed8e850c0a902e2de93b65cc75d274a..0000000000000000000000000000000000000000 --- a/include/aidge/backend/cpu/operator/TransposeImpl_forward_kernels.hpp +++ /dev/null @@ -1,110 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 CEA-List - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - ********************************************************************************/ - -#ifndef AIDGE_CPU_OPERATOR_TRANSPOSEIMPL_FORWARD_KERNEL_H_ -#define AIDGE_CPU_OPERATOR_TRANSPOSEIMPL_FORWARD_KERNEL_H_ - -#include "aidge/utils/Registrar.hpp" -#include <cstddef> -#include <cmath> -#include "aidge/data/Data.hpp" -#include "aidge/utils/Types.h" - -#include "aidge/backend/cpu/operator/TransposeImpl.hpp" - -namespace Aidge { -template <class I, class O, DimSize_t DIM> -void TransposeImpl_cpu_forward_kernel( const typename Transpose_Op<DIM>::Attrs& attrs, const std::vector<DimSize_t>& inputDims, const std::vector<DimSize_t>& outputDims, const void* input_, void* output_) -{ - O* output = static_cast<O*>(output_); - const I* input = static_cast<const I*>(input_); - - // Compute total number of elements in the input array - size_t totalElements = 1; - for (size_t dimSize : inputDims) { - totalElements *= dimSize; - } - - std::vector<std::size_t> outStrides(DIM, 1); - for (size_t i = 0; i < DIM; ++i) { - for (size_t j = i+1; j < DIM; ++j) - { - outStrides[i] *= outputDims[j]; - } - } - - std::vector<size_t> indices(outputDims.size(), 0); - for (size_t i = 0; i < totalElements; ++i) { - size_t idx = 0; - // Permute indices based on OutputDimsOrder attr - std::vector<size_t> permutedIndices(DIM); - for (size_t j = 0; j < DIM; ++j) { - permutedIndices[j] = indices[std::get<0>(attrs)[j]]; - } - - for (int j = DIM -1; j >=0; --j) { - idx += permutedIndices[j] * outStrides[j]; - } - // Copy the value in output - output[idx] = input[i]; - - // Update indices for the next iteration - for (int j = DIM - 1; j >= 0; --j) { - if (indices[j] < inputDims[j] - 1) { - indices[j]++; - break; - } else { - indices[j] = 0; - } - } - } - -} -namespace { -// DIM = 2 -static Registrar<TransposeImpl2DForward_cpu> registrarTransposeImpl2DForward_cpu_Float32( - {DataType::Float32, DataType::Float32}, Aidge::TransposeImpl_cpu_forward_kernel<float, float, 2>); -static Registrar<TransposeImpl2DForward_cpu> registrarTransposeImpl2DForward_cpu_Int32( - {DataType::Int32, DataType::Int32}, Aidge::TransposeImpl_cpu_forward_kernel<int, int, 2>); -static Registrar<TransposeImpl2DForward_cpu> registrarTransposeImpl2DForward_cpu_Float64( - {DataType::Float64, DataType::Float64}, Aidge::TransposeImpl_cpu_forward_kernel<double, double, 2>); -// DIM = 3 -static Registrar<TransposeImpl3DForward_cpu> registrarTransposeImpl3DForward_cpu_Float32( - {DataType::Float32, DataType::Float32}, Aidge::TransposeImpl_cpu_forward_kernel<float, float, 3>); -static Registrar<TransposeImpl3DForward_cpu> registrarTransposeImpl3DForward_cpu_Int32( - {DataType::Int32, DataType::Int32}, Aidge::TransposeImpl_cpu_forward_kernel<int, int, 3>); -static Registrar<TransposeImpl3DForward_cpu> registrarTransposeImpl3DForward_cpu_Float64( - {DataType::Float64, DataType::Float64}, Aidge::TransposeImpl_cpu_forward_kernel<double, double, 3>); -// DIM = 4 -static Registrar<TransposeImpl4DForward_cpu> registrarTransposeImpl4DForward_cpu_Float32( - {DataType::Float32, DataType::Float32}, Aidge::TransposeImpl_cpu_forward_kernel<float, float, 4>); -static Registrar<TransposeImpl4DForward_cpu> registrarTransposeImpl4DForward_cpu_Int32( - {DataType::Int32, DataType::Int32}, Aidge::TransposeImpl_cpu_forward_kernel<int, int, 4>); -static Registrar<TransposeImpl4DForward_cpu> registrarTransposeImpl4DForward_cpu_Float64( - {DataType::Float64, DataType::Float64}, Aidge::TransposeImpl_cpu_forward_kernel<double, double, 4>); -// DIM = 5 -static Registrar<TransposeImpl5DForward_cpu> registrarTransposeImpl5DForward_cpu_Float32( - {DataType::Float32, DataType::Float32}, Aidge::TransposeImpl_cpu_forward_kernel<float, float, 5>); -static Registrar<TransposeImpl5DForward_cpu> registrarTransposeImpl5DForward_cpu_Int32( - {DataType::Int32, DataType::Int32}, Aidge::TransposeImpl_cpu_forward_kernel<int, int, 5>); -static Registrar<TransposeImpl5DForward_cpu> registrarTransposeImpl5DForward_cpu_Float64( - {DataType::Float64, DataType::Float64}, Aidge::TransposeImpl_cpu_forward_kernel<double, double, 5>); -// DIM = 6 -static Registrar<TransposeImpl6DForward_cpu> registrarTransposeImpl6DForward_cpu_Float32( - {DataType::Float32, DataType::Float32}, Aidge::TransposeImpl_cpu_forward_kernel<float, float, 6>); -static Registrar<TransposeImpl6DForward_cpu> registrarTransposeImpl6DForward_cpu_Int32( - {DataType::Int32, DataType::Int32}, Aidge::TransposeImpl_cpu_forward_kernel<int, int, 6>); -static Registrar<TransposeImpl6DForward_cpu> registrarTransposeImpl6DForward_cpu_Float64( - {DataType::Float64, DataType::Float64}, Aidge::TransposeImpl_cpu_forward_kernel<double, double, 6>); -} // namespace -} // namespace Aidge - -#endif /* AIDGE_CPU_OPERATOR_TRANSPOSEIMPL_FORWARD_KERNEL_H_ */ diff --git a/src/operator/TransposeImpl.cpp b/src/operator/TransposeImpl.cpp deleted file mode 100644 index 710e67b4f5aaa5261a111a8e131a0dd740694a4b..0000000000000000000000000000000000000000 --- a/src/operator/TransposeImpl.cpp +++ /dev/null @@ -1,102 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 CEA-List - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - ********************************************************************************/ - -#include <cassert> -#include <chrono> // std::chrono::milliseconds -#include <numeric> // std::accumulate -#include <thread> // std::this_thread::sleep_for -#include <vector> - -#include "aidge/utils/Types.h" -#include "aidge/operator/Transpose.hpp" - -#include "aidge/backend/cpu/operator/TransposeImpl.hpp" -#include "aidge/backend/cpu/operator/TransposeImpl_forward_kernels.hpp" - -void Aidge::TransposeImpl2D_cpu::forward() { - // Find the correct kernel type - auto kernelFunc = - Registrar<TransposeImpl2DForward_cpu>::create({ - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dataType(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dataType()}); - - // auto attr = dynamic_cast<const Transpose_Op<2>&>(mOp).getStaticAttributes(); - // std::vector<DimIdx_t> outDimsOrder; - // outDimsOrder.reserve(std::get<0>(attr).size()); // Reserve space for the new vector - - // std::transform(std::get<0>(attr).begin(), std::get<0>(attr).end(), std::back_inserter(outDimsOrder), - // [](int intValue) { return static_cast<DimIdx_t>(intValue); }); - - // Call kernel - kernelFunc(dynamic_cast<const Transpose_Op<2>&>(mOp).getStaticAttributes(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->getImpl()->rawPtr(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->getImpl()->rawPtr()); -} - -void Aidge::TransposeImpl3D_cpu::forward() { - // Find the correct kernel type - auto kernelFunc = - Registrar<TransposeImpl3DForward_cpu>::create({ - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dataType(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dataType()}); - - // Call kernel - kernelFunc(dynamic_cast<const Transpose_Op<3>&>(mOp).getStaticAttributes(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->getImpl()->rawPtr(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->getImpl()->rawPtr()); -} - -void Aidge::TransposeImpl4D_cpu::forward() { - // Find the correct kernel type - auto kernelFunc = - Registrar<TransposeImpl4DForward_cpu>::create({ - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dataType(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dataType()}); - - // Call kernel - kernelFunc(dynamic_cast<const Transpose_Op<4>&>(mOp).getStaticAttributes(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->getImpl()->rawPtr(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->getImpl()->rawPtr()); -} -void Aidge::TransposeImpl5D_cpu::forward() { - // Find the correct kernel type - auto kernelFunc = - Registrar<TransposeImpl5DForward_cpu>::create({ - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dataType(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dataType()}); - - // Call kernel - kernelFunc(dynamic_cast<const Transpose_Op<5>&>(mOp).getStaticAttributes(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->getImpl()->rawPtr(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->getImpl()->rawPtr()); -} -void Aidge::TransposeImpl6D_cpu::forward() { - // Find the correct kernel type - auto kernelFunc = - Registrar<TransposeImpl6DForward_cpu>::create({ - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dataType(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dataType()}); - - // Call kernel - kernelFunc(dynamic_cast<const Transpose_Op<6>&>(mOp).getStaticAttributes(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->dims(), - std::static_pointer_cast<Tensor>(mOp.getRawInput(0))->getImpl()->rawPtr(), - std::static_pointer_cast<Tensor>(mOp.getRawOutput(0))->getImpl()->rawPtr()); -} \ No newline at end of file diff --git a/unit_tests/operator/Test_TransposeImpl.cpp b/unit_tests/operator/Test_TransposeImpl.cpp deleted file mode 100644 index d1eadb8f165e625853a3a0c956e180f92d3fce75..0000000000000000000000000000000000000000 --- a/unit_tests/operator/Test_TransposeImpl.cpp +++ /dev/null @@ -1,125 +0,0 @@ -/******************************************************************************** - * Copyright (c) 2023 CEA-List - * - * This program and the accompanying materials are made available under the - * terms of the Eclipse Public License 2.0 which is available at - * http://www.eclipse.org/legal/epl-2.0. - * - * SPDX-License-Identifier: EPL-2.0 - * - ********************************************************************************/ - -#include <catch2/catch_test_macros.hpp> -#include <memory> - -#include "aidge/data/Tensor.hpp" -#include "aidge/operator/Transpose.hpp" - -#include "aidge/backend/cpu.hpp" - -using namespace Aidge; - -TEST_CASE("[cpu/operator] Transpose(forward)") { - SECTION("3D Tensor") { - std::shared_ptr<Tensor> input = std::make_shared<Tensor>(Array3D<float,2,3,4> { - { - {{0.42507452, 0.11244237, 0.43243718, 0.62354952}, - {0.90250170, 0.48719984, 0.45781207, 0.92536664}, - {0.06348717, 0.91678733, 0.64452291, 0.00484818}}, - - {{0.66873497, 0.99508536, 0.55714869, 0.84887981}, - {0.41666120, 0.92365038, 0.80034822, 0.38721532}, - {0.52037925, 0.53937608, 0.66380072, 0.36330253}} - } - }); - std::shared_ptr<Tensor> output = std::make_shared<Tensor>(Array3D<float,2,4,3> { - { - {{0.42507452, 0.90250170, 0.06348717}, - {0.11244237, 0.48719984, 0.91678733}, - {0.43243718, 0.45781207, 0.64452291}, - {0.62354952, 0.92536664, 0.00484818}}, - - {{0.66873497, 0.41666120, 0.52037925}, - {0.99508536, 0.92365038, 0.53937608}, - {0.55714869, 0.80034822, 0.66380072}, - {0.84887981, 0.38721532, 0.36330253}} - } - }); - std::shared_ptr<Node> myTranspose = Transpose<3>(std::array<DimSize_t,3>{{0,2,1}}); - auto op = std::static_pointer_cast<OperatorTensor>(myTranspose -> getOperator()); - op->associateInput(0,input); - op->setDataType(DataType::Float32); - op->setBackend("cpu"); - myTranspose->forward(); - - REQUIRE(*(op->getOutput(0)) == *output); - } - SECTION("4D Tensor") { - std::shared_ptr<Tensor> input = std::make_shared<Tensor>(Array4D<int,2,3,1,4> { - { - { - { - {1, 2, 3, 4} - }, - { - {5, 6, 7, 8} - }, - { - {9, 10, 11, 12} - } - }, - { - { - {13, 14, 15, 16} - }, - { - {17, 18, 19, 20} - }, - { - {21, 22, 23, 24} - } - } - } - }); - std::shared_ptr<Tensor> output = std::make_shared<Tensor>(Array4D<int,2,4,1,3> { - { - { - { - {1, 5, 9} - }, - { - {2, 6, 10} - }, - { - {3, 7, 11} - }, - { - {4, 8, 12} - } - }, - { - { - {13, 17, 21} - }, - { - {14, 18, 22} - }, - { - {15, 19, 23} - }, - { - {16, 20, 24} - } - } - } - }); - std::shared_ptr<Node> myTranspose = Transpose<4>(std::array<DimSize_t,4>{{0,3,2,1}}); - auto op = std::static_pointer_cast<OperatorTensor>(myTranspose -> getOperator()); - op->associateInput(0,input); - op->setDataType(DataType::Int32); - op->setBackend("cpu"); - myTranspose->forward(); - - REQUIRE(*(op->getOutput(0)) == *output); - } -} \ No newline at end of file