Compute Library
 21.08
QuantizationLayer.cpp
Go to the documentation of this file.
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>
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;
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__
69 #else // __aarch64__
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 <>
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 <>
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 <>
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 <>
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 <>
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
SimpleTensor< Tout > quantization_layer(const SimpleTensor< Tin > &src, DataType output_data_type, const QuantizationInfo &quantization_info)
uint8_t quantize_qasymm8(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given an unsigned 8-bit asymmetric quantization scheme.
#define ARM_COMPUTE_ERROR(msg)
Print the given message then throw an std::runtime_error.
Definition: Error.h:352
Quantization info when assuming per layer quantization.
quantized, asymmetric fixed-point 16-bit number
TensorShape shape() const override
Shape of the tensor.
Definition: SimpleTensor.h:320
SimpleTensor< float > src
Definition: DFT.cpp:155
Copyright (c) 2017-2021 Arm Limited.
Quantization information.
int8_t quantize_qasymm8_signed(float value, const INFO_TYPE &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a signed 8-bit asymmetric quantization scheme.
quantized, asymmetric fixed-point 8-bit number unsigned
UniformQuantizationInfo uniform() const
Return per layer quantization info.
Simple tensor object that stores elements in a consecutive chunk of memory.
Definition: SimpleTensor.h:58
Rounds to nearest value; half rounds to nearest even.
const QuantizationInfo qinfo
Definition: Im2Col.cpp:155
int num_elements() const override
Number of elements of the tensor.
Definition: SimpleTensor.h:406
quantized, asymmetric fixed-point 8-bit number signed
DataType
Available data types.
Definition: Types.h:77
Truncates the least significant values that are lost in operations.
uint16_t quantize_qasymm16(float value, const UniformQuantizationInfo &qinfo, RoundingPolicy rounding_policy=RoundingPolicy::TO_NEAREST_UP)
Quantize a value given a 16-bit asymmetric quantization scheme.