From df4cf57c7394265b27d051cb1cf0152c53659126 Mon Sep 17 00:00:00 2001 From: Michele Di Giorgio Date: Wed, 9 Oct 2019 15:32:39 +0100 Subject: COMPMID-2306: CLDepthwiseConvolution: support for QUANT8_PER_CHANNEL_SYMM Change-Id: I18c886400daa2dcba0b91011bc4e503d807a4732 Signed-off-by: Michele Di Giorgio Reviewed-on: https://review.mlplatform.org/c/2143 Comments-Addressed: Arm Jenkins Reviewed-by: Giorgio Arena Tested-by: Arm Jenkins --- src/core/utils/quantization/AsymmHelpers.cpp | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) (limited to 'src/core/utils/quantization/AsymmHelpers.cpp') diff --git a/src/core/utils/quantization/AsymmHelpers.cpp b/src/core/utils/quantization/AsymmHelpers.cpp index 42bd84db47..cdd48972eb 100644 --- a/src/core/utils/quantization/AsymmHelpers.cpp +++ b/src/core/utils/quantization/AsymmHelpers.cpp @@ -22,6 +22,7 @@ * SOFTWARE. */ #include "arm_compute/core/utils/quantization/AsymmHelpers.h" +#include "arm_compute/core/Helpers.h" #include #include @@ -134,5 +135,26 @@ std::pair get_min_max_values_from_quantized_data_type(DataType data_ty } return std::make_pair(min_quant_val, max_quant_val); } +void compute_quantized_multipliers_and_shifts(const ITensor *input, const ITensor *weights, const ITensor *output, int32_t *output_multipliers_ptr, int32_t *output_shifts_ptr) +{ + const unsigned int idx_c = get_data_layout_dimension_index(weights->info()->data_layout(), DataLayoutDimension::CHANNEL); + const unsigned int num_filters = is_data_type_quantized_per_channel(weights->info()->data_type()) ? weights->info()->dimension(idx_c) : 1; + + const UniformQuantizationInfo iq_info = input->info()->quantization_info().uniform(); + const QuantizationInfo wq_info = weights->info()->quantization_info(); + const UniformQuantizationInfo oq_info = output->info()->quantization_info().uniform(); + + for(unsigned int i = 0; i < num_filters; ++i) + { + int output_multiplier = 0; + int output_shift = 0; + const float multiplier = iq_info.scale * wq_info.scale()[i] / oq_info.scale; + ARM_COMPUTE_ERROR_ON(multiplier > 1.0f); + calculate_quantized_multiplier_less_than_one(multiplier, &output_multiplier, &output_shift); + + output_multipliers_ptr[i] = output_multiplier; + output_shifts_ptr[i] = output_shift; + } +} } // quantization } // arm_compute -- cgit v1.2.1