blob: f323fe44705bda155d75099f5fb7ac3b780e8654 [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
Sang-Hoon Park63001ac2021-01-18 14:20:27 +00002 * Copyright (c) 2021 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 */
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000024#ifndef ARM_COMPUTE_CPU_ELEMENTWISE_KERNEL_H
25#define ARM_COMPUTE_CPU_ELEMENTWISE_KERNEL_H
giuros0192fd9432018-12-03 17:30:00 +000026
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000027#include "src/core/common/Macros.h"
Georgios Pinitas7891a732021-08-20 21:39:25 +010028#include "src/cpu/ICpuKernel.h"
giuros0192fd9432018-12-03 17:30:00 +000029
30namespace arm_compute
31{
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000032namespace cpu
33{
34namespace kernels
35{
giuros0192fd9432018-12-03 17:30:00 +000036/** Interface for an element-wise operation kernel
37 *
38 * Element-wise operation is computed by:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000039 * @f[ dst(x,y) = OP(src0(x,y), src1(x,y))@f]
giuros0192fd9432018-12-03 17:30:00 +000040 *
41 */
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000042class CpuElementwiseKernel : public ICpuKernel
giuros0192fd9432018-12-03 17:30:00 +000043{
44public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000045 CpuElementwiseKernel() = default;
46 ARM_COMPUTE_DISALLOW_COPY_ALLOW_MOVE(CpuElementwiseKernel);
giuros0192fd9432018-12-03 17:30:00 +000047
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000048 using ElementwiseFunction = void(const ITensor *, const ITensor *, ITensor *, const Window &);
Georgios Pinitas5fdde992021-06-25 05:42:57 +010049 struct UKernelInfo
50 {
51 std::string name;
52 std::function<ElementwiseFunction> ukernel;
53 };
George Wortd88590f2018-12-12 17:39:58 +000054
Michalis Spyrouce0c6752020-06-18 10:14:57 +010055 // Inherited methods overridden:
Georgios Pinitas0499dff2020-07-31 22:21:38 +010056 void run_op(ITensorPack &tensors, const Window &window, const ThreadInfo &info) override;
Georgios Pinitas5fdde992021-06-25 05:42:57 +010057 const char *name() const override;
Michalis Spyrouce0c6752020-06-18 10:14:57 +010058
giuros0192fd9432018-12-03 17:30:00 +000059protected:
60 /** Validate the argument passed to the kernel
61 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000062 * @param[in] src0 First tensor input. Data types supported: QASYMM8/S16/F16/S32/F32.
63 * @param[in] src1 Second tensor input. Data types supported: Same as @p src0.
64 * @param[in] dst Output tensor. Data types supported: Dependent on subclass.
giuros0192fd9432018-12-03 17:30:00 +000065 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000066 static Status validate_arguments_common(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
giuros0192fd9432018-12-03 17:30:00 +000067
68 /** Commmon configure function for element-wise operators with no additional options (e.g. Min, Max, SquaredDiff)
69 *
70 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000071 void configure_common(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +000072
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000073 /** Function to get the micro kernel implementation
74 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000075 * @param[in] src0 First input tensor information
76 * @param[in] src1 Second input tensor information
77 * @param[in] dst Output tensor information
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000078 *
79 * @return the function instance for the micro kernel
80 */
Georgios Pinitas5fdde992021-06-25 05:42:57 +010081 virtual UKernelInfo get_implementation(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) = 0;
82
83protected:
84 std::function<ElementwiseFunction> _run_method{ nullptr };
85 std::string _name{};
giuros0192fd9432018-12-03 17:30:00 +000086};
87
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000088class CpuArithmeticKernel : public CpuElementwiseKernel
giuros0192fd9432018-12-03 17:30:00 +000089{
90public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000091 CpuArithmeticKernel() = default;
giuros0192fd9432018-12-03 17:30:00 +000092
Georgios Pinitas18134222020-09-03 21:00:23 +010093 /** Configure kernel
giuros0192fd9432018-12-03 17:30:00 +000094 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000095 * @param[in] op Arithmetic operation to be executed.
96 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/S16/F16/S32/F32.
97 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
98 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
giuros0192fd9432018-12-03 17:30:00 +000099 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000100 void configure(ArithmeticOperation op, const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +0000101
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100102 /** Static function to check if given info will lead to a valid configuration
giuros0192fd9432018-12-03 17:30:00 +0000103 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100104 * Similar to CpuArithmeticKernel::configure()
giuros0192fd9432018-12-03 17:30:00 +0000105 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100106 * @return a status
giuros0192fd9432018-12-03 17:30:00 +0000107 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000108 static Status validate(ArithmeticOperation op, const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +0000109
110protected:
111 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000112 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000113
114 ArithmeticOperation _op{};
115
116private:
117 /** Function to get the micro kernel implementation
118 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000119 * @param[in] src0 First input tensor information
120 * @param[in] src1 Second input tensor information
121 * @param[in] dst Output tensor information
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000122 *
123 * @return the function instance for the micro kernel
124 */
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100125 UKernelInfo get_implementation(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) override;
George Wortd88590f2018-12-12 17:39:58 +0000126};
127
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000128class CpuDivisionKernel : public CpuArithmeticKernel
George Worta1e7e282019-01-15 11:00:29 +0000129{
130public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000131 CpuDivisionKernel() = default;
George Worta1e7e282019-01-15 11:00:29 +0000132
Georgios Pinitas18134222020-09-03 21:00:23 +0100133 /** Configure kernel
George Worta1e7e282019-01-15 11:00:29 +0000134 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000135 * @param[in] src0 First tensor input info. Data types supported: S32/F16/F32.
136 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
137 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
George Worta1e7e282019-01-15 11:00:29 +0000138 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000139 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
George Worta1e7e282019-01-15 11:00:29 +0000140
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100141 /** Static function to check if given info will lead to a valid configuration
George Worta1e7e282019-01-15 11:00:29 +0000142 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100143 * Similar to CpuDivisionKernel::configure()
George Worta1e7e282019-01-15 11:00:29 +0000144 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100145 * @return a status
George Worta1e7e282019-01-15 11:00:29 +0000146 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000147 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
George Worta1e7e282019-01-15 11:00:29 +0000148
149protected:
150 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000151 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
George Worta1e7e282019-01-15 11:00:29 +0000152};
153
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000154class CpuPowerKernel : public CpuArithmeticKernel
Usama Arif81e671e2019-05-13 13:33:14 +0100155{
156public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000157 CpuPowerKernel() = default;
Usama Arif81e671e2019-05-13 13:33:14 +0100158
Georgios Pinitas18134222020-09-03 21:00:23 +0100159 /** Configure kernel
Usama Arif81e671e2019-05-13 13:33:14 +0100160 *
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[out] dst Output tensor info. Data types supported: Same as @p src0.
Usama Arif81e671e2019-05-13 13:33:14 +0100164 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000165 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100166
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100167 /** Static function to check if given info will lead to a valid configuration
Usama Arif81e671e2019-05-13 13:33:14 +0100168 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100169 * Similar to CpuPowerKernel::configure()
Usama Arif81e671e2019-05-13 13:33:14 +0100170 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100171 * @return a status
Usama Arif81e671e2019-05-13 13:33:14 +0100172 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000173 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100174
175protected:
176 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000177 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100178};
179
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000180class CpuComparisonKernel : public CpuElementwiseKernel
George Wortd88590f2018-12-12 17:39:58 +0000181{
182public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000183 CpuComparisonKernel() = default;
George Wortd88590f2018-12-12 17:39:58 +0000184
Georgios Pinitas18134222020-09-03 21:00:23 +0100185 /** Configure kernel
George Wortd88590f2018-12-12 17:39:58 +0000186 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000187 * @param[in] op Comparison operation to be executed.
188 * @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[out] dst Output tensor info. Data types supported: U8.
George Wortd88590f2018-12-12 17:39:58 +0000191 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000192 void configure(ComparisonOperation op, const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
George Wortd88590f2018-12-12 17:39:58 +0000193
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100194 /** Static function to check if given info will lead to a valid configuration
George Wortd88590f2018-12-12 17:39:58 +0000195 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100196 * Similar to CpuComparisonKernel::configure()
George Wortd88590f2018-12-12 17:39:58 +0000197 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100198 * @return a status
George Wortd88590f2018-12-12 17:39:58 +0000199 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000200 static Status validate(ComparisonOperation op, const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
George Wortd88590f2018-12-12 17:39:58 +0000201
202protected:
203 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000204 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000205
206private:
207 /** Function to get the micro kernel implementation
208 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000209 * @param[in] src0 First input tensor information
210 * @param[in] src1 Second input tensor information
211 * @param[in] dst Output tensor information
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000212 *
213 * @return the function instance for the micro kernel
214 */
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100215 UKernelInfo get_implementation(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst) override;
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000216
217 ComparisonOperation _op{};
giuros0192fd9432018-12-03 17:30:00 +0000218};
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000219} // namespace kernels
220} // namespace cpu
giuros0192fd9432018-12-03 17:30:00 +0000221} // namespace arm_compute
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000222#endif /* ARM_COMPUTE_CPU_ELEMENTWISE_KERNEL_H */