From dbdea0d1c025b18d4d82c278c87454427918f5b4 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Wed, 16 Oct 2019 19:21:40 +0100 Subject: COMPMID-2308: NEConvolutionLayer: support QUANT8_SYMM_PER_CHANNEL filters Change-Id: Ic1bf5f0d21ccd525f84213a360f7e199d7f50577 Signed-off-by: Georgios Pinitas Reviewed-on: https://review.mlplatform.org/c/2177 Tested-by: Arm Jenkins Reviewed-by: Michele Di Giorgio Comments-Addressed: Arm Jenkins --- tests/validation/reference/Convolution3d.h | 51 ++++++++++++++++++++---------- 1 file changed, 34 insertions(+), 17 deletions(-) (limited to 'tests/validation/reference/Convolution3d.h') diff --git a/tests/validation/reference/Convolution3d.h b/tests/validation/reference/Convolution3d.h index 30be25f504..23918a4055 100644 --- a/tests/validation/reference/Convolution3d.h +++ b/tests/validation/reference/Convolution3d.h @@ -42,13 +42,16 @@ inline bool is_valid_pixel(int i, int min, int max) } // 3D convolution for floating point type -template < typename T, typename TB, typename std::enable_if < validation::is_floating_point::value &&validation::is_floating_point::value, int >::type = 0 > -inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weights, const SimpleTensor &bias, SimpleTensor &out, +template < typename T, typename TW, typename TB, typename std::enable_if < validation::is_floating_point::value &&validation::is_floating_point::value + &&validation::is_floating_point::value, + int >::type = 0 > +inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weights, const SimpleTensor &bias, SimpleTensor &out, int i_offset, int w_offset, int b_offset, int o_offset, - int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x = 1, int dilation_y = 1) + int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x = 1, int dilation_y = 1, int filter_id = 0) { + ARM_COMPUTE_UNUSED(filter_id); const T *in_ptr = in.data() + i_offset; - const T *w_ptr = weights.data() + w_offset; + const TW *w_ptr = weights.data() + w_offset; const TB *b_ptr = bias.data() + b_offset; T *out_ptr = out.data() + o_offset; @@ -77,8 +80,8 @@ inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weig const int idx = xk + half_width_weights_start; const int idy = yk + half_height_weights_start; - const T i_value = in_ptr[offset_slice_in + xk * dilation_x + yk * dilation_y * width_in]; - const T w_value = w_ptr[idx + idy * width_weights + ifm * width_weights * height_weights]; + const T i_value = in_ptr[offset_slice_in + xk * dilation_x + yk * dilation_y * width_in]; + const TW w_value = w_ptr[idx + idy * width_weights + ifm * width_weights * height_weights]; acc += i_value * w_value; } @@ -91,13 +94,16 @@ inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weig } // 3D convolution for QASYMM8 type -template < typename T, typename TB, typename std::enable_if < std::is_same::value &&std::is_same::value, int >::type = 0 > -inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weights, const SimpleTensor &bias, SimpleTensor &out, +template < typename T, typename TW, typename TB, typename std::enable_if < std::is_same::value &&(std::is_same::value + || std::is_same::value) + &&std::is_same::value, + int >::type = 0 > +inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weights, const SimpleTensor &bias, SimpleTensor &out, int i_offset, int w_offset, int b_offset, int o_offset, - int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x = 1, int dilation_y = 1) + int xi, int yi, int width_in, int height_in, int depth_in, int width_weights, int height_weights, int dilation_x = 1, int dilation_y = 1, int filter_id = 0) { const T *in_ptr = in.data() + i_offset; - const T *w_ptr = weights.data() + w_offset; + const TW *w_ptr = weights.data() + w_offset; const TB *b_ptr = bias.data() + b_offset; T *out_ptr = out.data() + o_offset; @@ -107,10 +113,22 @@ inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weig const int input_offset = -iq_info.offset; const float input_scale = iq_info.scale; - const int weights_offset = -wq_info.offset; - const float weights_scale = wq_info.scale; - const int output_offset = oq_info.offset; - const float output_scale = oq_info.scale; + int weights_offset = -wq_info.offset; + float weights_scale = wq_info.scale; + if(is_data_type_quantized_per_channel(weights.data_type())) + { + if(is_data_type_quantized_asymmetric(weights.data_type())) + { + weights_offset = weights.quantization_info().offset()[filter_id]; + } + else + { + weights_offset = 0; + } + weights_scale = weights.quantization_info().scale()[filter_id]; + } + const int output_offset = oq_info.offset; + const float output_scale = oq_info.scale; int output_multiplier = 0; int output_shift = 0; @@ -142,9 +160,8 @@ inline void convolution3d(const SimpleTensor &in, const SimpleTensor &weig const int idx = xk + half_width_weights_start; const int idy = yk + half_height_weights_start; - const uint8_t i_value = in_ptr[offset_slice_in + xk * dilation_x + yk * dilation_y * width_in]; - const uint8_t w_value = w_ptr[idx + idy * width_weights + ifm * width_weights * height_weights]; - + const int32_t i_value = in_ptr[offset_slice_in + xk * dilation_x + yk * dilation_y * width_in]; + const int32_t w_value = w_ptr[idx + idy * width_weights + ifm * width_weights * height_weights]; acc += (i_value + input_offset) * (w_value + weights_offset); } } -- cgit v1.2.1