blob: 5d2475b3a4b43e67571674ed794c1cfef4d35c7e [file] [log] [blame]
Anthony Barbier6ff3b192017-09-04 18:44:23 +01001/*
Michele Di Giorgiod9eaf612020-07-08 11:12:57 +01002 * Copyright (c) 2016-2020 Arm Limited.
Anthony Barbier6ff3b192017-09-04 18:44:23 +01003 *
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 */
Michalis Spyrouf4643372019-11-29 16:17:13 +000024#ifndef ARM_COMPUTE_NEARITHMETICSUBTRACTION_H
25#define ARM_COMPUTE_NEARITHMETICSUBTRACTION_H
Anthony Barbier6ff3b192017-09-04 18:44:23 +010026
27#include "arm_compute/core/Types.h"
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010028#include "arm_compute/runtime/IFunction.h"
29#include "arm_compute/runtime/NEON/INEOperator.h"
Anthony Barbier6ff3b192017-09-04 18:44:23 +010030
31namespace arm_compute
32{
33class ITensor;
34
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010035namespace experimental
36{
Georgios Pinitascbf39c62018-09-10 15:07:45 +010037/** Basic function to run @ref NEArithmeticSubtractionKernel
38 *
SiCong Li903f8cc2020-08-27 10:17:10 +010039 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/S32/F16/F32.
Georgios Pinitascbf39c62018-09-10 15:07:45 +010040 * @note The function performs an arithmetic subtraction between two tensors.
41 *
42 * This function calls the following kernels:
Georgios Pinitascbf39c62018-09-10 15:07:45 +010043 * -# @ref NEArithmeticSubtractionKernel
44 */
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010045class NEArithmeticSubtraction : public INEOperator
Anthony Barbier6ff3b192017-09-04 18:44:23 +010046{
47public:
48 /** Initialise the kernel's inputs, output and conversion policy.
49 *
Michele Di Giorgiof9b595a2020-07-03 13:34:52 +010050 * Valid configurations (Input1,Input2) -> Output :
51 *
52 * - (U8,U8) -> U8
53 * - (U8,U8) -> S16
54 * - (QASYMM8, QASYMM8) -> QASYMM8
55 * - (QASYMM8_SIGNED, QASYMM8_SIGNED) -> QASYMM8_SIGNED
56 * - (S16,U8) -> S16
57 * - (U8,S16) -> S16
58 * - (S16,S16) -> S16
SiCong Li903f8cc2020-08-27 10:17:10 +010059 * - (S32,S32) -> S32
Michele Di Giorgiof9b595a2020-07-03 13:34:52 +010060 * - (F16,F16) -> F16
61 * - (F32,F32) -> F32
62 *
SiCong Li903f8cc2020-08-27 10:17:10 +010063 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
64 * @param[in] input2 Second tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
65 * @param[out] output Output tensor info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000066 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
67 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
Anthony Barbier6ff3b192017-09-04 18:44:23 +010068 */
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010069 void configure(const ITensorInfo *input1, const ITensorInfo *input2, ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000070 /** Static function to check if given info will lead to a valid configuration of @ref NEArithmeticSubtraction
71 *
Michele Di Giorgiof9b595a2020-07-03 13:34:52 +010072 * Valid configurations (Input1,Input2) -> Output :
73 *
74 * - (U8,U8) -> U8
75 * - (U8,U8) -> S16
76 * - (QASYMM8, QASYMM8) -> QASYMM8
77 * - (QASYMM8_SIGNED, QASYMM8_SIGNED) -> QASYMM8_SIGNED
78 * - (S16,U8) -> S16
79 * - (U8,S16) -> S16
80 * - (S16,S16) -> S16
SiCong Li903f8cc2020-08-27 10:17:10 +010081 * - (S32,S32) -> S32
Michele Di Giorgiof9b595a2020-07-03 13:34:52 +010082 * - (F16,F16) -> F16
83 * - (F32,F32) -> F32
84 *
SiCong Li903f8cc2020-08-27 10:17:10 +010085 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
86 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
87 * @param[in] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000088 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
89 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000090 *
Georgios Pinitas631c41a2017-12-06 11:53:03 +000091 * @return a status
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000092 */
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000093 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010094};
95} // namespace experimental
96
97/** Basic function to run @ref NEArithmeticSubtractionKernel
98 *
SiCong Li903f8cc2020-08-27 10:17:10 +010099 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/S32/F16/F32.
Michalis Spyrou173ba9b2020-06-23 17:25:43 +0100100 * @note The function performs an arithmetic subtraction between two tensors.
101 *
102 * This function calls the following kernels:
103 * -# @ref NEArithmeticSubtractionKernel
104 */
105class NEArithmeticSubtraction : public IFunction
106{
107public:
108 /** Default Constructor */
109 NEArithmeticSubtraction();
110 /** Default Destructor */
111 ~NEArithmeticSubtraction();
112 /** Prevent instances of this class from being copied (As this class contains pointers) */
113 NEArithmeticSubtraction(const NEArithmeticSubtraction &) = delete;
114 /** Default move constructor */
115 NEArithmeticSubtraction(NEArithmeticSubtraction &&);
116 /** Prevent instances of this class from being copied (As this class contains pointers) */
117 NEArithmeticSubtraction &operator=(const NEArithmeticSubtraction &) = delete;
118 /** Default move assignment operator */
119 NEArithmeticSubtraction &operator=(NEArithmeticSubtraction &&);
120 /** Initialise the kernel's inputs, output and conversion policy.
121 *
SiCong Li903f8cc2020-08-27 10:17:10 +0100122 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
123 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
124 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/S32/F16/F32
Michalis Spyrou173ba9b2020-06-23 17:25:43 +0100125 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
126 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
127 */
128 void configure(const ITensor *input1, const ITensor *input2, ITensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
129 /** Static function to check if given info will lead to a valid configuration of @ref NEArithmeticSubtraction
130 *
SiCong Li903f8cc2020-08-27 10:17:10 +0100131 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
132 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
133 * @param[in] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32
Michalis Spyrou173ba9b2020-06-23 17:25:43 +0100134 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
135 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
136 *
137 * @return a status
138 */
139 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
140
141 // Inherited methods overridden:
142 void run() override;
143
144private:
145 struct Impl;
146 std::unique_ptr<Impl> _impl;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100147};
Georgios Pinitasb2842be2020-06-22 21:27:14 +0100148} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +0000149#endif /* ARM_COMPUTE_NEARITHMETICSUBTRACTION_H */