blob: ddbfe1f03454df1f15e78c34ce742d4f6b2d4c3a [file] [log] [blame]
Georgios Pinitas11d84152021-04-28 10:20:18 +01001/*
Pablo Marquez Tello6bcdc572023-01-11 09:54:00 +00002 * Copyright (c) 2016-2023 Arm Limited.
Georgios Pinitas11d84152021-04-28 10:20:18 +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 */
Adnan AlSinan40a9d3e2023-09-15 13:46:17 +010024#ifndef ACL_SRC_CPU_KERNELS_CPUCASTKERNEL_H
25#define ACL_SRC_CPU_KERNELS_CPUCASTKERNEL_H
Georgios Pinitas11d84152021-04-28 10:20:18 +010026
27#include "src/core/common/Macros.h"
Georgios Pinitas7891a732021-08-20 21:39:25 +010028#include "src/cpu/ICpuKernel.h"
Georgios Pinitas11d84152021-04-28 10:20:18 +010029
30namespace arm_compute
31{
32namespace cpu
33{
34namespace kernels
35{
36/** Casts a given tensor to a new type
37 *
38 * @note When casting between quantized types the scale and zeroPoint are ignored
39 */
Yair Schwarzbaum46d44d22022-01-12 16:38:58 +020040class CpuCastKernel : public ICpuKernel<CpuCastKernel>
Georgios Pinitas11d84152021-04-28 10:20:18 +010041{
Yair Schwarzbaum298b2c02022-02-01 08:55:56 +020042private:
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +010043 using CastKernelPtr =
44 std::add_pointer<void(const ITensor *, ITensor *, const ThreadInfo &, ConvertPolicy, const Window &)>::type;
Yair Schwarzbaum298b2c02022-02-01 08:55:56 +020045
Georgios Pinitas11d84152021-04-28 10:20:18 +010046public:
47 CpuCastKernel() = default;
48 ARM_COMPUTE_DISALLOW_COPY_ALLOW_MOVE(CpuCastKernel);
49 /** Set the src and dst of the kernel
50 *
51 * Valid conversions src -> dst :
52 *
53 * - QASYMM8_SIGNED -> S16, S32, F32, F16
54 * - QASYMM8 -> U16, S16, S32, F32, F16
55 * - U8 -> U16, S16, S32, F32, F16
56 * - U16 -> U8, U32
57 * - S16 -> QASYMM8_SIGNED, U8, S32
Georgios Pinitas11d84152021-04-28 10:20:18 +010058 * - F16 -> QASYMM8_SIGNED, QASYMM8, F32, S32, U8
59 * - S32 -> QASYMM8_SIGNED, QASYMM8, F16, F32, U8
Pablo Marquez Tello4a1c9172023-07-18 14:51:24 +010060 * - S64 -> F32
Adnan AlSinan40a9d3e2023-09-15 13:46:17 +010061 * - F32 -> QASYMM8_SIGNED, QASYMM8, F16, S32, U8
Georgios Pinitas11d84152021-04-28 10:20:18 +010062 *
Adnan AlSinan40a9d3e2023-09-15 13:46:17 +010063 * @param[in] src The src tensor to convert. Data types supported: QASYMM8_SIGNED/QASYMM8/U8/U16/S16/S32/S64/F16/F32.
64 * @param[out] dst The dst tensor. Data types supported: QASYMM8_SIGNED/QASYMM8/U8/U16/S16/U32/S32/S64/F16/F32.
Georgios Pinitas11d84152021-04-28 10:20:18 +010065 * @param[in] policy Conversion policy.
Pablo Marquez Tello6bcdc572023-01-11 09:54:00 +000066 *
Pablo Marquez Tello29e27b02023-08-03 14:47:31 +010067 * @note S64 is only supported in aarch64
68 *
Georgios Pinitas11d84152021-04-28 10:20:18 +010069 */
70 void configure(const ITensorInfo *src, ITensorInfo *dst, ConvertPolicy policy);
71 /** Static function to check if given info will lead to a valid configuration
72 *
73 * Similar to @ref CpuCastKernel::configure()
74 *
75 * @return a status
76 */
77 static Status validate(const ITensorInfo *src, const ITensorInfo *dst, ConvertPolicy policy);
78
79 // Inherited methods overridden:
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +010080 void run_op(ITensorPack &tensors, const Window &window, const ThreadInfo &info) override;
Georgios Pinitas11d84152021-04-28 10:20:18 +010081 const char *name() const override;
82
Yair Schwarzbaum298b2c02022-02-01 08:55:56 +020083 struct CastKernel
84 {
85 const char *name;
86 const CastDataTypeISASelectorDataPtr is_selected;
87 CastKernelPtr ukernel;
88 };
89
90 static const std::vector<CastKernel> &get_available_kernels();
91
Georgios Pinitas11d84152021-04-28 10:20:18 +010092private:
Felix Thomasmathibalanafd38f02023-09-27 17:46:17 +010093 ConvertPolicy _policy{ConvertPolicy::SATURATE};
Georgios Pinitas11d84152021-04-28 10:20:18 +010094};
95} // namespace kernels
96} // namespace cpu
97} // namespace arm_compute
Adnan AlSinan40a9d3e2023-09-15 13:46:17 +010098#endif // ACL_SRC_CPU_KERNELS_CPUCASTKERNEL_H