ONE - On-device Neural Engine
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages
ConvolutionCommon.cpp
Go to the documentation of this file.
1/*
2 * Copyright (c) 2024 Samsung Electronics Co., Ltd. All Rights Reserved
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
18#include "execute/OMUtils.h"
19
20using namespace onert_micro;
21using namespace onert_micro::core;
22
23namespace onert_micro
24{
25namespace execute
26{
27
28OMStatus createConvParams(core::ConvQuant &params, const circle::Tensor *input,
29 const circle::Tensor *filter, const circle::Tensor *output,
30 circle::ActivationFunctionType act_type)
31{
32 assert(input->quantization() != nullptr); // Fix caller
33 assert(filter->quantization() != nullptr); // Fix caller
34 assert(output->quantization() != nullptr); // Fix caller
35
36 const auto *input_scales = input->quantization()->scale();
37 const auto *filter_scales = filter->quantization()->scale();
38 const auto *output_scales = output->quantization()->scale();
39
40 assert(input_scales != nullptr); // Fix caller
41 assert(filter_scales != nullptr); // Fix caller
42 assert(output_scales != nullptr); // Fix caller
43
44 assert(input_scales->size() != 0); // Fix caller
45 assert(filter_scales->size() != 0); // Fix caller
46 assert(output_scales->size() != 0); // Fix caller
47
48 const auto input_zero_points = input->quantization()->zero_point();
49 const auto filter_zero_points = filter->quantization()->zero_point();
50 const auto output_zero_points = output->quantization()->zero_point();
51
52 assert(input_zero_points != nullptr); // Fix caller
53 assert(filter_zero_points != nullptr); // Fix caller
54 assert(output_zero_points != nullptr); // Fix caller
55
56 assert(input_zero_points->size() != 0); // Fix caller
57 assert(filter_zero_points->size() != 0); // Fix caller
58 assert(output_zero_points->size() != 0); // Fix caller
59
60 const auto input_zp = input_zero_points->operator[](0);
61 const auto filter_zp = filter_zero_points->operator[](0);
62 const auto output_zp = output_zero_points->operator[](0);
63
64 const auto output_scale = output_scales->operator[](0);
65
66 int32_t activation_min{};
67 int32_t activation_max{};
69 act_type, static_cast<int32_t>(output_zp), output_scale, output->type(), &activation_min,
70 &activation_max);
71 assert(status == Ok);
72 if (status != Ok)
73 return status;
74
75 // The kernel expects input and filter zero points to be negated.
76 params.input_offset = -static_cast<int32_t>(input_zp); // Note the '-'.
77 params.weights_offset = -static_cast<int32_t>(filter_zp); // Note the '-'.
78 params.output_offset = static_cast<int32_t>(output_zp);
79 params.quantized_activation_min = activation_min;
80 params.quantized_activation_max = activation_max;
81
82 assert(filter_scales->size() > 1); // Support only channel-wise quantization
83 // Channel-wise quantization
84 const auto input_scale = input_scales->operator[](0);
85 const std::vector<double> effective_output_scale =
86 execute::getQuantizedConvolutionMultiplers(input_scale, filter_scales, output_scale);
87
88 size_t n = effective_output_scale.size();
89 params.per_channel_output_shift.resize(n);
90 params.per_channel_output_multiplier.resize(n);
91 for (size_t i = 0; i < n; ++i)
92 {
93 execute::quantizeMultiplier(effective_output_scale[i], &params.per_channel_output_multiplier[i],
94 &params.per_channel_output_shift[i]);
95 }
96
97 return Ok;
98}
99
100} // namespace execute
101} // namespace onert_micro
void quantizeMultiplier(double double_multiplier, int32_t *quantized_multiplier, int *shift)
Definition OMUtils.cpp:23
std::vector< double > getQuantizedConvolutionMultiplers(float input_scale, const flatbuffers::Vector< float > *filter_scale, float output_scale)
Definition OMUtils.h:95
OMStatus calculateActivationRangeQuantized(circle::ActivationFunctionType activation, int32_t output_zero_point, float output_scale, circle::TensorType data_type, int32_t *activation_min, int32_t *activation_max)
Definition OMUtils.cpp:112
OMStatus createConvParams(core::ConvQuant &params, const circle::Tensor *input, const circle::Tensor *filter, const circle::Tensor *output, circle::ActivationFunctionType act_type)
std::vector< int > per_channel_output_shift
std::vector< int32_t > per_channel_output_multiplier