blob: a38335c59beaa7b235c3b43c651edd06d55978e7 [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 *
Manuel Bottini6a2b6e82019-02-25 13:50:11 +000039 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/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
59 * - (F16,F16) -> F16
60 * - (F32,F32) -> F32
61 *
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010062 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
63 * @param[in] input2 Second tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
64 * @param[out] output Output tensor info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000065 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
66 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
Anthony Barbier6ff3b192017-09-04 18:44:23 +010067 */
Michalis Spyrou173ba9b2020-06-23 17:25:43 +010068 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 +000069 /** Static function to check if given info will lead to a valid configuration of @ref NEArithmeticSubtraction
70 *
Michele Di Giorgiof9b595a2020-07-03 13:34:52 +010071 * Valid configurations (Input1,Input2) -> Output :
72 *
73 * - (U8,U8) -> U8
74 * - (U8,U8) -> S16
75 * - (QASYMM8, QASYMM8) -> QASYMM8
76 * - (QASYMM8_SIGNED, QASYMM8_SIGNED) -> QASYMM8_SIGNED
77 * - (S16,U8) -> S16
78 * - (U8,S16) -> S16
79 * - (S16,S16) -> S16
80 * - (F16,F16) -> F16
81 * - (F32,F32) -> F32
82 *
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000083 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
84 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
85 * @param[in] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
86 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
87 * @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 +000088 *
Georgios Pinitas631c41a2017-12-06 11:53:03 +000089 * @return a status
Ioan-Cristian Szabo397d58a2017-11-30 15:19:11 +000090 */
Giorgio Arena8b2a7d32020-02-11 17:21:31 +000091 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 +010092};
93} // namespace experimental
94
95/** Basic function to run @ref NEArithmeticSubtractionKernel
96 *
97 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/F16/F32.
98 * @note The function performs an arithmetic subtraction between two tensors.
99 *
100 * This function calls the following kernels:
101 * -# @ref NEArithmeticSubtractionKernel
102 */
103class NEArithmeticSubtraction : public IFunction
104{
105public:
106 /** Default Constructor */
107 NEArithmeticSubtraction();
108 /** Default Destructor */
109 ~NEArithmeticSubtraction();
110 /** Prevent instances of this class from being copied (As this class contains pointers) */
111 NEArithmeticSubtraction(const NEArithmeticSubtraction &) = delete;
112 /** Default move constructor */
113 NEArithmeticSubtraction(NEArithmeticSubtraction &&);
114 /** Prevent instances of this class from being copied (As this class contains pointers) */
115 NEArithmeticSubtraction &operator=(const NEArithmeticSubtraction &) = delete;
116 /** Default move assignment operator */
117 NEArithmeticSubtraction &operator=(NEArithmeticSubtraction &&);
118 /** Initialise the kernel's inputs, output and conversion policy.
119 *
120 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
121 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
122 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/QSYMM16/S16/F16/F32
123 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
124 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
125 */
126 void configure(const ITensor *input1, const ITensor *input2, ITensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
127 /** Static function to check if given info will lead to a valid configuration of @ref NEArithmeticSubtraction
128 *
129 * @param[in] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
130 * @param[in] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
131 * @param[in] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/F16/F32
132 * @param[in] policy Policy to use to handle overflow. Convert policy cannot be WRAP if datatype is quantized.
133 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. Currently not supported.
134 *
135 * @return a status
136 */
137 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo());
138
139 // Inherited methods overridden:
140 void run() override;
141
142private:
143 struct Impl;
144 std::unique_ptr<Impl> _impl;
Anthony Barbier6ff3b192017-09-04 18:44:23 +0100145};
Georgios Pinitasb2842be2020-06-22 21:27:14 +0100146} // namespace arm_compute
Michalis Spyrouf4643372019-11-29 16:17:13 +0000147#endif /* ARM_COMPUTE_NEARITHMETICSUBTRACTION_H */