aboutsummaryrefslogtreecommitdiff
path: root/arm_compute/core/NEON/kernels/convolution/winograd/transforms
diff options
context:
space:
mode:
authorPablo Tello <pablo.tello@arm.com>2018-09-25 16:01:35 +0100
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:55:19 +0000
commiteb027e933758b1e749f0f6bd2817ee8979ef903c (patch)
tree99543b716f42c040d801a01d7e4674c54a1173a7 /arm_compute/core/NEON/kernels/convolution/winograd/transforms
parent4284bfab4594d4babb23123001ef63db7bebeccb (diff)
downloadComputeLibrary-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')
-rw-r--r--arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp98
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;
+ }
+ }
}
+
+