diff --git a/include/aidge/backend/cpu.hpp b/include/aidge/backend/cpu.hpp index 985a2001baf90e38b69de2fca5801b8c5969b3d1..4134f5c50220198840e078dc78b8f37ded09b78e 100644 --- a/include/aidge/backend/cpu.hpp +++ b/include/aidge/backend/cpu.hpp @@ -12,6 +12,7 @@ #ifndef AIDGE_CPU_IMPORTS_H_ #define AIDGE_CPU_IMPORTS_H_ +#include "aidge/backend/cpu/operator/AbsImpl.hpp" #include "aidge/backend/cpu/operator/AddImpl.hpp" #include "aidge/backend/cpu/operator/AndImpl.hpp" #include "aidge/backend/cpu/operator/ArgMaxImpl.hpp" diff --git a/include/aidge/backend/cpu/operator/AbsImpl.hpp b/include/aidge/backend/cpu/operator/AbsImpl.hpp new file mode 100644 index 0000000000000000000000000000000000000000..faba3ef69ff27fbfb92393e1e0dacaebd5d69b07 --- /dev/null +++ b/include/aidge/backend/cpu/operator/AbsImpl.hpp @@ -0,0 +1,50 @@ +/******************************************************************************** + * 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_ABSIMPL_H_ +#define AIDGE_CPU_OPERATOR_ABSIMPL_H_ + +#include "aidge/backend/OperatorImpl.hpp" +#include "aidge/operator/Abs.hpp" +#include "aidge/utils/Registrar.hpp" +#include "aidge/utils/Types.h" +#include <memory> +#include <vector> + +namespace Aidge { +// class Abs_Op; + +// compute kernel registry for forward and backward +class AbsImplForward_cpu + : public Registrable<AbsImplForward_cpu, std::tuple<DataType, DataType>, void(const std::size_t, const void*, void*)> { +}; +class AbsImplBackward_cpu + : public Registrable<AbsImplBackward_cpu, std::tuple<DataType, DataType>, void(const std::size_t, const void*, void*)> { +}; + +class AbsImpl_cpu : public OperatorImpl { +public: + AbsImpl_cpu(const Abs_Op& op) : OperatorImpl(op, "cpu") {} + + static std::unique_ptr<AbsImpl_cpu> create(const Abs_Op& op) { + return std::make_unique<AbsImpl_cpu>(op); + } + + Elts_t getNbRequiredProtected(const IOIndex_t inputIdx) const override final; + void forward() override; +}; + +namespace { +static Registrar<Abs_Op> registrarAbsImpl_cpu("cpu", Aidge::AbsImpl_cpu::create); +} +} // namespace Aidge + +#endif /* AIDGE_CPU_OPERATOR_ABSIMPL_H_ */ diff --git a/include/aidge/backend/cpu/operator/AbsImpl_forward_kernels.hpp b/include/aidge/backend/cpu/operator/AbsImpl_forward_kernels.hpp new file mode 100644 index 0000000000000000000000000000000000000000..4922d6273b681515a4682b86c720b42381598042 --- /dev/null +++ b/include/aidge/backend/cpu/operator/AbsImpl_forward_kernels.hpp @@ -0,0 +1,45 @@ +/******************************************************************************** + * 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_ABSIMPL_FORWARD_KERNEL_H_ +#define AIDGE_CPU_OPERATOR_ABSIMPL_FORWARD_KERNEL_H_ + +#include <cmath> + +#include "aidge/utils/Registrar.hpp" + +#include "aidge/backend/cpu/operator/AbsImpl.hpp" + +namespace Aidge { +template <class I, class O> +void AbsImpl_cpu_forward_kernel(std::size_t inputLenght, + const void* input_, + void* output_) { + + const I* input = static_cast<const I*>(input_); + O* output = static_cast<O*>(output_); + + for (std::size_t i = 0; i < inputLenght; ++i) { + output[i] = std::abs(input[i]); + } +} + +namespace { +static Registrar<AbsImplForward_cpu> registrarAbsImplForward_cpu_Float32( + {DataType::Float32, DataType::Float32}, Aidge::AbsImpl_cpu_forward_kernel<float, float>); +static Registrar<AbsImplForward_cpu> registrarAbsImplForward_cpu_Int32( + {DataType::Int32, DataType::Int32}, Aidge::AbsImpl_cpu_forward_kernel<int, int>); +static Registrar<AbsImplForward_cpu> registrarAbsImplForward_cpu_Float64( + {DataType::Float64, DataType::Float64}, Aidge::AbsImpl_cpu_forward_kernel<double, double>); +} // namespace +} // namespace Aidge + +#endif /* AIDGE_CPU_OPERATOR_ABSIMPL_FORWARD_KERNEL_H_ */ diff --git a/src/operator/AbsImpl.cpp b/src/operator/AbsImpl.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1eb86c91289d3000f9cc0792e5ca2da29d4d8c24 --- /dev/null +++ b/src/operator/AbsImpl.cpp @@ -0,0 +1,42 @@ +/******************************************************************************** + * 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 "aidge/backend/cpu/operator/AbsImpl.hpp" + +#include <memory> +#include <vector> + +#include "aidge/backend/cpu/operator/AbsImpl_forward_kernels.hpp" +#include "aidge/data/Tensor.hpp" +#include "aidge/operator/Abs.hpp" +#include "aidge/utils/Types.h" + +Aidge::Elts_t Aidge::AbsImpl_cpu::getNbRequiredProtected(const Aidge::IOIndex_t /*inputIdx*/) const { + // this implementation can be in-place + return Elts_t::DataElts(0); +} + +void Aidge::AbsImpl_cpu::forward() { + const Abs_Op& op = static_cast<const Abs_Op&>(mOp); + + // Find the correct kernel type + auto kernelFunc = Registrar<AbsImplForward_cpu>::create({ + op.getInput(0)->dataType(), + op.getOutput(0)->dataType() + }); + + // Call kernel + kernelFunc( + op.getInput(0)->size(), + op.getInput(0)->getImpl()->rawPtr(), + op.getOutput(0)->getImpl()->rawPtr() + ); +}