blob: 926ae1fa21b8c8d077abfffd31572fbc9f261eff [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
morgolock781d7272020-01-10 10:11:14 +00002 * Copyright (c) 2018-2020 ARM Limited.
giuros0192fd9432018-12-03 17:30:00 +00003 *
4 * SPDX-License-Identifier: MIT
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a copy
7 * of this software and associated documentation files (the "Software"), to
8 * deal in the Software without restriction, including without limitation the
9 * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
10 * sell copies of the Software, and to permit persons to whom the Software is
11 * furnished to do so, subject to the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be included in all
14 * copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
George Wortd88590f2018-12-12 17:39:58 +000017 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
giuros0192fd9432018-12-03 17:30:00 +000018 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
George Wortd88590f2018-12-12 17:39:58 +000019 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
giuros0192fd9432018-12-03 17:30:00 +000020 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
22 * SOFTWARE.
23 */
morgolock781d7272020-01-10 10:11:14 +000024#include "arm_compute/core/Validate.h"
giuros0192fd9432018-12-03 17:30:00 +000025#include "arm_compute/runtime/NEON/functions/NEElementwiseOperations.h"
26#include <arm_compute/core/NEON/kernels/NEElementwiseOperationKernel.h>
27
28#include "arm_compute/core/ITensor.h"
Matthew Bentham758b5ba2020-03-05 23:37:48 +000029#include "support/MemorySupport.h"
giuros0192fd9432018-12-03 17:30:00 +000030
31#include <utility>
32
33namespace arm_compute
34{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000035void NEElementwiseMax::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000036{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000037 ARM_COMPUTE_UNUSED(act_info);
giuros0192fd9432018-12-03 17:30:00 +000038 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
39 k->configure(ArithmeticOperation::MAX, input1, input2, output);
40 _kernel = std::move(k);
41}
42
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000043Status NEElementwiseMax::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000044{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000045 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
giuros0192fd9432018-12-03 17:30:00 +000046 return NEArithmeticOperationKernel::validate(ArithmeticOperation::MAX, input1, input2, output);
47}
48
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000049void NEElementwiseMin::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000050{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000051 ARM_COMPUTE_UNUSED(act_info);
giuros0192fd9432018-12-03 17:30:00 +000052 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
53 k->configure(ArithmeticOperation::MIN, input1, input2, output);
54 _kernel = std::move(k);
55}
56
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000057Status NEElementwiseMin::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000058{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000059 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
giuros0192fd9432018-12-03 17:30:00 +000060 return NEArithmeticOperationKernel::validate(ArithmeticOperation::MIN, input1, input2, output);
61}
62
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000063void NEElementwiseSquaredDiff::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000064{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000065 ARM_COMPUTE_UNUSED(act_info);
giuros0192fd9432018-12-03 17:30:00 +000066 auto k = arm_compute::support::cpp14::make_unique<NEArithmeticOperationKernel>();
67 k->configure(ArithmeticOperation::SQUARED_DIFF, input1, input2, output);
68 _kernel = std::move(k);
69}
70
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000071Status NEElementwiseSquaredDiff::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
giuros0192fd9432018-12-03 17:30:00 +000072{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000073 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
giuros0192fd9432018-12-03 17:30:00 +000074 return NEArithmeticOperationKernel::validate(ArithmeticOperation::SQUARED_DIFF, input1, input2, output);
75}
George Wortd88590f2018-12-12 17:39:58 +000076
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000077void NEElementwiseDivision::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
George Worta1e7e282019-01-15 11:00:29 +000078{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000079 ARM_COMPUTE_UNUSED(act_info);
George Worta1e7e282019-01-15 11:00:29 +000080 auto k = arm_compute::support::cpp14::make_unique<NEDivisionOperationKernel>();
81 k->configure(input1, input2, output);
82 _kernel = std::move(k);
83}
84
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000085Status NEElementwiseDivision::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
George Worta1e7e282019-01-15 11:00:29 +000086{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000087 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
George Worta1e7e282019-01-15 11:00:29 +000088 return NEDivisionOperationKernel::validate(input1, input2, output);
89}
90
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000091void NEElementwisePower::configure(ITensor *input1, ITensor *input2, ITensor *output, const ActivationLayerInfo &act_info)
Usama Arif81e671e2019-05-13 13:33:14 +010092{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000093 ARM_COMPUTE_UNUSED(act_info);
Usama Arif81e671e2019-05-13 13:33:14 +010094 auto k = arm_compute::support::cpp14::make_unique<NEPowerOperationKernel>();
95 k->configure(input1, input2, output);
96 _kernel = std::move(k);
97}
98
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000099Status NEElementwisePower::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info)
Usama Arif81e671e2019-05-13 13:33:14 +0100100{
Giorgio Arena8b2a7d32020-02-11 17:21:31 +0000101 ARM_COMPUTE_RETURN_ERROR_ON(act_info.enabled());
Usama Arif81e671e2019-05-13 13:33:14 +0100102 return NEPowerOperationKernel::validate(input1, input2, output);
103}
104
George Wortd88590f2018-12-12 17:39:58 +0000105template <ComparisonOperation COP>
106void NEElementwiseComparisonStatic<COP>::configure(ITensor *input1, ITensor *input2, ITensor *output)
107{
108 auto k = arm_compute::support::cpp14::make_unique<NEComparisonOperationKernel>();
109 k->configure(COP, input1, input2, output);
110 _kernel = std::move(k);
111}
112
113template <ComparisonOperation COP>
114Status NEElementwiseComparisonStatic<COP>::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output)
115{
116 return NEComparisonOperationKernel::validate(COP, input1, input2, output);
117}
118
119void NEElementwiseComparison::configure(ITensor *input1, ITensor *input2, ITensor *output, ComparisonOperation op)
120{
121 auto k = arm_compute::support::cpp14::make_unique<NEComparisonOperationKernel>();
122 k->configure(op, input1, input2, output);
123 _kernel = std::move(k);
124}
125
126Status NEElementwiseComparison::validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ComparisonOperation op)
127{
128 return NEComparisonOperationKernel::validate(op, input1, input2, output);
129}
Georgios Pinitas83bbf772019-01-25 16:44:07 +0000130
131// Supported Specializations
132template class NEElementwiseComparisonStatic<ComparisonOperation::Equal>;
133template class NEElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
134template class NEElementwiseComparisonStatic<ComparisonOperation::Greater>;
135template class NEElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
136template class NEElementwiseComparisonStatic<ComparisonOperation::Less>;
137template class NEElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
giuros0192fd9432018-12-03 17:30:00 +0000138} // namespace arm_compute