blob: 4b350d5f9fb49ff350a606cc916682bde46d008d [file] [log] [blame]
Sang-Hoon Park63001ac2021-01-18 14:20:27 +00001/*
2 * Copyright (c) 2021 Arm Limited.
3 *
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
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 * 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 */
24#ifndef ARM_COMPUTE_CPU_ELEMENTWISE_H
25#define ARM_COMPUTE_CPU_ELEMENTWISE_H
26
27#include "src/runtime/cpu/ICpuOperator.h"
28
29namespace arm_compute
30{
31namespace cpu
32{
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000033class CpuElementwiseBase : public ICpuOperator
34{
35public:
36 // Inherited methods overridden:
37 void run(ITensorPack &tensors) override;
38};
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000039/** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for max
40 *
41 * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
42 * @note The function performs a max operation between two tensors.
43 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000044class CpuElementwiseMax : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000045{
46public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000047 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000048 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000049 * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
50 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
51 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000052 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000053 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000054 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for max
55 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000056 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
57 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
58 * @param[in] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000059 *
60 * @return a status
61 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000062 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000063};
64
65/** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for min
66 *
67 * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
68 * @note The function performs a min operation between two tensors.
69 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000070class CpuElementwiseMin : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000071{
72public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000073 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000074 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000075 * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
76 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
77 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000078 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000079 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000080 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for min
81 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000082 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
83 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
84 * @param[in] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000085 *
86 * @return a status
87 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000088 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000089};
90
91/** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for squared difference
92 *
93 * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
94 * @note The function performs a squared different operation between two tensors (i.e., out[i] = (in1[i] - in2[i])^2
95 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000096class CpuElementwiseSquaredDiff : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000097{
98public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000099 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000100 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000101 * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
102 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
103 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000104 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000105 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000106 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for squared difference
107 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000108 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
109 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
110 * @param[in] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000111 *
112 * @return a status
113 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000114 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000115};
116
117/** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for division
118 *
119 * @note The tensor data type for the inputs must be S32/F16/F32.
120 * @note The function performs a division operation between two tensors (i.e., out[i] = in1[i] / in2[i])
121 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000122class CpuElementwiseDivision : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000123{
124public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000125 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000126 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000127 * @param[in, out] src0 First tensor input info. Data types supported: S32/F16/F32.
128 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
129 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000130 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000131 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000132 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for division
133 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000134 * @param[in] src0 First tensor input info. Data types supported: S32/F16/F32.
135 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
136 * @param[in] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000137 *
138 * @return a status
139 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000140 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000141};
142
143/** Basic function to run @ref cpu::kernels::CpuArithmeticKernel for power
144 *
145 * @note The tensor data type for the inputs must be F16/F32.
146 * @note The function performs a elementwise power of in1 to in2 (i.e., out[i] = in1[i] ^ in2[i])
147 * @note For an exponent that is a float, this function will only work with a positive base.
148 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000149class CpuElementwisePower : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000150{
151public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000152 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000153 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000154 * @param[in, out] src0 First tensor input info. Data types supported: F16/F32.
155 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
156 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000157 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000158 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000159 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuArithmeticKernel for power
160 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000161 * @param[in] src0 First tensor input info. Data types supported: F16/F32.
162 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
163 * @param[in] dst Output tensor info. Data types supported: Same as @p src0.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000164 *
165 * @return a status
166 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000167 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000168};
169
170/** Basic function to run @ref cpu::kernels::CpuComparisonKernel.
171 *
172 * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
173 * @note The function performs a comparison operation between two tensors.
174 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000175class CpuElementwiseComparison : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000176{
177public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000178 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000179 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000180 * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
181 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
182 * @param[out] dst Output tensor info. Data types supported: U16/U32.
183 * @param[in] op Comparison Operation to be performed.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000184 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000185 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst, ComparisonOperation op);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000186 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuComparisonKernel
187 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000188 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
189 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
190 * @param[in] dst Output tensor info. Data types supported: U16/U32.
191 * @param[in] op Comparison Operation to be performed.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000192 *
193 * @return a status
194 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000195 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst, ComparisonOperation op);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000196};
197
198/** Basic function to run @ref cpu::kernels::CpuComparisonKernel
199 *
200 * @note The tensor data type for the inputs must be QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
201 * @note The function performs a comparison operation between two tensors.
202 */
203template <ComparisonOperation op>
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000204class CpuElementwiseComparisonStatic : public CpuElementwiseBase
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000205{
206public:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000207 /** Initialise the kernel's inputs, dst and conversion policy.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000208 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000209 * @param[in, out] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
210 * @param[in, out] src1 Second tensor input info. Data types supported: Same as @p src0.
211 * @param[out] dst Output tensor info. Data types supported: U16/U32.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000212 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000213 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000214 /** Static function to check if given info will lead to a valid configuration of @ref cpu::kernels::CpuComparisonKernel
215 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000216 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
217 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
218 * @param[in] dst Output tensor info. Data types supported: U16/U32.
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000219 *
220 * @return a status
221 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000222 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000223};
224
225/** Basic function to run equal comparison. */
226using NEEqual = CpuElementwiseComparisonStatic<ComparisonOperation::Equal>;
227/** Basic function to run not equal comparison. */
228using NENotEqual = CpuElementwiseComparisonStatic<ComparisonOperation::NotEqual>;
229/** Basic function to run greater comparison. */
230using NEGreater = CpuElementwiseComparisonStatic<ComparisonOperation::Greater>;
231/** Basic function to run greater-equal comparison. */
232using NEGreaterEqual = CpuElementwiseComparisonStatic<ComparisonOperation::GreaterEqual>;
233/** Basic function to run less comparison. */
234using NELess = CpuElementwiseComparisonStatic<ComparisonOperation::Less>;
235/** Basic function to run less-equal comparison. */
236using NELessEqual = CpuElementwiseComparisonStatic<ComparisonOperation::LessEqual>;
237} // namespace cpu
238} // namespace arm_compute
239
240#endif /* ARM_COMPUTE_CPU_ELEMENTWISE_H */