aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2019-12-18 15:09:00 +0000
committerGeorgios Pinitas <georgios.pinitas@arm.com>2019-12-20 11:30:52 +0000
commitdcddcd2fc5bd1f07a23ad906ad24c3f53887d141 (patch)
treebdb5d04ff28b101d2f2636290ebbfad7653d1c86
parentc740d119f07547699105a3a9cb1cc1dfb70fcd10 (diff)
downloadComputeLibrary-dcddcd2fc5bd1f07a23ad906ad24c3f53887d141.tar.gz
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 <georgios.pinitas@arm.com> Change-Id: I4debf872b5534d8dcec6d34e1c6114e58ce9dbb2 Reviewed-on: https://review.mlplatform.org/c/2494 Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Michele Di Giorgio <michele.digiorgio@arm.com> Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
-rw-r--r--src/core/NEON/kernels/NEPadLayerKernel.cpp25
1 files 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<uint8_t>();
@@ -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;
}