diff options
author | Usama Arif <usama.arif@arm.com> | 2019-05-13 13:33:14 +0100 |
---|---|---|
committer | Usama Arif <usama.arif@arm.com> | 2019-05-15 10:25:17 +0000 |
commit | 81e671ef4f2a8fb3128fba402610b9de28b57891 (patch) | |
tree | 37ae4534cc3e34d8aba615c869a318d8f8038d33 /src | |
parent | c255aa7df3e61a73cc4af86d21d3b1848653b7a9 (diff) | |
download | ComputeLibrary-81e671ef4f2a8fb3128fba402610b9de28b57891.tar.gz |
COMPMID-2269: Implement POW operator for NEON
Change-Id: I7135f665d89da3c24c9bbe00e991a64713a41d0e
Signed-off-by: Usama Arif <usama.arif@arm.com>
Reviewed-on: https://review.mlplatform.org/c/1128
Reviewed-by: Michalis Spyrou <michalis.spyrou@arm.com>
Comments-Addressed: Arm Jenkins <bsgcomp@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src')
-rw-r--r-- | src/core/NEON/kernels/NEElementwiseOperationKernel.cpp | 38 | ||||
-rw-r--r-- | src/runtime/NEON/functions/NEElementwiseOperators.cpp | 12 |
2 files changed, 50 insertions, 0 deletions
diff --git a/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp b/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp index 6b87ea017b..33457e1fca 100644 --- a/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp +++ b/src/core/NEON/kernels/NEElementwiseOperationKernel.cpp @@ -130,6 +130,11 @@ inline ScalarType elementwise_arithm_op_scalar(const ScalarType &a, const Scalar res = a / b; break; } + case ArithmeticOperation::POWER: + { + res = std::pow(a, b); + break; + } default: ARM_COMPUTE_ERROR("NOT_SUPPORTED!"); } @@ -174,12 +179,24 @@ inline float32x4_t elementwise_arithm_op<ArithmeticOperation::DIV, float32x4_t>( return wrapper::vdiv(a, b); } +template <> +inline float32x4_t elementwise_arithm_op<ArithmeticOperation::POWER, float32x4_t>(const float32x4_t &a, const float32x4_t &b) +{ + return wrapper::vpow(a, b); +} + #ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC template <> inline float16x8_t elementwise_arithm_op<ArithmeticOperation::DIV, float16x8_t>(const float16x8_t &a, const float16x8_t &b) { return wrapper::vdiv(a, b); } + +template <> +inline float16x8_t elementwise_arithm_op<ArithmeticOperation::POWER, float16x8_t>(const float16x8_t &a, const float16x8_t &b) +{ + return wrapper::vpow(a, b); +} #endif // __ARM_FEATURE_FP16_VECTOR_ARITHMETIC template <ArithmeticOperation op> @@ -879,6 +896,27 @@ Status NEDivisionOperationKernel::validate(const ITensorInfo *input1, const ITen return Status{}; } +/** The power operator */ +void NEPowerOperationKernel::configure(const ITensor *input1, const ITensor *input2, ITensor *output) +{ + ARM_COMPUTE_ERROR_THROW_ON(validate_arguments(*input1->info(), *input2->info(), *output->info())); + configure_common(input1, input2, output); + _function = configure_arithm_func<ArithmeticOperation::POWER>(input1, input2, output); +} + +Status NEPowerOperationKernel::validate_arguments(const ITensorInfo &input1, const ITensorInfo &input2, const ITensorInfo &output) +{ + ARM_COMPUTE_RETURN_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(&input1, 1, DataType::F16, DataType::F32); + return NEArithmeticOperationKernel::validate_arguments(input1, input2, output); +} + +Status NEPowerOperationKernel::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +{ + ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input1, input2, output); + ARM_COMPUTE_RETURN_ON_ERROR(validate_arguments(*input1, *input2, *output)); + return Status{}; +} + /** Comparison operators (equal, not equal, less than, greater than, less than or equal, greater than or equal) */ void NEComparisonOperationKernel::configure(ComparisonOperation op, const ITensor *input1, const ITensor *input2, ITensor *output) diff --git a/src/runtime/NEON/functions/NEElementwiseOperators.cpp b/src/runtime/NEON/functions/NEElementwiseOperators.cpp index 74c195764b..699363111d 100644 --- a/src/runtime/NEON/functions/NEElementwiseOperators.cpp +++ b/src/runtime/NEON/functions/NEElementwiseOperators.cpp @@ -79,6 +79,18 @@ Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorI return NEDivisionOperationKernel::validate(input1, input2, output); } +void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *output) +{ + auto k = arm_compute::support::cpp14::make_unique<NEPowerOperationKernel>(); + k->configure(input1, input2, output); + _kernel = std::move(k); +} + +Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output) +{ + return NEPowerOperationKernel::validate(input1, input2, output); +} + template <ComparisonOperation COP> void NEElementwiseComparisonStatic<COP>::configure(ITensor *input1, ITensor *input2, ITensor *output) { |