1 /* 2 * Copyright (c) 2018-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_CLELEMENTWISEOPERATIONS_H 25 #define ARM_COMPUTE_CLELEMENTWISEOPERATIONS_H 26 27 #include "arm_compute/runtime/CL/ICLOperator.h" 28 #include "arm_compute/runtime/IFunction.h" 29 30 namespace arm_compute 31 { 32 class ICLTensor; 33 class CLCompileContext; 34 class ITensorInfo; 35 36 /** Basic function to run @ref opencl::kernels::ClSaturatedArithmeticKernel for addition 37 * 38 * @note The tensor data type for the inputs must be U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 39 * @note The function performs an arithmetic addition between two tensors. 40 */ 41 class CLArithmeticAddition : public IFunction 42 { 43 public: 44 /** Default Constructor */ 45 CLArithmeticAddition(); 46 /** Default Destructor */ 47 ~CLArithmeticAddition(); 48 /** Prevent instances of this class from being copied (As this class contains pointers) */ 49 CLArithmeticAddition(const CLArithmeticAddition &) = delete; 50 /** Default move constructor */ 51 CLArithmeticAddition(CLArithmeticAddition &&); 52 /** Prevent instances of this class from being copied (As this class contains pointers) */ 53 CLArithmeticAddition &operator=(const CLArithmeticAddition &) = delete; 54 /** Default move assignment operator */ 55 CLArithmeticAddition &operator=(CLArithmeticAddition &&); 56 /** Initialise the kernel's inputs, output and conversion policy. 57 * 58 * Valid data layouts: 59 * - All 60 * 61 * Valid data type configurations: 62 * |src0 |src1 |dst | 63 * |:--------------|:--------------|:--------------| 64 * |QASYMM8 |QASYMM8 |QASYMM8 | 65 * |QASYMM8_SIGNED |QASYMM8_SIGNED |QASYMM8_SIGNED | 66 * |QSYMM16 |QSYMM16 |QASYMM16 | 67 * |U8 |U8 |U8 | 68 * |U8 |U8 |S16 | 69 * |U8 |S16 |S16 | 70 * |S16 |U8 |S16 | 71 * |S16 |S16 |S16 | 72 * |S32 |S32 |S32 | 73 * |F16 |F16 |F16 | 74 * |F32 |F32 |F32 | 75 * 76 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 77 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 78 * @param[in, out] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 79 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 80 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 81 * @param[in] policy Policy to use to handle overflow. 82 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 83 */ 84 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 85 /** Initialise the kernel's inputs, output and conversion policy. 86 * 87 * Valid configurations (Input1,Input2) -> Output : 88 * 89 * - (U8,U8) -> U8 90 * - (U8,U8) -> S16 91 * - (S16,U8) -> S16 92 * - (U8,S16) -> S16 93 * - (S16,S16) -> S16 94 * - (S32,S32) -> S32 95 * - (F16,F16) -> F16 96 * - (F32,F32) -> F32 97 * - (QASYMM8,QASYMM8) -> QASYMM8 98 * - (QASYMM8_SIGNED,QASYMM8_SIGNED) -> QASYMM8_SIGNED 99 * - (QSYMM16,QSYMM16) -> QSYMM16 100 * 101 * @param[in] compile_context The compile context to be used. 102 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 103 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 104 * @param[in, out] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 105 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 106 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 107 * @param[in] policy Policy to use to handle overflow. 108 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 109 */ 110 void configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, 111 const ActivationLayerInfo &act_info = ActivationLayerInfo()); 112 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClSaturatedArithmeticKernel for addition 113 * 114 * Valid configurations (Input1,Input2) -> Output : 115 * 116 * - (U8,U8) -> U8 117 * - (U8,U8) -> S16 118 * - (S16,U8) -> S16 119 * - (U8,S16) -> S16 120 * - (S16,S16) -> S16 121 * - (S32,S32) -> S32 122 * - (F16,F16) -> F16 123 * - (F32,F32) -> F32 124 * - (QASYMM8,QASYMM8) -> QASYMM8 125 * - (QASYMM8_SIGNED,QASYMM8_SIGNED) -> QASYMM8_SIGNED 126 * - (QSYMM16,QSYMM16) -> QSYMM16 127 * 128 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 129 * @param[in] input2 Second tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 130 * @param[in] output Output tensor info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 131 * @param[in] policy Policy to use to handle overflow. 132 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 133 * 134 * @return a status 135 */ 136 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 137 138 // Inherited methods overridden: 139 void run() override; 140 141 private: 142 struct Impl; 143 std::unique_ptr<Impl> _impl; 144 }; 145 146 /** Basic function to run @ref opencl::kernels::ClSaturatedArithmeticKernel for subtraction 147 * 148 * @note The tensor data type for the inputs must be U8/QASYMM8/QASYMM8_SIGNED/S16/S32/F16/F32. 149 * @note The function performs an arithmetic subtraction between two tensors. 150 */ 151 class CLArithmeticSubtraction : public IFunction 152 { 153 public: 154 /** Default Constructor */ 155 CLArithmeticSubtraction(); 156 /** Default Destructor */ 157 ~CLArithmeticSubtraction(); 158 /** Prevent instances of this class from being copied (As this class contains pointers) */ 159 CLArithmeticSubtraction(const CLArithmeticSubtraction &) = delete; 160 /** Default move constructor */ 161 CLArithmeticSubtraction(CLArithmeticSubtraction &&); 162 /** Prevent instances of this class from being copied (As this class contains pointers) */ 163 CLArithmeticSubtraction &operator=(const CLArithmeticSubtraction &) = delete; 164 /** Default move assignment operator */ 165 CLArithmeticSubtraction &operator=(CLArithmeticSubtraction &&); 166 /** Initialise the kernel's inputs, output and conversion policy. 167 * 168 * Valid data layouts: 169 * - All 170 * 171 * Valid data type configurations: 172 * |src0 |src1 |dst | 173 * |:--------------|:--------------|:--------------| 174 * |QASYMM8 |QASYMM8 |QASYMM8 | 175 * |QASYMM8_SIGNED |QASYMM8_SIGNED |QASYMM8_SIGNED | 176 * |QSYMM16 |QSYMM16 |QASYMM16 | 177 * |U8 |U8 |U8 | 178 * |U8 |U8 |S16 | 179 * |U8 |S16 |S16 | 180 * |S16 |U8 |S16 | 181 * |S16 |S16 |S16 | 182 * |S32 |S32 |S32 | 183 * |F16 |F16 |F16 | 184 * |F32 |F32 |F32 | 185 * 186 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 187 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 188 * @param[in, out] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 189 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 190 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 191 * @param[in] policy Policy to use to handle overflow. 192 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 193 */ 194 void configure(const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 195 /** Initialise the kernel's inputs, output and conversion policy. 196 * 197 * Valid configurations (Input1,Input2) -> Output : 198 * 199 * - (U8,U8) -> U8 200 * - (U8,U8) -> S16 201 * - (S16,U8) -> S16 202 * - (U8,S16) -> S16 203 * - (S16,S16) -> S16 204 * - (S32,S32) -> S32 205 * - (F16,F16) -> F16 206 * - (F32,F32) -> F32 207 * - (QASYMM8,QASYMM8) -> QASYMM8 208 * - (QASYMM8_SIGNED,QASYMM8_SIGNED) -> QASYMM8_SIGNED 209 * - (QSYMM16,QSYMM16) -> QSYMM16 210 * 211 * @param[in] compile_context The compile context to be used. 212 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 213 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 214 * @param[in, out] input2 Second tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 215 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 216 * @param[out] output Output tensor. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 217 * @param[in] policy Policy to use to handle overflow. 218 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 219 */ 220 void configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, ConvertPolicy policy, 221 const ActivationLayerInfo &act_info = ActivationLayerInfo()); 222 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClSaturatedArithmeticKernel for subtraction 223 * 224 * Valid configurations (Input1,Input2) -> Output : 225 * 226 * - (U8,U8) -> U8 227 * - (U8,U8) -> S16 228 * - (S16,U8) -> S16 229 * - (U8,S16) -> S16 230 * - (S16,S16) -> S16 231 * - (S32,S32) -> S32 232 * - (F16,F16) -> F16 233 * - (F32,F32) -> F32 234 * - (QASYMM8,QASYMM8) -> QASYMM8 235 * - (QASYMM8_SIGNED,QASYMM8_SIGNED) -> QASYMM8_SIGNED 236 * - (QSYMM16,QSYMM16) -> QSYMM16 237 * 238 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 239 * @param[in] input2 Second tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 240 * @param[in] output Output tensor info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/F16/F32. 241 * @param[in] policy Policy to use to handle overflow. 242 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 243 * 244 * @return a status 245 */ 246 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, ConvertPolicy policy, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 247 248 // Inherited methods overridden: 249 void run() override; 250 251 private: 252 struct Impl; 253 std::unique_ptr<Impl> _impl; 254 }; 255 256 /** Basic function to run @ref opencl::kernels::ClSaturatedArithmeticKernel for division 257 * 258 * @note The tensor data type for the inputs must be F16/F32. 259 * @note The function performs an arithmetic division between two tensors. 260 */ 261 class CLArithmeticDivision : public IFunction 262 { 263 public: 264 /** Default Constructor */ 265 CLArithmeticDivision(); 266 /** Default Destructor */ 267 ~CLArithmeticDivision(); 268 /** Prevent instances of this class from being copied (As this class contains pointers) */ 269 CLArithmeticDivision(const CLArithmeticDivision &) = delete; 270 /** Default move constructor */ 271 CLArithmeticDivision(CLArithmeticDivision &&); 272 /** Prevent instances of this class from being copied (As this class contains pointers) */ 273 CLArithmeticDivision &operator=(const CLArithmeticDivision &) = delete; 274 /** Default move assignment operator */ 275 CLArithmeticDivision &operator=(CLArithmeticDivision &&); 276 /** Initialise the kernel's inputs, output. 277 * 278 * Valid data layouts: 279 * - All 280 * 281 * Valid data type configurations: 282 * |src0 |src1 |dst | 283 * |:--------------|:--------------|:--------------| 284 * |F16 |F16 |F16 | 285 * |F32 |F32 |F32 | 286 * 287 * @param[in, out] input1 First tensor input. Data types supported: F16/F32. 288 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 289 * @param[in, out] input2 Second tensor input. Same as @p input1. 290 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 291 * @param[out] output Output tensor. Data types supported: Same as @p input1. 292 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 293 */ 294 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 295 /** Initialise the kernel's inputs, output. 296 * 297 * @param[in] compile_context The compile context to be used. 298 * @param[in, out] input1 First tensor input. Data types supported: F16/F32. 299 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 300 * @param[in, out] input2 Second tensor input. Same as @p input1. 301 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 302 * @param[out] output Output tensor. Data types supported: Same as @p input1. 303 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 304 */ 305 void configure(const CLCompileContext &compile_context, const ICLTensor *input1, const ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 306 /** Static function to check if given info will lead to a valid configuration of @ref CLArithmeticDivision 307 * 308 * @param[in] input1 First tensor input info. Data types supported: F16/F32. 309 * @param[in] input2 Second tensor input info. Data types supported: Same as @p input1. 310 * @param[in] output Output tensor info. Data types supported: Same as @p input1. 311 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 312 * 313 * @return a status 314 */ 315 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 316 317 // Inherited methods overridden: 318 void run() override; 319 320 private: 321 struct Impl; 322 std::unique_ptr<Impl> _impl; 323 }; 324 325 /** Basic function to run @ref opencl::kernels::ClArithmeticKernel for max 326 * 327 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/QSYMM16/S32/U32/F16/F32. 328 * @note The function performs a max operation between two tensors. 329 */ 330 class CLElementwiseMax : public IFunction 331 { 332 public: 333 /** Default Constructor */ 334 CLElementwiseMax(); 335 /** Default Destructor */ 336 ~CLElementwiseMax(); 337 /** Prevent instances of this class from being copied (As this class contains pointers) */ 338 CLElementwiseMax(const CLElementwiseMax &) = delete; 339 /** Default move constructor */ 340 CLElementwiseMax(CLElementwiseMax &&); 341 /** Prevent instances of this class from being copied (As this class contains pointers) */ 342 CLElementwiseMax &operator=(const CLElementwiseMax &) = delete; 343 /** Default move assignment operator */ 344 CLElementwiseMax &operator=(CLElementwiseMax &&); 345 /** Initialise the kernel's inputs, output and conversion policy. 346 * 347 * Valid data layouts: 348 * - All 349 * 350 * Valid data type configurations: 351 * |src0 |src1 |dst | 352 * |:--------------|:--------------|:--------------| 353 * |QASYMM8 |QASYMM8 |QASYMM8 | 354 * |QASYMM8_SIGNED |QASYMM8_SIGNED |QASYMM8_SIGNED | 355 * |QSYMM16 |QSYMM16 |QASYMM16 | 356 * |U8 |U8 |U8 | 357 * |S16 |S16 |S16 | 358 * |S32 |S32 |S32 | 359 * |U32 |U32 |U32 | 360 * |F16 |F16 |F16 | 361 * |F32 |F32 |F32 | 362 * 363 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 364 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 365 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 366 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 367 * @param[out] output Output tensor. Data types supported: same as @p input1. 368 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 369 */ 370 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 371 /** Initialise the kernel's inputs, output and conversion policy. 372 * 373 * @param[in] compile_context The compile context to be used. 374 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 375 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 376 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 377 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 378 * @param[out] output Output tensor. Data types supported: same as @p input1. 379 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 380 */ 381 void configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 382 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClArithmeticKernel for max 383 * 384 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 385 * @param[in] input2 Second tensor input info. Data types supported: same as @p input1. 386 * @param[in] output Output tensor info. Data types supported: same as @p input1. 387 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 388 * 389 * @return a status 390 */ 391 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 392 393 // Inherited methods overridden: 394 void run() override; 395 396 private: 397 struct Impl; 398 std::unique_ptr<Impl> _impl; 399 }; 400 401 /** Basic function to run @ref opencl::kernels::ClArithmeticKernel for min 402 * 403 * @note The tensor data type for the inputs must be U8/QASYMM8/S16/QSYMM16/S32/U32/F16/F32. 404 * @note The function performs a max operation between two tensors. 405 */ 406 class CLElementwiseMin : public IFunction 407 { 408 public: 409 /** Default Constructor */ 410 CLElementwiseMin(); 411 /** Default Destructor */ 412 ~CLElementwiseMin(); 413 /** Prevent instances of this class from being copied (As this class contains pointers) */ 414 CLElementwiseMin(const CLElementwiseMin &) = delete; 415 /** Default move constructor */ 416 CLElementwiseMin(CLElementwiseMin &&); 417 /** Prevent instances of this class from being copied (As this class contains pointers) */ 418 CLElementwiseMin &operator=(const CLElementwiseMin &) = delete; 419 /** Default move assignment operator */ 420 CLElementwiseMin &operator=(CLElementwiseMin &&); 421 /** Initialise the kernel's inputs, output and conversion policy. 422 * 423 * Valid data layouts: 424 * - All 425 * 426 * Valid data type configurations: 427 * |src0 |src1 |dst | 428 * |:--------------|:--------------|:--------------| 429 * |QASYMM8 |QASYMM8 |QASYMM8 | 430 * |QASYMM8_SIGNED |QASYMM8_SIGNED |QASYMM8_SIGNED | 431 * |QSYMM16 |QSYMM16 |QASYMM16 | 432 * |U8 |U8 |U8 | 433 * |S16 |S16 |S16 | 434 * |S32 |S32 |S32 | 435 * |U32 |U32 |U32 | 436 * |F16 |F16 |F16 | 437 * |F32 |F32 |F32 | 438 * 439 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 440 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 441 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 442 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 443 * @param[out] output Output tensor. Data types supported: same as @p input1. 444 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 445 */ 446 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 447 /** Initialise the kernel's inputs, output and conversion policy. 448 * 449 * @param[in] compile_context The compile context to be used. 450 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 451 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 452 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 453 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 454 * @param[out] output Output tensor. Data types supported: same as @p input1. 455 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 456 */ 457 void configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 458 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClArithmeticKernel for min 459 * 460 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/S32/U32/F16/F32. 461 * @param[in] input2 Second tensor input info. Data types supported: same as @p input1. 462 * @param[in] output Output tensor info. Data types supported: same as @p input1. 463 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 464 * 465 * @return a status 466 */ 467 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 468 469 // Inherited methods overridden: 470 void run() override; 471 472 private: 473 struct Impl; 474 std::unique_ptr<Impl> _impl; 475 }; 476 477 /** Basic function to run @ref opencl::kernels::ClArithmeticKernel for squared difference 478 * 479 * @note The tensor data type for the inputs must be QASYMM8/U8/S16/QSYMM16/F16/F32. 480 * @note The function performs a squared different operation between two tensors (i.e., out[i] = (in1[i] - in2[i])^2 481 */ 482 class CLElementwiseSquaredDiff : public IFunction 483 { 484 public: 485 /** Default Constructor */ 486 CLElementwiseSquaredDiff(); 487 /** Default Destructor */ 488 ~CLElementwiseSquaredDiff(); 489 /** Prevent instances of this class from being copied (As this class contains pointers) */ 490 CLElementwiseSquaredDiff(const CLElementwiseSquaredDiff &) = delete; 491 /** Default move constructor */ 492 CLElementwiseSquaredDiff(CLElementwiseSquaredDiff &&); 493 /** Prevent instances of this class from being copied (As this class contains pointers) */ 494 CLElementwiseSquaredDiff &operator=(const CLElementwiseSquaredDiff &) = delete; 495 /** Default move assignment operator */ 496 CLElementwiseSquaredDiff &operator=(CLElementwiseSquaredDiff &&); 497 /** Initialise the kernel's inputs, output and conversion policy. 498 * 499 * Valid data layouts: 500 * - All 501 * 502 * Valid data type configurations: 503 * |src0 |src1 |dst | 504 * |:--------------|:--------------|:--------------| 505 * |QASYMM8 |QASYMM8 |QASYMM8 | 506 * |QASYMM8_SIGNED |QASYMM8_SIGNED |QASYMM8_SIGNED | 507 * |QSYMM16 |QSYMM16 |QASYMM16 | 508 * |U8 |U8 |U8 | 509 * |S16 |S16 |S16 | 510 * |F16 |F16 |F16 | 511 * |F32 |F32 |F32 | 512 * 513 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/F16/F32. 514 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 515 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 516 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 517 * @param[out] output Output tensor. Data types supported: same as @p input1. 518 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 519 */ 520 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 521 /** Initialise the kernel's inputs, output and conversion policy. 522 * 523 * @param[in] compile_context The compile context to be used. 524 * @param[in, out] input1 First tensor input. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/F16/F32. 525 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 526 * @param[in, out] input2 Second tensor input. Data types supported: same as @p input1. 527 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 528 * @param[out] output Output tensor. Data types supported: same as @p input1. 529 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 530 */ 531 void configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 532 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClArithmeticKernel for squared difference 533 * 534 * @param[in] input1 First tensor input info. Data types supported: U8/QASYMM8/QASYMM8_SIGNED/S16/QSYMM16/F16/F32. 535 * @param[in] input2 Second tensor input info. Data types supported: same as @p input1. 536 * @param[in] output Output tensor info. Data types supported: same as @p input1. 537 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 538 * 539 * @return a status 540 */ 541 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 542 543 // Inherited methods overridden: 544 void run() override; 545 546 private: 547 struct Impl; 548 std::unique_ptr<Impl> _impl; 549 }; 550 551 /** Basic function to run @ref opencl::kernels::ClArithmeticKernel for power 552 * 553 * @note The tensor data type for the inputs must be F16/F32. 554 * @note The function performs an elementwise power of in1 to in2 (i.e., out[i] = in1[i] ^ in2[i]) 555 */ 556 class CLElementwisePower : public IFunction 557 { 558 public: 559 /** Default Constructor */ 560 CLElementwisePower(); 561 /** Default Destructor */ 562 ~CLElementwisePower(); 563 /** Prevent instances of this class from being copied (As this class contains pointers) */ 564 CLElementwisePower(const CLElementwisePower &) = delete; 565 /** Default move constructor */ 566 CLElementwisePower(CLElementwisePower &&); 567 /** Prevent instances of this class from being copied (As this class contains pointers) */ 568 CLElementwisePower &operator=(const CLElementwisePower &) = delete; 569 /** Default move assignment operator */ 570 CLElementwisePower &operator=(CLElementwisePower &&); 571 /** Initialise the kernel's inputs, output and conversion policy. 572 * 573 * Valid data layouts: 574 * - All 575 * 576 * Valid data type configurations: 577 * |src0 |src1 |dst | 578 * |:--------------|:--------------|:--------------| 579 * |F16 |F16 |F16 | 580 * |F32 |F32 |F32 | 581 * 582 * @param[in, out] input1 First tensor input. Data types supported: F16/F32. 583 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 584 * @param[in, out] input2 Second tensor input. Data types supported: F16/F32. 585 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 586 * @param[out] output Output tensor. Data types supported:F16/F32. 587 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 588 */ 589 void configure(ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 590 /** Initialise the kernel's inputs, output and conversion policy. 591 * 592 * @param[in] compile_context The compile context to be used. 593 * @param[in, out] input1 First tensor input. Data types supported: F16/F32. 594 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 595 * @param[in, out] input2 Second tensor input. Data types supported: F16/F32. 596 * The input tensor is [in, out] because its TensorInfo might be modified inside the kernel in case of broadcasting of dimension 0. 597 * @param[out] output Output tensor. Data types supported:F16/F32. 598 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 599 */ 600 void configure(const CLCompileContext &compile_context, ICLTensor *input1, ICLTensor *input2, ICLTensor *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 601 /** Static function to check if given info will lead to a valid configuration of @ref opencl::kernels::ClArithmeticKernel for power 602 * 603 * @param[in] input1 First tensor input info. Data types supported: F16/F32. 604 * @param[in] input2 Second tensor input info. Data types supported: F16/F32. 605 * @param[in] output Output tensor info. Data types supported: F16/F32. 606 * @param[in] act_info (Optional) Activation layer information in case of a fused activation. 607 * 608 * @return a status 609 */ 610 static Status validate(const ITensorInfo *input1, const ITensorInfo *input2, const ITensorInfo *output, const ActivationLayerInfo &act_info = ActivationLayerInfo()); 611 612 // Inherited methods overridden: 613 void run() override; 614 615 private: 616 struct Impl; 617 std::unique_ptr<Impl> _impl; 618 }; 619 } // namespace arm_compute 620 #endif /* ARM_COMPUTE_CLELEMENTWISEOPERATIONS_H */ 621