xref: /aosp_15_r20/external/ComputeLibrary/tests/validation/reference/QuantizationLayer.cpp (revision c217d954acce2dbc11938adb493fc0abd69584f3)
1 /*
2  * Copyright (c) 2017-2020 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 #include "QuantizationLayer.h"
25 
26 #include <cmath>
27 
28 namespace arm_compute
29 {
30 namespace test
31 {
32 namespace validation
33 {
34 namespace reference
35 {
36 template <typename Tin, typename Tout>
quantization_layer(const SimpleTensor<Tin> & src,DataType output_data_type,const QuantizationInfo & quantization_info)37 SimpleTensor<Tout> quantization_layer(const SimpleTensor<Tin> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
38 {
39     // Create reference
40     SimpleTensor<Tout> dst{ src.shape(), output_data_type, 1, quantization_info };
41 
42     const UniformQuantizationInfo qinfo = quantization_info.uniform();
43 
44 #ifdef __aarch64__
45     constexpr auto rounding_policy = RoundingPolicy::TO_NEAREST_EVEN;
46 #else  // __aarch64__
47     constexpr auto rounding_policy = RoundingPolicy::TO_ZERO;
48 #endif // __aarch64__
49 
50     switch(output_data_type)
51     {
52         case DataType::QASYMM8:
53 #if defined(_OPENMP)
54             #pragma omp parallel for
55 #endif /* _OPENMP */
56             for(int i = 0; i < src.num_elements(); ++i)
57             {
58                 dst[i] = quantize_qasymm8((src[i]), qinfo, rounding_policy);
59             }
60             break;
61         case DataType::QASYMM8_SIGNED:
62 #if defined(_OPENMP)
63             #pragma omp parallel for
64 #endif /* _OPENMP */
65             for(int i = 0; i < src.num_elements(); ++i)
66             {
67 #ifdef __aarch64__
68                 dst[i] = quantize_qasymm8_signed((src[i]), qinfo, RoundingPolicy::TO_NEAREST_EVEN);
69 #else  // __aarch64__
70                 dst[i] = quantize_qasymm8_signed((src[i]), qinfo, RoundingPolicy::TO_ZERO);
71 #endif // __aarch64__
72             }
73             break;
74         case DataType::QASYMM16:
75 #if defined(_OPENMP)
76             #pragma omp parallel for
77 #endif /* _OPENMP */
78             for(int i = 0; i < src.num_elements(); ++i)
79             {
80                 dst[i] = quantize_qasymm16((src[i]), qinfo, rounding_policy);
81             }
82             break;
83         default:
84             ARM_COMPUTE_ERROR("Unsupported output data type");
85     }
86     return dst;
87 }
88 
89 template <>
quantization_layer(const SimpleTensor<uint8_t> & src,DataType output_data_type,const QuantizationInfo & quantization_info)90 SimpleTensor<uint8_t> quantization_layer(const SimpleTensor<uint8_t> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
91 {
92     SimpleTensor<float> src_tmp = convert_from_asymmetric<uint8_t>(src);
93     return quantization_layer<float, uint8_t>(src_tmp, output_data_type, quantization_info);
94 }
95 
96 template <>
quantization_layer(const SimpleTensor<uint8_t> & src,DataType output_data_type,const QuantizationInfo & quantization_info)97 SimpleTensor<int8_t> quantization_layer(const SimpleTensor<uint8_t> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
98 {
99     SimpleTensor<float> src_tmp = convert_from_asymmetric<uint8_t>(src);
100     return quantization_layer<float, int8_t>(src_tmp, output_data_type, quantization_info);
101 }
102 
103 template <>
quantization_layer(const SimpleTensor<int8_t> & src,DataType output_data_type,const QuantizationInfo & quantization_info)104 SimpleTensor<uint8_t> quantization_layer(const SimpleTensor<int8_t> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
105 {
106     SimpleTensor<float> src_tmp = convert_from_asymmetric<int8_t>(src);
107     return quantization_layer<float, uint8_t>(src_tmp, output_data_type, quantization_info);
108 }
109 
110 template <>
quantization_layer(const SimpleTensor<int8_t> & src,DataType output_data_type,const QuantizationInfo & quantization_info)111 SimpleTensor<int8_t> quantization_layer(const SimpleTensor<int8_t> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
112 {
113     SimpleTensor<float> src_tmp = convert_from_asymmetric<int8_t>(src);
114     return quantization_layer<float, int8_t>(src_tmp, output_data_type, quantization_info);
115 }
116 
117 template <>
quantization_layer(const SimpleTensor<uint8_t> & src,DataType output_data_type,const QuantizationInfo & quantization_info)118 SimpleTensor<uint16_t> quantization_layer(const SimpleTensor<uint8_t> &src, DataType output_data_type, const QuantizationInfo &quantization_info)
119 {
120     SimpleTensor<float> src_tmp = convert_from_asymmetric<uint8_t>(src);
121     return quantization_layer<float, uint16_t>(src_tmp, output_data_type, quantization_info);
122 }
123 
124 template SimpleTensor<int8_t> quantization_layer(const SimpleTensor<half> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
125 template SimpleTensor<int8_t> quantization_layer(const SimpleTensor<float> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
126 template SimpleTensor<uint8_t> quantization_layer(const SimpleTensor<half> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
127 template SimpleTensor<uint8_t> quantization_layer(const SimpleTensor<float> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
128 template SimpleTensor<uint16_t> quantization_layer(const SimpleTensor<half> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
129 template SimpleTensor<uint16_t> quantization_layer(const SimpleTensor<float> &src, DataType output_data_type, const QuantizationInfo &quantization_info);
130 } // namespace reference
131 } // namespace validation
132 } // namespace test
133 } // namespace arm_compute
134