From dcddcd2fc5bd1f07a23ad906ad24c3f53887d141 Mon Sep 17 00:00:00 2001 From: Georgios Pinitas Date: Wed, 18 Dec 2019 15:09:00 +0000 Subject: COMPMID-2819: Restrict cases where optimized NEPadLayer runs. Restricts the optimized path for NEPadLayer on int8 inputs to run only when both input and output do not have any virtual padding, to honor all the kernels assumptions. Signed-off-by: Georgios Pinitas Change-Id: I4debf872b5534d8dcec6d34e1c6114e58ce9dbb2 Reviewed-on: https://review.mlplatform.org/c/2494 Comments-Addressed: Arm Jenkins Reviewed-by: Michele Di Giorgio Tested-by: Arm Jenkins Reviewed-by: Giorgio Arena --- src/core/NEON/kernels/NEPadLayerKernel.cpp | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/src/core/NEON/kernels/NEPadLayerKernel.cpp b/src/core/NEON/kernels/NEPadLayerKernel.cpp index 88a1c2ec83..2b63a159d4 100644 --- a/src/core/NEON/kernels/NEPadLayerKernel.cpp +++ b/src/core/NEON/kernels/NEPadLayerKernel.cpp @@ -87,21 +87,21 @@ void NEPadLayerKernel::run_pad_constant_uint8_3Dinput_3Dpad(const Window &window const size_t start_plane = window.z().start(); const size_t end_plane = window.z().end(); - const size_t start_plane_input = start_plane - (_padding.size() > 2 && start_plane >= _padding[2].first ? _padding[2].first : 0); - + size_t start_plane_input = start_plane; + if(_padding.size() > 2) + { + start_plane_input = (start_plane < _padding[2].first) ? 0 : start_plane - _padding[2].first; + } const int output_plane_size = _output->info()->dimension(0) * _output->info()->dimension(1); - const int input_plane_size = (_input->info()->dimension(0) + _input->info()->padding().right + _input->info()->padding().left) * (_input->info()->dimension( - 1) - + _input->info()->padding().top + _input->info()->padding().bottom); + const int input_plane_size = _input->info()->dimension(0) * _input->info()->dimension(1); const int pad_y_elems_top = (_padding.size() > 1 ? _padding[1].first : 0) * _output->info()->dimension(0); const int pad_y_elems_bot = (_padding.size() > 1 ? _padding[1].second : 0) * _output->info()->dimension(0); - const size_t jump_to_next_row_input = _input->info()->dimension(0) + _input->info()->padding().right + _input->info()->padding().left; - const size_t jump_to_next_row_output = _padding[0].first + _padding[0].second; - const size_t jump_to_next_plane_input = _input->info()->padding().empty() ? 0 : _input->info()->dimension(0) * (_input->info()->padding().right + _input->info()->padding().top); + const size_t jump_to_next_row_input = _input->info()->dimension(0); + const size_t jump_to_next_row_output = _padding[0].first + _padding[0].second; - uint8_t *output_row_ptr = _output->buffer() + start_plane * output_plane_size; + uint8_t *output_row_ptr = _output->buffer() + _output->info()->offset_first_element_in_bytes() + start_plane * output_plane_size; const uint8_t *input_it_ptr = _input->buffer() + _input->info()->offset_first_element_in_bytes() + start_plane_input * input_plane_size; const auto pad_value = _constant_value.get(); @@ -112,7 +112,7 @@ void NEPadLayerKernel::run_pad_constant_uint8_3Dinput_3Dpad(const Window &window memset(output_row_ptr, pad_value, output_plane_size); output_row_ptr += output_plane_size; } - else if(_padding.size() > 2 && z_i > _input->info()->dimension(2) + _padding[2].first - 1) + else if(_padding.size() > 2 && z_i > (_input->info()->dimension(2) + _padding[2].first - 1)) { memset(output_row_ptr, pad_value, output_plane_size); output_row_ptr += output_plane_size; @@ -168,7 +168,6 @@ void NEPadLayerKernel::run_pad_constant_uint8_3Dinput_3Dpad(const Window &window memset(output_row_ptr, pad_value, _padding[0].second); output_row_ptr += _padding[0].second; } - input_it_ptr += jump_to_next_plane_input; memset(output_row_ptr, pad_value, pad_y_elems_bot); output_row_ptr += pad_y_elems_bot; } @@ -202,7 +201,9 @@ void NEPadLayerKernel::configure(ITensor *input, ITensor *output, const PaddingL switch(_input->info()->element_size()) { case 1: - if(_input->info()->num_dimensions() == 3 && padding.size() <= 3) + if(_input->info()->num_dimensions() == 3 && // Is 3D + padding.size() <= 3 && // Has 3D padding + !_input->info()->has_padding() && !_output->info()->has_padding()) // Input & Output have no padding { _func = &NEPadLayerKernel::run_pad_constant_uint8_3Dinput_3Dpad; } -- cgit v1.2.1