blob: 2785e0a44ca9ba6b9c68b86b2f7844e713a553d5 [file] [log] [blame]
giuros0192fd9432018-12-03 17:30:00 +00001/*
Giorgio Arena5ae8d802021-11-18 18:02:13 +00002 * Copyright (c) 2021-2022 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 */
Dana Zlotnik6a2df882022-01-17 09:54:26 +020042template <class Derived>
43class CpuElementwiseKernel : public ICpuKernel<Derived>
giuros0192fd9432018-12-03 17:30:00 +000044{
Dana Zlotnik6a2df882022-01-17 09:54:26 +020045private:
46 using ElementwiseKernelPtr = std::add_pointer<void(const ITensor *, const ITensor *, ITensor *, const Window &)>::type;
47
giuros0192fd9432018-12-03 17:30:00 +000048public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000049 CpuElementwiseKernel() = default;
50 ARM_COMPUTE_DISALLOW_COPY_ALLOW_MOVE(CpuElementwiseKernel);
giuros0192fd9432018-12-03 17:30:00 +000051
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000052 using ElementwiseFunction = void(const ITensor *, const ITensor *, ITensor *, const Window &);
Michalis Spyrouce0c6752020-06-18 10:14:57 +010053 // Inherited methods overridden:
Georgios Pinitas0499dff2020-07-31 22:21:38 +010054 void run_op(ITensorPack &tensors, const Window &window, const ThreadInfo &info) override;
Dana Zlotnik6a2df882022-01-17 09:54:26 +020055
Georgios Pinitas5fdde992021-06-25 05:42:57 +010056 const char *name() const override;
Michalis Spyrouce0c6752020-06-18 10:14:57 +010057
Dana Zlotnik6a2df882022-01-17 09:54:26 +020058 struct ElementwiseKernel
59 {
60 const char *name;
61 const ElementwiseDataTypeISASelectorPtr is_selected;
62 ElementwiseKernelPtr ukernel;
63 };
64
giuros0192fd9432018-12-03 17:30:00 +000065protected:
66 /** Validate the argument passed to the kernel
67 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000068 * @param[in] src0 First tensor input. Data types supported: QASYMM8/S16/F16/S32/F32.
69 * @param[in] src1 Second tensor input. Data types supported: Same as @p src0.
70 * @param[in] dst Output tensor. Data types supported: Dependent on subclass.
giuros0192fd9432018-12-03 17:30:00 +000071 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000072 static Status validate_arguments_common(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
giuros0192fd9432018-12-03 17:30:00 +000073
Georgios Pinitas5fdde992021-06-25 05:42:57 +010074protected:
75 std::function<ElementwiseFunction> _run_method{ nullptr };
76 std::string _name{};
giuros0192fd9432018-12-03 17:30:00 +000077};
78
Dana Zlotnik6a2df882022-01-17 09:54:26 +020079class CpuArithmeticKernel : public CpuElementwiseKernel<CpuArithmeticKernel>
giuros0192fd9432018-12-03 17:30:00 +000080{
81public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +000082 CpuArithmeticKernel() = default;
giuros0192fd9432018-12-03 17:30:00 +000083
Georgios Pinitas18134222020-09-03 21:00:23 +010084 /** Configure kernel
giuros0192fd9432018-12-03 17:30:00 +000085 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000086 * @param[in] op Arithmetic operation to be executed.
87 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/S16/F16/S32/F32.
88 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
89 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
giuros0192fd9432018-12-03 17:30:00 +000090 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000091 void configure(ArithmeticOperation op, const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +000092
Georgios Pinitas5fdde992021-06-25 05:42:57 +010093 /** Static function to check if given info will lead to a valid configuration
giuros0192fd9432018-12-03 17:30:00 +000094 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +010095 * Similar to CpuArithmeticKernel::configure()
giuros0192fd9432018-12-03 17:30:00 +000096 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +010097 * @return a status
giuros0192fd9432018-12-03 17:30:00 +000098 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +000099 static Status validate(ArithmeticOperation op, const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +0000100
Dana Zlotnik6a2df882022-01-17 09:54:26 +0200101 static const std::vector<CpuElementwiseKernel<CpuArithmeticKernel>::ElementwiseKernel> &get_available_kernels();
102
giuros0192fd9432018-12-03 17:30:00 +0000103protected:
Dana Zlotnik6a2df882022-01-17 09:54:26 +0200104 /** Commmon configure function for element-wise operators with no additional options (e.g. Min, Max, SquaredDiff)
105 */
106 void configure_common(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
giuros0192fd9432018-12-03 17:30:00 +0000107 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000108 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000109
110 ArithmeticOperation _op{};
111
112private:
113 /** Function to get the micro kernel implementation
114 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000115 * @param[in] src0 First input tensor information
116 * @param[in] src1 Second input tensor information
117 * @param[in] dst Output tensor information
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000118 *
119 * @return the function instance for the micro kernel
120 */
George Wortd88590f2018-12-12 17:39:58 +0000121};
122
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000123class CpuDivisionKernel : public CpuArithmeticKernel
George Worta1e7e282019-01-15 11:00:29 +0000124{
125public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000126 CpuDivisionKernel() = default;
George Worta1e7e282019-01-15 11:00:29 +0000127
Georgios Pinitas18134222020-09-03 21:00:23 +0100128 /** Configure kernel
George Worta1e7e282019-01-15 11:00:29 +0000129 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000130 * @param[in] src0 First tensor input info. Data types supported: S32/F16/F32.
131 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
132 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
George Worta1e7e282019-01-15 11:00:29 +0000133 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000134 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
George Worta1e7e282019-01-15 11:00:29 +0000135
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100136 /** Static function to check if given info will lead to a valid configuration
George Worta1e7e282019-01-15 11:00:29 +0000137 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100138 * Similar to CpuDivisionKernel::configure()
George Worta1e7e282019-01-15 11:00:29 +0000139 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100140 * @return a status
George Worta1e7e282019-01-15 11:00:29 +0000141 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000142 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
George Worta1e7e282019-01-15 11:00:29 +0000143
144protected:
145 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000146 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
George Worta1e7e282019-01-15 11:00:29 +0000147};
148
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000149class CpuPowerKernel : public CpuArithmeticKernel
Usama Arif81e671e2019-05-13 13:33:14 +0100150{
151public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000152 CpuPowerKernel() = default;
Usama Arif81e671e2019-05-13 13:33:14 +0100153
Georgios Pinitas18134222020-09-03 21:00:23 +0100154 /** Configure kernel
Usama Arif81e671e2019-05-13 13:33:14 +0100155 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000156 * @param[in] src0 First tensor input info. Data types supported: F16/F32.
157 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
158 * @param[out] dst Output tensor info. Data types supported: Same as @p src0.
Usama Arif81e671e2019-05-13 13:33:14 +0100159 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000160 void configure(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100161
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100162 /** Static function to check if given info will lead to a valid configuration
Usama Arif81e671e2019-05-13 13:33:14 +0100163 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100164 * Similar to CpuPowerKernel::configure()
Usama Arif81e671e2019-05-13 13:33:14 +0100165 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100166 * @return a status
Usama Arif81e671e2019-05-13 13:33:14 +0100167 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000168 static Status validate(const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100169
170protected:
171 // Inherited methods overridden:
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000172 static Status validate_arguments(const ITensorInfo &src0, const ITensorInfo &src1, const ITensorInfo &dst);
Usama Arif81e671e2019-05-13 13:33:14 +0100173};
174
Dana Zlotnik6a2df882022-01-17 09:54:26 +0200175class CpuComparisonKernel : public CpuElementwiseKernel<CpuComparisonKernel>
George Wortd88590f2018-12-12 17:39:58 +0000176{
177public:
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000178 CpuComparisonKernel() = default;
George Wortd88590f2018-12-12 17:39:58 +0000179
Georgios Pinitas18134222020-09-03 21:00:23 +0100180 /** Configure kernel
George Wortd88590f2018-12-12 17:39:58 +0000181 *
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000182 * @param[in] op Comparison operation to be executed.
183 * @param[in] src0 First tensor input info. Data types supported: QASYMM8/QASYMM8_SIGNED/S16/F16/S32/F32.
184 * @param[in] src1 Second tensor input info. Data types supported: Same as @p src0.
185 * @param[out] dst Output tensor info. Data types supported: U8.
George Wortd88590f2018-12-12 17:39:58 +0000186 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000187 void configure(ComparisonOperation op, const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
George Wortd88590f2018-12-12 17:39:58 +0000188
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100189 /** Static function to check if given info will lead to a valid configuration
George Wortd88590f2018-12-12 17:39:58 +0000190 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100191 * Similar to CpuComparisonKernel::configure()
George Wortd88590f2018-12-12 17:39:58 +0000192 *
Georgios Pinitas5fdde992021-06-25 05:42:57 +0100193 * @return a status
George Wortd88590f2018-12-12 17:39:58 +0000194 */
Sang-Hoon Park668ccdc2021-02-03 10:32:59 +0000195 static Status validate(ComparisonOperation op, const ITensorInfo *src0, const ITensorInfo *src1, const ITensorInfo *dst);
George Wortd88590f2018-12-12 17:39:58 +0000196
Dana Zlotnik6a2df882022-01-17 09:54:26 +0200197 static const std::vector<CpuElementwiseKernel<CpuComparisonKernel>::ElementwiseKernel> &get_available_kernels();
198
George Wortd88590f2018-12-12 17:39:58 +0000199protected:
Dana Zlotnik6a2df882022-01-17 09:54:26 +0200200 /** Commmon configure function for element-wise operators with no additional options (e.g. Min, Max, SquaredDiff)
201 */
202 void configure_common(const ITensorInfo *src0, const ITensorInfo *src1, ITensorInfo *dst);
George Wortd88590f2018-12-12 17:39:58 +0000203 // 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 */
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000215
216 ComparisonOperation _op{};
giuros0192fd9432018-12-03 17:30:00 +0000217};
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000218} // namespace kernels
219} // namespace cpu
giuros0192fd9432018-12-03 17:30:00 +0000220} // namespace arm_compute
Sang-Hoon Park63001ac2021-01-18 14:20:27 +0000221#endif /* ARM_COMPUTE_CPU_ELEMENTWISE_KERNEL_H */