From 668ccdcfb81bfab3a2d44cd1ddd956e83a2dfb09 Mon Sep 17 00:00:00 2001 From: Sang-Hoon Park Date: Wed, 3 Feb 2021 10:32:59 +0000 Subject: Add dynamic tensor support to CpuElementwise The kernels and operators for binary and unary operations are now capable of being configured with dynamic shapes and computing windows at run-time. Additionally, changing arguments' names is done for consistency. Partially Implements: COMPMID-4127 Change-Id: I48e5038692db667dec7cb2b2906fe5683214fe19 Signed-off-by: Sang-Hoon Park Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/4973 Tested-by: Arm Jenkins Reviewed-by: Pablo Marquez Tello Comments-Addressed: Arm Jenkins --- src/runtime/cpu/operators/CpuElementwise.cpp | 72 +++++++---- src/runtime/cpu/operators/CpuElementwise.h | 150 +++++++++++----------- src/runtime/cpu/operators/CpuElementwiseUnary.cpp | 13 ++ src/runtime/cpu/operators/CpuElementwiseUnary.h | 3 + 4 files changed, 138 insertions(+), 100 deletions(-) (limited to 'src/runtime/cpu') diff --git a/src/runtime/cpu/operators/CpuElementwise.cpp b/src/runtime/cpu/operators/CpuElementwise.cpp index 322bd09c43..b5c8dde925 100644 --- a/src/runtime/cpu/operators/CpuElementwise.cpp +++ b/src/runtime/cpu/operators/CpuElementwise.cpp @@ -23,95 +23,111 @@ */ #include "src/runtime/cpu/operators/CpuElementwise.h" #include "src/core/cpu/kernels/CpuElementwiseKernel.h" +#include "src/core/helpers/WindowHelpers.h" namespace arm_compute { namespace cpu { -void CpuElementwiseMax::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwiseBase::run(ITensorPack &tensors) +{ + // If the kernel has been configured, use the window from the kernel. + if(_kernel->is_window_configured()) + { + ICpuOperator::run(tensors); + return; + } + + auto src0_info = tensors.get_const_tensor(TensorType::ACL_SRC_0)->info(); + auto src1_info = tensors.get_const_tensor(TensorType::ACL_SRC_1)->info(); + auto shape_and_window = compute_output_shape_and_window(*src0_info, *src1_info); + ICpuOperator::run(tensors, shape_and_window.second); +} + +void CpuElementwiseMax::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(ArithmeticOperation::MAX, input1, input2, output); + k->configure(ArithmeticOperation::MAX, src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwiseMax::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MAX, input1, input2, output); + return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MAX, src0, src1, dst); } -void CpuElementwiseMin::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwiseMin::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(ArithmeticOperation::MIN, input1, input2, output); + k->configure(ArithmeticOperation::MIN, src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwiseMin::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MIN, input1, input2, output); + return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::MIN, src0, src1, dst); } -void CpuElementwiseSquaredDiff::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwiseSquaredDiff::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(ArithmeticOperation::SQUARED_DIFF, input1, input2, output); + k->configure(ArithmeticOperation::SQUARED_DIFF, src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwiseSquaredDiff::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::SQUARED_DIFF, input1, input2, output); + return kernels::CpuArithmeticKernel::validate(ArithmeticOperation::SQUARED_DIFF, src0, src1, dst); } -void CpuElementwiseDivision::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwiseDivision::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(input1, input2, output); + k->configure(src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwiseDivision::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuDivisionKernel::validate(input1, input2, output); + return kernels::CpuDivisionKernel::validate(src0, src1, dst); } -void CpuElementwisePower::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwisePower::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(input1, input2, output); + k->configure(src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwisePower::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuPowerKernel::validate(input1, input2, output); + return kernels::CpuPowerKernel::validate(src0, src1, dst); } template -void CpuElementwiseComparisonStatic::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output) +void CpuElementwiseComparisonStatic::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) { auto k = std::make_unique(); - k->configure(COP, input1, input2, output); + k->configure(COP, src0, src1, dst); _kernel = std::move(k); } template -Status CpuElementwiseComparisonStatic::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +Status CpuElementwiseComparisonStatic::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst) { - return kernels::CpuComparisonKernel::validate(COP, input1, input2, output); + return kernels::CpuComparisonKernel::validate(COP, src0, src1, dst); } -void CpuElementwiseComparison::configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, ComparisonOperation op) +void CpuElementwiseComparison::configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ComparisonOperation op) { auto k = std::make_unique(); - k->configure(op, input1, input2, output); + k->configure(op, src0, src1, dst); _kernel = std::move(k); } -Status CpuElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op) +Status CpuElementwiseComparison::validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op) { - return kernels::CpuComparisonKernel::validate(op, input1, input2, output); + return kernels::CpuComparisonKernel::validate(op, src0, src1, dst); } // Supported Specializations diff --git a/src/runtime/cpu/operators/CpuElementwise.h b/src/runtime/cpu/operators/CpuElementwise.h index 611a374c26..4b350d5f9f 100644 --- a/src/runtime/cpu/operators/CpuElementwise.h +++ b/src/runtime/cpu/operators/CpuElementwise.h @@ -30,30 +30,36 @@ namespace arm_compute { namespace cpu { +class CpuElementwiseBase : public ICpuOperator +{ +public: + // Inherited methods overridden: + void run(ITensorPack &tensors) override; +}; /** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for max * * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. * @note The function performs a max operation between two tensors. */ -class CpuElementwiseMax : public ICpuOperator +class CpuElementwiseMax : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: Same as @p input1. + * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: Same as @p src0. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for max * - * @param[in] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: Same as @p input1. + * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: Same as @p src0. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for min @@ -61,25 +67,25 @@ public: * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. * @note The function performs a min operation between two tensors. */ -class CpuElementwiseMin : public ICpuOperator +class CpuElementwiseMin : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: Same as @p input1. + * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: Same as @p src0. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for min * - * @param[in] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: Same as @p input1. + * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: Same as @p src0. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for squared difference @@ -87,25 +93,25 @@ public: * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. * @note The function performs a squared different operation between two tensors (i.e., out[i] = (in1[i] - in2[i])^2 */ -class CpuElementwiseSquaredDiff : public ICpuOperator +class CpuElementwiseSquaredDiff : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: Same as @p input1. + * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: Same as @p src0. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for squared difference * - * @param[in] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: Same as @p input1. + * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: Same as @p src0. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for division @@ -113,25 +119,25 @@ public: * @note The tensor data type for the inputs must be S32/F16/F32. * @note The function performs a division operation between two tensors (i.e., out[i] = in1[i] / in2[i]) */ -class CpuElementwiseDivision : public ICpuOperator +class CpuElementwiseDivision : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: S32/F16/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: Same as @p input1. + * @param[in, out] src0 First tensor input info. Data types supported: S32/F16/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: Same as @p src0. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for division * - * @param[in] input1 First tensor input info. Data types supported: S32/F16/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: Same as @p input1. + * @param[in] src0 First tensor input info. Data types supported: S32/F16/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: Same as @p src0. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for power @@ -140,25 +146,25 @@ public: * @note The function performs a elementwise power of in1 to in2 (i.e., out[i] = in1[i] ^ in2[i]) * @note For an exponent that is a float, this function will only work with a positive base. */ -class CpuElementwisePower : public ICpuOperator +class CpuElementwisePower : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: F16/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: Same as @p input1. + * @param[in, out] src0 First tensor input info. Data types supported: F16/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: Same as @p src0. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for power * - * @param[in] input1 First tensor input info. Data types supported: F16/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: Same as @p input1. + * @param[in] src0 First tensor input info. Data types supported: F16/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: Same as @p src0. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run @ref cpu::kernels::CpuComparisonKernel. @@ -166,27 +172,27 @@ public: * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. * @note The function performs a comparison operation between two tensors. */ -class CpuElementwiseComparison : public ICpuOperator +class CpuElementwiseComparison : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: U16/U32. - * @param[in] op Comparison Operation to be performed. + * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: U16/U32. + * @param[in] op Comparison Operation to be performed. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, ComparisonOperation op); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ComparisonOperation op); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuComparisonKernel * - * @param[in] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: U16/U32. - * @param[in] op Comparison Operation to be performed. + * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: U16/U32. + * @param[in] op Comparison Operation to be performed. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op); }; /** Basic function to run @ref cpu::kernels::CpuComparisonKernel @@ -195,25 +201,25 @@ public: * @note The function performs a comparison operation between two tensors. */ template -class CpuElementwiseComparisonStatic : public ICpuOperator +class CpuElementwiseComparisonStatic : public CpuElementwiseBase { public: - /** Initialise the kernel's inputs, output and conversion policy. + /** Initialise the kernel's inputs, dst and conversion policy. * - * @param[in, out] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in, out] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[out] output Output tensor info. Data types supported: U16/U32. + * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[out] dst Output tensor info. Data types supported: U16/U32. */ - void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output); + void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst); /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuComparisonKernel * - * @param[in] input1 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. - * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. - * @param[in] output Output tensor info. Data types supported: U16/U32. + * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32. + * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0. + * @param[in] dst Output tensor info. Data types supported: U16/U32. * * @return a status */ - static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output); + static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst); }; /** Basic function to run equal comparison. */ diff --git a/src/runtime/cpu/operators/CpuElementwiseUnary.cpp b/src/runtime/cpu/operators/CpuElementwiseUnary.cpp index d1b1700927..2140c5cf78 100644 --- a/src/runtime/cpu/operators/CpuElementwiseUnary.cpp +++ b/src/runtime/cpu/operators/CpuElementwiseUnary.cpp @@ -23,6 +23,7 @@ */ #include "src/runtime/cpu/operators/CpuElementwiseUnary.h" #include "src/core/cpu/kernels/CpuElementwiseUnaryKernel.h" +#include "src/core/helpers/WindowHelpers.h" namespace arm_compute { @@ -41,5 +42,17 @@ Status CpuElementwiseUnary::validate(ElementWiseUnary op, const ITensorInfo &src { return KernelType::validate(op, src, dst); } + +void CpuElementwiseUnary::run(ITensorPack &tensors) +{ + if(_kernel->is_window_configured()) + { + ICpuOperator::run(tensors); + return; + } + + auto src_info = tensors.get_const_tensor(TensorType::ACL_SRC)->info(); + ICpuOperator::run(tensors, compute_output_shape_and_window(*src_info).second); +} } // namespace cpu } // namespace arm_compute \ No newline at end of file diff --git a/src/runtime/cpu/operators/CpuElementwiseUnary.h b/src/runtime/cpu/operators/CpuElementwiseUnary.h index 0b2a9e730d..721ba2a85b 100644 --- a/src/runtime/cpu/operators/CpuElementwiseUnary.h +++ b/src/runtime/cpu/operators/CpuElementwiseUnary.h @@ -50,6 +50,9 @@ public: * @return a status */ static Status validate(ElementWiseUnary op, const ITensorInfo &src, const ITensorInfo &dst); + + // Inherited methods overridden: + void run(ITensorPack &tensors) override; }; } // namespace cpu -- cgit v1.2.1