diff options
author | Pablo Tello <pablo.tello@arm.com> | 2018-09-25 16:01:35 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:55:19 +0000 |
commit | eb027e933758b1e749f0f6bd2817ee8979ef903c (patch) | |
tree | 99543b716f42c040d801a01d7e4674c54a1173a7 /arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp | |
parent | 4284bfab4594d4babb23123001ef63db7bebeccb (diff) | |
download | ComputeLibrary-eb027e933758b1e749f0f6bd2817ee8979ef903c.tar.gz |
COMPMID-1600: Reduce number of tile specialisations.
Change-Id: I4d06eca9404ea6d3df9d0ca52f5d6f5421ab7116
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/150117
Tested-by: bsgcomp <bsgcomp@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Diffstat (limited to 'arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp')
-rw-r--r-- | arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp | 98 |
1 files changed, 90 insertions, 8 deletions
diff --git a/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp index 473a13c3b0..b813bbb25c 100644 --- a/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp @@ -155,15 +155,15 @@ namespace winograd T* const outptr = matrix_base + tile_j*matrix_row_stride; // Apply the specific tile processing function - const int f_pad_top = iceildiv(pad_top, 2); - const int f_pad_left = iceildiv(t_pad_left, 2); - tile_fns[f_pad_top][f_pad_left][pad_bottom][t_pad_right]( + const typename Tiles::TileFn tilefn = Tiles::get_tile_specialization( + pad_top, t_pad_left, pad_bottom, t_pad_right + ); + + tilefn( n_channels, - input_base_col, - input_row_stride, - input_col_stride, - outptr, - matrix_stride + input_base_col, input_row_stride, input_col_stride, + outptr, matrix_stride, + pad_top, t_pad_left, pad_bottom, t_pad_right ); } } @@ -264,4 +264,86 @@ namespace winograd matrix_stride, matrix_batch_stride, matrix_row_stride ); } + + template <int KernelRows, int KernelCols, int InnerTileRows, int InnerTileCols, typename T> + typename InputTransformImplTiles<KernelRows, KernelCols, InnerTileRows, InnerTileCols, T>::TileFn + InputTransformImplTiles<KernelRows, KernelCols, InnerTileRows, InnerTileCols, T>:: + get_tile_specialization( + const int pad_top, + const int pad_left, + const int pad_bottom, + const int pad_right + ) + { + if (!(pad_top || pad_left || pad_bottom || pad_right)) + { + // No padding, return unpadded specialisation + return tilefn_unpadded; + } + else if (pad_top && !(pad_left || pad_bottom || pad_right)) + { + // Top padding only + const int index = (pad_top - min_pad_top) / (InnerTileRows - overlap_rows); + return tilefn_top_padded[index]; + } + else if (!(pad_top) && pad_left && !(pad_bottom || pad_right)) + { + // Left padding only + const int index = (pad_left - min_pad_left) / (InnerTileCols - overlap_cols); + return tilefn_left_padded[index]; + } + else if (!(pad_top || pad_left) && pad_bottom && !(pad_right)) + { + // Bottom padding only + return tilefn_bottom_padded[pad_bottom - 1]; + } + else if (!(pad_top || pad_left || pad_bottom) && pad_right) + { + // Right padding only + return tilefn_right_padded[pad_right - 1]; + } + else + { + // Combination of paddings, return an unspecialised method + return tilefn_generic; + } + } + + template <int KernelCols, int InnerTileCols, typename T> + typename InputTransformImplTiles<1, KernelCols, 1, InnerTileCols, T>::TileFn + InputTransformImplTiles<1, KernelCols, 1, InnerTileCols, T>:: + get_tile_specialization( + const int pad_top, + const int pad_left, + const int pad_bottom, + const int pad_right + ) + { + (void) pad_top; + (void) pad_bottom; + + if (!(pad_left || pad_right)) + { + // No padding, return unpadded specialisation + return tilefn_unpadded; + } + else if (pad_left && !pad_right) + { + // Left padding only + const int index = (pad_left - min_pad_left) / (InnerTileCols - overlap_cols); + return tilefn_left_padded[index]; + } + else if (!pad_left && pad_right) + { + // Right padding only + return tilefn_right_padded[pad_right - 1]; + } + else + { + // Combination of paddings, return an unspecialised method + return tilefn_generic; + } + } } + + |