diff options
60 files changed, 15309 insertions, 170 deletions
diff --git a/SConscript b/SConscript index d813033676..f021f34615 100644 --- a/SConscript +++ b/SConscript @@ -176,8 +176,8 @@ if env['neon']: core_files += Glob('src/core/NEON/kernels/*.cpp') # build winograd sources for either v7a / v8a - core_files += Glob('src/core/NEON/kernels/winograd/*.cpp') - core_files += Glob('src/core/NEON/kernels/winograd/transforms/*.cpp') + core_files += Glob('src/core/NEON/kernels/convolution/*/*.cpp') + core_files += Glob('src/core/NEON/kernels/convolution/winograd/*/*.cpp') arm_compute_env.Append(CPPPATH = ["arm_compute/core/NEON/kernels/winograd/", "arm_compute/core/NEON/kernels/assembly/"]) if env['arch'] == "armv7a": diff --git a/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h b/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h index a441fb44b3..1367f378f7 100644 --- a/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h +++ b/arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h @@ -25,13 +25,15 @@ #define __ARM_COMPUTE_NEDEPTHWISECONVOLUTIONKERNEL3x3_H__ #include "arm_compute/core/NEON/INEKernel.h" +#include "arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp" + +#include <memory> namespace arm_compute { class ITensor; -/** Interface for the kernel to run a 3x3 depthwise convolution on a tensor. - */ +/** Interface for the kernel to run a 3x3 depthwise convolution on a tensor. */ class NEDepthwiseConvolutionLayer3x3Kernel : public INEKernel { public: @@ -51,24 +53,47 @@ public: NEDepthwiseConvolutionLayer3x3Kernel &operator=(NEDepthwiseConvolutionLayer3x3Kernel &&) = default; /** Initialize the function's source, destination, conv and border_size. * - * @param[in] input Source tensor. DataType supported: QASYMM8, F32. - * @param[in] weights Weights tensor. This is a 3D tensor with dimensions [3, 3, IFM]. Data type supported: Same as @p input. - * @param[out] output Destination tensor. Data type supported: Same as @p input. - * @param[in] conv_info Padding and stride information to use for the convolution. + * @param[in] input Source tensor. DataType supported: QASYMM8, F32. + * @param[in] weights Weights tensor. This is a 3D tensor with dimensions [3, 3, IFM]. Data type supported: Same as @p input. + * @param[out] output Destination tensor. Data type supported: Same as @p input. + * @param[in] conv_info Padding and stride information to use for the convolution. + * @param[in] data_layout (Optional) Data layout of the input and weights tensor */ - void configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info); + void configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info, DataLayout data_layout = DataLayout::NCHW); + /** Static method that checks if optimized execution is supported for the given parameters + * + * @param[in] input_shape Input shape + * @param[in] conv_info Padding and stride information to use for the convolution. + * @param[in] dt Data type of the input and weights + * @param[in] data_layout (Optional) Data layout of the input and weights tensor + * + * @return True if the optimized kernels can be executed else false + */ + static bool is_optimized_execution_possible(TensorShape input_shape, PadStrideInfo conv_info, DataType dt, DataLayout data_layout = DataLayout::NCHW); + /** Generates the convolver object */ + void generate_convolver(); // Inherited methods overridden: void run(const Window &window, const ThreadInfo &info) override; BorderSize border_size() const override; private: - BorderSize _border_size; - const ITensor *_input; - ITensor *_output; - const ITensor *_weights; - PadStrideInfo _conv_info; - unsigned int _num_elems_written_per_iteration; + void configure_generic(); + void configure_optimized(); + void run_generic(const Window &window, const ThreadInfo &info); + void run_optimized(const Window &window, const ThreadInfo &info); + std::unique_ptr<depthwise::IDepthwiseConvolution> create_convolver_object(TensorShape shape, PadStrideInfo conv_info, + const uint8_t *w_ptr, uint8_t *in_ptr, uint8_t *out_ptr); + +private: + BorderSize _border_size; + const ITensor *_input; + ITensor *_output; + const ITensor *_weights; + PadStrideInfo _conv_info; + std::unique_ptr<depthwise::IDepthwiseConvolution> _convolver; + unsigned int _num_elems_written_per_iteration; + bool _run_optimized; }; } // namespace arm_compute #endif /* __ARM_COMPUTE_NEDEPTHWISECONVOLUTIONKERNEL3x3_H__ */ diff --git a/arm_compute/core/NEON/kernels/NEWinogradLayerKernel.h b/arm_compute/core/NEON/kernels/NEWinogradLayerKernel.h index 97532f3574..a8645dc07e 100644 --- a/arm_compute/core/NEON/kernels/NEWinogradLayerKernel.h +++ b/arm_compute/core/NEON/kernels/NEWinogradLayerKernel.h @@ -25,10 +25,10 @@ #define __ARM_COMPUTE_NEGEMMWINOGRADLAYERKERNEL_H__ #include "arm_compute/core/NEON/INEKernel.h" -#include "arm_compute/core/NEON/kernels/winograd/batched_blocked_gemm.hpp" -#include "arm_compute/core/NEON/kernels/winograd/convolution.hpp" -#include "arm_compute/core/NEON/kernels/winograd/tensor.hpp" -#include "arm_compute/core/NEON/kernels/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/convolution.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/tensor.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" namespace arm_compute { diff --git a/arm_compute/core/NEON/kernels/winograd/alloc.hpp b/arm_compute/core/NEON/kernels/convolution/common/alloc.hpp index 799e95d3e6..799e95d3e6 100644 --- a/arm_compute/core/NEON/kernels/winograd/alloc.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/alloc.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/arm.hpp b/arm_compute/core/NEON/kernels/convolution/common/arm.hpp index 90e7828553..90e7828553 100644 --- a/arm_compute/core/NEON/kernels/winograd/arm.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/arm.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/convolution.hpp b/arm_compute/core/NEON/kernels/convolution/common/convolution.hpp index 2ab2597785..2ab2597785 100644 --- a/arm_compute/core/NEON/kernels/winograd/convolution.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/convolution.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/perf.h b/arm_compute/core/NEON/kernels/convolution/common/perf.h index 3c0d36646d..3c0d36646d 100644 --- a/arm_compute/core/NEON/kernels/winograd/perf.h +++ b/arm_compute/core/NEON/kernels/convolution/common/perf.h diff --git a/arm_compute/core/NEON/kernels/winograd/profiler.hpp b/arm_compute/core/NEON/kernels/convolution/common/profiler.hpp index 01fafa9604..01fafa9604 100644 --- a/arm_compute/core/NEON/kernels/winograd/profiler.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/profiler.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/shims.hpp b/arm_compute/core/NEON/kernels/convolution/common/shims.hpp index 09e14577ff..09e14577ff 100644 --- a/arm_compute/core/NEON/kernels/winograd/shims.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/shims.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/tensor.hpp b/arm_compute/core/NEON/kernels/convolution/common/tensor.hpp index 6567eeb23d..6567eeb23d 100644 --- a/arm_compute/core/NEON/kernels/winograd/tensor.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/tensor.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/tensor_utils.hpp b/arm_compute/core/NEON/kernels/convolution/common/tensor_utils.hpp index 68a5c6a178..68a5c6a178 100644 --- a/arm_compute/core/NEON/kernels/winograd/tensor_utils.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/tensor_utils.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/utils.hpp b/arm_compute/core/NEON/kernels/convolution/common/utils.hpp index d8b9c3b7d3..d8b9c3b7d3 100644 --- a/arm_compute/core/NEON/kernels/winograd/utils.hpp +++ b/arm_compute/core/NEON/kernels/convolution/common/utils.hpp diff --git a/arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp b/arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp new file mode 100644 index 0000000000..80b0614015 --- /dev/null +++ b/arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp @@ -0,0 +1,209 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +#pragma once + +namespace depthwise +{ + +class IDepthwiseConvolution +{ +public: + virtual ~IDepthwiseConvolution() = default; + virtual int output_size(const int dim_size, const bool padding_same) const = 0; + virtual unsigned int get_window(void) const = 0; + virtual void run(const unsigned int start, const unsigned int stop) = 0; +}; + +template < + int OutputTileRows, + int OutputTileCols, + int KernelRows, + int KernelCols, + int StrideRows, + int StrideCols, + typename TIn, + typename TOut +> +class DepthwiseConvolution : public IDepthwiseConvolution +{ + public: + typedef TIn InputType; + typedef TOut OutputType; + + // Information about the specific convolution instance + static constexpr int output_tile_rows = OutputTileRows; + static constexpr int output_tile_cols = OutputTileCols; + static constexpr int kernel_rows = KernelRows; + static constexpr int kernel_cols = KernelCols; + static constexpr int stride_rows = StrideRows; + static constexpr int stride_cols = StrideCols; + static constexpr int inner_tile_rows = stride_rows * output_tile_rows + kernel_rows - 1; + static constexpr int inner_tile_cols = stride_cols * output_tile_cols + kernel_cols - 1; + + /** Create a new depthwise convolution engine. + * + * @param[in] n_batches Number of batches tensors. + * @param[in] n_input_rows Number of rows in input tensor. + * @param[in] n_input_cols Number of columns in input tensor. + * @param[in] n_channels Number of channels in input and output tensors. + * @param[in] padding_same True if padding is SAME, else VALID. + * @param[in] weights Pointer to Height x Width x Channel ordered weights. + * @param[in] input Pointer to NHWC ordered input tensor. + * @param[output] output Pointer to NHWC ordered output tensor. + */ + DepthwiseConvolution( + const int n_batches, const int n_input_rows, const int n_input_cols, + const int n_channels, const bool padding_same, + const TIn* const weights, + const TIn* const input, + TOut* const output + ); + + // Cannot copy or move a DepthwiseConvolution. + DepthwiseConvolution(DepthwiseConvolution&) = delete; + DepthwiseConvolution operator=(DepthwiseConvolution&) = delete; + + /** Get the number of output rows/columns. + * + * @param[in] dim_size Number of elements in the dimension (rows/columns) + * @param[in] same_padding True if the padding is SAME, otherwise false. + */ + static int get_output_size(const int dim_size, const bool padding_same); + + /** Get the number of output rows/columns. + * + * @param[in] dim_size Number of elements in the dimension (rows/columns) + * @param[in] same_padding True if the padding is SAME, otherwise false. + */ + int output_size(const int dim_size, const bool padding_same) const override + { + return DepthwiseConvolution<OutputTileRows, + OutputTileCols, + KernelRows, + KernelCols, + StrideRows, + StrideCols, + TIn, + TOut>::get_output_size(dim_size, padding_same); + } + + /** Get the window of work to be performed by an instance of the operator. + */ + unsigned int get_window(void) const override; + + /** Perform a portion of the work associated with the operator. + * + * Will perform the window of work described by $[start, stop)$. + * + * @param[in] start Start of the window of work to perform. + * @param[in] stop End of the work to perform. + */ + void run(const unsigned int start, const unsigned int stop) override; + + protected: + /** Process a tile-row of the tensors. + */ + static void process_tile_row( + const int n_channels, + const TIn* const weights, + const TIn* const inptr, + const int in_row_stride, + const int in_col_stride, + TOut* const outptr, + const int out_row_stride, + const int out_col_stride, + const int row_pad_in_top, + const int row_pad_in_left, + const int row_pad_in_bottom, + const int row_pad_out_bottom, + const int n_tiles, + const int n_input_cols, + const int n_output_cols + ); + + /** Process a single tile of the tensors. + * + * @param[in] n_channels Number of channels. + * @param[in] weights Pointer to Height x Width x Channels ordered weights. + * @param[in] inptr Pointer to the top-left unpadded value of the tile. + * @param[in] in_row_stride Stride between rows of the input tensor. + * @param[in] in_col_stride Stride between columns of the input tensor. + * @param[out] outptr Pointer to the top-left output value for the tile. + * @param[in] out_row_stride Stride between rows of the output tensor. + * @param[in] out_col_stride Stride between columns of the output tensor. + */ + template < + int in_pad_top, int in_pad_left, int in_pad_bottom, int in_pad_right, + int out_pad_bottom, int out_pad_right + > + static void process_tile( + const int n_channels, + const TIn* const weights, + const TIn* const inptr, + const int in_row_stride, + const int in_col_stride, + TOut* const outptr, + const int out_row_stride, + const int out_col_stride + ); + + // Type of a pointer to a `process_tile` instance + typedef void (*TileFn)( + const int, + const TIn* const, + const TIn* const, const int, const int, + TOut* const, const int, const int + ); + + // Determine the maximum padding values which can be applied to tiles of + // the tensors involved in this class of convolution. + static constexpr int max_in_pad_top = 2; + static constexpr int max_in_pad_left = 2; + static constexpr int max_in_pad_bottom = inner_tile_rows - 1; + static constexpr int max_in_pad_right = inner_tile_cols - 1; + static constexpr int max_out_pad_bottom = output_tile_rows; + static constexpr int max_out_pad_right = output_tile_cols; + + /** Array of methods to process tensor tiles. + * + * Allows dynamic dispatch to specialized implementations based on + * different padding configurations. + */ + static const TileFn tile_fns[ + max_in_pad_top][max_in_pad_left][max_in_pad_bottom][max_in_pad_right][ + max_out_pad_bottom][max_out_pad_right + ]; + + private: + // Member variables of instances of a convolution engine. + const TIn* const _weights; + const TIn* const _input; + TOut* const _output; + const int _n_batches, _n_input_rows, _n_input_cols, _n_channels, + _n_output_rows, _n_output_cols, _n_tile_rows, _n_tile_cols; + const bool _padding_same; +}; + +} // namespace depthwise diff --git a/arm_compute/core/NEON/kernels/convolution/depthwise/impl_base.hpp b/arm_compute/core/NEON/kernels/convolution/depthwise/impl_base.hpp new file mode 100644 index 0000000000..f9671fc426 --- /dev/null +++ b/arm_compute/core/NEON/kernels/convolution/depthwise/impl_base.hpp @@ -0,0 +1,348 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * NOTE: Header to be included by implementation files only. + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#include <algorithm> +#include "arm_compute/core/NEON/kernels/convolution/depthwise/depthwise.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/utils.hpp" + +#pragma once + +namespace depthwise +{ + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +int DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::get_output_size( + const int dim_size, const bool same_padding +) +{ + return iceildiv(dim_size - (same_padding ? 0 : (KC - 1)), SR); +} + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::DepthwiseConvolution( + const int n_batches, const int n_input_rows, const int n_input_cols, + const int n_channels, const bool padding_same, + const TIn* const weights, + const TIn* const input, + TOut* const output +) : _weights(weights), _input(input), _output(output), + _n_batches(n_batches), + _n_input_rows(n_input_rows), + _n_input_cols(n_input_cols), + _n_channels(n_channels), + _n_output_rows(get_output_size(n_input_rows, padding_same)), + _n_output_cols(get_output_size(n_input_cols, padding_same)), + _n_tile_rows(iceildiv(_n_output_rows, output_tile_rows)), + _n_tile_cols(iceildiv(_n_output_cols, output_tile_cols)), + _padding_same(padding_same) +{ +} + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +unsigned int DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::get_window() const +{ + // TODO Later support parallelisation over tile rows. + return 1; // _n_tile_rows; +} + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +void DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::run( + const unsigned int start, + const unsigned int stop +) +{ + // TODO Later support parallelisation over tile rows. + (void) start; + (void) stop; + + // Compute input striding + const int input_col_stride = _n_channels; + const int input_row_stride = _n_input_cols * input_col_stride; + const int input_batch_stride = _n_input_rows * input_row_stride; + + // Compute output striding + const int output_col_stride = _n_channels; + const int output_row_stride = _n_output_cols * output_col_stride; + const int output_batch_stride = _n_output_rows * output_row_stride; + + // Compute top and bottom padding for input and output + const int input_pad_top = _padding_same ? + ((_n_output_rows - 1)*stride_rows + kernel_rows - _n_input_rows) / 2 : 0; + const int input_pad_left = _padding_same ? + ((_n_output_cols - 1)*stride_cols + kernel_cols - _n_input_cols) / 2 : 0; + constexpr int tile_overlap = kernel_rows - 1; + + // Perform the convolution by calling `process_tile_row` for each tile row in + // each batch. + for (int batch = 0; batch < _n_batches; batch++) + { + const TIn* const inptr_batch = _input + batch*input_batch_stride; + TOut* const outptr_batch = _output + batch*output_batch_stride; + + // Loop over rows of tiles + for (int tile_i = 0; tile_i < _n_tile_rows; tile_i++) + { + // Pointer to the row + const int input_row_offset = (tile_i == 0) ? 0 : input_pad_top; + const TIn* const inptr_row = (inptr_batch + ((inner_tile_rows - tile_overlap)*tile_i - input_row_offset)*input_row_stride); + TOut* const outptr_row = outptr_batch + output_tile_rows * tile_i * output_row_stride; + + // Input padding (top + bottom) for the row + const int input_row_top = tile_i*(inner_tile_rows - tile_overlap) - input_pad_top; + const int input_row_bottom = input_row_top + inner_tile_rows; + const int input_row_pad_top = (tile_i == 0) ? input_pad_top : 0; + const int input_row_pad_bottom = std::max(0, input_row_bottom - _n_input_rows); + + // Output padding (bottom) for the row + const int output_row_bottom = (tile_i + 1)*output_tile_rows; + const int output_row_pad_bottom = std::max(0, output_row_bottom - _n_output_rows); + + // Process the row + process_tile_row( + _n_channels, _weights, + inptr_row, input_row_stride, input_col_stride, + outptr_row, output_row_stride, output_col_stride, + input_row_pad_top, input_pad_left, input_row_pad_bottom, + output_row_pad_bottom, + _n_tile_cols, _n_input_cols, _n_output_cols + ); + } + } +} + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +void DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::process_tile_row( + const int n_channels, + const TIn* const weights, + const TIn* const inptr, + const int in_row_stride, + const int in_col_stride, + TOut* const outptr, + const int out_row_stride, + const int out_col_stride, + const int row_pad_in_top, + const int row_pad_in_left, + const int row_pad_in_bottom, + const int row_pad_out_bottom, + const int n_tiles, + const int n_input_cols, + const int n_output_cols +) +{ + constexpr int tile_overlap = kernel_cols - 1; + + // Loop over columns of tiles + for (int tile_j = 0; tile_j < n_tiles; tile_j++) + { + // Input padding (left + right) for the tile + const int t_pad_in_left = (tile_j == 0) ? row_pad_in_left : 0; + const int t_in_start = tile_j*(inner_tile_cols - tile_overlap) - row_pad_in_left; + const int t_in_end = t_in_start + inner_tile_cols; + const int t_pad_in_right = std::max(0, t_in_end - n_input_cols); + + // Output padding (right) for the tile + const int t_out_end = (tile_j + 1) * output_tile_cols; + const int t_pad_out_right = std::max(0, t_out_end - n_output_cols); + + // Get pointers into the inputs and outputs + const int col_offset = (tile_j == 0) ? 0 : row_pad_in_left; + const TIn* const inptr_col = (inptr + ((inner_tile_cols - tile_overlap)*tile_j - col_offset)*in_col_stride); + TOut* const outptr_col = outptr + tile_j * output_tile_cols * out_col_stride; + + // Apply the specific tile processing function + tile_fns[row_pad_in_top][t_pad_in_left][row_pad_in_bottom][t_pad_in_right][row_pad_out_bottom][t_pad_out_right]( + n_channels, weights, + inptr_col, in_row_stride, in_col_stride, + outptr_col, out_row_stride, out_col_stride + ); + } +} + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC, typename TIn, typename TOut> +template < + int in_pad_top, int in_pad_left, int in_pad_bottom, int in_pad_right, + int out_pad_bottom, int out_pad_right +> +void DepthwiseConvolution<OTR, OTC, KR, KC, SR, SC, TIn, TOut>::process_tile( + const int n_channels, + const TIn* const weights, + const TIn* const inptr, + const int in_row_stride, + const int in_col_stride, + TOut* const outptr, + const int out_row_stride, + const int out_col_stride +) +{ + // Compute valid ranges of the tile + constexpr int in_cells_i = inner_tile_rows - in_pad_bottom; + constexpr int in_cells_j = inner_tile_cols - in_pad_right; + constexpr int out_cells_i = output_tile_rows - out_pad_bottom; + constexpr int out_cells_j = output_tile_cols - out_pad_right; + + // Instantiate pointers + const TIn* inptr_base = inptr; + const TIn* wptr_base = weights; + TOut* outptr_base = outptr; + + const int weight_col_stride = n_channels; + const int weight_row_stride = kernel_cols * n_channels; + + // Perform the depthwise convolution + int channels_remaining = n_channels; + for (; channels_remaining; channels_remaining--) + { + // Load input tile + TIn u[inner_tile_rows][inner_tile_cols]; + for (int i = 0; i < inner_tile_rows; i++) + { + const TIn* const inptr_row = inptr_base + (i - in_pad_top)*in_row_stride; + for (int j = 0; j < inner_tile_cols; j++) + { + if (i < in_pad_top || in_cells_i <= i || + j < in_pad_left || in_cells_j <= j) + { + u[i][j] = static_cast<TIn>(0); + } + else + { + u[i][j] = *(inptr_row + (j - in_pad_left)*in_col_stride); + } + } + } + inptr_base++; + + // Load weights tile + TIn w[kernel_rows][kernel_cols]; + for (int i = 0; i < kernel_rows; i++) + { + const TIn* const wptr_row = wptr_base + i*weight_row_stride; + for (int j = 0; j < kernel_cols; j++) + { + w[i][j] = *(wptr_row + j*weight_col_stride); + } + } + wptr_base++; + + // Perform the convolution + TOut v[out_cells_i][out_cells_j]; + for (int out_i = 0; out_i < out_cells_i; out_i++) + { + for (int out_j = 0; out_j < out_cells_j; out_j++) + { + // Clear the accumulator + v[out_i][out_j] = static_cast<TOut>(0); + + // Base co-ordinate + const int base_i = out_i * stride_rows; + const int base_j = out_j * stride_cols; + + // Fill the accumulator + for (int in_i = 0; in_i < kernel_rows; in_i++) + { + const int i = base_i + in_i; + for (int in_j = 0; in_j < kernel_cols; in_j++) + { + const int j = base_j + in_j; + v[out_i][out_j] += w[in_i][in_j] * u[i][j]; + } + } + } + } + + // Store the output tile + for (int i = 0; i < out_cells_i; i++) + { + TOut* const outptr_row = outptr_base + i*out_row_stride; + for (int j = 0; j < out_cells_j; j++) + { + *(outptr_row + j*out_col_stride) = v[i][j]; + } + } + outptr_base++; + } +} + + +// New templated struct used solely as a way to provide tile processing +// specialisations. +template <int OutputTileRows, int OutputTileCols, + int KernelRows, int KernelCols, + int StrideRows, int StrideCols, + typename TIn, typename TOut> +struct DepthwiseConvolutionImpl : public DepthwiseConvolution< + OutputTileRows, OutputTileCols, + KernelRows, KernelCols, + StrideRows, StrideCols, TIn, TOut +> +{ + template < + int in_pad_top, int in_pad_left, int in_pad_bottom, int in_pad_right, + int out_pad_bottom, int out_pad_right + > + static void process_tile( + const int n_channels, + const TIn* const weights, + const TIn* const inptr, + const int in_row_stride, + const int in_col_stride, + TOut* const outptr, + const int out_row_stride, + const int out_col_stride + ) + { + // By default, redirect to parent. Specialised implementations can be added + // by overriding this method. + DepthwiseConvolution<OutputTileRows, OutputTileCols, + KernelRows, KernelCols, + StrideRows, StrideCols, + TIn, TOut>:: + template process_tile<in_pad_top, in_pad_left, in_pad_bottom, in_pad_right, + out_pad_bottom, out_pad_right>( + n_channels, + weights, + inptr, + in_row_stride, + in_col_stride, + outptr, + out_row_stride, + out_col_stride + ); + } +}; + +} // namespace depthwise diff --git a/arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp b/arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp new file mode 100644 index 0000000000..e7f0609b0c --- /dev/null +++ b/arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp @@ -0,0 +1,263 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/* + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + * + * NOTE: Header to be included by implementation files only. + * + * !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + */ + +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_base.hpp" + +#pragma once + +namespace depthwise +{ +// Partial specialisation for FP32 to FP32 +template <int OutputTileRows, int OutputTileCols, + int KernelRows, int KernelCols, + int StrideRows, int StrideCols> +struct DepthwiseConvolutionImpl<OutputTileRows, OutputTileCols, KernelRows, KernelCols, StrideRows, StrideCols, float, float> +{ + typedef DepthwiseConvolution< + OutputTileRows, OutputTileCols, + KernelRows, KernelCols, + StrideRows, StrideCols, + float, float + > DWC; + + template < + int in_pad_top, int in_pad_left, int in_pad_bottom, int in_pad_right, + int out_pad_bottom, int out_pad_right + > + static void process_tile( + const int n_channels, + const float* const weights, + const float* const inptr, + const int in_row_stride, + const int in_col_stride, + float* const outptr, + const int out_row_stride, + const int out_col_stride + ); +}; + + +template <int OTR, int OTC, int KR, int KC, int SR, int SC> +template < + int in_pad_top, int in_pad_left, int in_pad_bottom, int in_pad_right, + int out_pad_bottom, int out_pad_right +> +void DepthwiseConvolutionImpl<OTR, OTC, KR, KC, SR, SC, float, float>::process_tile( + const int n_channels, + const float* const weights, + const float* const inptr, + const int in_row_stride, + const int in_col_stride, + float* const outptr, + const int out_row_stride, + const int out_col_stride +) +{ + constexpr auto inner_tile_rows = DWC::inner_tile_rows; + constexpr auto inner_tile_cols = DWC::inner_tile_cols; + constexpr auto kernel_rows = DWC::kernel_rows; + constexpr auto kernel_cols = DWC::kernel_cols; + constexpr auto output_tile_rows = DWC::output_tile_rows; + constexpr auto output_tile_cols = DWC::output_tile_cols; + constexpr auto stride_rows = DWC::stride_rows; + constexpr auto stride_cols = DWC::stride_cols; + + // Compute valid ranges of the tile + constexpr int in_cells_i = inner_tile_rows - in_pad_bottom; + constexpr int in_cells_j = inner_tile_cols - in_pad_right; + constexpr int out_cells_i = output_tile_rows - out_pad_bottom; + constexpr int out_cells_j = output_tile_cols - out_pad_right; + + // Instantiate pointers + const float* inptr_base = inptr; + const float* wptr_base = weights; + float* outptr_base = outptr; + + const int weight_col_stride = n_channels; + const int weight_row_stride = kernel_cols * n_channels; + + // Perform the depthwise convolution + int channels_remaining = n_channels; +#ifdef __aarch64__ + for (; channels_remaining >= 4; channels_remaining -= 4) + { + // Load input tile + float32x4_t u[inner_tile_rows][inner_tile_cols]; + for (int i = 0; i < inner_tile_rows; i++) + { + const float* const inptr_row = inptr_base + (i - in_pad_top)*in_row_stride; + for (int j = 0; j < inner_tile_cols; j++) + { + if (i < in_pad_top || in_cells_i <= i || + j < in_pad_left || in_cells_j <= j) + { + u[i][j] = vdupq_n_f32(0.0f); + } + else + { + u[i][j] = vld1q_f32(inptr_row + (j - in_pad_left)*in_col_stride); + } + } + } + inptr_base += 4; + + // Load weights tile + float32x4_t w[kernel_rows][kernel_cols]; + for (int i = 0; i < kernel_rows; i++) + { + const float* const wptr_row = wptr_base + i*weight_row_stride; + for (int j = 0; j < kernel_cols; j++) + { + w[i][j] = vld1q_f32(wptr_row + j*weight_col_stride); + } + } + wptr_base += 4; + + // Perform the convolution + float32x4_t v[out_cells_i][out_cells_j]; + for (int out_i = 0; out_i < out_cells_i; out_i++) + { + for (int out_j = 0; out_j < out_cells_j; out_j++) + { + // Base co-ordinate + const int base_i = out_i * stride_rows; + const int base_j = out_j * stride_cols; + + // Fill the accumulator + for (int in_i = 0; in_i < kernel_rows; in_i++) + { + const int i = base_i + in_i; + for (int in_j = 0; in_j < kernel_cols; in_j++) + { + const int j = base_j + in_j; + if (in_i == 0 && in_j == 0) + { + // v[out_i][out_j] = w[in_i][in_j] * u[i][j]; + v[out_i][out_j] = vmulq_f32(w[in_i][in_j], u[i][j]); + } + else + { + // v[out_i][out_j] += w[in_i][in_j] * u[i][j]; + v[out_i][out_j] = vmlaq_f32(v[out_i][out_j], w[in_i][in_j], u[i][j]); + } + } + } + } + } + + // Store the output tile + for (int i = 0; i < out_cells_i; i++) + { + float* const outptr_row = outptr_base + i*out_row_stride; + for (int j = 0; j < out_cells_j; j++) + { + vst1q_f32(outptr_row + j*out_col_stride, v[i][j]); + } + } + outptr_base += 4; + } +#endif // __aarch64__ + for (; channels_remaining; channels_remaining--) + { + // Load input tile + float u[inner_tile_rows][inner_tile_cols]; + for (int i = 0; i < inner_tile_rows; i++) + { + const float* const inptr_row = inptr_base + (i - in_pad_top)*in_row_stride; + for (int j = 0; j < inner_tile_cols; j++) + { + if (i < in_pad_top || in_cells_i <= i || + j < in_pad_left || in_cells_j <= j) + { + u[i][j] = static_cast<float>(0); + } + else + { + u[i][j] = *(inptr_row + (j - in_pad_left)*in_col_stride); + } + } + } + inptr_base++; + + // Load weights tile + float w[kernel_rows][kernel_cols]; + for (int i = 0; i < kernel_rows; i++) + { + const float* const wptr_row = wptr_base + i*weight_row_stride; + for (int j = 0; j < kernel_cols; j++) + { + w[i][j] = *(wptr_row + j*weight_col_stride); + } + } + wptr_base++; + + // Perform the convolution + float v[out_cells_i][out_cells_j]; + for (int out_i = 0; out_i < out_cells_i; out_i++) + { + for (int out_j = 0; out_j < out_cells_j; out_j++) + { + // Clear the accumulator + v[out_i][out_j] = static_cast<float>(0); + + // Base co-ordinate + const int base_i = out_i * stride_rows; + const int base_j = out_j * stride_cols; + + // Fill the accumulator + for (int in_i = 0; in_i < kernel_rows; in_i++) + { + const int i = base_i + in_i; + for (int in_j = 0; in_j < kernel_cols; in_j++) + { + const int j = base_j + in_j; + v[out_i][out_j] += w[in_i][in_j] * u[i][j]; + } + } + } + } + + // Store the output tile + for (int i = 0; i < out_cells_i; i++) + { + float* const outptr_row = outptr_base + i*out_row_stride; + for (int j = 0; j < out_cells_j; j++) + { + *(outptr_row + j*out_col_stride) = v[i][j]; + } + } + outptr_base++; + } +} + +} // namespace depthwise diff --git a/arm_compute/core/NEON/kernels/winograd/batched_blocked_gemm.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.hpp index 663b3c414f..663b3c414f 100644 --- a/arm_compute/core/NEON/kernels/winograd/batched_blocked_gemm.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/gemm.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/gemm.hpp index e48d31b4e6..62a20c9eea 100644 --- a/arm_compute/core/NEON/kernels/winograd/gemm.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/gemm.hpp @@ -23,7 +23,7 @@ */ #pragma once -#include "utils.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/utils.hpp" template <typename TIn, typename TOut> inline void Gemm(const TIn* const a, const TIn* const b, TOut *c, diff --git a/arm_compute/core/NEON/kernels/winograd/gemm/a64_sgemm.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/gemm/a64_sgemm.hpp index caeb48f65a..8073cb1896 100644 --- a/arm_compute/core/NEON/kernels/winograd/gemm/a64_sgemm.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/gemm/a64_sgemm.hpp @@ -24,7 +24,7 @@ #pragma once #include <cassert> -#include "../utils.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/utils.hpp" #ifdef __aarch64__ diff --git a/arm_compute/core/NEON/kernels/winograd/gemm/a64_sgemm_4x16.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/gemm/a64_sgemm_4x16.hpp index 5cd37de7a0..5cd37de7a0 100644 --- a/arm_compute/core/NEON/kernels/winograd/gemm/a64_sgemm_4x16.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/gemm/a64_sgemm_4x16.hpp diff --git a/arm_compute/core/NEON/kernels/winograd/transforms/input.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp index 075765a513..6dd8f5460a 100644 --- a/arm_compute/core/NEON/kernels/winograd/transforms/input.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp @@ -23,7 +23,7 @@ */ #pragma once -#include "../winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" namespace winograd { diff --git a/arm_compute/core/NEON/kernels/winograd/transforms/kernel.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/kernel.hpp index 4b54dfdf08..bad3ef2249 100644 --- a/arm_compute/core/NEON/kernels/winograd/transforms/kernel.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/kernel.hpp @@ -22,7 +22,7 @@ * SOFTWARE. */ -#include "winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" using namespace winograd; diff --git a/arm_compute/core/NEON/kernels/winograd/transforms/output.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/output.hpp index 0dd719751b..401b2816be 100644 --- a/arm_compute/core/NEON/kernels/winograd/transforms/output.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/transforms/output.hpp @@ -23,7 +23,7 @@ */ #pragma once -#include "../winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" namespace winograd { diff --git a/arm_compute/core/NEON/kernels/winograd/winograd_gemm.hpp b/arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp index 2ea70f182b..f3b2bb10ed 100644 --- a/arm_compute/core/NEON/kernels/winograd/winograd_gemm.hpp +++ b/arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp @@ -24,13 +24,13 @@ #pragma once -#include "alloc.hpp" -#include "convolution.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/alloc.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/convolution.hpp" #include "gemm.hpp" -#include "profiler.hpp" -#include "shims.hpp" -#include "tensor.hpp" -#include "utils.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/profiler.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/shims.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/tensor.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/utils.hpp" #include <thread> #include <utility> diff --git a/arm_compute/core/NEON/kernels/convolution/NEDirectConvolution3x3.h b/arm_compute/core/NEON/kernels/detail/NEDirectConvolution3x3.h index 7f39e5ee8d..fee206638b 100644 --- a/arm_compute/core/NEON/kernels/convolution/NEDirectConvolution3x3.h +++ b/arm_compute/core/NEON/kernels/detail/NEDirectConvolution3x3.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * diff --git a/arm_compute/core/NEON/kernels/convolution/NEDirectConvolutionDetail.h b/arm_compute/core/NEON/kernels/detail/NEDirectConvolutionDetail.h index 908fa13876..908fa13876 100644 --- a/arm_compute/core/NEON/kernels/convolution/NEDirectConvolutionDetail.h +++ b/arm_compute/core/NEON/kernels/detail/NEDirectConvolutionDetail.h diff --git a/arm_compute/core/NEON/kernels/winograd/direct_convolution.hpp b/arm_compute/core/NEON/kernels/winograd/direct_convolution.hpp deleted file mode 100644 index 6a9984a24a..0000000000 --- a/arm_compute/core/NEON/kernels/winograd/direct_convolution.hpp +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (c) 2017 ARM Limited. - * - * SPDX-License-Identifier: MIT - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to - * deal in the Software without restriction, including without limitation the - * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or - * sell copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in all - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -#pragma once -#include "convolution.hpp" -#include "tensor.hpp" - -void direct_convolution( - const Tensor4D<Tensor4DShape, float>& input, - const Tensor4D<KernelShape, float>& kernel, - const Tensor4D<Tensor4DShape, float>& biases, - Tensor4D<Tensor4DShape, float>& output, - const PaddingType padding -); diff --git a/arm_compute/core/Types.h b/arm_compute/core/Types.h index 72be5cba2b..5a08ac9153 100644 --- a/arm_compute/core/Types.h +++ b/arm_compute/core/Types.h @@ -106,6 +106,13 @@ constexpr float SCALE_PYRAMID_HALF = 0.5f; /* Constant value used to indicate a ORB scaled pyramid */ constexpr float SCALE_PYRAMID_ORB = 8.408964152537146130583778358414e-01; +/** Supported tensor data layouts */ +enum class DataLayout +{ + NCHW, + NHWC +}; + /** Quantization settings (used for QASYMM8 data type) */ struct QuantizationInfo { diff --git a/arm_compute/core/Utils.h b/arm_compute/core/Utils.h index fc89d97073..111eac0e57 100644 --- a/arm_compute/core/Utils.h +++ b/arm_compute/core/Utils.h @@ -602,6 +602,16 @@ inline DataType data_type_for_convolution_matrix(const int16_t *conv, size_t siz } } +/** Calculate padding requirements in case of SAME padding + * + * @param[in] input_shape Input shape + * @param[in] weights_shape Weights shape + * @param[in] conv_info Convolution information (containing strides) + * + * @return PadStrideInfo for SAME padding + */ +PadStrideInfo calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info); + /** Returns expected shape for the deconvolution output tensor. * * @param[in] out_dims widht and height of the output tensor, these values can be obtained with the function deconvolution_output_dimensions. diff --git a/arm_compute/runtime/NEON/functions/NEDepthwiseConvolutionLayer.h b/arm_compute/runtime/NEON/functions/NEDepthwiseConvolutionLayer.h index e89ef88562..682effe84b 100644 --- a/arm_compute/runtime/NEON/functions/NEDepthwiseConvolutionLayer.h +++ b/arm_compute/runtime/NEON/functions/NEDepthwiseConvolutionLayer.h @@ -32,6 +32,7 @@ #include "arm_compute/core/NEON/kernels/NEFillBorderKernel.h" #include "arm_compute/core/NEON/kernels/NEGEMMMatrixVectorMultiplyKernel.h" #include "arm_compute/core/Types.h" +#include "arm_compute/runtime/CPP/functions/CPPPermute.h" #include "arm_compute/runtime/IFunction.h" #include "arm_compute/runtime/IMemoryManager.h" #include "arm_compute/runtime/MemoryGroup.h" @@ -67,12 +68,20 @@ public: void run() override; private: - NEDepthwiseConvolutionLayer3x3Kernel _kernel; + NEDepthwiseConvolutionLayer3x3Kernel _dwc_kernel; NEDirectConvolutionLayerOutputStageKernel _output_stage_kernel; NEFillBorderKernel _border_handler; + CPPPermute _permute_input; + CPPPermute _permute_weights; + CPPPermute _permute_output; Tensor _accumulator; + Tensor _input_nhwc; + Tensor _weights_hwio; + Tensor _output_nhwc; bool _has_bias; bool _is_quantized; + bool _is_optimized; + bool _are_weights_reshaped; }; /** Basic function to execute a generic depthwise convolution. This function calls the following NEON kernels: diff --git a/docs/Doxyfile b/docs/Doxyfile index 59aa780fd3..4046b373bc 100644 --- a/docs/Doxyfile +++ b/docs/Doxyfile @@ -856,7 +856,7 @@ RECURSIVE = YES # run. EXCLUDE = ./arm_compute/core/NEON/kernels/assembly/ \ - ./arm_compute/core/NEON/kernels/winograd/ + ./arm_compute/core/NEON/kernels/convolution/ # The EXCLUDE_SYMLINKS tag can be used to select whether or not files or # directories that are symbolic links (a Unix file system feature) are excluded diff --git a/examples/graph_mobilenet.cpp b/examples/graph_mobilenet.cpp index 83d1db9f0f..6d3a88e540 100644 --- a/examples/graph_mobilenet.cpp +++ b/examples/graph_mobilenet.cpp @@ -126,18 +126,18 @@ public: << ActivationLayer(ActivationLayerInfo(ActivationLayerInfo::ActivationFunction::BOUNDED_RELU, 6.f)) << get_dwsc_node(data_path, "Conv2d_1", 64 * depth_scale, PadStrideInfo(1, 1, 1, 1), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_2", 128 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_3", 128 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_4", 256 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_5", 256 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_6", 512 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_7", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_8", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_9", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_10", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_11", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_12", 1024 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) - << get_dwsc_node(data_path, "Conv2d_13", 1024 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::FLOOR), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_2", 128 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_3", 128 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_4", 256 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_5", 256 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_6", 512 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_7", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_8", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_9", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_10", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_11", 512 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_12", 1024 * depth_scale, PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) + << get_dwsc_node(data_path, "Conv2d_13", 1024 * depth_scale, PadStrideInfo(1, 1, 1, 1, 1, 1, DimensionRoundingType::CEIL), PadStrideInfo(1, 1, 0, 0)) << PoolingLayer(PoolingLayerInfo(PoolingType::AVG)) << ConvolutionLayer( 1U, 1U, 1001U, diff --git a/scripts/check_bad_style.sh b/scripts/check_bad_style.sh index 4cd69757d6..c9fa57f8eb 100755 --- a/scripts/check_bad_style.sh +++ b/scripts/check_bad_style.sh @@ -5,7 +5,7 @@ set -e DIRECTORIES="./arm_compute ./src ./examples ./tests ./utils ./support" -grep -HrnP --exclude-dir=assembly --exclude-dir=winograd "/\*\*$" $DIRECTORIES | tee bad_style.log +grep -HrnP --exclude-dir=assembly --exclude-dir=convolution "/\*\*$" $DIRECTORIES | tee bad_style.log if (( `cat bad_style.log | wc -l` > 0 )) then echo "" @@ -13,7 +13,7 @@ then exit -1 fi -grep -Hnr --exclude-dir=assembly --exclude-dir=winograd --exclude=Doxyfile "@brief" $DIRECTORIES | tee bad_style.log +grep -Hnr --exclude-dir=assembly --exclude-dir=convolution --exclude=Doxyfile "@brief" $DIRECTORIES | tee bad_style.log if (( `cat bad_style.log | wc -l` > 0 )) then echo "" @@ -21,7 +21,7 @@ then exit -1 fi -grep -HnRE --exclude-dir=assembly --exclude-dir=winograd "\buint " --exclude-dir=cl_kernels --exclude-dir=cs_shaders $DIRECTORIES | tee bad_style.log +grep -HnRE --exclude-dir=assembly --exclude-dir=convolution "\buint " --exclude-dir=cl_kernels --exclude-dir=cs_shaders $DIRECTORIES | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" @@ -29,7 +29,7 @@ then exit -1 fi -grep -HnR --exclude-dir=assembly --exclude-dir=winograd "float32_t" $DIRECTORIES | tee bad_style.log +grep -HnR --exclude-dir=assembly --exclude-dir=convolution "float32_t" $DIRECTORIES | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" @@ -37,7 +37,7 @@ then exit -1 fi -grep -Hnir --exclude-dir=assembly --exclude-dir=winograd "arm[_ ]\?cv" $DIRECTORIES | tee bad_style.log +grep -Hnir --exclude-dir=assembly --exclude-dir=convolution "arm[_ ]\?cv" $DIRECTORIES | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" @@ -45,7 +45,7 @@ then exit -1 fi -grep -Hnir --exclude-dir=assembly --exclude-dir=winograd "#.*if.*defined[^(]" $DIRECTORIES | tee bad_style.log +grep -Hnir --exclude-dir=assembly --exclude-dir=convolution "#.*if.*defined[^(]" $DIRECTORIES | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" @@ -53,7 +53,7 @@ then exit -1 fi -grep -Hnir --exclude-dir=assembly --exclude-dir=winograd "#else$\|#endif$" $DIRECTORIES | tee bad_style.log +grep -Hnir --exclude-dir=assembly --exclude-dir=convolution "#else$\|#endif$" $DIRECTORIES | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" @@ -61,7 +61,7 @@ then exit -1 fi -grep -Hnir --exclude-dir=assembly --exclude-dir=winograd "ARM_COMPUTE_AARCH64_V8_2" ./tests/validation/CL | tee bad_style.log +grep -Hnir --exclude-dir=assembly --exclude-dir=convolution "ARM_COMPUTE_AARCH64_V8_2" ./tests/validation/CL | tee bad_style.log if [[ $(cat bad_style.log | wc -l) > 0 ]] then echo "" diff --git a/scripts/clang_tidy_rules.py b/scripts/clang_tidy_rules.py index a250b519b9..fce84b0b9c 100755 --- a/scripts/clang_tidy_rules.py +++ b/scripts/clang_tidy_rules.py @@ -42,7 +42,7 @@ def filter_clang_tidy_lines( lines ): if "/assembly/" in line: continue - if "/winograd/" in line: + if "/convolution/" in line: continue if "error:" in line: diff --git a/src/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.cpp b/src/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.cpp index bc2f1ed266..92383d9f15 100644 --- a/src/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.cpp +++ b/src/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.cpp @@ -22,7 +22,7 @@ * SOFTWARE. */ #include "arm_compute/core/NEON/kernels/NEDepthwiseConvolutionLayer3x3Kernel.h" -#include "arm_compute/core/NEON/kernels/convolution/NEDirectConvolutionDetail.h" +#include "arm_compute/core/NEON/kernels/detail/NEDirectConvolutionDetail.h" #include "arm_compute/core/AccessWindowStatic.h" #include "arm_compute/core/AccessWindowTranspose.h" @@ -34,13 +34,16 @@ #include "arm_compute/core/TensorInfo.h" #include "arm_compute/core/TensorShape.h" #include "arm_compute/core/Types.h" +#include "arm_compute/core/Utils.h" #include "arm_compute/core/Validate.h" #include "arm_compute/core/Window.h" #include "arm_compute/core/utils/misc/ShapeCalculator.h" +#include "support/ToolchainSupport.h" using namespace arm_compute; using namespace arm_compute::detail; using namespace arm_compute::misc::shape_calculator; +using namespace depthwise; namespace { @@ -143,7 +146,7 @@ inline void convolve_3x3(const Window &window, unsigned int num_elems_written_pe } // namespace NEDepthwiseConvolutionLayer3x3Kernel::NEDepthwiseConvolutionLayer3x3Kernel() - : _border_size(0), _input(), _output(), _weights(), _conv_info(), _num_elems_written_per_iteration(0) + : _border_size(0), _input(), _output(), _weights(), _conv_info(), _convolver(nullptr), _num_elems_written_per_iteration(0), _run_optimized(false) { } @@ -152,35 +155,98 @@ BorderSize NEDepthwiseConvolutionLayer3x3Kernel::border_size() const return _border_size; } -void NEDepthwiseConvolutionLayer3x3Kernel::configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info) +void NEDepthwiseConvolutionLayer3x3Kernel::configure(const ITensor *input, const ITensor *weights, ITensor *output, const PadStrideInfo &conv_info, DataLayout data_layout) { ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(input, 1, DataType::QASYMM8, DataType::F32); ARM_COMPUTE_ERROR_ON_MISMATCHING_DATA_TYPES(input, weights); - ARM_COMPUTE_ERROR_ON(weights->info()->dimension(0) != 3 || weights->info()->dimension(1) != 3); + + _input = input; + _output = output; + _weights = weights; + _conv_info = conv_info; + _convolver = nullptr; + + _run_optimized = NEDepthwiseConvolutionLayer3x3Kernel::is_optimized_execution_possible(input->info()->tensor_shape(), + conv_info, + input->info()->data_type(), + data_layout); + + (_run_optimized) ? configure_optimized() : configure_generic(); +} + +void NEDepthwiseConvolutionLayer3x3Kernel::run(const Window &window, const ThreadInfo &info) +{ + ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); + ARM_COMPUTE_UNUSED(info); + + (_run_optimized) ? run_optimized(window, info) : run_generic(window, info); +} + +bool NEDepthwiseConvolutionLayer3x3Kernel::is_optimized_execution_possible(TensorShape input_shape, PadStrideInfo conv_info, DataType dt, DataLayout data_layout) +{ + // Reshape input shape if in NHWC format + TensorShape in_shape{ input_shape }; + if(data_layout == DataLayout::NHWC) + { + in_shape.set(Window::DimX, input_shape.y()); + in_shape.set(Window::DimY, input_shape.z()); + in_shape.set(Window::DimZ, input_shape.x()); + } + + // Check supported data type + bool supported_datatype = (dt == DataType::F32); + + // Check for supported strides + const auto &strides = conv_info.stride(); + bool supported_strides = (strides.first == strides.second) && ((strides.first == 1) || (strides.first == 2)); + + // Check for supported padding + const auto pad_top = conv_info.pad_top(); + const auto pad_right = conv_info.pad_right(); + const auto pad_bottom = conv_info.pad_bottom(); + const auto pad_left = conv_info.pad_left(); + PadStrideInfo same_pad = calculate_same_pad(in_shape, TensorShape(3U, 3U), conv_info); + bool is_same_padding = (pad_top == same_pad.pad_top()) && (pad_right == same_pad.pad_right()) && (pad_bottom == same_pad.pad_bottom()) && (pad_left == same_pad.pad_left()); + bool is_valid_padding = (pad_top == 0) && (pad_right == 0) && (pad_bottom == 0) && (pad_left == 0); + bool supported_padding = is_same_padding || is_valid_padding; + + return supported_datatype && supported_strides && supported_padding; +} + +void NEDepthwiseConvolutionLayer3x3Kernel::generate_convolver() +{ + ARM_COMPUTE_ERROR_ON_DATA_TYPE_CHANNEL_NOT_IN(_input, 1, DataType::F32); + ARM_COMPUTE_ERROR_ON_MISMATCHING_DATA_TYPES(_input, _weights); + ARM_COMPUTE_ERROR_ON(_weights->info()->dimension(1) != 3 || _weights->info()->dimension(2) != 3); + + _convolver = create_convolver_object(_input->info()->tensor_shape(), _conv_info, + _weights->buffer(), _input->buffer(), _output->buffer()); +} + +void NEDepthwiseConvolutionLayer3x3Kernel::configure_generic() +{ + ARM_COMPUTE_ERROR_ON(_weights->info()->dimension(0) != 3 || _weights->info()->dimension(1) != 3); // Get convolved dimensions - const TensorShape output_shape = compute_depthwise_convolution_shape(*input->info(), *weights->info(), conv_info); - const DataType output_dt = (input->info()->data_type() == DataType::QASYMM8) ? DataType::S32 : input->info()->data_type(); + const TensorShape output_shape = compute_depthwise_convolution_shape(*_input->info(), *_weights->info(), _conv_info); + const DataType output_dt = (_input->info()->data_type() == DataType::QASYMM8) ? DataType::S32 : _input->info()->data_type(); // Output auto inizialitation if not yet initialized - auto_init_if_empty(*output->info(), - input->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(output_shape).set_data_type(output_dt)); + auto_init_if_empty(*_output->info(), + _input->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(output_shape).set_data_type(output_dt)); - ARM_COMPUTE_ERROR_ON_MISMATCHING_DIMENSIONS(output->info()->tensor_shape(), output_shape); + ARM_COMPUTE_ERROR_ON_MISMATCHING_DIMENSIONS(_output->info()->tensor_shape(), output_shape); - _input = input; - _output = output; - _weights = weights; - _conv_info = conv_info; - const unsigned int conv_stride_x = conv_info.stride().first; - const unsigned int conv_stride_y = conv_info.stride().second; - const unsigned int conv_pad_left = conv_info.pad_left(); - const unsigned int conv_pad_top = conv_info.pad_top(); + const unsigned int conv_stride_x = _conv_info.stride().first; + const unsigned int conv_pad_top = _conv_info.pad_top(); + const unsigned int conv_pad_right = _conv_info.pad_right(); + const unsigned int conv_pad_bottom = _conv_info.pad_bottom(); + const unsigned int conv_pad_left = _conv_info.pad_left(); ARM_COMPUTE_ERROR_ON(conv_stride_x < 1 || conv_stride_x > 3); unsigned int num_elems_read_per_iteration = 0; - switch(input->info()->data_type()) + switch(_input->info()->data_type()) { case DataType::QASYMM8: num_elems_read_per_iteration = 16; @@ -193,31 +259,56 @@ void NEDepthwiseConvolutionLayer3x3Kernel::configure(const ITensor *input, const default: ARM_COMPUTE_ERROR("Data type not supported."); } - _border_size = BorderSize(conv_pad_top, conv_info.pad_right(), conv_info.pad_bottom(), conv_pad_left); + _border_size = BorderSize(conv_pad_top, conv_pad_right, conv_pad_bottom, conv_pad_left); // Configure kernel window - Window win = calculate_max_window(*output->info(), Steps(_num_elems_written_per_iteration)); + Window win = calculate_max_window(*_output->info(), Steps(_num_elems_written_per_iteration)); const unsigned int num_x_steps = (output_shape.x() + _num_elems_written_per_iteration - 1) / _num_elems_written_per_iteration; const int input_num_elems_processed = get_input_num_elems_processed(_num_elems_written_per_iteration, conv_stride_x); - AccessWindowStatic input_access(input->info(), + AccessWindowStatic input_access(_input->info(), -conv_pad_left, -conv_pad_top, (num_x_steps - 1) * input_num_elems_processed + num_elems_read_per_iteration, - conv_stride_y * (output_shape.y() - 1) + 2); - AccessWindowStatic weights_access(weights->info(), 0, 0, weights->info()->dimension(0), weights->info()->dimension(1)); - AccessWindowStatic output_access(output->info(), 0, 0, num_x_steps * _num_elems_written_per_iteration, output_shape.y()); + _input->info()->tensor_shape().y() + conv_pad_bottom); + AccessWindowStatic weights_access(_weights->info(), 0, 0, _weights->info()->dimension(0), _weights->info()->dimension(1)); + AccessWindowStatic output_access(_output->info(), 0, 0, num_x_steps * _num_elems_written_per_iteration, output_shape.y()); update_window_and_padding(win, input_access, weights_access, output_access); - output_access.set_valid_region(win, ValidRegion(Coordinates(), output->info()->tensor_shape())); + output_access.set_valid_region(win, ValidRegion(Coordinates(), _output->info()->tensor_shape())); INEKernel::configure(win); } -void NEDepthwiseConvolutionLayer3x3Kernel::run(const Window &window, const ThreadInfo &info) +void NEDepthwiseConvolutionLayer3x3Kernel::configure_optimized() +{ + ARM_COMPUTE_ERROR_ON(_weights->info()->dimension(1) != 3 || _weights->info()->dimension(2) != 3); + + _border_size = BorderSize(0, 0); + _convolver = create_convolver_object(_input->info()->tensor_shape(), _conv_info, + _weights->buffer(), _input->buffer(), _output->buffer()); + + // Auto-configure output + bool same_padding = _conv_info.has_padding(); + TensorShape output_shape{ _input->info()->tensor_shape() }; + + output_shape.set(1, _convolver->output_size(output_shape.y(), same_padding)); // Set width + output_shape.set(2, _convolver->output_size(output_shape.z(), same_padding)); // Set height + + // Output auto inizialitation if not yet initialized + auto_init_if_empty(*_output->info(), + _input->info()->clone()->set_is_resizable(true).reset_padding().set_tensor_shape(output_shape)); + + // Configure window + Window win; + auto win_last = _convolver->get_window(); + win.set(Window::DimX, Window::Dimension(0, win_last, 1)); + INEKernel::configure(win); +} + +void NEDepthwiseConvolutionLayer3x3Kernel::run_generic(const Window &window, const ThreadInfo &info) { - ARM_COMPUTE_ERROR_ON_UNCONFIGURED_KERNEL(this); ARM_COMPUTE_UNUSED(info); switch(_input->info()->data_type()) @@ -232,3 +323,53 @@ void NEDepthwiseConvolutionLayer3x3Kernel::run(const Window &window, const Threa ARM_COMPUTE_ERROR("Not implemented"); } } + +void NEDepthwiseConvolutionLayer3x3Kernel::run_optimized(const Window &window, const ThreadInfo &info) +{ + ARM_COMPUTE_UNUSED(info); + ARM_COMPUTE_ERROR_ON(!_convolver); + + const size_t start = window.x().start(); + const size_t end = window.x().end(); + _convolver->run(start, end); +} + +std::unique_ptr<depthwise::IDepthwiseConvolution> NEDepthwiseConvolutionLayer3x3Kernel::create_convolver_object(TensorShape shape, + PadStrideInfo conv_info, + const uint8_t *w_ptr, + uint8_t *in_ptr, + uint8_t *out_ptr) +{ + const int in_rows = shape.z(); + const int in_cols = shape.y(); + const int n_batches = shape[3]; + const int n_channels = shape.x(); + const bool padding_same = conv_info.has_padding(); + + const auto stride_x = conv_info.stride().first; + switch(stride_x) + { + case 1: + return arm_compute::support::cpp14::make_unique<DepthwiseConvolution<2, 2, 3, 3, 1, 1, float, float>>( + n_batches, + in_rows, + in_cols, + n_channels, + padding_same, + reinterpret_cast<const float *>(w_ptr), + reinterpret_cast<float *>(in_ptr), + reinterpret_cast<float *>(out_ptr)); + case 2: + return arm_compute::support::cpp14::make_unique<DepthwiseConvolution<2, 2, 3, 3, 2, 2, float, float>>( + n_batches, + in_rows, + in_cols, + n_channels, + padding_same, + reinterpret_cast<const float *>(w_ptr), + reinterpret_cast<float *>(in_ptr), + reinterpret_cast<float *>(out_ptr)); + default: + return nullptr; + } +}
\ No newline at end of file diff --git a/src/core/NEON/kernels/NEDirectConvolutionLayerKernel.cpp b/src/core/NEON/kernels/NEDirectConvolutionLayerKernel.cpp index cb8246d09e..c7534c59a6 100644 --- a/src/core/NEON/kernels/NEDirectConvolutionLayerKernel.cpp +++ b/src/core/NEON/kernels/NEDirectConvolutionLayerKernel.cpp @@ -22,7 +22,7 @@ * SOFTWARE. */ #include "arm_compute/core/NEON/kernels/NEDirectConvolutionLayerKernel.h" -#include "arm_compute/core/NEON/kernels/convolution/NEDirectConvolutionDetail.h" +#include "arm_compute/core/NEON/kernels/detail/NEDirectConvolutionDetail.h" #include "arm_compute/core/AccessWindowStatic.h" #include "arm_compute/core/Error.h" diff --git a/src/core/NEON/kernels/winograd/utils.cpp b/src/core/NEON/kernels/convolution/common/utils.cpp index 24d0386c76..24d0386c76 100644 --- a/src/core/NEON/kernels/winograd/utils.cpp +++ b/src/core/NEON/kernels/convolution/common/utils.cpp diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_1x1_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_1x1_fp32_fp32.cpp new file mode 100644 index 0000000000..fa50f79bc5 --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_1x1_fp32_fp32.cpp @@ -0,0 +1,439 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<2, 2, 3, 3, 1, 1, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<2, 2, 3, 3, 1, 1, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 2 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 2 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 2 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + }, // Input pad bottom = 2 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<2, 2, 3, 3, 1, 1, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_2x2_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_2x2_fp32_fp32.cpp new file mode 100644 index 0000000000..0ec5a77475 --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_2x2_3x3_2x2_fp32_fp32.cpp @@ -0,0 +1,1095 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<2, 2, 3, 3, 2, 2, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<2, 2, 3, 3, 2, 2, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 0, 0, 0>, + Conv::template process_tile<0, 0, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 0, 1, 0>, + Conv::template process_tile<0, 0, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 1, 0, 0>, + Conv::template process_tile<0, 0, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 1, 1, 0>, + Conv::template process_tile<0, 0, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 2, 0, 0>, + Conv::template process_tile<0, 0, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 2, 1, 0>, + Conv::template process_tile<0, 0, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 3, 0, 0>, + Conv::template process_tile<0, 0, 0, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 3, 1, 0>, + Conv::template process_tile<0, 0, 0, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 4, 0, 0>, + Conv::template process_tile<0, 0, 0, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 4, 1, 0>, + Conv::template process_tile<0, 0, 0, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 0, 0, 0>, + Conv::template process_tile<0, 0, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 0, 1, 0>, + Conv::template process_tile<0, 0, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 1, 0, 0>, + Conv::template process_tile<0, 0, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 1, 1, 0>, + Conv::template process_tile<0, 0, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 2, 0, 0>, + Conv::template process_tile<0, 0, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 2, 1, 0>, + Conv::template process_tile<0, 0, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 3, 0, 0>, + Conv::template process_tile<0, 0, 1, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 3, 1, 0>, + Conv::template process_tile<0, 0, 1, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 4, 0, 0>, + Conv::template process_tile<0, 0, 1, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 4, 1, 0>, + Conv::template process_tile<0, 0, 1, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 0, 0, 0>, + Conv::template process_tile<0, 0, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 0, 1, 0>, + Conv::template process_tile<0, 0, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 1, 0, 0>, + Conv::template process_tile<0, 0, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 1, 1, 0>, + Conv::template process_tile<0, 0, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 2, 0, 0>, + Conv::template process_tile<0, 0, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 2, 1, 0>, + Conv::template process_tile<0, 0, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 3, 0, 0>, + Conv::template process_tile<0, 0, 2, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 3, 1, 0>, + Conv::template process_tile<0, 0, 2, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 4, 0, 0>, + Conv::template process_tile<0, 0, 2, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 4, 1, 0>, + Conv::template process_tile<0, 0, 2, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 0, 0, 0>, + Conv::template process_tile<0, 0, 3, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 0, 1, 0>, + Conv::template process_tile<0, 0, 3, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 1, 0, 0>, + Conv::template process_tile<0, 0, 3, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 1, 1, 0>, + Conv::template process_tile<0, 0, 3, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 2, 0, 0>, + Conv::template process_tile<0, 0, 3, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 2, 1, 0>, + Conv::template process_tile<0, 0, 3, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 3, 0, 0>, + Conv::template process_tile<0, 0, 3, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 3, 1, 0>, + Conv::template process_tile<0, 0, 3, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 4, 0, 0>, + Conv::template process_tile<0, 0, 3, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 4, 1, 0>, + Conv::template process_tile<0, 0, 3, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 0, 0, 0>, + Conv::template process_tile<0, 0, 4, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 0, 1, 0>, + Conv::template process_tile<0, 0, 4, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 1, 0, 0>, + Conv::template process_tile<0, 0, 4, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 1, 1, 0>, + Conv::template process_tile<0, 0, 4, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 2, 0, 0>, + Conv::template process_tile<0, 0, 4, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 2, 1, 0>, + Conv::template process_tile<0, 0, 4, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 3, 0, 0>, + Conv::template process_tile<0, 0, 4, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 3, 1, 0>, + Conv::template process_tile<0, 0, 4, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 4, 0, 0>, + Conv::template process_tile<0, 0, 4, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 4, 1, 0>, + Conv::template process_tile<0, 0, 4, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 0, 0, 0>, + Conv::template process_tile<0, 1, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 0, 1, 0>, + Conv::template process_tile<0, 1, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 1, 0, 0>, + Conv::template process_tile<0, 1, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 1, 1, 0>, + Conv::template process_tile<0, 1, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 2, 0, 0>, + Conv::template process_tile<0, 1, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 2, 1, 0>, + Conv::template process_tile<0, 1, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 3, 0, 0>, + Conv::template process_tile<0, 1, 0, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 3, 1, 0>, + Conv::template process_tile<0, 1, 0, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 4, 0, 0>, + Conv::template process_tile<0, 1, 0, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 4, 1, 0>, + Conv::template process_tile<0, 1, 0, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 0, 0, 0>, + Conv::template process_tile<0, 1, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 0, 1, 0>, + Conv::template process_tile<0, 1, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 1, 0, 0>, + Conv::template process_tile<0, 1, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 1, 1, 0>, + Conv::template process_tile<0, 1, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 2, 0, 0>, + Conv::template process_tile<0, 1, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 2, 1, 0>, + Conv::template process_tile<0, 1, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 3, 0, 0>, + Conv::template process_tile<0, 1, 1, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 3, 1, 0>, + Conv::template process_tile<0, 1, 1, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 4, 0, 0>, + Conv::template process_tile<0, 1, 1, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 4, 1, 0>, + Conv::template process_tile<0, 1, 1, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 0, 0, 0>, + Conv::template process_tile<0, 1, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 0, 1, 0>, + Conv::template process_tile<0, 1, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 1, 0, 0>, + Conv::template process_tile<0, 1, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 1, 1, 0>, + Conv::template process_tile<0, 1, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 2, 0, 0>, + Conv::template process_tile<0, 1, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 2, 1, 0>, + Conv::template process_tile<0, 1, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 3, 0, 0>, + Conv::template process_tile<0, 1, 2, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 3, 1, 0>, + Conv::template process_tile<0, 1, 2, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 4, 0, 0>, + Conv::template process_tile<0, 1, 2, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 4, 1, 0>, + Conv::template process_tile<0, 1, 2, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 0, 0, 0>, + Conv::template process_tile<0, 1, 3, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 0, 1, 0>, + Conv::template process_tile<0, 1, 3, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 1, 0, 0>, + Conv::template process_tile<0, 1, 3, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 1, 1, 0>, + Conv::template process_tile<0, 1, 3, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 2, 0, 0>, + Conv::template process_tile<0, 1, 3, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 2, 1, 0>, + Conv::template process_tile<0, 1, 3, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 3, 0, 0>, + Conv::template process_tile<0, 1, 3, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 3, 1, 0>, + Conv::template process_tile<0, 1, 3, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 4, 0, 0>, + Conv::template process_tile<0, 1, 3, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 4, 1, 0>, + Conv::template process_tile<0, 1, 3, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 0, 0, 0>, + Conv::template process_tile<0, 1, 4, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 0, 1, 0>, + Conv::template process_tile<0, 1, 4, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 1, 0, 0>, + Conv::template process_tile<0, 1, 4, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 1, 1, 0>, + Conv::template process_tile<0, 1, 4, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 2, 0, 0>, + Conv::template process_tile<0, 1, 4, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 2, 1, 0>, + Conv::template process_tile<0, 1, 4, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 3, 0, 0>, + Conv::template process_tile<0, 1, 4, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 3, 1, 0>, + Conv::template process_tile<0, 1, 4, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 4, 0, 0>, + Conv::template process_tile<0, 1, 4, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 4, 1, 0>, + Conv::template process_tile<0, 1, 4, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 0, 0, 0>, + Conv::template process_tile<1, 0, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 0, 1, 0>, + Conv::template process_tile<1, 0, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 1, 0, 0>, + Conv::template process_tile<1, 0, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 1, 1, 0>, + Conv::template process_tile<1, 0, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 2, 0, 0>, + Conv::template process_tile<1, 0, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 2, 1, 0>, + Conv::template process_tile<1, 0, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 3, 0, 0>, + Conv::template process_tile<1, 0, 0, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 3, 1, 0>, + Conv::template process_tile<1, 0, 0, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 4, 0, 0>, + Conv::template process_tile<1, 0, 0, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 4, 1, 0>, + Conv::template process_tile<1, 0, 0, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 0, 0, 0>, + Conv::template process_tile<1, 0, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 0, 1, 0>, + Conv::template process_tile<1, 0, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 1, 0, 0>, + Conv::template process_tile<1, 0, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 1, 1, 0>, + Conv::template process_tile<1, 0, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 2, 0, 0>, + Conv::template process_tile<1, 0, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 2, 1, 0>, + Conv::template process_tile<1, 0, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 3, 0, 0>, + Conv::template process_tile<1, 0, 1, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 3, 1, 0>, + Conv::template process_tile<1, 0, 1, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 4, 0, 0>, + Conv::template process_tile<1, 0, 1, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 4, 1, 0>, + Conv::template process_tile<1, 0, 1, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 0, 0, 0>, + Conv::template process_tile<1, 0, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 0, 1, 0>, + Conv::template process_tile<1, 0, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 1, 0, 0>, + Conv::template process_tile<1, 0, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 1, 1, 0>, + Conv::template process_tile<1, 0, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 2, 0, 0>, + Conv::template process_tile<1, 0, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 2, 1, 0>, + Conv::template process_tile<1, 0, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 3, 0, 0>, + Conv::template process_tile<1, 0, 2, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 3, 1, 0>, + Conv::template process_tile<1, 0, 2, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 4, 0, 0>, + Conv::template process_tile<1, 0, 2, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 4, 1, 0>, + Conv::template process_tile<1, 0, 2, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 0, 0, 0>, + Conv::template process_tile<1, 0, 3, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 0, 1, 0>, + Conv::template process_tile<1, 0, 3, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 1, 0, 0>, + Conv::template process_tile<1, 0, 3, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 1, 1, 0>, + Conv::template process_tile<1, 0, 3, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 2, 0, 0>, + Conv::template process_tile<1, 0, 3, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 2, 1, 0>, + Conv::template process_tile<1, 0, 3, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 3, 0, 0>, + Conv::template process_tile<1, 0, 3, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 3, 1, 0>, + Conv::template process_tile<1, 0, 3, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 4, 0, 0>, + Conv::template process_tile<1, 0, 3, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 4, 1, 0>, + Conv::template process_tile<1, 0, 3, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 0, 0, 0>, + Conv::template process_tile<1, 0, 4, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 0, 1, 0>, + Conv::template process_tile<1, 0, 4, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 1, 0, 0>, + Conv::template process_tile<1, 0, 4, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 1, 1, 0>, + Conv::template process_tile<1, 0, 4, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 2, 0, 0>, + Conv::template process_tile<1, 0, 4, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 2, 1, 0>, + Conv::template process_tile<1, 0, 4, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 3, 0, 0>, + Conv::template process_tile<1, 0, 4, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 3, 1, 0>, + Conv::template process_tile<1, 0, 4, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 4, 0, 0>, + Conv::template process_tile<1, 0, 4, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 4, 1, 0>, + Conv::template process_tile<1, 0, 4, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 0, 0, 0>, + Conv::template process_tile<1, 1, 0, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 0, 1, 0>, + Conv::template process_tile<1, 1, 0, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 1, 0, 0>, + Conv::template process_tile<1, 1, 0, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 1, 1, 0>, + Conv::template process_tile<1, 1, 0, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 2, 0, 0>, + Conv::template process_tile<1, 1, 0, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 2, 1, 0>, + Conv::template process_tile<1, 1, 0, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 3, 0, 0>, + Conv::template process_tile<1, 1, 0, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 3, 1, 0>, + Conv::template process_tile<1, 1, 0, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 4, 0, 0>, + Conv::template process_tile<1, 1, 0, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 4, 1, 0>, + Conv::template process_tile<1, 1, 0, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 0, 0, 0>, + Conv::template process_tile<1, 1, 1, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 0, 1, 0>, + Conv::template process_tile<1, 1, 1, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 1, 0, 0>, + Conv::template process_tile<1, 1, 1, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 1, 1, 0>, + Conv::template process_tile<1, 1, 1, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 2, 0, 0>, + Conv::template process_tile<1, 1, 1, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 2, 1, 0>, + Conv::template process_tile<1, 1, 1, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 3, 0, 0>, + Conv::template process_tile<1, 1, 1, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 3, 1, 0>, + Conv::template process_tile<1, 1, 1, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 4, 0, 0>, + Conv::template process_tile<1, 1, 1, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 4, 1, 0>, + Conv::template process_tile<1, 1, 1, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 0, 0, 0>, + Conv::template process_tile<1, 1, 2, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 0, 1, 0>, + Conv::template process_tile<1, 1, 2, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 1, 0, 0>, + Conv::template process_tile<1, 1, 2, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 1, 1, 0>, + Conv::template process_tile<1, 1, 2, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 2, 0, 0>, + Conv::template process_tile<1, 1, 2, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 2, 1, 0>, + Conv::template process_tile<1, 1, 2, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 3, 0, 0>, + Conv::template process_tile<1, 1, 2, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 3, 1, 0>, + Conv::template process_tile<1, 1, 2, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 4, 0, 0>, + Conv::template process_tile<1, 1, 2, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 4, 1, 0>, + Conv::template process_tile<1, 1, 2, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 0, 0, 0>, + Conv::template process_tile<1, 1, 3, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 0, 1, 0>, + Conv::template process_tile<1, 1, 3, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 1, 0, 0>, + Conv::template process_tile<1, 1, 3, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 1, 1, 0>, + Conv::template process_tile<1, 1, 3, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 2, 0, 0>, + Conv::template process_tile<1, 1, 3, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 2, 1, 0>, + Conv::template process_tile<1, 1, 3, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 3, 0, 0>, + Conv::template process_tile<1, 1, 3, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 3, 1, 0>, + Conv::template process_tile<1, 1, 3, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 4, 0, 0>, + Conv::template process_tile<1, 1, 3, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 4, 1, 0>, + Conv::template process_tile<1, 1, 3, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 0, 0, 0>, + Conv::template process_tile<1, 1, 4, 0, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 0, 1, 0>, + Conv::template process_tile<1, 1, 4, 0, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 1, 0, 0>, + Conv::template process_tile<1, 1, 4, 1, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 1, 1, 0>, + Conv::template process_tile<1, 1, 4, 1, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 2, 0, 0>, + Conv::template process_tile<1, 1, 4, 2, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 2, 1, 0>, + Conv::template process_tile<1, 1, 4, 2, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 3, 0, 0>, + Conv::template process_tile<1, 1, 4, 3, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 3, 1, 0>, + Conv::template process_tile<1, 1, 4, 3, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 4, 0, 0>, + Conv::template process_tile<1, 1, 4, 4, 0, 1>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 4, 1, 0>, + Conv::template process_tile<1, 1, 4, 4, 1, 1>, + }, // Output pad bottom = 1 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<2, 2, 3, 3, 2, 2, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_1x1_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_1x1_fp32_fp32.cpp new file mode 100644 index 0000000000..dc3c383f99 --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_1x1_fp32_fp32.cpp @@ -0,0 +1,1175 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<3, 3, 3, 3, 1, 1, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<3, 3, 3, 3, 1, 1, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 0, 0, 0>, + Conv::template process_tile<0, 0, 0, 0, 0, 1>, + Conv::template process_tile<0, 0, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 0, 1, 0>, + Conv::template process_tile<0, 0, 0, 0, 1, 1>, + Conv::template process_tile<0, 0, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 0, 2, 0>, + Conv::template process_tile<0, 0, 0, 0, 2, 1>, + Conv::template process_tile<0, 0, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 1, 0, 0>, + Conv::template process_tile<0, 0, 0, 1, 0, 1>, + Conv::template process_tile<0, 0, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 1, 1, 0>, + Conv::template process_tile<0, 0, 0, 1, 1, 1>, + Conv::template process_tile<0, 0, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 1, 2, 0>, + Conv::template process_tile<0, 0, 0, 1, 2, 1>, + Conv::template process_tile<0, 0, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 2, 0, 0>, + Conv::template process_tile<0, 0, 0, 2, 0, 1>, + Conv::template process_tile<0, 0, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 2, 1, 0>, + Conv::template process_tile<0, 0, 0, 2, 1, 1>, + Conv::template process_tile<0, 0, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 2, 2, 0>, + Conv::template process_tile<0, 0, 0, 2, 2, 1>, + Conv::template process_tile<0, 0, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 3, 0, 0>, + Conv::template process_tile<0, 0, 0, 3, 0, 1>, + Conv::template process_tile<0, 0, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 3, 1, 0>, + Conv::template process_tile<0, 0, 0, 3, 1, 1>, + Conv::template process_tile<0, 0, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 3, 2, 0>, + Conv::template process_tile<0, 0, 0, 3, 2, 1>, + Conv::template process_tile<0, 0, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 0, 0, 0>, + Conv::template process_tile<0, 0, 1, 0, 0, 1>, + Conv::template process_tile<0, 0, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 0, 1, 0>, + Conv::template process_tile<0, 0, 1, 0, 1, 1>, + Conv::template process_tile<0, 0, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 0, 2, 0>, + Conv::template process_tile<0, 0, 1, 0, 2, 1>, + Conv::template process_tile<0, 0, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 1, 0, 0>, + Conv::template process_tile<0, 0, 1, 1, 0, 1>, + Conv::template process_tile<0, 0, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 1, 1, 0>, + Conv::template process_tile<0, 0, 1, 1, 1, 1>, + Conv::template process_tile<0, 0, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 1, 2, 0>, + Conv::template process_tile<0, 0, 1, 1, 2, 1>, + Conv::template process_tile<0, 0, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 2, 0, 0>, + Conv::template process_tile<0, 0, 1, 2, 0, 1>, + Conv::template process_tile<0, 0, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 2, 1, 0>, + Conv::template process_tile<0, 0, 1, 2, 1, 1>, + Conv::template process_tile<0, 0, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 2, 2, 0>, + Conv::template process_tile<0, 0, 1, 2, 2, 1>, + Conv::template process_tile<0, 0, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 3, 0, 0>, + Conv::template process_tile<0, 0, 1, 3, 0, 1>, + Conv::template process_tile<0, 0, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 3, 1, 0>, + Conv::template process_tile<0, 0, 1, 3, 1, 1>, + Conv::template process_tile<0, 0, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 3, 2, 0>, + Conv::template process_tile<0, 0, 1, 3, 2, 1>, + Conv::template process_tile<0, 0, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 0, 0, 0>, + Conv::template process_tile<0, 0, 2, 0, 0, 1>, + Conv::template process_tile<0, 0, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 0, 1, 0>, + Conv::template process_tile<0, 0, 2, 0, 1, 1>, + Conv::template process_tile<0, 0, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 0, 2, 0>, + Conv::template process_tile<0, 0, 2, 0, 2, 1>, + Conv::template process_tile<0, 0, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 1, 0, 0>, + Conv::template process_tile<0, 0, 2, 1, 0, 1>, + Conv::template process_tile<0, 0, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 1, 1, 0>, + Conv::template process_tile<0, 0, 2, 1, 1, 1>, + Conv::template process_tile<0, 0, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 1, 2, 0>, + Conv::template process_tile<0, 0, 2, 1, 2, 1>, + Conv::template process_tile<0, 0, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 2, 0, 0>, + Conv::template process_tile<0, 0, 2, 2, 0, 1>, + Conv::template process_tile<0, 0, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 2, 1, 0>, + Conv::template process_tile<0, 0, 2, 2, 1, 1>, + Conv::template process_tile<0, 0, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 2, 2, 0>, + Conv::template process_tile<0, 0, 2, 2, 2, 1>, + Conv::template process_tile<0, 0, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 3, 0, 0>, + Conv::template process_tile<0, 0, 2, 3, 0, 1>, + Conv::template process_tile<0, 0, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 3, 1, 0>, + Conv::template process_tile<0, 0, 2, 3, 1, 1>, + Conv::template process_tile<0, 0, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 3, 2, 0>, + Conv::template process_tile<0, 0, 2, 3, 2, 1>, + Conv::template process_tile<0, 0, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 0, 0, 0>, + Conv::template process_tile<0, 0, 3, 0, 0, 1>, + Conv::template process_tile<0, 0, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 0, 1, 0>, + Conv::template process_tile<0, 0, 3, 0, 1, 1>, + Conv::template process_tile<0, 0, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 0, 2, 0>, + Conv::template process_tile<0, 0, 3, 0, 2, 1>, + Conv::template process_tile<0, 0, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 1, 0, 0>, + Conv::template process_tile<0, 0, 3, 1, 0, 1>, + Conv::template process_tile<0, 0, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 1, 1, 0>, + Conv::template process_tile<0, 0, 3, 1, 1, 1>, + Conv::template process_tile<0, 0, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 1, 2, 0>, + Conv::template process_tile<0, 0, 3, 1, 2, 1>, + Conv::template process_tile<0, 0, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 2, 0, 0>, + Conv::template process_tile<0, 0, 3, 2, 0, 1>, + Conv::template process_tile<0, 0, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 2, 1, 0>, + Conv::template process_tile<0, 0, 3, 2, 1, 1>, + Conv::template process_tile<0, 0, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 2, 2, 0>, + Conv::template process_tile<0, 0, 3, 2, 2, 1>, + Conv::template process_tile<0, 0, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 3, 0, 0>, + Conv::template process_tile<0, 0, 3, 3, 0, 1>, + Conv::template process_tile<0, 0, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 3, 1, 0>, + Conv::template process_tile<0, 0, 3, 3, 1, 1>, + Conv::template process_tile<0, 0, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 3, 2, 0>, + Conv::template process_tile<0, 0, 3, 3, 2, 1>, + Conv::template process_tile<0, 0, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 3 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 0, 0, 0>, + Conv::template process_tile<0, 1, 0, 0, 0, 1>, + Conv::template process_tile<0, 1, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 0, 1, 0>, + Conv::template process_tile<0, 1, 0, 0, 1, 1>, + Conv::template process_tile<0, 1, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 0, 2, 0>, + Conv::template process_tile<0, 1, 0, 0, 2, 1>, + Conv::template process_tile<0, 1, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 1, 0, 0>, + Conv::template process_tile<0, 1, 0, 1, 0, 1>, + Conv::template process_tile<0, 1, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 1, 1, 0>, + Conv::template process_tile<0, 1, 0, 1, 1, 1>, + Conv::template process_tile<0, 1, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 1, 2, 0>, + Conv::template process_tile<0, 1, 0, 1, 2, 1>, + Conv::template process_tile<0, 1, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 2, 0, 0>, + Conv::template process_tile<0, 1, 0, 2, 0, 1>, + Conv::template process_tile<0, 1, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 2, 1, 0>, + Conv::template process_tile<0, 1, 0, 2, 1, 1>, + Conv::template process_tile<0, 1, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 2, 2, 0>, + Conv::template process_tile<0, 1, 0, 2, 2, 1>, + Conv::template process_tile<0, 1, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 3, 0, 0>, + Conv::template process_tile<0, 1, 0, 3, 0, 1>, + Conv::template process_tile<0, 1, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 3, 1, 0>, + Conv::template process_tile<0, 1, 0, 3, 1, 1>, + Conv::template process_tile<0, 1, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 3, 2, 0>, + Conv::template process_tile<0, 1, 0, 3, 2, 1>, + Conv::template process_tile<0, 1, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 0, 0, 0>, + Conv::template process_tile<0, 1, 1, 0, 0, 1>, + Conv::template process_tile<0, 1, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 0, 1, 0>, + Conv::template process_tile<0, 1, 1, 0, 1, 1>, + Conv::template process_tile<0, 1, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 0, 2, 0>, + Conv::template process_tile<0, 1, 1, 0, 2, 1>, + Conv::template process_tile<0, 1, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 1, 0, 0>, + Conv::template process_tile<0, 1, 1, 1, 0, 1>, + Conv::template process_tile<0, 1, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 1, 1, 0>, + Conv::template process_tile<0, 1, 1, 1, 1, 1>, + Conv::template process_tile<0, 1, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 1, 2, 0>, + Conv::template process_tile<0, 1, 1, 1, 2, 1>, + Conv::template process_tile<0, 1, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 2, 0, 0>, + Conv::template process_tile<0, 1, 1, 2, 0, 1>, + Conv::template process_tile<0, 1, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 2, 1, 0>, + Conv::template process_tile<0, 1, 1, 2, 1, 1>, + Conv::template process_tile<0, 1, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 2, 2, 0>, + Conv::template process_tile<0, 1, 1, 2, 2, 1>, + Conv::template process_tile<0, 1, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 3, 0, 0>, + Conv::template process_tile<0, 1, 1, 3, 0, 1>, + Conv::template process_tile<0, 1, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 3, 1, 0>, + Conv::template process_tile<0, 1, 1, 3, 1, 1>, + Conv::template process_tile<0, 1, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 3, 2, 0>, + Conv::template process_tile<0, 1, 1, 3, 2, 1>, + Conv::template process_tile<0, 1, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 0, 0, 0>, + Conv::template process_tile<0, 1, 2, 0, 0, 1>, + Conv::template process_tile<0, 1, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 0, 1, 0>, + Conv::template process_tile<0, 1, 2, 0, 1, 1>, + Conv::template process_tile<0, 1, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 0, 2, 0>, + Conv::template process_tile<0, 1, 2, 0, 2, 1>, + Conv::template process_tile<0, 1, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 1, 0, 0>, + Conv::template process_tile<0, 1, 2, 1, 0, 1>, + Conv::template process_tile<0, 1, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 1, 1, 0>, + Conv::template process_tile<0, 1, 2, 1, 1, 1>, + Conv::template process_tile<0, 1, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 1, 2, 0>, + Conv::template process_tile<0, 1, 2, 1, 2, 1>, + Conv::template process_tile<0, 1, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 2, 0, 0>, + Conv::template process_tile<0, 1, 2, 2, 0, 1>, + Conv::template process_tile<0, 1, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 2, 1, 0>, + Conv::template process_tile<0, 1, 2, 2, 1, 1>, + Conv::template process_tile<0, 1, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 2, 2, 0>, + Conv::template process_tile<0, 1, 2, 2, 2, 1>, + Conv::template process_tile<0, 1, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 3, 0, 0>, + Conv::template process_tile<0, 1, 2, 3, 0, 1>, + Conv::template process_tile<0, 1, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 3, 1, 0>, + Conv::template process_tile<0, 1, 2, 3, 1, 1>, + Conv::template process_tile<0, 1, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 3, 2, 0>, + Conv::template process_tile<0, 1, 2, 3, 2, 1>, + Conv::template process_tile<0, 1, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 0, 0, 0>, + Conv::template process_tile<0, 1, 3, 0, 0, 1>, + Conv::template process_tile<0, 1, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 0, 1, 0>, + Conv::template process_tile<0, 1, 3, 0, 1, 1>, + Conv::template process_tile<0, 1, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 0, 2, 0>, + Conv::template process_tile<0, 1, 3, 0, 2, 1>, + Conv::template process_tile<0, 1, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 1, 0, 0>, + Conv::template process_tile<0, 1, 3, 1, 0, 1>, + Conv::template process_tile<0, 1, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 1, 1, 0>, + Conv::template process_tile<0, 1, 3, 1, 1, 1>, + Conv::template process_tile<0, 1, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 1, 2, 0>, + Conv::template process_tile<0, 1, 3, 1, 2, 1>, + Conv::template process_tile<0, 1, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 2, 0, 0>, + Conv::template process_tile<0, 1, 3, 2, 0, 1>, + Conv::template process_tile<0, 1, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 2, 1, 0>, + Conv::template process_tile<0, 1, 3, 2, 1, 1>, + Conv::template process_tile<0, 1, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 2, 2, 0>, + Conv::template process_tile<0, 1, 3, 2, 2, 1>, + Conv::template process_tile<0, 1, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 3, 0, 0>, + Conv::template process_tile<0, 1, 3, 3, 0, 1>, + Conv::template process_tile<0, 1, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 3, 1, 0>, + Conv::template process_tile<0, 1, 3, 3, 1, 1>, + Conv::template process_tile<0, 1, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 3, 2, 0>, + Conv::template process_tile<0, 1, 3, 3, 2, 1>, + Conv::template process_tile<0, 1, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 3 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 0, 0, 0>, + Conv::template process_tile<1, 0, 0, 0, 0, 1>, + Conv::template process_tile<1, 0, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 0, 1, 0>, + Conv::template process_tile<1, 0, 0, 0, 1, 1>, + Conv::template process_tile<1, 0, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 0, 2, 0>, + Conv::template process_tile<1, 0, 0, 0, 2, 1>, + Conv::template process_tile<1, 0, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 1, 0, 0>, + Conv::template process_tile<1, 0, 0, 1, 0, 1>, + Conv::template process_tile<1, 0, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 1, 1, 0>, + Conv::template process_tile<1, 0, 0, 1, 1, 1>, + Conv::template process_tile<1, 0, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 1, 2, 0>, + Conv::template process_tile<1, 0, 0, 1, 2, 1>, + Conv::template process_tile<1, 0, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 2, 0, 0>, + Conv::template process_tile<1, 0, 0, 2, 0, 1>, + Conv::template process_tile<1, 0, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 2, 1, 0>, + Conv::template process_tile<1, 0, 0, 2, 1, 1>, + Conv::template process_tile<1, 0, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 2, 2, 0>, + Conv::template process_tile<1, 0, 0, 2, 2, 1>, + Conv::template process_tile<1, 0, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 3, 0, 0>, + Conv::template process_tile<1, 0, 0, 3, 0, 1>, + Conv::template process_tile<1, 0, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 3, 1, 0>, + Conv::template process_tile<1, 0, 0, 3, 1, 1>, + Conv::template process_tile<1, 0, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 3, 2, 0>, + Conv::template process_tile<1, 0, 0, 3, 2, 1>, + Conv::template process_tile<1, 0, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 0, 0, 0>, + Conv::template process_tile<1, 0, 1, 0, 0, 1>, + Conv::template process_tile<1, 0, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 0, 1, 0>, + Conv::template process_tile<1, 0, 1, 0, 1, 1>, + Conv::template process_tile<1, 0, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 0, 2, 0>, + Conv::template process_tile<1, 0, 1, 0, 2, 1>, + Conv::template process_tile<1, 0, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 1, 0, 0>, + Conv::template process_tile<1, 0, 1, 1, 0, 1>, + Conv::template process_tile<1, 0, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 1, 1, 0>, + Conv::template process_tile<1, 0, 1, 1, 1, 1>, + Conv::template process_tile<1, 0, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 1, 2, 0>, + Conv::template process_tile<1, 0, 1, 1, 2, 1>, + Conv::template process_tile<1, 0, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 2, 0, 0>, + Conv::template process_tile<1, 0, 1, 2, 0, 1>, + Conv::template process_tile<1, 0, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 2, 1, 0>, + Conv::template process_tile<1, 0, 1, 2, 1, 1>, + Conv::template process_tile<1, 0, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 2, 2, 0>, + Conv::template process_tile<1, 0, 1, 2, 2, 1>, + Conv::template process_tile<1, 0, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 3, 0, 0>, + Conv::template process_tile<1, 0, 1, 3, 0, 1>, + Conv::template process_tile<1, 0, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 3, 1, 0>, + Conv::template process_tile<1, 0, 1, 3, 1, 1>, + Conv::template process_tile<1, 0, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 3, 2, 0>, + Conv::template process_tile<1, 0, 1, 3, 2, 1>, + Conv::template process_tile<1, 0, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 0, 0, 0>, + Conv::template process_tile<1, 0, 2, 0, 0, 1>, + Conv::template process_tile<1, 0, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 0, 1, 0>, + Conv::template process_tile<1, 0, 2, 0, 1, 1>, + Conv::template process_tile<1, 0, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 0, 2, 0>, + Conv::template process_tile<1, 0, 2, 0, 2, 1>, + Conv::template process_tile<1, 0, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 1, 0, 0>, + Conv::template process_tile<1, 0, 2, 1, 0, 1>, + Conv::template process_tile<1, 0, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 1, 1, 0>, + Conv::template process_tile<1, 0, 2, 1, 1, 1>, + Conv::template process_tile<1, 0, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 1, 2, 0>, + Conv::template process_tile<1, 0, 2, 1, 2, 1>, + Conv::template process_tile<1, 0, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 2, 0, 0>, + Conv::template process_tile<1, 0, 2, 2, 0, 1>, + Conv::template process_tile<1, 0, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 2, 1, 0>, + Conv::template process_tile<1, 0, 2, 2, 1, 1>, + Conv::template process_tile<1, 0, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 2, 2, 0>, + Conv::template process_tile<1, 0, 2, 2, 2, 1>, + Conv::template process_tile<1, 0, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 3, 0, 0>, + Conv::template process_tile<1, 0, 2, 3, 0, 1>, + Conv::template process_tile<1, 0, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 3, 1, 0>, + Conv::template process_tile<1, 0, 2, 3, 1, 1>, + Conv::template process_tile<1, 0, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 3, 2, 0>, + Conv::template process_tile<1, 0, 2, 3, 2, 1>, + Conv::template process_tile<1, 0, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 0, 0, 0>, + Conv::template process_tile<1, 0, 3, 0, 0, 1>, + Conv::template process_tile<1, 0, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 0, 1, 0>, + Conv::template process_tile<1, 0, 3, 0, 1, 1>, + Conv::template process_tile<1, 0, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 0, 2, 0>, + Conv::template process_tile<1, 0, 3, 0, 2, 1>, + Conv::template process_tile<1, 0, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 1, 0, 0>, + Conv::template process_tile<1, 0, 3, 1, 0, 1>, + Conv::template process_tile<1, 0, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 1, 1, 0>, + Conv::template process_tile<1, 0, 3, 1, 1, 1>, + Conv::template process_tile<1, 0, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 1, 2, 0>, + Conv::template process_tile<1, 0, 3, 1, 2, 1>, + Conv::template process_tile<1, 0, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 2, 0, 0>, + Conv::template process_tile<1, 0, 3, 2, 0, 1>, + Conv::template process_tile<1, 0, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 2, 1, 0>, + Conv::template process_tile<1, 0, 3, 2, 1, 1>, + Conv::template process_tile<1, 0, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 2, 2, 0>, + Conv::template process_tile<1, 0, 3, 2, 2, 1>, + Conv::template process_tile<1, 0, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 3, 0, 0>, + Conv::template process_tile<1, 0, 3, 3, 0, 1>, + Conv::template process_tile<1, 0, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 3, 1, 0>, + Conv::template process_tile<1, 0, 3, 3, 1, 1>, + Conv::template process_tile<1, 0, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 3, 2, 0>, + Conv::template process_tile<1, 0, 3, 3, 2, 1>, + Conv::template process_tile<1, 0, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 3 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 0, 0, 0>, + Conv::template process_tile<1, 1, 0, 0, 0, 1>, + Conv::template process_tile<1, 1, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 0, 1, 0>, + Conv::template process_tile<1, 1, 0, 0, 1, 1>, + Conv::template process_tile<1, 1, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 0, 2, 0>, + Conv::template process_tile<1, 1, 0, 0, 2, 1>, + Conv::template process_tile<1, 1, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 1, 0, 0>, + Conv::template process_tile<1, 1, 0, 1, 0, 1>, + Conv::template process_tile<1, 1, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 1, 1, 0>, + Conv::template process_tile<1, 1, 0, 1, 1, 1>, + Conv::template process_tile<1, 1, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 1, 2, 0>, + Conv::template process_tile<1, 1, 0, 1, 2, 1>, + Conv::template process_tile<1, 1, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 2, 0, 0>, + Conv::template process_tile<1, 1, 0, 2, 0, 1>, + Conv::template process_tile<1, 1, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 2, 1, 0>, + Conv::template process_tile<1, 1, 0, 2, 1, 1>, + Conv::template process_tile<1, 1, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 2, 2, 0>, + Conv::template process_tile<1, 1, 0, 2, 2, 1>, + Conv::template process_tile<1, 1, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 3, 0, 0>, + Conv::template process_tile<1, 1, 0, 3, 0, 1>, + Conv::template process_tile<1, 1, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 3, 1, 0>, + Conv::template process_tile<1, 1, 0, 3, 1, 1>, + Conv::template process_tile<1, 1, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 3, 2, 0>, + Conv::template process_tile<1, 1, 0, 3, 2, 1>, + Conv::template process_tile<1, 1, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 0, 0, 0>, + Conv::template process_tile<1, 1, 1, 0, 0, 1>, + Conv::template process_tile<1, 1, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 0, 1, 0>, + Conv::template process_tile<1, 1, 1, 0, 1, 1>, + Conv::template process_tile<1, 1, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 0, 2, 0>, + Conv::template process_tile<1, 1, 1, 0, 2, 1>, + Conv::template process_tile<1, 1, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 1, 0, 0>, + Conv::template process_tile<1, 1, 1, 1, 0, 1>, + Conv::template process_tile<1, 1, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 1, 1, 0>, + Conv::template process_tile<1, 1, 1, 1, 1, 1>, + Conv::template process_tile<1, 1, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 1, 2, 0>, + Conv::template process_tile<1, 1, 1, 1, 2, 1>, + Conv::template process_tile<1, 1, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 2, 0, 0>, + Conv::template process_tile<1, 1, 1, 2, 0, 1>, + Conv::template process_tile<1, 1, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 2, 1, 0>, + Conv::template process_tile<1, 1, 1, 2, 1, 1>, + Conv::template process_tile<1, 1, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 2, 2, 0>, + Conv::template process_tile<1, 1, 1, 2, 2, 1>, + Conv::template process_tile<1, 1, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 3, 0, 0>, + Conv::template process_tile<1, 1, 1, 3, 0, 1>, + Conv::template process_tile<1, 1, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 3, 1, 0>, + Conv::template process_tile<1, 1, 1, 3, 1, 1>, + Conv::template process_tile<1, 1, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 3, 2, 0>, + Conv::template process_tile<1, 1, 1, 3, 2, 1>, + Conv::template process_tile<1, 1, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 0, 0, 0>, + Conv::template process_tile<1, 1, 2, 0, 0, 1>, + Conv::template process_tile<1, 1, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 0, 1, 0>, + Conv::template process_tile<1, 1, 2, 0, 1, 1>, + Conv::template process_tile<1, 1, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 0, 2, 0>, + Conv::template process_tile<1, 1, 2, 0, 2, 1>, + Conv::template process_tile<1, 1, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 1, 0, 0>, + Conv::template process_tile<1, 1, 2, 1, 0, 1>, + Conv::template process_tile<1, 1, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 1, 1, 0>, + Conv::template process_tile<1, 1, 2, 1, 1, 1>, + Conv::template process_tile<1, 1, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 1, 2, 0>, + Conv::template process_tile<1, 1, 2, 1, 2, 1>, + Conv::template process_tile<1, 1, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 2, 0, 0>, + Conv::template process_tile<1, 1, 2, 2, 0, 1>, + Conv::template process_tile<1, 1, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 2, 1, 0>, + Conv::template process_tile<1, 1, 2, 2, 1, 1>, + Conv::template process_tile<1, 1, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 2, 2, 0>, + Conv::template process_tile<1, 1, 2, 2, 2, 1>, + Conv::template process_tile<1, 1, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 3, 0, 0>, + Conv::template process_tile<1, 1, 2, 3, 0, 1>, + Conv::template process_tile<1, 1, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 3, 1, 0>, + Conv::template process_tile<1, 1, 2, 3, 1, 1>, + Conv::template process_tile<1, 1, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 3, 2, 0>, + Conv::template process_tile<1, 1, 2, 3, 2, 1>, + Conv::template process_tile<1, 1, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 0, 0, 0>, + Conv::template process_tile<1, 1, 3, 0, 0, 1>, + Conv::template process_tile<1, 1, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 0, 1, 0>, + Conv::template process_tile<1, 1, 3, 0, 1, 1>, + Conv::template process_tile<1, 1, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 0, 2, 0>, + Conv::template process_tile<1, 1, 3, 0, 2, 1>, + Conv::template process_tile<1, 1, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 1, 0, 0>, + Conv::template process_tile<1, 1, 3, 1, 0, 1>, + Conv::template process_tile<1, 1, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 1, 1, 0>, + Conv::template process_tile<1, 1, 3, 1, 1, 1>, + Conv::template process_tile<1, 1, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 1, 2, 0>, + Conv::template process_tile<1, 1, 3, 1, 2, 1>, + Conv::template process_tile<1, 1, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 2, 0, 0>, + Conv::template process_tile<1, 1, 3, 2, 0, 1>, + Conv::template process_tile<1, 1, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 2, 1, 0>, + Conv::template process_tile<1, 1, 3, 2, 1, 1>, + Conv::template process_tile<1, 1, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 2, 2, 0>, + Conv::template process_tile<1, 1, 3, 2, 2, 1>, + Conv::template process_tile<1, 1, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 3, 0, 0>, + Conv::template process_tile<1, 1, 3, 3, 0, 1>, + Conv::template process_tile<1, 1, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 3, 1, 0>, + Conv::template process_tile<1, 1, 3, 3, 1, 1>, + Conv::template process_tile<1, 1, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 3, 2, 0>, + Conv::template process_tile<1, 1, 3, 3, 2, 1>, + Conv::template process_tile<1, 1, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + }, // Input pad bottom = 3 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<3, 3, 3, 3, 1, 1, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_2x2_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_2x2_fp32_fp32.cpp new file mode 100644 index 0000000000..8d511b1a6c --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_3x3_3x3_2x2_fp32_fp32.cpp @@ -0,0 +1,3443 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<3, 3, 3, 3, 2, 2, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<3, 3, 3, 3, 2, 2, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 0, 0, 0>, + Conv::template process_tile<0, 0, 0, 0, 0, 1>, + Conv::template process_tile<0, 0, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 0, 1, 0>, + Conv::template process_tile<0, 0, 0, 0, 1, 1>, + Conv::template process_tile<0, 0, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 0, 2, 0>, + Conv::template process_tile<0, 0, 0, 0, 2, 1>, + Conv::template process_tile<0, 0, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 1, 0, 0>, + Conv::template process_tile<0, 0, 0, 1, 0, 1>, + Conv::template process_tile<0, 0, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 1, 1, 0>, + Conv::template process_tile<0, 0, 0, 1, 1, 1>, + Conv::template process_tile<0, 0, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 1, 2, 0>, + Conv::template process_tile<0, 0, 0, 1, 2, 1>, + Conv::template process_tile<0, 0, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 2, 0, 0>, + Conv::template process_tile<0, 0, 0, 2, 0, 1>, + Conv::template process_tile<0, 0, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 2, 1, 0>, + Conv::template process_tile<0, 0, 0, 2, 1, 1>, + Conv::template process_tile<0, 0, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 2, 2, 0>, + Conv::template process_tile<0, 0, 0, 2, 2, 1>, + Conv::template process_tile<0, 0, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 3, 0, 0>, + Conv::template process_tile<0, 0, 0, 3, 0, 1>, + Conv::template process_tile<0, 0, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 3, 1, 0>, + Conv::template process_tile<0, 0, 0, 3, 1, 1>, + Conv::template process_tile<0, 0, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 3, 2, 0>, + Conv::template process_tile<0, 0, 0, 3, 2, 1>, + Conv::template process_tile<0, 0, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 4, 0, 0>, + Conv::template process_tile<0, 0, 0, 4, 0, 1>, + Conv::template process_tile<0, 0, 0, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 4, 1, 0>, + Conv::template process_tile<0, 0, 0, 4, 1, 1>, + Conv::template process_tile<0, 0, 0, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 4, 2, 0>, + Conv::template process_tile<0, 0, 0, 4, 2, 1>, + Conv::template process_tile<0, 0, 0, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 5, 0, 0>, + Conv::template process_tile<0, 0, 0, 5, 0, 1>, + Conv::template process_tile<0, 0, 0, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 5, 1, 0>, + Conv::template process_tile<0, 0, 0, 5, 1, 1>, + Conv::template process_tile<0, 0, 0, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 5, 2, 0>, + Conv::template process_tile<0, 0, 0, 5, 2, 1>, + Conv::template process_tile<0, 0, 0, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 6, 0, 0>, + Conv::template process_tile<0, 0, 0, 6, 0, 1>, + Conv::template process_tile<0, 0, 0, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 6, 1, 0>, + Conv::template process_tile<0, 0, 0, 6, 1, 1>, + Conv::template process_tile<0, 0, 0, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 6, 2, 0>, + Conv::template process_tile<0, 0, 0, 6, 2, 1>, + Conv::template process_tile<0, 0, 0, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 0, 0, 0>, + Conv::template process_tile<0, 0, 1, 0, 0, 1>, + Conv::template process_tile<0, 0, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 0, 1, 0>, + Conv::template process_tile<0, 0, 1, 0, 1, 1>, + Conv::template process_tile<0, 0, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 0, 2, 0>, + Conv::template process_tile<0, 0, 1, 0, 2, 1>, + Conv::template process_tile<0, 0, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 1, 0, 0>, + Conv::template process_tile<0, 0, 1, 1, 0, 1>, + Conv::template process_tile<0, 0, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 1, 1, 0>, + Conv::template process_tile<0, 0, 1, 1, 1, 1>, + Conv::template process_tile<0, 0, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 1, 2, 0>, + Conv::template process_tile<0, 0, 1, 1, 2, 1>, + Conv::template process_tile<0, 0, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 2, 0, 0>, + Conv::template process_tile<0, 0, 1, 2, 0, 1>, + Conv::template process_tile<0, 0, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 2, 1, 0>, + Conv::template process_tile<0, 0, 1, 2, 1, 1>, + Conv::template process_tile<0, 0, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 2, 2, 0>, + Conv::template process_tile<0, 0, 1, 2, 2, 1>, + Conv::template process_tile<0, 0, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 3, 0, 0>, + Conv::template process_tile<0, 0, 1, 3, 0, 1>, + Conv::template process_tile<0, 0, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 3, 1, 0>, + Conv::template process_tile<0, 0, 1, 3, 1, 1>, + Conv::template process_tile<0, 0, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 3, 2, 0>, + Conv::template process_tile<0, 0, 1, 3, 2, 1>, + Conv::template process_tile<0, 0, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 4, 0, 0>, + Conv::template process_tile<0, 0, 1, 4, 0, 1>, + Conv::template process_tile<0, 0, 1, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 4, 1, 0>, + Conv::template process_tile<0, 0, 1, 4, 1, 1>, + Conv::template process_tile<0, 0, 1, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 4, 2, 0>, + Conv::template process_tile<0, 0, 1, 4, 2, 1>, + Conv::template process_tile<0, 0, 1, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 5, 0, 0>, + Conv::template process_tile<0, 0, 1, 5, 0, 1>, + Conv::template process_tile<0, 0, 1, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 5, 1, 0>, + Conv::template process_tile<0, 0, 1, 5, 1, 1>, + Conv::template process_tile<0, 0, 1, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 5, 2, 0>, + Conv::template process_tile<0, 0, 1, 5, 2, 1>, + Conv::template process_tile<0, 0, 1, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 6, 0, 0>, + Conv::template process_tile<0, 0, 1, 6, 0, 1>, + Conv::template process_tile<0, 0, 1, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 6, 1, 0>, + Conv::template process_tile<0, 0, 1, 6, 1, 1>, + Conv::template process_tile<0, 0, 1, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 6, 2, 0>, + Conv::template process_tile<0, 0, 1, 6, 2, 1>, + Conv::template process_tile<0, 0, 1, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 0, 0, 0>, + Conv::template process_tile<0, 0, 2, 0, 0, 1>, + Conv::template process_tile<0, 0, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 0, 1, 0>, + Conv::template process_tile<0, 0, 2, 0, 1, 1>, + Conv::template process_tile<0, 0, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 0, 2, 0>, + Conv::template process_tile<0, 0, 2, 0, 2, 1>, + Conv::template process_tile<0, 0, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 1, 0, 0>, + Conv::template process_tile<0, 0, 2, 1, 0, 1>, + Conv::template process_tile<0, 0, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 1, 1, 0>, + Conv::template process_tile<0, 0, 2, 1, 1, 1>, + Conv::template process_tile<0, 0, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 1, 2, 0>, + Conv::template process_tile<0, 0, 2, 1, 2, 1>, + Conv::template process_tile<0, 0, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 2, 0, 0>, + Conv::template process_tile<0, 0, 2, 2, 0, 1>, + Conv::template process_tile<0, 0, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 2, 1, 0>, + Conv::template process_tile<0, 0, 2, 2, 1, 1>, + Conv::template process_tile<0, 0, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 2, 2, 0>, + Conv::template process_tile<0, 0, 2, 2, 2, 1>, + Conv::template process_tile<0, 0, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 3, 0, 0>, + Conv::template process_tile<0, 0, 2, 3, 0, 1>, + Conv::template process_tile<0, 0, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 3, 1, 0>, + Conv::template process_tile<0, 0, 2, 3, 1, 1>, + Conv::template process_tile<0, 0, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 3, 2, 0>, + Conv::template process_tile<0, 0, 2, 3, 2, 1>, + Conv::template process_tile<0, 0, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 4, 0, 0>, + Conv::template process_tile<0, 0, 2, 4, 0, 1>, + Conv::template process_tile<0, 0, 2, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 4, 1, 0>, + Conv::template process_tile<0, 0, 2, 4, 1, 1>, + Conv::template process_tile<0, 0, 2, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 4, 2, 0>, + Conv::template process_tile<0, 0, 2, 4, 2, 1>, + Conv::template process_tile<0, 0, 2, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 5, 0, 0>, + Conv::template process_tile<0, 0, 2, 5, 0, 1>, + Conv::template process_tile<0, 0, 2, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 5, 1, 0>, + Conv::template process_tile<0, 0, 2, 5, 1, 1>, + Conv::template process_tile<0, 0, 2, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 5, 2, 0>, + Conv::template process_tile<0, 0, 2, 5, 2, 1>, + Conv::template process_tile<0, 0, 2, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 6, 0, 0>, + Conv::template process_tile<0, 0, 2, 6, 0, 1>, + Conv::template process_tile<0, 0, 2, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 6, 1, 0>, + Conv::template process_tile<0, 0, 2, 6, 1, 1>, + Conv::template process_tile<0, 0, 2, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 6, 2, 0>, + Conv::template process_tile<0, 0, 2, 6, 2, 1>, + Conv::template process_tile<0, 0, 2, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 0, 0, 0>, + Conv::template process_tile<0, 0, 3, 0, 0, 1>, + Conv::template process_tile<0, 0, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 0, 1, 0>, + Conv::template process_tile<0, 0, 3, 0, 1, 1>, + Conv::template process_tile<0, 0, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 0, 2, 0>, + Conv::template process_tile<0, 0, 3, 0, 2, 1>, + Conv::template process_tile<0, 0, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 1, 0, 0>, + Conv::template process_tile<0, 0, 3, 1, 0, 1>, + Conv::template process_tile<0, 0, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 1, 1, 0>, + Conv::template process_tile<0, 0, 3, 1, 1, 1>, + Conv::template process_tile<0, 0, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 1, 2, 0>, + Conv::template process_tile<0, 0, 3, 1, 2, 1>, + Conv::template process_tile<0, 0, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 2, 0, 0>, + Conv::template process_tile<0, 0, 3, 2, 0, 1>, + Conv::template process_tile<0, 0, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 2, 1, 0>, + Conv::template process_tile<0, 0, 3, 2, 1, 1>, + Conv::template process_tile<0, 0, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 2, 2, 0>, + Conv::template process_tile<0, 0, 3, 2, 2, 1>, + Conv::template process_tile<0, 0, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 3, 0, 0>, + Conv::template process_tile<0, 0, 3, 3, 0, 1>, + Conv::template process_tile<0, 0, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 3, 1, 0>, + Conv::template process_tile<0, 0, 3, 3, 1, 1>, + Conv::template process_tile<0, 0, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 3, 2, 0>, + Conv::template process_tile<0, 0, 3, 3, 2, 1>, + Conv::template process_tile<0, 0, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 4, 0, 0>, + Conv::template process_tile<0, 0, 3, 4, 0, 1>, + Conv::template process_tile<0, 0, 3, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 4, 1, 0>, + Conv::template process_tile<0, 0, 3, 4, 1, 1>, + Conv::template process_tile<0, 0, 3, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 4, 2, 0>, + Conv::template process_tile<0, 0, 3, 4, 2, 1>, + Conv::template process_tile<0, 0, 3, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 5, 0, 0>, + Conv::template process_tile<0, 0, 3, 5, 0, 1>, + Conv::template process_tile<0, 0, 3, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 5, 1, 0>, + Conv::template process_tile<0, 0, 3, 5, 1, 1>, + Conv::template process_tile<0, 0, 3, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 5, 2, 0>, + Conv::template process_tile<0, 0, 3, 5, 2, 1>, + Conv::template process_tile<0, 0, 3, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 6, 0, 0>, + Conv::template process_tile<0, 0, 3, 6, 0, 1>, + Conv::template process_tile<0, 0, 3, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 6, 1, 0>, + Conv::template process_tile<0, 0, 3, 6, 1, 1>, + Conv::template process_tile<0, 0, 3, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 6, 2, 0>, + Conv::template process_tile<0, 0, 3, 6, 2, 1>, + Conv::template process_tile<0, 0, 3, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 0, 0, 0>, + Conv::template process_tile<0, 0, 4, 0, 0, 1>, + Conv::template process_tile<0, 0, 4, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 0, 1, 0>, + Conv::template process_tile<0, 0, 4, 0, 1, 1>, + Conv::template process_tile<0, 0, 4, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 0, 2, 0>, + Conv::template process_tile<0, 0, 4, 0, 2, 1>, + Conv::template process_tile<0, 0, 4, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 1, 0, 0>, + Conv::template process_tile<0, 0, 4, 1, 0, 1>, + Conv::template process_tile<0, 0, 4, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 1, 1, 0>, + Conv::template process_tile<0, 0, 4, 1, 1, 1>, + Conv::template process_tile<0, 0, 4, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 1, 2, 0>, + Conv::template process_tile<0, 0, 4, 1, 2, 1>, + Conv::template process_tile<0, 0, 4, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 2, 0, 0>, + Conv::template process_tile<0, 0, 4, 2, 0, 1>, + Conv::template process_tile<0, 0, 4, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 2, 1, 0>, + Conv::template process_tile<0, 0, 4, 2, 1, 1>, + Conv::template process_tile<0, 0, 4, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 2, 2, 0>, + Conv::template process_tile<0, 0, 4, 2, 2, 1>, + Conv::template process_tile<0, 0, 4, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 3, 0, 0>, + Conv::template process_tile<0, 0, 4, 3, 0, 1>, + Conv::template process_tile<0, 0, 4, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 3, 1, 0>, + Conv::template process_tile<0, 0, 4, 3, 1, 1>, + Conv::template process_tile<0, 0, 4, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 3, 2, 0>, + Conv::template process_tile<0, 0, 4, 3, 2, 1>, + Conv::template process_tile<0, 0, 4, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 4, 0, 0>, + Conv::template process_tile<0, 0, 4, 4, 0, 1>, + Conv::template process_tile<0, 0, 4, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 4, 1, 0>, + Conv::template process_tile<0, 0, 4, 4, 1, 1>, + Conv::template process_tile<0, 0, 4, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 4, 2, 0>, + Conv::template process_tile<0, 0, 4, 4, 2, 1>, + Conv::template process_tile<0, 0, 4, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 5, 0, 0>, + Conv::template process_tile<0, 0, 4, 5, 0, 1>, + Conv::template process_tile<0, 0, 4, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 5, 1, 0>, + Conv::template process_tile<0, 0, 4, 5, 1, 1>, + Conv::template process_tile<0, 0, 4, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 5, 2, 0>, + Conv::template process_tile<0, 0, 4, 5, 2, 1>, + Conv::template process_tile<0, 0, 4, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 6, 0, 0>, + Conv::template process_tile<0, 0, 4, 6, 0, 1>, + Conv::template process_tile<0, 0, 4, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 6, 1, 0>, + Conv::template process_tile<0, 0, 4, 6, 1, 1>, + Conv::template process_tile<0, 0, 4, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 6, 2, 0>, + Conv::template process_tile<0, 0, 4, 6, 2, 1>, + Conv::template process_tile<0, 0, 4, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 0, 0, 0>, + Conv::template process_tile<0, 0, 5, 0, 0, 1>, + Conv::template process_tile<0, 0, 5, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 0, 1, 0>, + Conv::template process_tile<0, 0, 5, 0, 1, 1>, + Conv::template process_tile<0, 0, 5, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 0, 2, 0>, + Conv::template process_tile<0, 0, 5, 0, 2, 1>, + Conv::template process_tile<0, 0, 5, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 1, 0, 0>, + Conv::template process_tile<0, 0, 5, 1, 0, 1>, + Conv::template process_tile<0, 0, 5, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 1, 1, 0>, + Conv::template process_tile<0, 0, 5, 1, 1, 1>, + Conv::template process_tile<0, 0, 5, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 1, 2, 0>, + Conv::template process_tile<0, 0, 5, 1, 2, 1>, + Conv::template process_tile<0, 0, 5, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 2, 0, 0>, + Conv::template process_tile<0, 0, 5, 2, 0, 1>, + Conv::template process_tile<0, 0, 5, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 2, 1, 0>, + Conv::template process_tile<0, 0, 5, 2, 1, 1>, + Conv::template process_tile<0, 0, 5, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 2, 2, 0>, + Conv::template process_tile<0, 0, 5, 2, 2, 1>, + Conv::template process_tile<0, 0, 5, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 3, 0, 0>, + Conv::template process_tile<0, 0, 5, 3, 0, 1>, + Conv::template process_tile<0, 0, 5, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 3, 1, 0>, + Conv::template process_tile<0, 0, 5, 3, 1, 1>, + Conv::template process_tile<0, 0, 5, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 3, 2, 0>, + Conv::template process_tile<0, 0, 5, 3, 2, 1>, + Conv::template process_tile<0, 0, 5, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 4, 0, 0>, + Conv::template process_tile<0, 0, 5, 4, 0, 1>, + Conv::template process_tile<0, 0, 5, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 4, 1, 0>, + Conv::template process_tile<0, 0, 5, 4, 1, 1>, + Conv::template process_tile<0, 0, 5, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 4, 2, 0>, + Conv::template process_tile<0, 0, 5, 4, 2, 1>, + Conv::template process_tile<0, 0, 5, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 5, 0, 0>, + Conv::template process_tile<0, 0, 5, 5, 0, 1>, + Conv::template process_tile<0, 0, 5, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 5, 1, 0>, + Conv::template process_tile<0, 0, 5, 5, 1, 1>, + Conv::template process_tile<0, 0, 5, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 5, 2, 0>, + Conv::template process_tile<0, 0, 5, 5, 2, 1>, + Conv::template process_tile<0, 0, 5, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 6, 0, 0>, + Conv::template process_tile<0, 0, 5, 6, 0, 1>, + Conv::template process_tile<0, 0, 5, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 6, 1, 0>, + Conv::template process_tile<0, 0, 5, 6, 1, 1>, + Conv::template process_tile<0, 0, 5, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 6, 2, 0>, + Conv::template process_tile<0, 0, 5, 6, 2, 1>, + Conv::template process_tile<0, 0, 5, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 0, 0, 0>, + Conv::template process_tile<0, 0, 6, 0, 0, 1>, + Conv::template process_tile<0, 0, 6, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 0, 1, 0>, + Conv::template process_tile<0, 0, 6, 0, 1, 1>, + Conv::template process_tile<0, 0, 6, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 0, 2, 0>, + Conv::template process_tile<0, 0, 6, 0, 2, 1>, + Conv::template process_tile<0, 0, 6, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 1, 0, 0>, + Conv::template process_tile<0, 0, 6, 1, 0, 1>, + Conv::template process_tile<0, 0, 6, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 1, 1, 0>, + Conv::template process_tile<0, 0, 6, 1, 1, 1>, + Conv::template process_tile<0, 0, 6, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 1, 2, 0>, + Conv::template process_tile<0, 0, 6, 1, 2, 1>, + Conv::template process_tile<0, 0, 6, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 2, 0, 0>, + Conv::template process_tile<0, 0, 6, 2, 0, 1>, + Conv::template process_tile<0, 0, 6, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 2, 1, 0>, + Conv::template process_tile<0, 0, 6, 2, 1, 1>, + Conv::template process_tile<0, 0, 6, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 2, 2, 0>, + Conv::template process_tile<0, 0, 6, 2, 2, 1>, + Conv::template process_tile<0, 0, 6, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 3, 0, 0>, + Conv::template process_tile<0, 0, 6, 3, 0, 1>, + Conv::template process_tile<0, 0, 6, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 3, 1, 0>, + Conv::template process_tile<0, 0, 6, 3, 1, 1>, + Conv::template process_tile<0, 0, 6, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 3, 2, 0>, + Conv::template process_tile<0, 0, 6, 3, 2, 1>, + Conv::template process_tile<0, 0, 6, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 4, 0, 0>, + Conv::template process_tile<0, 0, 6, 4, 0, 1>, + Conv::template process_tile<0, 0, 6, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 4, 1, 0>, + Conv::template process_tile<0, 0, 6, 4, 1, 1>, + Conv::template process_tile<0, 0, 6, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 4, 2, 0>, + Conv::template process_tile<0, 0, 6, 4, 2, 1>, + Conv::template process_tile<0, 0, 6, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 5, 0, 0>, + Conv::template process_tile<0, 0, 6, 5, 0, 1>, + Conv::template process_tile<0, 0, 6, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 5, 1, 0>, + Conv::template process_tile<0, 0, 6, 5, 1, 1>, + Conv::template process_tile<0, 0, 6, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 5, 2, 0>, + Conv::template process_tile<0, 0, 6, 5, 2, 1>, + Conv::template process_tile<0, 0, 6, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 6, 0, 0>, + Conv::template process_tile<0, 0, 6, 6, 0, 1>, + Conv::template process_tile<0, 0, 6, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 6, 1, 0>, + Conv::template process_tile<0, 0, 6, 6, 1, 1>, + Conv::template process_tile<0, 0, 6, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 6, 2, 0>, + Conv::template process_tile<0, 0, 6, 6, 2, 1>, + Conv::template process_tile<0, 0, 6, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 0, 0, 0>, + Conv::template process_tile<0, 1, 0, 0, 0, 1>, + Conv::template process_tile<0, 1, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 0, 1, 0>, + Conv::template process_tile<0, 1, 0, 0, 1, 1>, + Conv::template process_tile<0, 1, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 0, 2, 0>, + Conv::template process_tile<0, 1, 0, 0, 2, 1>, + Conv::template process_tile<0, 1, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 1, 0, 0>, + Conv::template process_tile<0, 1, 0, 1, 0, 1>, + Conv::template process_tile<0, 1, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 1, 1, 0>, + Conv::template process_tile<0, 1, 0, 1, 1, 1>, + Conv::template process_tile<0, 1, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 1, 2, 0>, + Conv::template process_tile<0, 1, 0, 1, 2, 1>, + Conv::template process_tile<0, 1, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 2, 0, 0>, + Conv::template process_tile<0, 1, 0, 2, 0, 1>, + Conv::template process_tile<0, 1, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 2, 1, 0>, + Conv::template process_tile<0, 1, 0, 2, 1, 1>, + Conv::template process_tile<0, 1, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 2, 2, 0>, + Conv::template process_tile<0, 1, 0, 2, 2, 1>, + Conv::template process_tile<0, 1, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 3, 0, 0>, + Conv::template process_tile<0, 1, 0, 3, 0, 1>, + Conv::template process_tile<0, 1, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 3, 1, 0>, + Conv::template process_tile<0, 1, 0, 3, 1, 1>, + Conv::template process_tile<0, 1, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 3, 2, 0>, + Conv::template process_tile<0, 1, 0, 3, 2, 1>, + Conv::template process_tile<0, 1, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 4, 0, 0>, + Conv::template process_tile<0, 1, 0, 4, 0, 1>, + Conv::template process_tile<0, 1, 0, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 4, 1, 0>, + Conv::template process_tile<0, 1, 0, 4, 1, 1>, + Conv::template process_tile<0, 1, 0, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 4, 2, 0>, + Conv::template process_tile<0, 1, 0, 4, 2, 1>, + Conv::template process_tile<0, 1, 0, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 5, 0, 0>, + Conv::template process_tile<0, 1, 0, 5, 0, 1>, + Conv::template process_tile<0, 1, 0, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 5, 1, 0>, + Conv::template process_tile<0, 1, 0, 5, 1, 1>, + Conv::template process_tile<0, 1, 0, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 5, 2, 0>, + Conv::template process_tile<0, 1, 0, 5, 2, 1>, + Conv::template process_tile<0, 1, 0, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 6, 0, 0>, + Conv::template process_tile<0, 1, 0, 6, 0, 1>, + Conv::template process_tile<0, 1, 0, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 6, 1, 0>, + Conv::template process_tile<0, 1, 0, 6, 1, 1>, + Conv::template process_tile<0, 1, 0, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 6, 2, 0>, + Conv::template process_tile<0, 1, 0, 6, 2, 1>, + Conv::template process_tile<0, 1, 0, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 0, 0, 0>, + Conv::template process_tile<0, 1, 1, 0, 0, 1>, + Conv::template process_tile<0, 1, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 0, 1, 0>, + Conv::template process_tile<0, 1, 1, 0, 1, 1>, + Conv::template process_tile<0, 1, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 0, 2, 0>, + Conv::template process_tile<0, 1, 1, 0, 2, 1>, + Conv::template process_tile<0, 1, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 1, 0, 0>, + Conv::template process_tile<0, 1, 1, 1, 0, 1>, + Conv::template process_tile<0, 1, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 1, 1, 0>, + Conv::template process_tile<0, 1, 1, 1, 1, 1>, + Conv::template process_tile<0, 1, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 1, 2, 0>, + Conv::template process_tile<0, 1, 1, 1, 2, 1>, + Conv::template process_tile<0, 1, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 2, 0, 0>, + Conv::template process_tile<0, 1, 1, 2, 0, 1>, + Conv::template process_tile<0, 1, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 2, 1, 0>, + Conv::template process_tile<0, 1, 1, 2, 1, 1>, + Conv::template process_tile<0, 1, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 2, 2, 0>, + Conv::template process_tile<0, 1, 1, 2, 2, 1>, + Conv::template process_tile<0, 1, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 3, 0, 0>, + Conv::template process_tile<0, 1, 1, 3, 0, 1>, + Conv::template process_tile<0, 1, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 3, 1, 0>, + Conv::template process_tile<0, 1, 1, 3, 1, 1>, + Conv::template process_tile<0, 1, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 3, 2, 0>, + Conv::template process_tile<0, 1, 1, 3, 2, 1>, + Conv::template process_tile<0, 1, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 4, 0, 0>, + Conv::template process_tile<0, 1, 1, 4, 0, 1>, + Conv::template process_tile<0, 1, 1, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 4, 1, 0>, + Conv::template process_tile<0, 1, 1, 4, 1, 1>, + Conv::template process_tile<0, 1, 1, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 4, 2, 0>, + Conv::template process_tile<0, 1, 1, 4, 2, 1>, + Conv::template process_tile<0, 1, 1, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 5, 0, 0>, + Conv::template process_tile<0, 1, 1, 5, 0, 1>, + Conv::template process_tile<0, 1, 1, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 5, 1, 0>, + Conv::template process_tile<0, 1, 1, 5, 1, 1>, + Conv::template process_tile<0, 1, 1, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 5, 2, 0>, + Conv::template process_tile<0, 1, 1, 5, 2, 1>, + Conv::template process_tile<0, 1, 1, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 6, 0, 0>, + Conv::template process_tile<0, 1, 1, 6, 0, 1>, + Conv::template process_tile<0, 1, 1, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 6, 1, 0>, + Conv::template process_tile<0, 1, 1, 6, 1, 1>, + Conv::template process_tile<0, 1, 1, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 6, 2, 0>, + Conv::template process_tile<0, 1, 1, 6, 2, 1>, + Conv::template process_tile<0, 1, 1, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 0, 0, 0>, + Conv::template process_tile<0, 1, 2, 0, 0, 1>, + Conv::template process_tile<0, 1, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 0, 1, 0>, + Conv::template process_tile<0, 1, 2, 0, 1, 1>, + Conv::template process_tile<0, 1, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 0, 2, 0>, + Conv::template process_tile<0, 1, 2, 0, 2, 1>, + Conv::template process_tile<0, 1, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 1, 0, 0>, + Conv::template process_tile<0, 1, 2, 1, 0, 1>, + Conv::template process_tile<0, 1, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 1, 1, 0>, + Conv::template process_tile<0, 1, 2, 1, 1, 1>, + Conv::template process_tile<0, 1, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 1, 2, 0>, + Conv::template process_tile<0, 1, 2, 1, 2, 1>, + Conv::template process_tile<0, 1, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 2, 0, 0>, + Conv::template process_tile<0, 1, 2, 2, 0, 1>, + Conv::template process_tile<0, 1, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 2, 1, 0>, + Conv::template process_tile<0, 1, 2, 2, 1, 1>, + Conv::template process_tile<0, 1, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 2, 2, 0>, + Conv::template process_tile<0, 1, 2, 2, 2, 1>, + Conv::template process_tile<0, 1, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 3, 0, 0>, + Conv::template process_tile<0, 1, 2, 3, 0, 1>, + Conv::template process_tile<0, 1, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 3, 1, 0>, + Conv::template process_tile<0, 1, 2, 3, 1, 1>, + Conv::template process_tile<0, 1, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 3, 2, 0>, + Conv::template process_tile<0, 1, 2, 3, 2, 1>, + Conv::template process_tile<0, 1, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 4, 0, 0>, + Conv::template process_tile<0, 1, 2, 4, 0, 1>, + Conv::template process_tile<0, 1, 2, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 4, 1, 0>, + Conv::template process_tile<0, 1, 2, 4, 1, 1>, + Conv::template process_tile<0, 1, 2, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 4, 2, 0>, + Conv::template process_tile<0, 1, 2, 4, 2, 1>, + Conv::template process_tile<0, 1, 2, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 5, 0, 0>, + Conv::template process_tile<0, 1, 2, 5, 0, 1>, + Conv::template process_tile<0, 1, 2, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 5, 1, 0>, + Conv::template process_tile<0, 1, 2, 5, 1, 1>, + Conv::template process_tile<0, 1, 2, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 5, 2, 0>, + Conv::template process_tile<0, 1, 2, 5, 2, 1>, + Conv::template process_tile<0, 1, 2, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 6, 0, 0>, + Conv::template process_tile<0, 1, 2, 6, 0, 1>, + Conv::template process_tile<0, 1, 2, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 6, 1, 0>, + Conv::template process_tile<0, 1, 2, 6, 1, 1>, + Conv::template process_tile<0, 1, 2, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 6, 2, 0>, + Conv::template process_tile<0, 1, 2, 6, 2, 1>, + Conv::template process_tile<0, 1, 2, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 0, 0, 0>, + Conv::template process_tile<0, 1, 3, 0, 0, 1>, + Conv::template process_tile<0, 1, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 0, 1, 0>, + Conv::template process_tile<0, 1, 3, 0, 1, 1>, + Conv::template process_tile<0, 1, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 0, 2, 0>, + Conv::template process_tile<0, 1, 3, 0, 2, 1>, + Conv::template process_tile<0, 1, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 1, 0, 0>, + Conv::template process_tile<0, 1, 3, 1, 0, 1>, + Conv::template process_tile<0, 1, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 1, 1, 0>, + Conv::template process_tile<0, 1, 3, 1, 1, 1>, + Conv::template process_tile<0, 1, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 1, 2, 0>, + Conv::template process_tile<0, 1, 3, 1, 2, 1>, + Conv::template process_tile<0, 1, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 2, 0, 0>, + Conv::template process_tile<0, 1, 3, 2, 0, 1>, + Conv::template process_tile<0, 1, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 2, 1, 0>, + Conv::template process_tile<0, 1, 3, 2, 1, 1>, + Conv::template process_tile<0, 1, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 2, 2, 0>, + Conv::template process_tile<0, 1, 3, 2, 2, 1>, + Conv::template process_tile<0, 1, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 3, 0, 0>, + Conv::template process_tile<0, 1, 3, 3, 0, 1>, + Conv::template process_tile<0, 1, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 3, 1, 0>, + Conv::template process_tile<0, 1, 3, 3, 1, 1>, + Conv::template process_tile<0, 1, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 3, 2, 0>, + Conv::template process_tile<0, 1, 3, 3, 2, 1>, + Conv::template process_tile<0, 1, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 4, 0, 0>, + Conv::template process_tile<0, 1, 3, 4, 0, 1>, + Conv::template process_tile<0, 1, 3, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 4, 1, 0>, + Conv::template process_tile<0, 1, 3, 4, 1, 1>, + Conv::template process_tile<0, 1, 3, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 4, 2, 0>, + Conv::template process_tile<0, 1, 3, 4, 2, 1>, + Conv::template process_tile<0, 1, 3, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 5, 0, 0>, + Conv::template process_tile<0, 1, 3, 5, 0, 1>, + Conv::template process_tile<0, 1, 3, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 5, 1, 0>, + Conv::template process_tile<0, 1, 3, 5, 1, 1>, + Conv::template process_tile<0, 1, 3, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 5, 2, 0>, + Conv::template process_tile<0, 1, 3, 5, 2, 1>, + Conv::template process_tile<0, 1, 3, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 6, 0, 0>, + Conv::template process_tile<0, 1, 3, 6, 0, 1>, + Conv::template process_tile<0, 1, 3, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 6, 1, 0>, + Conv::template process_tile<0, 1, 3, 6, 1, 1>, + Conv::template process_tile<0, 1, 3, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 6, 2, 0>, + Conv::template process_tile<0, 1, 3, 6, 2, 1>, + Conv::template process_tile<0, 1, 3, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 0, 0, 0>, + Conv::template process_tile<0, 1, 4, 0, 0, 1>, + Conv::template process_tile<0, 1, 4, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 0, 1, 0>, + Conv::template process_tile<0, 1, 4, 0, 1, 1>, + Conv::template process_tile<0, 1, 4, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 0, 2, 0>, + Conv::template process_tile<0, 1, 4, 0, 2, 1>, + Conv::template process_tile<0, 1, 4, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 1, 0, 0>, + Conv::template process_tile<0, 1, 4, 1, 0, 1>, + Conv::template process_tile<0, 1, 4, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 1, 1, 0>, + Conv::template process_tile<0, 1, 4, 1, 1, 1>, + Conv::template process_tile<0, 1, 4, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 1, 2, 0>, + Conv::template process_tile<0, 1, 4, 1, 2, 1>, + Conv::template process_tile<0, 1, 4, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 2, 0, 0>, + Conv::template process_tile<0, 1, 4, 2, 0, 1>, + Conv::template process_tile<0, 1, 4, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 2, 1, 0>, + Conv::template process_tile<0, 1, 4, 2, 1, 1>, + Conv::template process_tile<0, 1, 4, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 2, 2, 0>, + Conv::template process_tile<0, 1, 4, 2, 2, 1>, + Conv::template process_tile<0, 1, 4, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 3, 0, 0>, + Conv::template process_tile<0, 1, 4, 3, 0, 1>, + Conv::template process_tile<0, 1, 4, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 3, 1, 0>, + Conv::template process_tile<0, 1, 4, 3, 1, 1>, + Conv::template process_tile<0, 1, 4, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 3, 2, 0>, + Conv::template process_tile<0, 1, 4, 3, 2, 1>, + Conv::template process_tile<0, 1, 4, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 4, 0, 0>, + Conv::template process_tile<0, 1, 4, 4, 0, 1>, + Conv::template process_tile<0, 1, 4, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 4, 1, 0>, + Conv::template process_tile<0, 1, 4, 4, 1, 1>, + Conv::template process_tile<0, 1, 4, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 4, 2, 0>, + Conv::template process_tile<0, 1, 4, 4, 2, 1>, + Conv::template process_tile<0, 1, 4, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 5, 0, 0>, + Conv::template process_tile<0, 1, 4, 5, 0, 1>, + Conv::template process_tile<0, 1, 4, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 5, 1, 0>, + Conv::template process_tile<0, 1, 4, 5, 1, 1>, + Conv::template process_tile<0, 1, 4, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 5, 2, 0>, + Conv::template process_tile<0, 1, 4, 5, 2, 1>, + Conv::template process_tile<0, 1, 4, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 6, 0, 0>, + Conv::template process_tile<0, 1, 4, 6, 0, 1>, + Conv::template process_tile<0, 1, 4, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 6, 1, 0>, + Conv::template process_tile<0, 1, 4, 6, 1, 1>, + Conv::template process_tile<0, 1, 4, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 6, 2, 0>, + Conv::template process_tile<0, 1, 4, 6, 2, 1>, + Conv::template process_tile<0, 1, 4, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 0, 0, 0>, + Conv::template process_tile<0, 1, 5, 0, 0, 1>, + Conv::template process_tile<0, 1, 5, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 0, 1, 0>, + Conv::template process_tile<0, 1, 5, 0, 1, 1>, + Conv::template process_tile<0, 1, 5, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 0, 2, 0>, + Conv::template process_tile<0, 1, 5, 0, 2, 1>, + Conv::template process_tile<0, 1, 5, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 1, 0, 0>, + Conv::template process_tile<0, 1, 5, 1, 0, 1>, + Conv::template process_tile<0, 1, 5, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 1, 1, 0>, + Conv::template process_tile<0, 1, 5, 1, 1, 1>, + Conv::template process_tile<0, 1, 5, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 1, 2, 0>, + Conv::template process_tile<0, 1, 5, 1, 2, 1>, + Conv::template process_tile<0, 1, 5, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 2, 0, 0>, + Conv::template process_tile<0, 1, 5, 2, 0, 1>, + Conv::template process_tile<0, 1, 5, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 2, 1, 0>, + Conv::template process_tile<0, 1, 5, 2, 1, 1>, + Conv::template process_tile<0, 1, 5, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 2, 2, 0>, + Conv::template process_tile<0, 1, 5, 2, 2, 1>, + Conv::template process_tile<0, 1, 5, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 3, 0, 0>, + Conv::template process_tile<0, 1, 5, 3, 0, 1>, + Conv::template process_tile<0, 1, 5, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 3, 1, 0>, + Conv::template process_tile<0, 1, 5, 3, 1, 1>, + Conv::template process_tile<0, 1, 5, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 3, 2, 0>, + Conv::template process_tile<0, 1, 5, 3, 2, 1>, + Conv::template process_tile<0, 1, 5, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 4, 0, 0>, + Conv::template process_tile<0, 1, 5, 4, 0, 1>, + Conv::template process_tile<0, 1, 5, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 4, 1, 0>, + Conv::template process_tile<0, 1, 5, 4, 1, 1>, + Conv::template process_tile<0, 1, 5, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 4, 2, 0>, + Conv::template process_tile<0, 1, 5, 4, 2, 1>, + Conv::template process_tile<0, 1, 5, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 5, 0, 0>, + Conv::template process_tile<0, 1, 5, 5, 0, 1>, + Conv::template process_tile<0, 1, 5, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 5, 1, 0>, + Conv::template process_tile<0, 1, 5, 5, 1, 1>, + Conv::template process_tile<0, 1, 5, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 5, 2, 0>, + Conv::template process_tile<0, 1, 5, 5, 2, 1>, + Conv::template process_tile<0, 1, 5, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 6, 0, 0>, + Conv::template process_tile<0, 1, 5, 6, 0, 1>, + Conv::template process_tile<0, 1, 5, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 6, 1, 0>, + Conv::template process_tile<0, 1, 5, 6, 1, 1>, + Conv::template process_tile<0, 1, 5, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 6, 2, 0>, + Conv::template process_tile<0, 1, 5, 6, 2, 1>, + Conv::template process_tile<0, 1, 5, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 0, 0, 0>, + Conv::template process_tile<0, 1, 6, 0, 0, 1>, + Conv::template process_tile<0, 1, 6, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 0, 1, 0>, + Conv::template process_tile<0, 1, 6, 0, 1, 1>, + Conv::template process_tile<0, 1, 6, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 0, 2, 0>, + Conv::template process_tile<0, 1, 6, 0, 2, 1>, + Conv::template process_tile<0, 1, 6, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 1, 0, 0>, + Conv::template process_tile<0, 1, 6, 1, 0, 1>, + Conv::template process_tile<0, 1, 6, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 1, 1, 0>, + Conv::template process_tile<0, 1, 6, 1, 1, 1>, + Conv::template process_tile<0, 1, 6, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 1, 2, 0>, + Conv::template process_tile<0, 1, 6, 1, 2, 1>, + Conv::template process_tile<0, 1, 6, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 2, 0, 0>, + Conv::template process_tile<0, 1, 6, 2, 0, 1>, + Conv::template process_tile<0, 1, 6, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 2, 1, 0>, + Conv::template process_tile<0, 1, 6, 2, 1, 1>, + Conv::template process_tile<0, 1, 6, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 2, 2, 0>, + Conv::template process_tile<0, 1, 6, 2, 2, 1>, + Conv::template process_tile<0, 1, 6, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 3, 0, 0>, + Conv::template process_tile<0, 1, 6, 3, 0, 1>, + Conv::template process_tile<0, 1, 6, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 3, 1, 0>, + Conv::template process_tile<0, 1, 6, 3, 1, 1>, + Conv::template process_tile<0, 1, 6, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 3, 2, 0>, + Conv::template process_tile<0, 1, 6, 3, 2, 1>, + Conv::template process_tile<0, 1, 6, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 4, 0, 0>, + Conv::template process_tile<0, 1, 6, 4, 0, 1>, + Conv::template process_tile<0, 1, 6, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 4, 1, 0>, + Conv::template process_tile<0, 1, 6, 4, 1, 1>, + Conv::template process_tile<0, 1, 6, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 4, 2, 0>, + Conv::template process_tile<0, 1, 6, 4, 2, 1>, + Conv::template process_tile<0, 1, 6, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 5, 0, 0>, + Conv::template process_tile<0, 1, 6, 5, 0, 1>, + Conv::template process_tile<0, 1, 6, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 5, 1, 0>, + Conv::template process_tile<0, 1, 6, 5, 1, 1>, + Conv::template process_tile<0, 1, 6, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 5, 2, 0>, + Conv::template process_tile<0, 1, 6, 5, 2, 1>, + Conv::template process_tile<0, 1, 6, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 6, 0, 0>, + Conv::template process_tile<0, 1, 6, 6, 0, 1>, + Conv::template process_tile<0, 1, 6, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 6, 1, 0>, + Conv::template process_tile<0, 1, 6, 6, 1, 1>, + Conv::template process_tile<0, 1, 6, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 6, 2, 0>, + Conv::template process_tile<0, 1, 6, 6, 2, 1>, + Conv::template process_tile<0, 1, 6, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 0, 0, 0>, + Conv::template process_tile<1, 0, 0, 0, 0, 1>, + Conv::template process_tile<1, 0, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 0, 1, 0>, + Conv::template process_tile<1, 0, 0, 0, 1, 1>, + Conv::template process_tile<1, 0, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 0, 2, 0>, + Conv::template process_tile<1, 0, 0, 0, 2, 1>, + Conv::template process_tile<1, 0, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 1, 0, 0>, + Conv::template process_tile<1, 0, 0, 1, 0, 1>, + Conv::template process_tile<1, 0, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 1, 1, 0>, + Conv::template process_tile<1, 0, 0, 1, 1, 1>, + Conv::template process_tile<1, 0, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 1, 2, 0>, + Conv::template process_tile<1, 0, 0, 1, 2, 1>, + Conv::template process_tile<1, 0, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 2, 0, 0>, + Conv::template process_tile<1, 0, 0, 2, 0, 1>, + Conv::template process_tile<1, 0, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 2, 1, 0>, + Conv::template process_tile<1, 0, 0, 2, 1, 1>, + Conv::template process_tile<1, 0, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 2, 2, 0>, + Conv::template process_tile<1, 0, 0, 2, 2, 1>, + Conv::template process_tile<1, 0, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 3, 0, 0>, + Conv::template process_tile<1, 0, 0, 3, 0, 1>, + Conv::template process_tile<1, 0, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 3, 1, 0>, + Conv::template process_tile<1, 0, 0, 3, 1, 1>, + Conv::template process_tile<1, 0, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 3, 2, 0>, + Conv::template process_tile<1, 0, 0, 3, 2, 1>, + Conv::template process_tile<1, 0, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 4, 0, 0>, + Conv::template process_tile<1, 0, 0, 4, 0, 1>, + Conv::template process_tile<1, 0, 0, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 4, 1, 0>, + Conv::template process_tile<1, 0, 0, 4, 1, 1>, + Conv::template process_tile<1, 0, 0, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 4, 2, 0>, + Conv::template process_tile<1, 0, 0, 4, 2, 1>, + Conv::template process_tile<1, 0, 0, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 5, 0, 0>, + Conv::template process_tile<1, 0, 0, 5, 0, 1>, + Conv::template process_tile<1, 0, 0, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 5, 1, 0>, + Conv::template process_tile<1, 0, 0, 5, 1, 1>, + Conv::template process_tile<1, 0, 0, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 5, 2, 0>, + Conv::template process_tile<1, 0, 0, 5, 2, 1>, + Conv::template process_tile<1, 0, 0, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 6, 0, 0>, + Conv::template process_tile<1, 0, 0, 6, 0, 1>, + Conv::template process_tile<1, 0, 0, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 6, 1, 0>, + Conv::template process_tile<1, 0, 0, 6, 1, 1>, + Conv::template process_tile<1, 0, 0, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 6, 2, 0>, + Conv::template process_tile<1, 0, 0, 6, 2, 1>, + Conv::template process_tile<1, 0, 0, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 0, 0, 0>, + Conv::template process_tile<1, 0, 1, 0, 0, 1>, + Conv::template process_tile<1, 0, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 0, 1, 0>, + Conv::template process_tile<1, 0, 1, 0, 1, 1>, + Conv::template process_tile<1, 0, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 0, 2, 0>, + Conv::template process_tile<1, 0, 1, 0, 2, 1>, + Conv::template process_tile<1, 0, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 1, 0, 0>, + Conv::template process_tile<1, 0, 1, 1, 0, 1>, + Conv::template process_tile<1, 0, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 1, 1, 0>, + Conv::template process_tile<1, 0, 1, 1, 1, 1>, + Conv::template process_tile<1, 0, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 1, 2, 0>, + Conv::template process_tile<1, 0, 1, 1, 2, 1>, + Conv::template process_tile<1, 0, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 2, 0, 0>, + Conv::template process_tile<1, 0, 1, 2, 0, 1>, + Conv::template process_tile<1, 0, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 2, 1, 0>, + Conv::template process_tile<1, 0, 1, 2, 1, 1>, + Conv::template process_tile<1, 0, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 2, 2, 0>, + Conv::template process_tile<1, 0, 1, 2, 2, 1>, + Conv::template process_tile<1, 0, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 3, 0, 0>, + Conv::template process_tile<1, 0, 1, 3, 0, 1>, + Conv::template process_tile<1, 0, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 3, 1, 0>, + Conv::template process_tile<1, 0, 1, 3, 1, 1>, + Conv::template process_tile<1, 0, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 3, 2, 0>, + Conv::template process_tile<1, 0, 1, 3, 2, 1>, + Conv::template process_tile<1, 0, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 4, 0, 0>, + Conv::template process_tile<1, 0, 1, 4, 0, 1>, + Conv::template process_tile<1, 0, 1, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 4, 1, 0>, + Conv::template process_tile<1, 0, 1, 4, 1, 1>, + Conv::template process_tile<1, 0, 1, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 4, 2, 0>, + Conv::template process_tile<1, 0, 1, 4, 2, 1>, + Conv::template process_tile<1, 0, 1, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 5, 0, 0>, + Conv::template process_tile<1, 0, 1, 5, 0, 1>, + Conv::template process_tile<1, 0, 1, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 5, 1, 0>, + Conv::template process_tile<1, 0, 1, 5, 1, 1>, + Conv::template process_tile<1, 0, 1, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 5, 2, 0>, + Conv::template process_tile<1, 0, 1, 5, 2, 1>, + Conv::template process_tile<1, 0, 1, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 6, 0, 0>, + Conv::template process_tile<1, 0, 1, 6, 0, 1>, + Conv::template process_tile<1, 0, 1, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 6, 1, 0>, + Conv::template process_tile<1, 0, 1, 6, 1, 1>, + Conv::template process_tile<1, 0, 1, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 6, 2, 0>, + Conv::template process_tile<1, 0, 1, 6, 2, 1>, + Conv::template process_tile<1, 0, 1, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 0, 0, 0>, + Conv::template process_tile<1, 0, 2, 0, 0, 1>, + Conv::template process_tile<1, 0, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 0, 1, 0>, + Conv::template process_tile<1, 0, 2, 0, 1, 1>, + Conv::template process_tile<1, 0, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 0, 2, 0>, + Conv::template process_tile<1, 0, 2, 0, 2, 1>, + Conv::template process_tile<1, 0, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 1, 0, 0>, + Conv::template process_tile<1, 0, 2, 1, 0, 1>, + Conv::template process_tile<1, 0, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 1, 1, 0>, + Conv::template process_tile<1, 0, 2, 1, 1, 1>, + Conv::template process_tile<1, 0, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 1, 2, 0>, + Conv::template process_tile<1, 0, 2, 1, 2, 1>, + Conv::template process_tile<1, 0, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 2, 0, 0>, + Conv::template process_tile<1, 0, 2, 2, 0, 1>, + Conv::template process_tile<1, 0, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 2, 1, 0>, + Conv::template process_tile<1, 0, 2, 2, 1, 1>, + Conv::template process_tile<1, 0, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 2, 2, 0>, + Conv::template process_tile<1, 0, 2, 2, 2, 1>, + Conv::template process_tile<1, 0, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 3, 0, 0>, + Conv::template process_tile<1, 0, 2, 3, 0, 1>, + Conv::template process_tile<1, 0, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 3, 1, 0>, + Conv::template process_tile<1, 0, 2, 3, 1, 1>, + Conv::template process_tile<1, 0, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 3, 2, 0>, + Conv::template process_tile<1, 0, 2, 3, 2, 1>, + Conv::template process_tile<1, 0, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 4, 0, 0>, + Conv::template process_tile<1, 0, 2, 4, 0, 1>, + Conv::template process_tile<1, 0, 2, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 4, 1, 0>, + Conv::template process_tile<1, 0, 2, 4, 1, 1>, + Conv::template process_tile<1, 0, 2, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 4, 2, 0>, + Conv::template process_tile<1, 0, 2, 4, 2, 1>, + Conv::template process_tile<1, 0, 2, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 5, 0, 0>, + Conv::template process_tile<1, 0, 2, 5, 0, 1>, + Conv::template process_tile<1, 0, 2, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 5, 1, 0>, + Conv::template process_tile<1, 0, 2, 5, 1, 1>, + Conv::template process_tile<1, 0, 2, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 5, 2, 0>, + Conv::template process_tile<1, 0, 2, 5, 2, 1>, + Conv::template process_tile<1, 0, 2, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 6, 0, 0>, + Conv::template process_tile<1, 0, 2, 6, 0, 1>, + Conv::template process_tile<1, 0, 2, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 6, 1, 0>, + Conv::template process_tile<1, 0, 2, 6, 1, 1>, + Conv::template process_tile<1, 0, 2, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 6, 2, 0>, + Conv::template process_tile<1, 0, 2, 6, 2, 1>, + Conv::template process_tile<1, 0, 2, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 0, 0, 0>, + Conv::template process_tile<1, 0, 3, 0, 0, 1>, + Conv::template process_tile<1, 0, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 0, 1, 0>, + Conv::template process_tile<1, 0, 3, 0, 1, 1>, + Conv::template process_tile<1, 0, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 0, 2, 0>, + Conv::template process_tile<1, 0, 3, 0, 2, 1>, + Conv::template process_tile<1, 0, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 1, 0, 0>, + Conv::template process_tile<1, 0, 3, 1, 0, 1>, + Conv::template process_tile<1, 0, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 1, 1, 0>, + Conv::template process_tile<1, 0, 3, 1, 1, 1>, + Conv::template process_tile<1, 0, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 1, 2, 0>, + Conv::template process_tile<1, 0, 3, 1, 2, 1>, + Conv::template process_tile<1, 0, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 2, 0, 0>, + Conv::template process_tile<1, 0, 3, 2, 0, 1>, + Conv::template process_tile<1, 0, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 2, 1, 0>, + Conv::template process_tile<1, 0, 3, 2, 1, 1>, + Conv::template process_tile<1, 0, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 2, 2, 0>, + Conv::template process_tile<1, 0, 3, 2, 2, 1>, + Conv::template process_tile<1, 0, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 3, 0, 0>, + Conv::template process_tile<1, 0, 3, 3, 0, 1>, + Conv::template process_tile<1, 0, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 3, 1, 0>, + Conv::template process_tile<1, 0, 3, 3, 1, 1>, + Conv::template process_tile<1, 0, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 3, 2, 0>, + Conv::template process_tile<1, 0, 3, 3, 2, 1>, + Conv::template process_tile<1, 0, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 4, 0, 0>, + Conv::template process_tile<1, 0, 3, 4, 0, 1>, + Conv::template process_tile<1, 0, 3, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 4, 1, 0>, + Conv::template process_tile<1, 0, 3, 4, 1, 1>, + Conv::template process_tile<1, 0, 3, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 4, 2, 0>, + Conv::template process_tile<1, 0, 3, 4, 2, 1>, + Conv::template process_tile<1, 0, 3, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 5, 0, 0>, + Conv::template process_tile<1, 0, 3, 5, 0, 1>, + Conv::template process_tile<1, 0, 3, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 5, 1, 0>, + Conv::template process_tile<1, 0, 3, 5, 1, 1>, + Conv::template process_tile<1, 0, 3, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 5, 2, 0>, + Conv::template process_tile<1, 0, 3, 5, 2, 1>, + Conv::template process_tile<1, 0, 3, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 6, 0, 0>, + Conv::template process_tile<1, 0, 3, 6, 0, 1>, + Conv::template process_tile<1, 0, 3, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 6, 1, 0>, + Conv::template process_tile<1, 0, 3, 6, 1, 1>, + Conv::template process_tile<1, 0, 3, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 6, 2, 0>, + Conv::template process_tile<1, 0, 3, 6, 2, 1>, + Conv::template process_tile<1, 0, 3, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 0, 0, 0>, + Conv::template process_tile<1, 0, 4, 0, 0, 1>, + Conv::template process_tile<1, 0, 4, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 0, 1, 0>, + Conv::template process_tile<1, 0, 4, 0, 1, 1>, + Conv::template process_tile<1, 0, 4, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 0, 2, 0>, + Conv::template process_tile<1, 0, 4, 0, 2, 1>, + Conv::template process_tile<1, 0, 4, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 1, 0, 0>, + Conv::template process_tile<1, 0, 4, 1, 0, 1>, + Conv::template process_tile<1, 0, 4, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 1, 1, 0>, + Conv::template process_tile<1, 0, 4, 1, 1, 1>, + Conv::template process_tile<1, 0, 4, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 1, 2, 0>, + Conv::template process_tile<1, 0, 4, 1, 2, 1>, + Conv::template process_tile<1, 0, 4, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 2, 0, 0>, + Conv::template process_tile<1, 0, 4, 2, 0, 1>, + Conv::template process_tile<1, 0, 4, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 2, 1, 0>, + Conv::template process_tile<1, 0, 4, 2, 1, 1>, + Conv::template process_tile<1, 0, 4, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 2, 2, 0>, + Conv::template process_tile<1, 0, 4, 2, 2, 1>, + Conv::template process_tile<1, 0, 4, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 3, 0, 0>, + Conv::template process_tile<1, 0, 4, 3, 0, 1>, + Conv::template process_tile<1, 0, 4, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 3, 1, 0>, + Conv::template process_tile<1, 0, 4, 3, 1, 1>, + Conv::template process_tile<1, 0, 4, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 3, 2, 0>, + Conv::template process_tile<1, 0, 4, 3, 2, 1>, + Conv::template process_tile<1, 0, 4, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 4, 0, 0>, + Conv::template process_tile<1, 0, 4, 4, 0, 1>, + Conv::template process_tile<1, 0, 4, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 4, 1, 0>, + Conv::template process_tile<1, 0, 4, 4, 1, 1>, + Conv::template process_tile<1, 0, 4, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 4, 2, 0>, + Conv::template process_tile<1, 0, 4, 4, 2, 1>, + Conv::template process_tile<1, 0, 4, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 5, 0, 0>, + Conv::template process_tile<1, 0, 4, 5, 0, 1>, + Conv::template process_tile<1, 0, 4, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 5, 1, 0>, + Conv::template process_tile<1, 0, 4, 5, 1, 1>, + Conv::template process_tile<1, 0, 4, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 5, 2, 0>, + Conv::template process_tile<1, 0, 4, 5, 2, 1>, + Conv::template process_tile<1, 0, 4, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 6, 0, 0>, + Conv::template process_tile<1, 0, 4, 6, 0, 1>, + Conv::template process_tile<1, 0, 4, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 6, 1, 0>, + Conv::template process_tile<1, 0, 4, 6, 1, 1>, + Conv::template process_tile<1, 0, 4, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 6, 2, 0>, + Conv::template process_tile<1, 0, 4, 6, 2, 1>, + Conv::template process_tile<1, 0, 4, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 0, 0, 0>, + Conv::template process_tile<1, 0, 5, 0, 0, 1>, + Conv::template process_tile<1, 0, 5, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 0, 1, 0>, + Conv::template process_tile<1, 0, 5, 0, 1, 1>, + Conv::template process_tile<1, 0, 5, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 0, 2, 0>, + Conv::template process_tile<1, 0, 5, 0, 2, 1>, + Conv::template process_tile<1, 0, 5, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 1, 0, 0>, + Conv::template process_tile<1, 0, 5, 1, 0, 1>, + Conv::template process_tile<1, 0, 5, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 1, 1, 0>, + Conv::template process_tile<1, 0, 5, 1, 1, 1>, + Conv::template process_tile<1, 0, 5, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 1, 2, 0>, + Conv::template process_tile<1, 0, 5, 1, 2, 1>, + Conv::template process_tile<1, 0, 5, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 2, 0, 0>, + Conv::template process_tile<1, 0, 5, 2, 0, 1>, + Conv::template process_tile<1, 0, 5, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 2, 1, 0>, + Conv::template process_tile<1, 0, 5, 2, 1, 1>, + Conv::template process_tile<1, 0, 5, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 2, 2, 0>, + Conv::template process_tile<1, 0, 5, 2, 2, 1>, + Conv::template process_tile<1, 0, 5, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 3, 0, 0>, + Conv::template process_tile<1, 0, 5, 3, 0, 1>, + Conv::template process_tile<1, 0, 5, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 3, 1, 0>, + Conv::template process_tile<1, 0, 5, 3, 1, 1>, + Conv::template process_tile<1, 0, 5, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 3, 2, 0>, + Conv::template process_tile<1, 0, 5, 3, 2, 1>, + Conv::template process_tile<1, 0, 5, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 4, 0, 0>, + Conv::template process_tile<1, 0, 5, 4, 0, 1>, + Conv::template process_tile<1, 0, 5, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 4, 1, 0>, + Conv::template process_tile<1, 0, 5, 4, 1, 1>, + Conv::template process_tile<1, 0, 5, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 4, 2, 0>, + Conv::template process_tile<1, 0, 5, 4, 2, 1>, + Conv::template process_tile<1, 0, 5, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 5, 0, 0>, + Conv::template process_tile<1, 0, 5, 5, 0, 1>, + Conv::template process_tile<1, 0, 5, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 5, 1, 0>, + Conv::template process_tile<1, 0, 5, 5, 1, 1>, + Conv::template process_tile<1, 0, 5, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 5, 2, 0>, + Conv::template process_tile<1, 0, 5, 5, 2, 1>, + Conv::template process_tile<1, 0, 5, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 6, 0, 0>, + Conv::template process_tile<1, 0, 5, 6, 0, 1>, + Conv::template process_tile<1, 0, 5, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 6, 1, 0>, + Conv::template process_tile<1, 0, 5, 6, 1, 1>, + Conv::template process_tile<1, 0, 5, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 6, 2, 0>, + Conv::template process_tile<1, 0, 5, 6, 2, 1>, + Conv::template process_tile<1, 0, 5, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 0, 0, 0>, + Conv::template process_tile<1, 0, 6, 0, 0, 1>, + Conv::template process_tile<1, 0, 6, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 0, 1, 0>, + Conv::template process_tile<1, 0, 6, 0, 1, 1>, + Conv::template process_tile<1, 0, 6, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 0, 2, 0>, + Conv::template process_tile<1, 0, 6, 0, 2, 1>, + Conv::template process_tile<1, 0, 6, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 1, 0, 0>, + Conv::template process_tile<1, 0, 6, 1, 0, 1>, + Conv::template process_tile<1, 0, 6, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 1, 1, 0>, + Conv::template process_tile<1, 0, 6, 1, 1, 1>, + Conv::template process_tile<1, 0, 6, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 1, 2, 0>, + Conv::template process_tile<1, 0, 6, 1, 2, 1>, + Conv::template process_tile<1, 0, 6, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 2, 0, 0>, + Conv::template process_tile<1, 0, 6, 2, 0, 1>, + Conv::template process_tile<1, 0, 6, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 2, 1, 0>, + Conv::template process_tile<1, 0, 6, 2, 1, 1>, + Conv::template process_tile<1, 0, 6, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 2, 2, 0>, + Conv::template process_tile<1, 0, 6, 2, 2, 1>, + Conv::template process_tile<1, 0, 6, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 3, 0, 0>, + Conv::template process_tile<1, 0, 6, 3, 0, 1>, + Conv::template process_tile<1, 0, 6, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 3, 1, 0>, + Conv::template process_tile<1, 0, 6, 3, 1, 1>, + Conv::template process_tile<1, 0, 6, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 3, 2, 0>, + Conv::template process_tile<1, 0, 6, 3, 2, 1>, + Conv::template process_tile<1, 0, 6, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 4, 0, 0>, + Conv::template process_tile<1, 0, 6, 4, 0, 1>, + Conv::template process_tile<1, 0, 6, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 4, 1, 0>, + Conv::template process_tile<1, 0, 6, 4, 1, 1>, + Conv::template process_tile<1, 0, 6, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 4, 2, 0>, + Conv::template process_tile<1, 0, 6, 4, 2, 1>, + Conv::template process_tile<1, 0, 6, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 5, 0, 0>, + Conv::template process_tile<1, 0, 6, 5, 0, 1>, + Conv::template process_tile<1, 0, 6, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 5, 1, 0>, + Conv::template process_tile<1, 0, 6, 5, 1, 1>, + Conv::template process_tile<1, 0, 6, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 5, 2, 0>, + Conv::template process_tile<1, 0, 6, 5, 2, 1>, + Conv::template process_tile<1, 0, 6, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 6, 0, 0>, + Conv::template process_tile<1, 0, 6, 6, 0, 1>, + Conv::template process_tile<1, 0, 6, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 6, 1, 0>, + Conv::template process_tile<1, 0, 6, 6, 1, 1>, + Conv::template process_tile<1, 0, 6, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 6, 2, 0>, + Conv::template process_tile<1, 0, 6, 6, 2, 1>, + Conv::template process_tile<1, 0, 6, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 0, 0, 0>, + Conv::template process_tile<1, 1, 0, 0, 0, 1>, + Conv::template process_tile<1, 1, 0, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 0, 1, 0>, + Conv::template process_tile<1, 1, 0, 0, 1, 1>, + Conv::template process_tile<1, 1, 0, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 0, 2, 0>, + Conv::template process_tile<1, 1, 0, 0, 2, 1>, + Conv::template process_tile<1, 1, 0, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 1, 0, 0>, + Conv::template process_tile<1, 1, 0, 1, 0, 1>, + Conv::template process_tile<1, 1, 0, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 1, 1, 0>, + Conv::template process_tile<1, 1, 0, 1, 1, 1>, + Conv::template process_tile<1, 1, 0, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 1, 2, 0>, + Conv::template process_tile<1, 1, 0, 1, 2, 1>, + Conv::template process_tile<1, 1, 0, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 2, 0, 0>, + Conv::template process_tile<1, 1, 0, 2, 0, 1>, + Conv::template process_tile<1, 1, 0, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 2, 1, 0>, + Conv::template process_tile<1, 1, 0, 2, 1, 1>, + Conv::template process_tile<1, 1, 0, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 2, 2, 0>, + Conv::template process_tile<1, 1, 0, 2, 2, 1>, + Conv::template process_tile<1, 1, 0, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 3, 0, 0>, + Conv::template process_tile<1, 1, 0, 3, 0, 1>, + Conv::template process_tile<1, 1, 0, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 3, 1, 0>, + Conv::template process_tile<1, 1, 0, 3, 1, 1>, + Conv::template process_tile<1, 1, 0, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 3, 2, 0>, + Conv::template process_tile<1, 1, 0, 3, 2, 1>, + Conv::template process_tile<1, 1, 0, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 4, 0, 0>, + Conv::template process_tile<1, 1, 0, 4, 0, 1>, + Conv::template process_tile<1, 1, 0, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 4, 1, 0>, + Conv::template process_tile<1, 1, 0, 4, 1, 1>, + Conv::template process_tile<1, 1, 0, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 4, 2, 0>, + Conv::template process_tile<1, 1, 0, 4, 2, 1>, + Conv::template process_tile<1, 1, 0, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 5, 0, 0>, + Conv::template process_tile<1, 1, 0, 5, 0, 1>, + Conv::template process_tile<1, 1, 0, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 5, 1, 0>, + Conv::template process_tile<1, 1, 0, 5, 1, 1>, + Conv::template process_tile<1, 1, 0, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 5, 2, 0>, + Conv::template process_tile<1, 1, 0, 5, 2, 1>, + Conv::template process_tile<1, 1, 0, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 6, 0, 0>, + Conv::template process_tile<1, 1, 0, 6, 0, 1>, + Conv::template process_tile<1, 1, 0, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 6, 1, 0>, + Conv::template process_tile<1, 1, 0, 6, 1, 1>, + Conv::template process_tile<1, 1, 0, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 6, 2, 0>, + Conv::template process_tile<1, 1, 0, 6, 2, 1>, + Conv::template process_tile<1, 1, 0, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 0, 0, 0>, + Conv::template process_tile<1, 1, 1, 0, 0, 1>, + Conv::template process_tile<1, 1, 1, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 0, 1, 0>, + Conv::template process_tile<1, 1, 1, 0, 1, 1>, + Conv::template process_tile<1, 1, 1, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 0, 2, 0>, + Conv::template process_tile<1, 1, 1, 0, 2, 1>, + Conv::template process_tile<1, 1, 1, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 1, 0, 0>, + Conv::template process_tile<1, 1, 1, 1, 0, 1>, + Conv::template process_tile<1, 1, 1, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 1, 1, 0>, + Conv::template process_tile<1, 1, 1, 1, 1, 1>, + Conv::template process_tile<1, 1, 1, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 1, 2, 0>, + Conv::template process_tile<1, 1, 1, 1, 2, 1>, + Conv::template process_tile<1, 1, 1, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 2, 0, 0>, + Conv::template process_tile<1, 1, 1, 2, 0, 1>, + Conv::template process_tile<1, 1, 1, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 2, 1, 0>, + Conv::template process_tile<1, 1, 1, 2, 1, 1>, + Conv::template process_tile<1, 1, 1, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 2, 2, 0>, + Conv::template process_tile<1, 1, 1, 2, 2, 1>, + Conv::template process_tile<1, 1, 1, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 3, 0, 0>, + Conv::template process_tile<1, 1, 1, 3, 0, 1>, + Conv::template process_tile<1, 1, 1, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 3, 1, 0>, + Conv::template process_tile<1, 1, 1, 3, 1, 1>, + Conv::template process_tile<1, 1, 1, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 3, 2, 0>, + Conv::template process_tile<1, 1, 1, 3, 2, 1>, + Conv::template process_tile<1, 1, 1, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 4, 0, 0>, + Conv::template process_tile<1, 1, 1, 4, 0, 1>, + Conv::template process_tile<1, 1, 1, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 4, 1, 0>, + Conv::template process_tile<1, 1, 1, 4, 1, 1>, + Conv::template process_tile<1, 1, 1, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 4, 2, 0>, + Conv::template process_tile<1, 1, 1, 4, 2, 1>, + Conv::template process_tile<1, 1, 1, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 5, 0, 0>, + Conv::template process_tile<1, 1, 1, 5, 0, 1>, + Conv::template process_tile<1, 1, 1, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 5, 1, 0>, + Conv::template process_tile<1, 1, 1, 5, 1, 1>, + Conv::template process_tile<1, 1, 1, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 5, 2, 0>, + Conv::template process_tile<1, 1, 1, 5, 2, 1>, + Conv::template process_tile<1, 1, 1, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 6, 0, 0>, + Conv::template process_tile<1, 1, 1, 6, 0, 1>, + Conv::template process_tile<1, 1, 1, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 6, 1, 0>, + Conv::template process_tile<1, 1, 1, 6, 1, 1>, + Conv::template process_tile<1, 1, 1, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 6, 2, 0>, + Conv::template process_tile<1, 1, 1, 6, 2, 1>, + Conv::template process_tile<1, 1, 1, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 0, 0, 0>, + Conv::template process_tile<1, 1, 2, 0, 0, 1>, + Conv::template process_tile<1, 1, 2, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 0, 1, 0>, + Conv::template process_tile<1, 1, 2, 0, 1, 1>, + Conv::template process_tile<1, 1, 2, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 0, 2, 0>, + Conv::template process_tile<1, 1, 2, 0, 2, 1>, + Conv::template process_tile<1, 1, 2, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 1, 0, 0>, + Conv::template process_tile<1, 1, 2, 1, 0, 1>, + Conv::template process_tile<1, 1, 2, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 1, 1, 0>, + Conv::template process_tile<1, 1, 2, 1, 1, 1>, + Conv::template process_tile<1, 1, 2, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 1, 2, 0>, + Conv::template process_tile<1, 1, 2, 1, 2, 1>, + Conv::template process_tile<1, 1, 2, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 2, 0, 0>, + Conv::template process_tile<1, 1, 2, 2, 0, 1>, + Conv::template process_tile<1, 1, 2, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 2, 1, 0>, + Conv::template process_tile<1, 1, 2, 2, 1, 1>, + Conv::template process_tile<1, 1, 2, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 2, 2, 0>, + Conv::template process_tile<1, 1, 2, 2, 2, 1>, + Conv::template process_tile<1, 1, 2, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 3, 0, 0>, + Conv::template process_tile<1, 1, 2, 3, 0, 1>, + Conv::template process_tile<1, 1, 2, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 3, 1, 0>, + Conv::template process_tile<1, 1, 2, 3, 1, 1>, + Conv::template process_tile<1, 1, 2, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 3, 2, 0>, + Conv::template process_tile<1, 1, 2, 3, 2, 1>, + Conv::template process_tile<1, 1, 2, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 4, 0, 0>, + Conv::template process_tile<1, 1, 2, 4, 0, 1>, + Conv::template process_tile<1, 1, 2, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 4, 1, 0>, + Conv::template process_tile<1, 1, 2, 4, 1, 1>, + Conv::template process_tile<1, 1, 2, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 4, 2, 0>, + Conv::template process_tile<1, 1, 2, 4, 2, 1>, + Conv::template process_tile<1, 1, 2, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 5, 0, 0>, + Conv::template process_tile<1, 1, 2, 5, 0, 1>, + Conv::template process_tile<1, 1, 2, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 5, 1, 0>, + Conv::template process_tile<1, 1, 2, 5, 1, 1>, + Conv::template process_tile<1, 1, 2, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 5, 2, 0>, + Conv::template process_tile<1, 1, 2, 5, 2, 1>, + Conv::template process_tile<1, 1, 2, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 6, 0, 0>, + Conv::template process_tile<1, 1, 2, 6, 0, 1>, + Conv::template process_tile<1, 1, 2, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 6, 1, 0>, + Conv::template process_tile<1, 1, 2, 6, 1, 1>, + Conv::template process_tile<1, 1, 2, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 6, 2, 0>, + Conv::template process_tile<1, 1, 2, 6, 2, 1>, + Conv::template process_tile<1, 1, 2, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 0, 0, 0>, + Conv::template process_tile<1, 1, 3, 0, 0, 1>, + Conv::template process_tile<1, 1, 3, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 0, 1, 0>, + Conv::template process_tile<1, 1, 3, 0, 1, 1>, + Conv::template process_tile<1, 1, 3, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 0, 2, 0>, + Conv::template process_tile<1, 1, 3, 0, 2, 1>, + Conv::template process_tile<1, 1, 3, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 1, 0, 0>, + Conv::template process_tile<1, 1, 3, 1, 0, 1>, + Conv::template process_tile<1, 1, 3, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 1, 1, 0>, + Conv::template process_tile<1, 1, 3, 1, 1, 1>, + Conv::template process_tile<1, 1, 3, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 1, 2, 0>, + Conv::template process_tile<1, 1, 3, 1, 2, 1>, + Conv::template process_tile<1, 1, 3, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 2, 0, 0>, + Conv::template process_tile<1, 1, 3, 2, 0, 1>, + Conv::template process_tile<1, 1, 3, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 2, 1, 0>, + Conv::template process_tile<1, 1, 3, 2, 1, 1>, + Conv::template process_tile<1, 1, 3, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 2, 2, 0>, + Conv::template process_tile<1, 1, 3, 2, 2, 1>, + Conv::template process_tile<1, 1, 3, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 3, 0, 0>, + Conv::template process_tile<1, 1, 3, 3, 0, 1>, + Conv::template process_tile<1, 1, 3, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 3, 1, 0>, + Conv::template process_tile<1, 1, 3, 3, 1, 1>, + Conv::template process_tile<1, 1, 3, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 3, 2, 0>, + Conv::template process_tile<1, 1, 3, 3, 2, 1>, + Conv::template process_tile<1, 1, 3, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 4, 0, 0>, + Conv::template process_tile<1, 1, 3, 4, 0, 1>, + Conv::template process_tile<1, 1, 3, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 4, 1, 0>, + Conv::template process_tile<1, 1, 3, 4, 1, 1>, + Conv::template process_tile<1, 1, 3, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 4, 2, 0>, + Conv::template process_tile<1, 1, 3, 4, 2, 1>, + Conv::template process_tile<1, 1, 3, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 5, 0, 0>, + Conv::template process_tile<1, 1, 3, 5, 0, 1>, + Conv::template process_tile<1, 1, 3, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 5, 1, 0>, + Conv::template process_tile<1, 1, 3, 5, 1, 1>, + Conv::template process_tile<1, 1, 3, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 5, 2, 0>, + Conv::template process_tile<1, 1, 3, 5, 2, 1>, + Conv::template process_tile<1, 1, 3, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 6, 0, 0>, + Conv::template process_tile<1, 1, 3, 6, 0, 1>, + Conv::template process_tile<1, 1, 3, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 6, 1, 0>, + Conv::template process_tile<1, 1, 3, 6, 1, 1>, + Conv::template process_tile<1, 1, 3, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 6, 2, 0>, + Conv::template process_tile<1, 1, 3, 6, 2, 1>, + Conv::template process_tile<1, 1, 3, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 0, 0, 0>, + Conv::template process_tile<1, 1, 4, 0, 0, 1>, + Conv::template process_tile<1, 1, 4, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 0, 1, 0>, + Conv::template process_tile<1, 1, 4, 0, 1, 1>, + Conv::template process_tile<1, 1, 4, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 0, 2, 0>, + Conv::template process_tile<1, 1, 4, 0, 2, 1>, + Conv::template process_tile<1, 1, 4, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 1, 0, 0>, + Conv::template process_tile<1, 1, 4, 1, 0, 1>, + Conv::template process_tile<1, 1, 4, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 1, 1, 0>, + Conv::template process_tile<1, 1, 4, 1, 1, 1>, + Conv::template process_tile<1, 1, 4, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 1, 2, 0>, + Conv::template process_tile<1, 1, 4, 1, 2, 1>, + Conv::template process_tile<1, 1, 4, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 2, 0, 0>, + Conv::template process_tile<1, 1, 4, 2, 0, 1>, + Conv::template process_tile<1, 1, 4, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 2, 1, 0>, + Conv::template process_tile<1, 1, 4, 2, 1, 1>, + Conv::template process_tile<1, 1, 4, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 2, 2, 0>, + Conv::template process_tile<1, 1, 4, 2, 2, 1>, + Conv::template process_tile<1, 1, 4, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 3, 0, 0>, + Conv::template process_tile<1, 1, 4, 3, 0, 1>, + Conv::template process_tile<1, 1, 4, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 3, 1, 0>, + Conv::template process_tile<1, 1, 4, 3, 1, 1>, + Conv::template process_tile<1, 1, 4, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 3, 2, 0>, + Conv::template process_tile<1, 1, 4, 3, 2, 1>, + Conv::template process_tile<1, 1, 4, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 4, 0, 0>, + Conv::template process_tile<1, 1, 4, 4, 0, 1>, + Conv::template process_tile<1, 1, 4, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 4, 1, 0>, + Conv::template process_tile<1, 1, 4, 4, 1, 1>, + Conv::template process_tile<1, 1, 4, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 4, 2, 0>, + Conv::template process_tile<1, 1, 4, 4, 2, 1>, + Conv::template process_tile<1, 1, 4, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 5, 0, 0>, + Conv::template process_tile<1, 1, 4, 5, 0, 1>, + Conv::template process_tile<1, 1, 4, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 5, 1, 0>, + Conv::template process_tile<1, 1, 4, 5, 1, 1>, + Conv::template process_tile<1, 1, 4, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 5, 2, 0>, + Conv::template process_tile<1, 1, 4, 5, 2, 1>, + Conv::template process_tile<1, 1, 4, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 6, 0, 0>, + Conv::template process_tile<1, 1, 4, 6, 0, 1>, + Conv::template process_tile<1, 1, 4, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 6, 1, 0>, + Conv::template process_tile<1, 1, 4, 6, 1, 1>, + Conv::template process_tile<1, 1, 4, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 6, 2, 0>, + Conv::template process_tile<1, 1, 4, 6, 2, 1>, + Conv::template process_tile<1, 1, 4, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 0, 0, 0>, + Conv::template process_tile<1, 1, 5, 0, 0, 1>, + Conv::template process_tile<1, 1, 5, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 0, 1, 0>, + Conv::template process_tile<1, 1, 5, 0, 1, 1>, + Conv::template process_tile<1, 1, 5, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 0, 2, 0>, + Conv::template process_tile<1, 1, 5, 0, 2, 1>, + Conv::template process_tile<1, 1, 5, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 1, 0, 0>, + Conv::template process_tile<1, 1, 5, 1, 0, 1>, + Conv::template process_tile<1, 1, 5, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 1, 1, 0>, + Conv::template process_tile<1, 1, 5, 1, 1, 1>, + Conv::template process_tile<1, 1, 5, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 1, 2, 0>, + Conv::template process_tile<1, 1, 5, 1, 2, 1>, + Conv::template process_tile<1, 1, 5, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 2, 0, 0>, + Conv::template process_tile<1, 1, 5, 2, 0, 1>, + Conv::template process_tile<1, 1, 5, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 2, 1, 0>, + Conv::template process_tile<1, 1, 5, 2, 1, 1>, + Conv::template process_tile<1, 1, 5, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 2, 2, 0>, + Conv::template process_tile<1, 1, 5, 2, 2, 1>, + Conv::template process_tile<1, 1, 5, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 3, 0, 0>, + Conv::template process_tile<1, 1, 5, 3, 0, 1>, + Conv::template process_tile<1, 1, 5, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 3, 1, 0>, + Conv::template process_tile<1, 1, 5, 3, 1, 1>, + Conv::template process_tile<1, 1, 5, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 3, 2, 0>, + Conv::template process_tile<1, 1, 5, 3, 2, 1>, + Conv::template process_tile<1, 1, 5, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 4, 0, 0>, + Conv::template process_tile<1, 1, 5, 4, 0, 1>, + Conv::template process_tile<1, 1, 5, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 4, 1, 0>, + Conv::template process_tile<1, 1, 5, 4, 1, 1>, + Conv::template process_tile<1, 1, 5, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 4, 2, 0>, + Conv::template process_tile<1, 1, 5, 4, 2, 1>, + Conv::template process_tile<1, 1, 5, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 5, 0, 0>, + Conv::template process_tile<1, 1, 5, 5, 0, 1>, + Conv::template process_tile<1, 1, 5, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 5, 1, 0>, + Conv::template process_tile<1, 1, 5, 5, 1, 1>, + Conv::template process_tile<1, 1, 5, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 5, 2, 0>, + Conv::template process_tile<1, 1, 5, 5, 2, 1>, + Conv::template process_tile<1, 1, 5, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 6, 0, 0>, + Conv::template process_tile<1, 1, 5, 6, 0, 1>, + Conv::template process_tile<1, 1, 5, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 6, 1, 0>, + Conv::template process_tile<1, 1, 5, 6, 1, 1>, + Conv::template process_tile<1, 1, 5, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 6, 2, 0>, + Conv::template process_tile<1, 1, 5, 6, 2, 1>, + Conv::template process_tile<1, 1, 5, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 0, 0, 0>, + Conv::template process_tile<1, 1, 6, 0, 0, 1>, + Conv::template process_tile<1, 1, 6, 0, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 0, 1, 0>, + Conv::template process_tile<1, 1, 6, 0, 1, 1>, + Conv::template process_tile<1, 1, 6, 0, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 0, 2, 0>, + Conv::template process_tile<1, 1, 6, 0, 2, 1>, + Conv::template process_tile<1, 1, 6, 0, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 1, 0, 0>, + Conv::template process_tile<1, 1, 6, 1, 0, 1>, + Conv::template process_tile<1, 1, 6, 1, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 1, 1, 0>, + Conv::template process_tile<1, 1, 6, 1, 1, 1>, + Conv::template process_tile<1, 1, 6, 1, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 1, 2, 0>, + Conv::template process_tile<1, 1, 6, 1, 2, 1>, + Conv::template process_tile<1, 1, 6, 1, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 2, 0, 0>, + Conv::template process_tile<1, 1, 6, 2, 0, 1>, + Conv::template process_tile<1, 1, 6, 2, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 2, 1, 0>, + Conv::template process_tile<1, 1, 6, 2, 1, 1>, + Conv::template process_tile<1, 1, 6, 2, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 2, 2, 0>, + Conv::template process_tile<1, 1, 6, 2, 2, 1>, + Conv::template process_tile<1, 1, 6, 2, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 3, 0, 0>, + Conv::template process_tile<1, 1, 6, 3, 0, 1>, + Conv::template process_tile<1, 1, 6, 3, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 3, 1, 0>, + Conv::template process_tile<1, 1, 6, 3, 1, 1>, + Conv::template process_tile<1, 1, 6, 3, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 3, 2, 0>, + Conv::template process_tile<1, 1, 6, 3, 2, 1>, + Conv::template process_tile<1, 1, 6, 3, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 4, 0, 0>, + Conv::template process_tile<1, 1, 6, 4, 0, 1>, + Conv::template process_tile<1, 1, 6, 4, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 4, 1, 0>, + Conv::template process_tile<1, 1, 6, 4, 1, 1>, + Conv::template process_tile<1, 1, 6, 4, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 4, 2, 0>, + Conv::template process_tile<1, 1, 6, 4, 2, 1>, + Conv::template process_tile<1, 1, 6, 4, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 5, 0, 0>, + Conv::template process_tile<1, 1, 6, 5, 0, 1>, + Conv::template process_tile<1, 1, 6, 5, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 5, 1, 0>, + Conv::template process_tile<1, 1, 6, 5, 1, 1>, + Conv::template process_tile<1, 1, 6, 5, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 5, 2, 0>, + Conv::template process_tile<1, 1, 6, 5, 2, 1>, + Conv::template process_tile<1, 1, 6, 5, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 6, 0, 0>, + Conv::template process_tile<1, 1, 6, 6, 0, 1>, + Conv::template process_tile<1, 1, 6, 6, 0, 2>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 6, 1, 0>, + Conv::template process_tile<1, 1, 6, 6, 1, 1>, + Conv::template process_tile<1, 1, 6, 6, 1, 2>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 6, 2, 0>, + Conv::template process_tile<1, 1, 6, 6, 2, 1>, + Conv::template process_tile<1, 1, 6, 6, 2, 2>, + }, // Output pad bottom = 2 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<3, 3, 3, 3, 2, 2, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_1x1_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_1x1_fp32_fp32.cpp new file mode 100644 index 0000000000..a1aaaa078c --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_1x1_fp32_fp32.cpp @@ -0,0 +1,2695 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<4, 4, 3, 3, 1, 1, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<4, 4, 3, 3, 1, 1, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 0, 1>, + ConvImpl::template process_tile<0, 0, 0, 0, 0, 2>, + ConvImpl::template process_tile<0, 0, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 1, 1>, + ConvImpl::template process_tile<0, 0, 0, 0, 1, 2>, + ConvImpl::template process_tile<0, 0, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 0, 0, 2, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 2, 1>, + ConvImpl::template process_tile<0, 0, 0, 0, 2, 2>, + ConvImpl::template process_tile<0, 0, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 0, 0, 3, 0>, + ConvImpl::template process_tile<0, 0, 0, 0, 3, 1>, + ConvImpl::template process_tile<0, 0, 0, 0, 3, 2>, + ConvImpl::template process_tile<0, 0, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 0, 1>, + ConvImpl::template process_tile<0, 0, 0, 1, 0, 2>, + ConvImpl::template process_tile<0, 0, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 1, 1>, + ConvImpl::template process_tile<0, 0, 0, 1, 1, 2>, + ConvImpl::template process_tile<0, 0, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 0, 1, 2, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 2, 1>, + ConvImpl::template process_tile<0, 0, 0, 1, 2, 2>, + ConvImpl::template process_tile<0, 0, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 0, 1, 3, 0>, + ConvImpl::template process_tile<0, 0, 0, 1, 3, 1>, + ConvImpl::template process_tile<0, 0, 0, 1, 3, 2>, + ConvImpl::template process_tile<0, 0, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 0, 1>, + ConvImpl::template process_tile<0, 0, 0, 2, 0, 2>, + ConvImpl::template process_tile<0, 0, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 1, 1>, + ConvImpl::template process_tile<0, 0, 0, 2, 1, 2>, + ConvImpl::template process_tile<0, 0, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 0, 2, 2, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 2, 1>, + ConvImpl::template process_tile<0, 0, 0, 2, 2, 2>, + ConvImpl::template process_tile<0, 0, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 0, 2, 3, 0>, + ConvImpl::template process_tile<0, 0, 0, 2, 3, 1>, + ConvImpl::template process_tile<0, 0, 0, 2, 3, 2>, + ConvImpl::template process_tile<0, 0, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 3, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 3, 0, 1>, + ConvImpl::template process_tile<0, 0, 0, 3, 0, 2>, + ConvImpl::template process_tile<0, 0, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 3, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 3, 1, 1>, + ConvImpl::template process_tile<0, 0, 0, 3, 1, 2>, + ConvImpl::template process_tile<0, 0, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 0, 3, 2, 0>, + ConvImpl::template process_tile<0, 0, 0, 3, 2, 1>, + ConvImpl::template process_tile<0, 0, 0, 3, 2, 2>, + ConvImpl::template process_tile<0, 0, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 0, 3, 3, 0>, + ConvImpl::template process_tile<0, 0, 0, 3, 3, 1>, + ConvImpl::template process_tile<0, 0, 0, 3, 3, 2>, + ConvImpl::template process_tile<0, 0, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 0, 4, 0, 0>, + ConvImpl::template process_tile<0, 0, 0, 4, 0, 1>, + ConvImpl::template process_tile<0, 0, 0, 4, 0, 2>, + ConvImpl::template process_tile<0, 0, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 0, 4, 1, 0>, + ConvImpl::template process_tile<0, 0, 0, 4, 1, 1>, + ConvImpl::template process_tile<0, 0, 0, 4, 1, 2>, + ConvImpl::template process_tile<0, 0, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 0, 4, 2, 0>, + ConvImpl::template process_tile<0, 0, 0, 4, 2, 1>, + ConvImpl::template process_tile<0, 0, 0, 4, 2, 2>, + ConvImpl::template process_tile<0, 0, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 0, 4, 3, 0>, + ConvImpl::template process_tile<0, 0, 0, 4, 3, 1>, + ConvImpl::template process_tile<0, 0, 0, 4, 3, 2>, + ConvImpl::template process_tile<0, 0, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 0, 1>, + ConvImpl::template process_tile<0, 0, 1, 0, 0, 2>, + ConvImpl::template process_tile<0, 0, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 1, 1>, + ConvImpl::template process_tile<0, 0, 1, 0, 1, 2>, + ConvImpl::template process_tile<0, 0, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 1, 0, 2, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 2, 1>, + ConvImpl::template process_tile<0, 0, 1, 0, 2, 2>, + ConvImpl::template process_tile<0, 0, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 1, 0, 3, 0>, + ConvImpl::template process_tile<0, 0, 1, 0, 3, 1>, + ConvImpl::template process_tile<0, 0, 1, 0, 3, 2>, + ConvImpl::template process_tile<0, 0, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 0, 1>, + ConvImpl::template process_tile<0, 0, 1, 1, 0, 2>, + ConvImpl::template process_tile<0, 0, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 1, 1>, + ConvImpl::template process_tile<0, 0, 1, 1, 1, 2>, + ConvImpl::template process_tile<0, 0, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 1, 1, 2, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 2, 1>, + ConvImpl::template process_tile<0, 0, 1, 1, 2, 2>, + ConvImpl::template process_tile<0, 0, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 1, 1, 3, 0>, + ConvImpl::template process_tile<0, 0, 1, 1, 3, 1>, + ConvImpl::template process_tile<0, 0, 1, 1, 3, 2>, + ConvImpl::template process_tile<0, 0, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 0, 1>, + ConvImpl::template process_tile<0, 0, 1, 2, 0, 2>, + ConvImpl::template process_tile<0, 0, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 1, 1>, + ConvImpl::template process_tile<0, 0, 1, 2, 1, 2>, + ConvImpl::template process_tile<0, 0, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 1, 2, 2, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 2, 1>, + ConvImpl::template process_tile<0, 0, 1, 2, 2, 2>, + ConvImpl::template process_tile<0, 0, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 1, 2, 3, 0>, + ConvImpl::template process_tile<0, 0, 1, 2, 3, 1>, + ConvImpl::template process_tile<0, 0, 1, 2, 3, 2>, + ConvImpl::template process_tile<0, 0, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 3, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 3, 0, 1>, + ConvImpl::template process_tile<0, 0, 1, 3, 0, 2>, + ConvImpl::template process_tile<0, 0, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 3, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 3, 1, 1>, + ConvImpl::template process_tile<0, 0, 1, 3, 1, 2>, + ConvImpl::template process_tile<0, 0, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 1, 3, 2, 0>, + ConvImpl::template process_tile<0, 0, 1, 3, 2, 1>, + ConvImpl::template process_tile<0, 0, 1, 3, 2, 2>, + ConvImpl::template process_tile<0, 0, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 1, 3, 3, 0>, + ConvImpl::template process_tile<0, 0, 1, 3, 3, 1>, + ConvImpl::template process_tile<0, 0, 1, 3, 3, 2>, + ConvImpl::template process_tile<0, 0, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 1, 4, 0, 0>, + ConvImpl::template process_tile<0, 0, 1, 4, 0, 1>, + ConvImpl::template process_tile<0, 0, 1, 4, 0, 2>, + ConvImpl::template process_tile<0, 0, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 1, 4, 1, 0>, + ConvImpl::template process_tile<0, 0, 1, 4, 1, 1>, + ConvImpl::template process_tile<0, 0, 1, 4, 1, 2>, + ConvImpl::template process_tile<0, 0, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 1, 4, 2, 0>, + ConvImpl::template process_tile<0, 0, 1, 4, 2, 1>, + ConvImpl::template process_tile<0, 0, 1, 4, 2, 2>, + ConvImpl::template process_tile<0, 0, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 1, 4, 3, 0>, + ConvImpl::template process_tile<0, 0, 1, 4, 3, 1>, + ConvImpl::template process_tile<0, 0, 1, 4, 3, 2>, + ConvImpl::template process_tile<0, 0, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 0, 1>, + ConvImpl::template process_tile<0, 0, 2, 0, 0, 2>, + ConvImpl::template process_tile<0, 0, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 1, 1>, + ConvImpl::template process_tile<0, 0, 2, 0, 1, 2>, + ConvImpl::template process_tile<0, 0, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 2, 0, 2, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 2, 1>, + ConvImpl::template process_tile<0, 0, 2, 0, 2, 2>, + ConvImpl::template process_tile<0, 0, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 2, 0, 3, 0>, + ConvImpl::template process_tile<0, 0, 2, 0, 3, 1>, + ConvImpl::template process_tile<0, 0, 2, 0, 3, 2>, + ConvImpl::template process_tile<0, 0, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 0, 1>, + ConvImpl::template process_tile<0, 0, 2, 1, 0, 2>, + ConvImpl::template process_tile<0, 0, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 1, 1>, + ConvImpl::template process_tile<0, 0, 2, 1, 1, 2>, + ConvImpl::template process_tile<0, 0, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 2, 1, 2, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 2, 1>, + ConvImpl::template process_tile<0, 0, 2, 1, 2, 2>, + ConvImpl::template process_tile<0, 0, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 2, 1, 3, 0>, + ConvImpl::template process_tile<0, 0, 2, 1, 3, 1>, + ConvImpl::template process_tile<0, 0, 2, 1, 3, 2>, + ConvImpl::template process_tile<0, 0, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 0, 1>, + ConvImpl::template process_tile<0, 0, 2, 2, 0, 2>, + ConvImpl::template process_tile<0, 0, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 1, 1>, + ConvImpl::template process_tile<0, 0, 2, 2, 1, 2>, + ConvImpl::template process_tile<0, 0, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 2, 2, 2, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 2, 1>, + ConvImpl::template process_tile<0, 0, 2, 2, 2, 2>, + ConvImpl::template process_tile<0, 0, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 2, 2, 3, 0>, + ConvImpl::template process_tile<0, 0, 2, 2, 3, 1>, + ConvImpl::template process_tile<0, 0, 2, 2, 3, 2>, + ConvImpl::template process_tile<0, 0, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 3, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 3, 0, 1>, + ConvImpl::template process_tile<0, 0, 2, 3, 0, 2>, + ConvImpl::template process_tile<0, 0, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 3, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 3, 1, 1>, + ConvImpl::template process_tile<0, 0, 2, 3, 1, 2>, + ConvImpl::template process_tile<0, 0, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 2, 3, 2, 0>, + ConvImpl::template process_tile<0, 0, 2, 3, 2, 1>, + ConvImpl::template process_tile<0, 0, 2, 3, 2, 2>, + ConvImpl::template process_tile<0, 0, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 2, 3, 3, 0>, + ConvImpl::template process_tile<0, 0, 2, 3, 3, 1>, + ConvImpl::template process_tile<0, 0, 2, 3, 3, 2>, + ConvImpl::template process_tile<0, 0, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 2, 4, 0, 0>, + ConvImpl::template process_tile<0, 0, 2, 4, 0, 1>, + ConvImpl::template process_tile<0, 0, 2, 4, 0, 2>, + ConvImpl::template process_tile<0, 0, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 2, 4, 1, 0>, + ConvImpl::template process_tile<0, 0, 2, 4, 1, 1>, + ConvImpl::template process_tile<0, 0, 2, 4, 1, 2>, + ConvImpl::template process_tile<0, 0, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 2, 4, 2, 0>, + ConvImpl::template process_tile<0, 0, 2, 4, 2, 1>, + ConvImpl::template process_tile<0, 0, 2, 4, 2, 2>, + ConvImpl::template process_tile<0, 0, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 2, 4, 3, 0>, + ConvImpl::template process_tile<0, 0, 2, 4, 3, 1>, + ConvImpl::template process_tile<0, 0, 2, 4, 3, 2>, + ConvImpl::template process_tile<0, 0, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 3, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 3, 0, 0, 1>, + ConvImpl::template process_tile<0, 0, 3, 0, 0, 2>, + ConvImpl::template process_tile<0, 0, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 3, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 3, 0, 1, 1>, + ConvImpl::template process_tile<0, 0, 3, 0, 1, 2>, + ConvImpl::template process_tile<0, 0, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 3, 0, 2, 0>, + ConvImpl::template process_tile<0, 0, 3, 0, 2, 1>, + ConvImpl::template process_tile<0, 0, 3, 0, 2, 2>, + ConvImpl::template process_tile<0, 0, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 3, 0, 3, 0>, + ConvImpl::template process_tile<0, 0, 3, 0, 3, 1>, + ConvImpl::template process_tile<0, 0, 3, 0, 3, 2>, + ConvImpl::template process_tile<0, 0, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 3, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 3, 1, 0, 1>, + ConvImpl::template process_tile<0, 0, 3, 1, 0, 2>, + ConvImpl::template process_tile<0, 0, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 3, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 3, 1, 1, 1>, + ConvImpl::template process_tile<0, 0, 3, 1, 1, 2>, + ConvImpl::template process_tile<0, 0, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 3, 1, 2, 0>, + ConvImpl::template process_tile<0, 0, 3, 1, 2, 1>, + ConvImpl::template process_tile<0, 0, 3, 1, 2, 2>, + ConvImpl::template process_tile<0, 0, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 3, 1, 3, 0>, + ConvImpl::template process_tile<0, 0, 3, 1, 3, 1>, + ConvImpl::template process_tile<0, 0, 3, 1, 3, 2>, + ConvImpl::template process_tile<0, 0, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 3, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 3, 2, 0, 1>, + ConvImpl::template process_tile<0, 0, 3, 2, 0, 2>, + ConvImpl::template process_tile<0, 0, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 3, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 3, 2, 1, 1>, + ConvImpl::template process_tile<0, 0, 3, 2, 1, 2>, + ConvImpl::template process_tile<0, 0, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 3, 2, 2, 0>, + ConvImpl::template process_tile<0, 0, 3, 2, 2, 1>, + ConvImpl::template process_tile<0, 0, 3, 2, 2, 2>, + ConvImpl::template process_tile<0, 0, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 3, 2, 3, 0>, + ConvImpl::template process_tile<0, 0, 3, 2, 3, 1>, + ConvImpl::template process_tile<0, 0, 3, 2, 3, 2>, + ConvImpl::template process_tile<0, 0, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 3, 3, 0, 0>, + ConvImpl::template process_tile<0, 0, 3, 3, 0, 1>, + ConvImpl::template process_tile<0, 0, 3, 3, 0, 2>, + ConvImpl::template process_tile<0, 0, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 3, 3, 1, 0>, + ConvImpl::template process_tile<0, 0, 3, 3, 1, 1>, + ConvImpl::template process_tile<0, 0, 3, 3, 1, 2>, + ConvImpl::template process_tile<0, 0, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 3, 3, 2, 0>, + ConvImpl::template process_tile<0, 0, 3, 3, 2, 1>, + ConvImpl::template process_tile<0, 0, 3, 3, 2, 2>, + ConvImpl::template process_tile<0, 0, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 3, 3, 3, 0>, + ConvImpl::template process_tile<0, 0, 3, 3, 3, 1>, + ConvImpl::template process_tile<0, 0, 3, 3, 3, 2>, + ConvImpl::template process_tile<0, 0, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 3, 4, 0, 0>, + ConvImpl::template process_tile<0, 0, 3, 4, 0, 1>, + ConvImpl::template process_tile<0, 0, 3, 4, 0, 2>, + ConvImpl::template process_tile<0, 0, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 3, 4, 1, 0>, + ConvImpl::template process_tile<0, 0, 3, 4, 1, 1>, + ConvImpl::template process_tile<0, 0, 3, 4, 1, 2>, + ConvImpl::template process_tile<0, 0, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 3, 4, 2, 0>, + ConvImpl::template process_tile<0, 0, 3, 4, 2, 1>, + ConvImpl::template process_tile<0, 0, 3, 4, 2, 2>, + ConvImpl::template process_tile<0, 0, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 3, 4, 3, 0>, + ConvImpl::template process_tile<0, 0, 3, 4, 3, 1>, + ConvImpl::template process_tile<0, 0, 3, 4, 3, 2>, + ConvImpl::template process_tile<0, 0, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 4, 0, 0, 0>, + ConvImpl::template process_tile<0, 0, 4, 0, 0, 1>, + ConvImpl::template process_tile<0, 0, 4, 0, 0, 2>, + ConvImpl::template process_tile<0, 0, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 4, 0, 1, 0>, + ConvImpl::template process_tile<0, 0, 4, 0, 1, 1>, + ConvImpl::template process_tile<0, 0, 4, 0, 1, 2>, + ConvImpl::template process_tile<0, 0, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 4, 0, 2, 0>, + ConvImpl::template process_tile<0, 0, 4, 0, 2, 1>, + ConvImpl::template process_tile<0, 0, 4, 0, 2, 2>, + ConvImpl::template process_tile<0, 0, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 4, 0, 3, 0>, + ConvImpl::template process_tile<0, 0, 4, 0, 3, 1>, + ConvImpl::template process_tile<0, 0, 4, 0, 3, 2>, + ConvImpl::template process_tile<0, 0, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 4, 1, 0, 0>, + ConvImpl::template process_tile<0, 0, 4, 1, 0, 1>, + ConvImpl::template process_tile<0, 0, 4, 1, 0, 2>, + ConvImpl::template process_tile<0, 0, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 4, 1, 1, 0>, + ConvImpl::template process_tile<0, 0, 4, 1, 1, 1>, + ConvImpl::template process_tile<0, 0, 4, 1, 1, 2>, + ConvImpl::template process_tile<0, 0, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 4, 1, 2, 0>, + ConvImpl::template process_tile<0, 0, 4, 1, 2, 1>, + ConvImpl::template process_tile<0, 0, 4, 1, 2, 2>, + ConvImpl::template process_tile<0, 0, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 4, 1, 3, 0>, + ConvImpl::template process_tile<0, 0, 4, 1, 3, 1>, + ConvImpl::template process_tile<0, 0, 4, 1, 3, 2>, + ConvImpl::template process_tile<0, 0, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 4, 2, 0, 0>, + ConvImpl::template process_tile<0, 0, 4, 2, 0, 1>, + ConvImpl::template process_tile<0, 0, 4, 2, 0, 2>, + ConvImpl::template process_tile<0, 0, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 4, 2, 1, 0>, + ConvImpl::template process_tile<0, 0, 4, 2, 1, 1>, + ConvImpl::template process_tile<0, 0, 4, 2, 1, 2>, + ConvImpl::template process_tile<0, 0, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 4, 2, 2, 0>, + ConvImpl::template process_tile<0, 0, 4, 2, 2, 1>, + ConvImpl::template process_tile<0, 0, 4, 2, 2, 2>, + ConvImpl::template process_tile<0, 0, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 4, 2, 3, 0>, + ConvImpl::template process_tile<0, 0, 4, 2, 3, 1>, + ConvImpl::template process_tile<0, 0, 4, 2, 3, 2>, + ConvImpl::template process_tile<0, 0, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 4, 3, 0, 0>, + ConvImpl::template process_tile<0, 0, 4, 3, 0, 1>, + ConvImpl::template process_tile<0, 0, 4, 3, 0, 2>, + ConvImpl::template process_tile<0, 0, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 4, 3, 1, 0>, + ConvImpl::template process_tile<0, 0, 4, 3, 1, 1>, + ConvImpl::template process_tile<0, 0, 4, 3, 1, 2>, + ConvImpl::template process_tile<0, 0, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 4, 3, 2, 0>, + ConvImpl::template process_tile<0, 0, 4, 3, 2, 1>, + ConvImpl::template process_tile<0, 0, 4, 3, 2, 2>, + ConvImpl::template process_tile<0, 0, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 4, 3, 3, 0>, + ConvImpl::template process_tile<0, 0, 4, 3, 3, 1>, + ConvImpl::template process_tile<0, 0, 4, 3, 3, 2>, + ConvImpl::template process_tile<0, 0, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 0, 4, 4, 0, 0>, + ConvImpl::template process_tile<0, 0, 4, 4, 0, 1>, + ConvImpl::template process_tile<0, 0, 4, 4, 0, 2>, + ConvImpl::template process_tile<0, 0, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 0, 4, 4, 1, 0>, + ConvImpl::template process_tile<0, 0, 4, 4, 1, 1>, + ConvImpl::template process_tile<0, 0, 4, 4, 1, 2>, + ConvImpl::template process_tile<0, 0, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 0, 4, 4, 2, 0>, + ConvImpl::template process_tile<0, 0, 4, 4, 2, 1>, + ConvImpl::template process_tile<0, 0, 4, 4, 2, 2>, + ConvImpl::template process_tile<0, 0, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 0, 4, 4, 3, 0>, + ConvImpl::template process_tile<0, 0, 4, 4, 3, 1>, + ConvImpl::template process_tile<0, 0, 4, 4, 3, 2>, + ConvImpl::template process_tile<0, 0, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 0, 1>, + ConvImpl::template process_tile<0, 1, 0, 0, 0, 2>, + ConvImpl::template process_tile<0, 1, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 1, 1>, + ConvImpl::template process_tile<0, 1, 0, 0, 1, 2>, + ConvImpl::template process_tile<0, 1, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 0, 0, 2, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 2, 1>, + ConvImpl::template process_tile<0, 1, 0, 0, 2, 2>, + ConvImpl::template process_tile<0, 1, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 0, 0, 3, 0>, + ConvImpl::template process_tile<0, 1, 0, 0, 3, 1>, + ConvImpl::template process_tile<0, 1, 0, 0, 3, 2>, + ConvImpl::template process_tile<0, 1, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 0, 1>, + ConvImpl::template process_tile<0, 1, 0, 1, 0, 2>, + ConvImpl::template process_tile<0, 1, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 1, 1>, + ConvImpl::template process_tile<0, 1, 0, 1, 1, 2>, + ConvImpl::template process_tile<0, 1, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 0, 1, 2, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 2, 1>, + ConvImpl::template process_tile<0, 1, 0, 1, 2, 2>, + ConvImpl::template process_tile<0, 1, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 0, 1, 3, 0>, + ConvImpl::template process_tile<0, 1, 0, 1, 3, 1>, + ConvImpl::template process_tile<0, 1, 0, 1, 3, 2>, + ConvImpl::template process_tile<0, 1, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 0, 1>, + ConvImpl::template process_tile<0, 1, 0, 2, 0, 2>, + ConvImpl::template process_tile<0, 1, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 1, 1>, + ConvImpl::template process_tile<0, 1, 0, 2, 1, 2>, + ConvImpl::template process_tile<0, 1, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 0, 2, 2, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 2, 1>, + ConvImpl::template process_tile<0, 1, 0, 2, 2, 2>, + ConvImpl::template process_tile<0, 1, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 0, 2, 3, 0>, + ConvImpl::template process_tile<0, 1, 0, 2, 3, 1>, + ConvImpl::template process_tile<0, 1, 0, 2, 3, 2>, + ConvImpl::template process_tile<0, 1, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 3, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 3, 0, 1>, + ConvImpl::template process_tile<0, 1, 0, 3, 0, 2>, + ConvImpl::template process_tile<0, 1, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 3, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 3, 1, 1>, + ConvImpl::template process_tile<0, 1, 0, 3, 1, 2>, + ConvImpl::template process_tile<0, 1, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 0, 3, 2, 0>, + ConvImpl::template process_tile<0, 1, 0, 3, 2, 1>, + ConvImpl::template process_tile<0, 1, 0, 3, 2, 2>, + ConvImpl::template process_tile<0, 1, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 0, 3, 3, 0>, + ConvImpl::template process_tile<0, 1, 0, 3, 3, 1>, + ConvImpl::template process_tile<0, 1, 0, 3, 3, 2>, + ConvImpl::template process_tile<0, 1, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 0, 4, 0, 0>, + ConvImpl::template process_tile<0, 1, 0, 4, 0, 1>, + ConvImpl::template process_tile<0, 1, 0, 4, 0, 2>, + ConvImpl::template process_tile<0, 1, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 0, 4, 1, 0>, + ConvImpl::template process_tile<0, 1, 0, 4, 1, 1>, + ConvImpl::template process_tile<0, 1, 0, 4, 1, 2>, + ConvImpl::template process_tile<0, 1, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 0, 4, 2, 0>, + ConvImpl::template process_tile<0, 1, 0, 4, 2, 1>, + ConvImpl::template process_tile<0, 1, 0, 4, 2, 2>, + ConvImpl::template process_tile<0, 1, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 0, 4, 3, 0>, + ConvImpl::template process_tile<0, 1, 0, 4, 3, 1>, + ConvImpl::template process_tile<0, 1, 0, 4, 3, 2>, + ConvImpl::template process_tile<0, 1, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 0, 1>, + ConvImpl::template process_tile<0, 1, 1, 0, 0, 2>, + ConvImpl::template process_tile<0, 1, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 1, 1>, + ConvImpl::template process_tile<0, 1, 1, 0, 1, 2>, + ConvImpl::template process_tile<0, 1, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 1, 0, 2, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 2, 1>, + ConvImpl::template process_tile<0, 1, 1, 0, 2, 2>, + ConvImpl::template process_tile<0, 1, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 1, 0, 3, 0>, + ConvImpl::template process_tile<0, 1, 1, 0, 3, 1>, + ConvImpl::template process_tile<0, 1, 1, 0, 3, 2>, + ConvImpl::template process_tile<0, 1, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 0, 1>, + ConvImpl::template process_tile<0, 1, 1, 1, 0, 2>, + ConvImpl::template process_tile<0, 1, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 1, 1>, + ConvImpl::template process_tile<0, 1, 1, 1, 1, 2>, + ConvImpl::template process_tile<0, 1, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 1, 1, 2, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 2, 1>, + ConvImpl::template process_tile<0, 1, 1, 1, 2, 2>, + ConvImpl::template process_tile<0, 1, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 1, 1, 3, 0>, + ConvImpl::template process_tile<0, 1, 1, 1, 3, 1>, + ConvImpl::template process_tile<0, 1, 1, 1, 3, 2>, + ConvImpl::template process_tile<0, 1, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 0, 1>, + ConvImpl::template process_tile<0, 1, 1, 2, 0, 2>, + ConvImpl::template process_tile<0, 1, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 1, 1>, + ConvImpl::template process_tile<0, 1, 1, 2, 1, 2>, + ConvImpl::template process_tile<0, 1, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 1, 2, 2, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 2, 1>, + ConvImpl::template process_tile<0, 1, 1, 2, 2, 2>, + ConvImpl::template process_tile<0, 1, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 1, 2, 3, 0>, + ConvImpl::template process_tile<0, 1, 1, 2, 3, 1>, + ConvImpl::template process_tile<0, 1, 1, 2, 3, 2>, + ConvImpl::template process_tile<0, 1, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 3, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 3, 0, 1>, + ConvImpl::template process_tile<0, 1, 1, 3, 0, 2>, + ConvImpl::template process_tile<0, 1, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 3, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 3, 1, 1>, + ConvImpl::template process_tile<0, 1, 1, 3, 1, 2>, + ConvImpl::template process_tile<0, 1, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 1, 3, 2, 0>, + ConvImpl::template process_tile<0, 1, 1, 3, 2, 1>, + ConvImpl::template process_tile<0, 1, 1, 3, 2, 2>, + ConvImpl::template process_tile<0, 1, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 1, 3, 3, 0>, + ConvImpl::template process_tile<0, 1, 1, 3, 3, 1>, + ConvImpl::template process_tile<0, 1, 1, 3, 3, 2>, + ConvImpl::template process_tile<0, 1, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 1, 4, 0, 0>, + ConvImpl::template process_tile<0, 1, 1, 4, 0, 1>, + ConvImpl::template process_tile<0, 1, 1, 4, 0, 2>, + ConvImpl::template process_tile<0, 1, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 1, 4, 1, 0>, + ConvImpl::template process_tile<0, 1, 1, 4, 1, 1>, + ConvImpl::template process_tile<0, 1, 1, 4, 1, 2>, + ConvImpl::template process_tile<0, 1, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 1, 4, 2, 0>, + ConvImpl::template process_tile<0, 1, 1, 4, 2, 1>, + ConvImpl::template process_tile<0, 1, 1, 4, 2, 2>, + ConvImpl::template process_tile<0, 1, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 1, 4, 3, 0>, + ConvImpl::template process_tile<0, 1, 1, 4, 3, 1>, + ConvImpl::template process_tile<0, 1, 1, 4, 3, 2>, + ConvImpl::template process_tile<0, 1, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 0, 1>, + ConvImpl::template process_tile<0, 1, 2, 0, 0, 2>, + ConvImpl::template process_tile<0, 1, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 1, 1>, + ConvImpl::template process_tile<0, 1, 2, 0, 1, 2>, + ConvImpl::template process_tile<0, 1, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 2, 0, 2, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 2, 1>, + ConvImpl::template process_tile<0, 1, 2, 0, 2, 2>, + ConvImpl::template process_tile<0, 1, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 2, 0, 3, 0>, + ConvImpl::template process_tile<0, 1, 2, 0, 3, 1>, + ConvImpl::template process_tile<0, 1, 2, 0, 3, 2>, + ConvImpl::template process_tile<0, 1, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 0, 1>, + ConvImpl::template process_tile<0, 1, 2, 1, 0, 2>, + ConvImpl::template process_tile<0, 1, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 1, 1>, + ConvImpl::template process_tile<0, 1, 2, 1, 1, 2>, + ConvImpl::template process_tile<0, 1, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 2, 1, 2, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 2, 1>, + ConvImpl::template process_tile<0, 1, 2, 1, 2, 2>, + ConvImpl::template process_tile<0, 1, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 2, 1, 3, 0>, + ConvImpl::template process_tile<0, 1, 2, 1, 3, 1>, + ConvImpl::template process_tile<0, 1, 2, 1, 3, 2>, + ConvImpl::template process_tile<0, 1, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 0, 1>, + ConvImpl::template process_tile<0, 1, 2, 2, 0, 2>, + ConvImpl::template process_tile<0, 1, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 1, 1>, + ConvImpl::template process_tile<0, 1, 2, 2, 1, 2>, + ConvImpl::template process_tile<0, 1, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 2, 2, 2, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 2, 1>, + ConvImpl::template process_tile<0, 1, 2, 2, 2, 2>, + ConvImpl::template process_tile<0, 1, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 2, 2, 3, 0>, + ConvImpl::template process_tile<0, 1, 2, 2, 3, 1>, + ConvImpl::template process_tile<0, 1, 2, 2, 3, 2>, + ConvImpl::template process_tile<0, 1, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 3, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 3, 0, 1>, + ConvImpl::template process_tile<0, 1, 2, 3, 0, 2>, + ConvImpl::template process_tile<0, 1, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 3, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 3, 1, 1>, + ConvImpl::template process_tile<0, 1, 2, 3, 1, 2>, + ConvImpl::template process_tile<0, 1, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 2, 3, 2, 0>, + ConvImpl::template process_tile<0, 1, 2, 3, 2, 1>, + ConvImpl::template process_tile<0, 1, 2, 3, 2, 2>, + ConvImpl::template process_tile<0, 1, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 2, 3, 3, 0>, + ConvImpl::template process_tile<0, 1, 2, 3, 3, 1>, + ConvImpl::template process_tile<0, 1, 2, 3, 3, 2>, + ConvImpl::template process_tile<0, 1, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 2, 4, 0, 0>, + ConvImpl::template process_tile<0, 1, 2, 4, 0, 1>, + ConvImpl::template process_tile<0, 1, 2, 4, 0, 2>, + ConvImpl::template process_tile<0, 1, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 2, 4, 1, 0>, + ConvImpl::template process_tile<0, 1, 2, 4, 1, 1>, + ConvImpl::template process_tile<0, 1, 2, 4, 1, 2>, + ConvImpl::template process_tile<0, 1, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 2, 4, 2, 0>, + ConvImpl::template process_tile<0, 1, 2, 4, 2, 1>, + ConvImpl::template process_tile<0, 1, 2, 4, 2, 2>, + ConvImpl::template process_tile<0, 1, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 2, 4, 3, 0>, + ConvImpl::template process_tile<0, 1, 2, 4, 3, 1>, + ConvImpl::template process_tile<0, 1, 2, 4, 3, 2>, + ConvImpl::template process_tile<0, 1, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 3, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 3, 0, 0, 1>, + ConvImpl::template process_tile<0, 1, 3, 0, 0, 2>, + ConvImpl::template process_tile<0, 1, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 3, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 3, 0, 1, 1>, + ConvImpl::template process_tile<0, 1, 3, 0, 1, 2>, + ConvImpl::template process_tile<0, 1, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 3, 0, 2, 0>, + ConvImpl::template process_tile<0, 1, 3, 0, 2, 1>, + ConvImpl::template process_tile<0, 1, 3, 0, 2, 2>, + ConvImpl::template process_tile<0, 1, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 3, 0, 3, 0>, + ConvImpl::template process_tile<0, 1, 3, 0, 3, 1>, + ConvImpl::template process_tile<0, 1, 3, 0, 3, 2>, + ConvImpl::template process_tile<0, 1, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 3, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 3, 1, 0, 1>, + ConvImpl::template process_tile<0, 1, 3, 1, 0, 2>, + ConvImpl::template process_tile<0, 1, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 3, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 3, 1, 1, 1>, + ConvImpl::template process_tile<0, 1, 3, 1, 1, 2>, + ConvImpl::template process_tile<0, 1, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 3, 1, 2, 0>, + ConvImpl::template process_tile<0, 1, 3, 1, 2, 1>, + ConvImpl::template process_tile<0, 1, 3, 1, 2, 2>, + ConvImpl::template process_tile<0, 1, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 3, 1, 3, 0>, + ConvImpl::template process_tile<0, 1, 3, 1, 3, 1>, + ConvImpl::template process_tile<0, 1, 3, 1, 3, 2>, + ConvImpl::template process_tile<0, 1, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 3, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 3, 2, 0, 1>, + ConvImpl::template process_tile<0, 1, 3, 2, 0, 2>, + ConvImpl::template process_tile<0, 1, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 3, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 3, 2, 1, 1>, + ConvImpl::template process_tile<0, 1, 3, 2, 1, 2>, + ConvImpl::template process_tile<0, 1, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 3, 2, 2, 0>, + ConvImpl::template process_tile<0, 1, 3, 2, 2, 1>, + ConvImpl::template process_tile<0, 1, 3, 2, 2, 2>, + ConvImpl::template process_tile<0, 1, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 3, 2, 3, 0>, + ConvImpl::template process_tile<0, 1, 3, 2, 3, 1>, + ConvImpl::template process_tile<0, 1, 3, 2, 3, 2>, + ConvImpl::template process_tile<0, 1, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 3, 3, 0, 0>, + ConvImpl::template process_tile<0, 1, 3, 3, 0, 1>, + ConvImpl::template process_tile<0, 1, 3, 3, 0, 2>, + ConvImpl::template process_tile<0, 1, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 3, 3, 1, 0>, + ConvImpl::template process_tile<0, 1, 3, 3, 1, 1>, + ConvImpl::template process_tile<0, 1, 3, 3, 1, 2>, + ConvImpl::template process_tile<0, 1, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 3, 3, 2, 0>, + ConvImpl::template process_tile<0, 1, 3, 3, 2, 1>, + ConvImpl::template process_tile<0, 1, 3, 3, 2, 2>, + ConvImpl::template process_tile<0, 1, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 3, 3, 3, 0>, + ConvImpl::template process_tile<0, 1, 3, 3, 3, 1>, + ConvImpl::template process_tile<0, 1, 3, 3, 3, 2>, + ConvImpl::template process_tile<0, 1, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 3, 4, 0, 0>, + ConvImpl::template process_tile<0, 1, 3, 4, 0, 1>, + ConvImpl::template process_tile<0, 1, 3, 4, 0, 2>, + ConvImpl::template process_tile<0, 1, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 3, 4, 1, 0>, + ConvImpl::template process_tile<0, 1, 3, 4, 1, 1>, + ConvImpl::template process_tile<0, 1, 3, 4, 1, 2>, + ConvImpl::template process_tile<0, 1, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 3, 4, 2, 0>, + ConvImpl::template process_tile<0, 1, 3, 4, 2, 1>, + ConvImpl::template process_tile<0, 1, 3, 4, 2, 2>, + ConvImpl::template process_tile<0, 1, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 3, 4, 3, 0>, + ConvImpl::template process_tile<0, 1, 3, 4, 3, 1>, + ConvImpl::template process_tile<0, 1, 3, 4, 3, 2>, + ConvImpl::template process_tile<0, 1, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 4, 0, 0, 0>, + ConvImpl::template process_tile<0, 1, 4, 0, 0, 1>, + ConvImpl::template process_tile<0, 1, 4, 0, 0, 2>, + ConvImpl::template process_tile<0, 1, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 4, 0, 1, 0>, + ConvImpl::template process_tile<0, 1, 4, 0, 1, 1>, + ConvImpl::template process_tile<0, 1, 4, 0, 1, 2>, + ConvImpl::template process_tile<0, 1, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 4, 0, 2, 0>, + ConvImpl::template process_tile<0, 1, 4, 0, 2, 1>, + ConvImpl::template process_tile<0, 1, 4, 0, 2, 2>, + ConvImpl::template process_tile<0, 1, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 4, 0, 3, 0>, + ConvImpl::template process_tile<0, 1, 4, 0, 3, 1>, + ConvImpl::template process_tile<0, 1, 4, 0, 3, 2>, + ConvImpl::template process_tile<0, 1, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 4, 1, 0, 0>, + ConvImpl::template process_tile<0, 1, 4, 1, 0, 1>, + ConvImpl::template process_tile<0, 1, 4, 1, 0, 2>, + ConvImpl::template process_tile<0, 1, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 4, 1, 1, 0>, + ConvImpl::template process_tile<0, 1, 4, 1, 1, 1>, + ConvImpl::template process_tile<0, 1, 4, 1, 1, 2>, + ConvImpl::template process_tile<0, 1, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 4, 1, 2, 0>, + ConvImpl::template process_tile<0, 1, 4, 1, 2, 1>, + ConvImpl::template process_tile<0, 1, 4, 1, 2, 2>, + ConvImpl::template process_tile<0, 1, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 4, 1, 3, 0>, + ConvImpl::template process_tile<0, 1, 4, 1, 3, 1>, + ConvImpl::template process_tile<0, 1, 4, 1, 3, 2>, + ConvImpl::template process_tile<0, 1, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 4, 2, 0, 0>, + ConvImpl::template process_tile<0, 1, 4, 2, 0, 1>, + ConvImpl::template process_tile<0, 1, 4, 2, 0, 2>, + ConvImpl::template process_tile<0, 1, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 4, 2, 1, 0>, + ConvImpl::template process_tile<0, 1, 4, 2, 1, 1>, + ConvImpl::template process_tile<0, 1, 4, 2, 1, 2>, + ConvImpl::template process_tile<0, 1, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 4, 2, 2, 0>, + ConvImpl::template process_tile<0, 1, 4, 2, 2, 1>, + ConvImpl::template process_tile<0, 1, 4, 2, 2, 2>, + ConvImpl::template process_tile<0, 1, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 4, 2, 3, 0>, + ConvImpl::template process_tile<0, 1, 4, 2, 3, 1>, + ConvImpl::template process_tile<0, 1, 4, 2, 3, 2>, + ConvImpl::template process_tile<0, 1, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 4, 3, 0, 0>, + ConvImpl::template process_tile<0, 1, 4, 3, 0, 1>, + ConvImpl::template process_tile<0, 1, 4, 3, 0, 2>, + ConvImpl::template process_tile<0, 1, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 4, 3, 1, 0>, + ConvImpl::template process_tile<0, 1, 4, 3, 1, 1>, + ConvImpl::template process_tile<0, 1, 4, 3, 1, 2>, + ConvImpl::template process_tile<0, 1, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 4, 3, 2, 0>, + ConvImpl::template process_tile<0, 1, 4, 3, 2, 1>, + ConvImpl::template process_tile<0, 1, 4, 3, 2, 2>, + ConvImpl::template process_tile<0, 1, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 4, 3, 3, 0>, + ConvImpl::template process_tile<0, 1, 4, 3, 3, 1>, + ConvImpl::template process_tile<0, 1, 4, 3, 3, 2>, + ConvImpl::template process_tile<0, 1, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<0, 1, 4, 4, 0, 0>, + ConvImpl::template process_tile<0, 1, 4, 4, 0, 1>, + ConvImpl::template process_tile<0, 1, 4, 4, 0, 2>, + ConvImpl::template process_tile<0, 1, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<0, 1, 4, 4, 1, 0>, + ConvImpl::template process_tile<0, 1, 4, 4, 1, 1>, + ConvImpl::template process_tile<0, 1, 4, 4, 1, 2>, + ConvImpl::template process_tile<0, 1, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<0, 1, 4, 4, 2, 0>, + ConvImpl::template process_tile<0, 1, 4, 4, 2, 1>, + ConvImpl::template process_tile<0, 1, 4, 4, 2, 2>, + ConvImpl::template process_tile<0, 1, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<0, 1, 4, 4, 3, 0>, + ConvImpl::template process_tile<0, 1, 4, 4, 3, 1>, + ConvImpl::template process_tile<0, 1, 4, 4, 3, 2>, + ConvImpl::template process_tile<0, 1, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 0, 1>, + ConvImpl::template process_tile<1, 0, 0, 0, 0, 2>, + ConvImpl::template process_tile<1, 0, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 1, 1>, + ConvImpl::template process_tile<1, 0, 0, 0, 1, 2>, + ConvImpl::template process_tile<1, 0, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 0, 0, 2, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 2, 1>, + ConvImpl::template process_tile<1, 0, 0, 0, 2, 2>, + ConvImpl::template process_tile<1, 0, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 0, 0, 3, 0>, + ConvImpl::template process_tile<1, 0, 0, 0, 3, 1>, + ConvImpl::template process_tile<1, 0, 0, 0, 3, 2>, + ConvImpl::template process_tile<1, 0, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 0, 1>, + ConvImpl::template process_tile<1, 0, 0, 1, 0, 2>, + ConvImpl::template process_tile<1, 0, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 1, 1>, + ConvImpl::template process_tile<1, 0, 0, 1, 1, 2>, + ConvImpl::template process_tile<1, 0, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 0, 1, 2, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 2, 1>, + ConvImpl::template process_tile<1, 0, 0, 1, 2, 2>, + ConvImpl::template process_tile<1, 0, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 0, 1, 3, 0>, + ConvImpl::template process_tile<1, 0, 0, 1, 3, 1>, + ConvImpl::template process_tile<1, 0, 0, 1, 3, 2>, + ConvImpl::template process_tile<1, 0, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 0, 1>, + ConvImpl::template process_tile<1, 0, 0, 2, 0, 2>, + ConvImpl::template process_tile<1, 0, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 1, 1>, + ConvImpl::template process_tile<1, 0, 0, 2, 1, 2>, + ConvImpl::template process_tile<1, 0, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 0, 2, 2, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 2, 1>, + ConvImpl::template process_tile<1, 0, 0, 2, 2, 2>, + ConvImpl::template process_tile<1, 0, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 0, 2, 3, 0>, + ConvImpl::template process_tile<1, 0, 0, 2, 3, 1>, + ConvImpl::template process_tile<1, 0, 0, 2, 3, 2>, + ConvImpl::template process_tile<1, 0, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 3, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 3, 0, 1>, + ConvImpl::template process_tile<1, 0, 0, 3, 0, 2>, + ConvImpl::template process_tile<1, 0, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 3, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 3, 1, 1>, + ConvImpl::template process_tile<1, 0, 0, 3, 1, 2>, + ConvImpl::template process_tile<1, 0, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 0, 3, 2, 0>, + ConvImpl::template process_tile<1, 0, 0, 3, 2, 1>, + ConvImpl::template process_tile<1, 0, 0, 3, 2, 2>, + ConvImpl::template process_tile<1, 0, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 0, 3, 3, 0>, + ConvImpl::template process_tile<1, 0, 0, 3, 3, 1>, + ConvImpl::template process_tile<1, 0, 0, 3, 3, 2>, + ConvImpl::template process_tile<1, 0, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 0, 4, 0, 0>, + ConvImpl::template process_tile<1, 0, 0, 4, 0, 1>, + ConvImpl::template process_tile<1, 0, 0, 4, 0, 2>, + ConvImpl::template process_tile<1, 0, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 0, 4, 1, 0>, + ConvImpl::template process_tile<1, 0, 0, 4, 1, 1>, + ConvImpl::template process_tile<1, 0, 0, 4, 1, 2>, + ConvImpl::template process_tile<1, 0, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 0, 4, 2, 0>, + ConvImpl::template process_tile<1, 0, 0, 4, 2, 1>, + ConvImpl::template process_tile<1, 0, 0, 4, 2, 2>, + ConvImpl::template process_tile<1, 0, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 0, 4, 3, 0>, + ConvImpl::template process_tile<1, 0, 0, 4, 3, 1>, + ConvImpl::template process_tile<1, 0, 0, 4, 3, 2>, + ConvImpl::template process_tile<1, 0, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 0, 1>, + ConvImpl::template process_tile<1, 0, 1, 0, 0, 2>, + ConvImpl::template process_tile<1, 0, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 1, 1>, + ConvImpl::template process_tile<1, 0, 1, 0, 1, 2>, + ConvImpl::template process_tile<1, 0, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 1, 0, 2, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 2, 1>, + ConvImpl::template process_tile<1, 0, 1, 0, 2, 2>, + ConvImpl::template process_tile<1, 0, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 1, 0, 3, 0>, + ConvImpl::template process_tile<1, 0, 1, 0, 3, 1>, + ConvImpl::template process_tile<1, 0, 1, 0, 3, 2>, + ConvImpl::template process_tile<1, 0, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 0, 1>, + ConvImpl::template process_tile<1, 0, 1, 1, 0, 2>, + ConvImpl::template process_tile<1, 0, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 1, 1>, + ConvImpl::template process_tile<1, 0, 1, 1, 1, 2>, + ConvImpl::template process_tile<1, 0, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 1, 1, 2, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 2, 1>, + ConvImpl::template process_tile<1, 0, 1, 1, 2, 2>, + ConvImpl::template process_tile<1, 0, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 1, 1, 3, 0>, + ConvImpl::template process_tile<1, 0, 1, 1, 3, 1>, + ConvImpl::template process_tile<1, 0, 1, 1, 3, 2>, + ConvImpl::template process_tile<1, 0, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 0, 1>, + ConvImpl::template process_tile<1, 0, 1, 2, 0, 2>, + ConvImpl::template process_tile<1, 0, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 1, 1>, + ConvImpl::template process_tile<1, 0, 1, 2, 1, 2>, + ConvImpl::template process_tile<1, 0, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 1, 2, 2, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 2, 1>, + ConvImpl::template process_tile<1, 0, 1, 2, 2, 2>, + ConvImpl::template process_tile<1, 0, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 1, 2, 3, 0>, + ConvImpl::template process_tile<1, 0, 1, 2, 3, 1>, + ConvImpl::template process_tile<1, 0, 1, 2, 3, 2>, + ConvImpl::template process_tile<1, 0, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 3, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 3, 0, 1>, + ConvImpl::template process_tile<1, 0, 1, 3, 0, 2>, + ConvImpl::template process_tile<1, 0, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 3, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 3, 1, 1>, + ConvImpl::template process_tile<1, 0, 1, 3, 1, 2>, + ConvImpl::template process_tile<1, 0, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 1, 3, 2, 0>, + ConvImpl::template process_tile<1, 0, 1, 3, 2, 1>, + ConvImpl::template process_tile<1, 0, 1, 3, 2, 2>, + ConvImpl::template process_tile<1, 0, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 1, 3, 3, 0>, + ConvImpl::template process_tile<1, 0, 1, 3, 3, 1>, + ConvImpl::template process_tile<1, 0, 1, 3, 3, 2>, + ConvImpl::template process_tile<1, 0, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 1, 4, 0, 0>, + ConvImpl::template process_tile<1, 0, 1, 4, 0, 1>, + ConvImpl::template process_tile<1, 0, 1, 4, 0, 2>, + ConvImpl::template process_tile<1, 0, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 1, 4, 1, 0>, + ConvImpl::template process_tile<1, 0, 1, 4, 1, 1>, + ConvImpl::template process_tile<1, 0, 1, 4, 1, 2>, + ConvImpl::template process_tile<1, 0, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 1, 4, 2, 0>, + ConvImpl::template process_tile<1, 0, 1, 4, 2, 1>, + ConvImpl::template process_tile<1, 0, 1, 4, 2, 2>, + ConvImpl::template process_tile<1, 0, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 1, 4, 3, 0>, + ConvImpl::template process_tile<1, 0, 1, 4, 3, 1>, + ConvImpl::template process_tile<1, 0, 1, 4, 3, 2>, + ConvImpl::template process_tile<1, 0, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 0, 1>, + ConvImpl::template process_tile<1, 0, 2, 0, 0, 2>, + ConvImpl::template process_tile<1, 0, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 1, 1>, + ConvImpl::template process_tile<1, 0, 2, 0, 1, 2>, + ConvImpl::template process_tile<1, 0, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 2, 0, 2, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 2, 1>, + ConvImpl::template process_tile<1, 0, 2, 0, 2, 2>, + ConvImpl::template process_tile<1, 0, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 2, 0, 3, 0>, + ConvImpl::template process_tile<1, 0, 2, 0, 3, 1>, + ConvImpl::template process_tile<1, 0, 2, 0, 3, 2>, + ConvImpl::template process_tile<1, 0, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 0, 1>, + ConvImpl::template process_tile<1, 0, 2, 1, 0, 2>, + ConvImpl::template process_tile<1, 0, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 1, 1>, + ConvImpl::template process_tile<1, 0, 2, 1, 1, 2>, + ConvImpl::template process_tile<1, 0, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 2, 1, 2, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 2, 1>, + ConvImpl::template process_tile<1, 0, 2, 1, 2, 2>, + ConvImpl::template process_tile<1, 0, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 2, 1, 3, 0>, + ConvImpl::template process_tile<1, 0, 2, 1, 3, 1>, + ConvImpl::template process_tile<1, 0, 2, 1, 3, 2>, + ConvImpl::template process_tile<1, 0, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 0, 1>, + ConvImpl::template process_tile<1, 0, 2, 2, 0, 2>, + ConvImpl::template process_tile<1, 0, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 1, 1>, + ConvImpl::template process_tile<1, 0, 2, 2, 1, 2>, + ConvImpl::template process_tile<1, 0, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 2, 2, 2, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 2, 1>, + ConvImpl::template process_tile<1, 0, 2, 2, 2, 2>, + ConvImpl::template process_tile<1, 0, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 2, 2, 3, 0>, + ConvImpl::template process_tile<1, 0, 2, 2, 3, 1>, + ConvImpl::template process_tile<1, 0, 2, 2, 3, 2>, + ConvImpl::template process_tile<1, 0, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 3, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 3, 0, 1>, + ConvImpl::template process_tile<1, 0, 2, 3, 0, 2>, + ConvImpl::template process_tile<1, 0, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 3, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 3, 1, 1>, + ConvImpl::template process_tile<1, 0, 2, 3, 1, 2>, + ConvImpl::template process_tile<1, 0, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 2, 3, 2, 0>, + ConvImpl::template process_tile<1, 0, 2, 3, 2, 1>, + ConvImpl::template process_tile<1, 0, 2, 3, 2, 2>, + ConvImpl::template process_tile<1, 0, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 2, 3, 3, 0>, + ConvImpl::template process_tile<1, 0, 2, 3, 3, 1>, + ConvImpl::template process_tile<1, 0, 2, 3, 3, 2>, + ConvImpl::template process_tile<1, 0, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 2, 4, 0, 0>, + ConvImpl::template process_tile<1, 0, 2, 4, 0, 1>, + ConvImpl::template process_tile<1, 0, 2, 4, 0, 2>, + ConvImpl::template process_tile<1, 0, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 2, 4, 1, 0>, + ConvImpl::template process_tile<1, 0, 2, 4, 1, 1>, + ConvImpl::template process_tile<1, 0, 2, 4, 1, 2>, + ConvImpl::template process_tile<1, 0, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 2, 4, 2, 0>, + ConvImpl::template process_tile<1, 0, 2, 4, 2, 1>, + ConvImpl::template process_tile<1, 0, 2, 4, 2, 2>, + ConvImpl::template process_tile<1, 0, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 2, 4, 3, 0>, + ConvImpl::template process_tile<1, 0, 2, 4, 3, 1>, + ConvImpl::template process_tile<1, 0, 2, 4, 3, 2>, + ConvImpl::template process_tile<1, 0, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 3, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 3, 0, 0, 1>, + ConvImpl::template process_tile<1, 0, 3, 0, 0, 2>, + ConvImpl::template process_tile<1, 0, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 3, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 3, 0, 1, 1>, + ConvImpl::template process_tile<1, 0, 3, 0, 1, 2>, + ConvImpl::template process_tile<1, 0, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 3, 0, 2, 0>, + ConvImpl::template process_tile<1, 0, 3, 0, 2, 1>, + ConvImpl::template process_tile<1, 0, 3, 0, 2, 2>, + ConvImpl::template process_tile<1, 0, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 3, 0, 3, 0>, + ConvImpl::template process_tile<1, 0, 3, 0, 3, 1>, + ConvImpl::template process_tile<1, 0, 3, 0, 3, 2>, + ConvImpl::template process_tile<1, 0, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 3, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 3, 1, 0, 1>, + ConvImpl::template process_tile<1, 0, 3, 1, 0, 2>, + ConvImpl::template process_tile<1, 0, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 3, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 3, 1, 1, 1>, + ConvImpl::template process_tile<1, 0, 3, 1, 1, 2>, + ConvImpl::template process_tile<1, 0, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 3, 1, 2, 0>, + ConvImpl::template process_tile<1, 0, 3, 1, 2, 1>, + ConvImpl::template process_tile<1, 0, 3, 1, 2, 2>, + ConvImpl::template process_tile<1, 0, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 3, 1, 3, 0>, + ConvImpl::template process_tile<1, 0, 3, 1, 3, 1>, + ConvImpl::template process_tile<1, 0, 3, 1, 3, 2>, + ConvImpl::template process_tile<1, 0, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 3, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 3, 2, 0, 1>, + ConvImpl::template process_tile<1, 0, 3, 2, 0, 2>, + ConvImpl::template process_tile<1, 0, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 3, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 3, 2, 1, 1>, + ConvImpl::template process_tile<1, 0, 3, 2, 1, 2>, + ConvImpl::template process_tile<1, 0, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 3, 2, 2, 0>, + ConvImpl::template process_tile<1, 0, 3, 2, 2, 1>, + ConvImpl::template process_tile<1, 0, 3, 2, 2, 2>, + ConvImpl::template process_tile<1, 0, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 3, 2, 3, 0>, + ConvImpl::template process_tile<1, 0, 3, 2, 3, 1>, + ConvImpl::template process_tile<1, 0, 3, 2, 3, 2>, + ConvImpl::template process_tile<1, 0, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 3, 3, 0, 0>, + ConvImpl::template process_tile<1, 0, 3, 3, 0, 1>, + ConvImpl::template process_tile<1, 0, 3, 3, 0, 2>, + ConvImpl::template process_tile<1, 0, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 3, 3, 1, 0>, + ConvImpl::template process_tile<1, 0, 3, 3, 1, 1>, + ConvImpl::template process_tile<1, 0, 3, 3, 1, 2>, + ConvImpl::template process_tile<1, 0, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 3, 3, 2, 0>, + ConvImpl::template process_tile<1, 0, 3, 3, 2, 1>, + ConvImpl::template process_tile<1, 0, 3, 3, 2, 2>, + ConvImpl::template process_tile<1, 0, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 3, 3, 3, 0>, + ConvImpl::template process_tile<1, 0, 3, 3, 3, 1>, + ConvImpl::template process_tile<1, 0, 3, 3, 3, 2>, + ConvImpl::template process_tile<1, 0, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 3, 4, 0, 0>, + ConvImpl::template process_tile<1, 0, 3, 4, 0, 1>, + ConvImpl::template process_tile<1, 0, 3, 4, 0, 2>, + ConvImpl::template process_tile<1, 0, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 3, 4, 1, 0>, + ConvImpl::template process_tile<1, 0, 3, 4, 1, 1>, + ConvImpl::template process_tile<1, 0, 3, 4, 1, 2>, + ConvImpl::template process_tile<1, 0, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 3, 4, 2, 0>, + ConvImpl::template process_tile<1, 0, 3, 4, 2, 1>, + ConvImpl::template process_tile<1, 0, 3, 4, 2, 2>, + ConvImpl::template process_tile<1, 0, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 3, 4, 3, 0>, + ConvImpl::template process_tile<1, 0, 3, 4, 3, 1>, + ConvImpl::template process_tile<1, 0, 3, 4, 3, 2>, + ConvImpl::template process_tile<1, 0, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 4, 0, 0, 0>, + ConvImpl::template process_tile<1, 0, 4, 0, 0, 1>, + ConvImpl::template process_tile<1, 0, 4, 0, 0, 2>, + ConvImpl::template process_tile<1, 0, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 4, 0, 1, 0>, + ConvImpl::template process_tile<1, 0, 4, 0, 1, 1>, + ConvImpl::template process_tile<1, 0, 4, 0, 1, 2>, + ConvImpl::template process_tile<1, 0, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 4, 0, 2, 0>, + ConvImpl::template process_tile<1, 0, 4, 0, 2, 1>, + ConvImpl::template process_tile<1, 0, 4, 0, 2, 2>, + ConvImpl::template process_tile<1, 0, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 4, 0, 3, 0>, + ConvImpl::template process_tile<1, 0, 4, 0, 3, 1>, + ConvImpl::template process_tile<1, 0, 4, 0, 3, 2>, + ConvImpl::template process_tile<1, 0, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 4, 1, 0, 0>, + ConvImpl::template process_tile<1, 0, 4, 1, 0, 1>, + ConvImpl::template process_tile<1, 0, 4, 1, 0, 2>, + ConvImpl::template process_tile<1, 0, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 4, 1, 1, 0>, + ConvImpl::template process_tile<1, 0, 4, 1, 1, 1>, + ConvImpl::template process_tile<1, 0, 4, 1, 1, 2>, + ConvImpl::template process_tile<1, 0, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 4, 1, 2, 0>, + ConvImpl::template process_tile<1, 0, 4, 1, 2, 1>, + ConvImpl::template process_tile<1, 0, 4, 1, 2, 2>, + ConvImpl::template process_tile<1, 0, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 4, 1, 3, 0>, + ConvImpl::template process_tile<1, 0, 4, 1, 3, 1>, + ConvImpl::template process_tile<1, 0, 4, 1, 3, 2>, + ConvImpl::template process_tile<1, 0, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 4, 2, 0, 0>, + ConvImpl::template process_tile<1, 0, 4, 2, 0, 1>, + ConvImpl::template process_tile<1, 0, 4, 2, 0, 2>, + ConvImpl::template process_tile<1, 0, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 4, 2, 1, 0>, + ConvImpl::template process_tile<1, 0, 4, 2, 1, 1>, + ConvImpl::template process_tile<1, 0, 4, 2, 1, 2>, + ConvImpl::template process_tile<1, 0, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 4, 2, 2, 0>, + ConvImpl::template process_tile<1, 0, 4, 2, 2, 1>, + ConvImpl::template process_tile<1, 0, 4, 2, 2, 2>, + ConvImpl::template process_tile<1, 0, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 4, 2, 3, 0>, + ConvImpl::template process_tile<1, 0, 4, 2, 3, 1>, + ConvImpl::template process_tile<1, 0, 4, 2, 3, 2>, + ConvImpl::template process_tile<1, 0, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 4, 3, 0, 0>, + ConvImpl::template process_tile<1, 0, 4, 3, 0, 1>, + ConvImpl::template process_tile<1, 0, 4, 3, 0, 2>, + ConvImpl::template process_tile<1, 0, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 4, 3, 1, 0>, + ConvImpl::template process_tile<1, 0, 4, 3, 1, 1>, + ConvImpl::template process_tile<1, 0, 4, 3, 1, 2>, + ConvImpl::template process_tile<1, 0, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 4, 3, 2, 0>, + ConvImpl::template process_tile<1, 0, 4, 3, 2, 1>, + ConvImpl::template process_tile<1, 0, 4, 3, 2, 2>, + ConvImpl::template process_tile<1, 0, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 4, 3, 3, 0>, + ConvImpl::template process_tile<1, 0, 4, 3, 3, 1>, + ConvImpl::template process_tile<1, 0, 4, 3, 3, 2>, + ConvImpl::template process_tile<1, 0, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 0, 4, 4, 0, 0>, + ConvImpl::template process_tile<1, 0, 4, 4, 0, 1>, + ConvImpl::template process_tile<1, 0, 4, 4, 0, 2>, + ConvImpl::template process_tile<1, 0, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 0, 4, 4, 1, 0>, + ConvImpl::template process_tile<1, 0, 4, 4, 1, 1>, + ConvImpl::template process_tile<1, 0, 4, 4, 1, 2>, + ConvImpl::template process_tile<1, 0, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 0, 4, 4, 2, 0>, + ConvImpl::template process_tile<1, 0, 4, 4, 2, 1>, + ConvImpl::template process_tile<1, 0, 4, 4, 2, 2>, + ConvImpl::template process_tile<1, 0, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 0, 4, 4, 3, 0>, + ConvImpl::template process_tile<1, 0, 4, 4, 3, 1>, + ConvImpl::template process_tile<1, 0, 4, 4, 3, 2>, + ConvImpl::template process_tile<1, 0, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 0, 1>, + ConvImpl::template process_tile<1, 1, 0, 0, 0, 2>, + ConvImpl::template process_tile<1, 1, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 1, 1>, + ConvImpl::template process_tile<1, 1, 0, 0, 1, 2>, + ConvImpl::template process_tile<1, 1, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 0, 0, 2, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 2, 1>, + ConvImpl::template process_tile<1, 1, 0, 0, 2, 2>, + ConvImpl::template process_tile<1, 1, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 0, 0, 3, 0>, + ConvImpl::template process_tile<1, 1, 0, 0, 3, 1>, + ConvImpl::template process_tile<1, 1, 0, 0, 3, 2>, + ConvImpl::template process_tile<1, 1, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 0, 1>, + ConvImpl::template process_tile<1, 1, 0, 1, 0, 2>, + ConvImpl::template process_tile<1, 1, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 1, 1>, + ConvImpl::template process_tile<1, 1, 0, 1, 1, 2>, + ConvImpl::template process_tile<1, 1, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 0, 1, 2, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 2, 1>, + ConvImpl::template process_tile<1, 1, 0, 1, 2, 2>, + ConvImpl::template process_tile<1, 1, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 0, 1, 3, 0>, + ConvImpl::template process_tile<1, 1, 0, 1, 3, 1>, + ConvImpl::template process_tile<1, 1, 0, 1, 3, 2>, + ConvImpl::template process_tile<1, 1, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 0, 1>, + ConvImpl::template process_tile<1, 1, 0, 2, 0, 2>, + ConvImpl::template process_tile<1, 1, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 1, 1>, + ConvImpl::template process_tile<1, 1, 0, 2, 1, 2>, + ConvImpl::template process_tile<1, 1, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 0, 2, 2, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 2, 1>, + ConvImpl::template process_tile<1, 1, 0, 2, 2, 2>, + ConvImpl::template process_tile<1, 1, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 0, 2, 3, 0>, + ConvImpl::template process_tile<1, 1, 0, 2, 3, 1>, + ConvImpl::template process_tile<1, 1, 0, 2, 3, 2>, + ConvImpl::template process_tile<1, 1, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 3, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 3, 0, 1>, + ConvImpl::template process_tile<1, 1, 0, 3, 0, 2>, + ConvImpl::template process_tile<1, 1, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 3, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 3, 1, 1>, + ConvImpl::template process_tile<1, 1, 0, 3, 1, 2>, + ConvImpl::template process_tile<1, 1, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 0, 3, 2, 0>, + ConvImpl::template process_tile<1, 1, 0, 3, 2, 1>, + ConvImpl::template process_tile<1, 1, 0, 3, 2, 2>, + ConvImpl::template process_tile<1, 1, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 0, 3, 3, 0>, + ConvImpl::template process_tile<1, 1, 0, 3, 3, 1>, + ConvImpl::template process_tile<1, 1, 0, 3, 3, 2>, + ConvImpl::template process_tile<1, 1, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 0, 4, 0, 0>, + ConvImpl::template process_tile<1, 1, 0, 4, 0, 1>, + ConvImpl::template process_tile<1, 1, 0, 4, 0, 2>, + ConvImpl::template process_tile<1, 1, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 0, 4, 1, 0>, + ConvImpl::template process_tile<1, 1, 0, 4, 1, 1>, + ConvImpl::template process_tile<1, 1, 0, 4, 1, 2>, + ConvImpl::template process_tile<1, 1, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 0, 4, 2, 0>, + ConvImpl::template process_tile<1, 1, 0, 4, 2, 1>, + ConvImpl::template process_tile<1, 1, 0, 4, 2, 2>, + ConvImpl::template process_tile<1, 1, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 0, 4, 3, 0>, + ConvImpl::template process_tile<1, 1, 0, 4, 3, 1>, + ConvImpl::template process_tile<1, 1, 0, 4, 3, 2>, + ConvImpl::template process_tile<1, 1, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 0, 1>, + ConvImpl::template process_tile<1, 1, 1, 0, 0, 2>, + ConvImpl::template process_tile<1, 1, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 1, 1>, + ConvImpl::template process_tile<1, 1, 1, 0, 1, 2>, + ConvImpl::template process_tile<1, 1, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 1, 0, 2, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 2, 1>, + ConvImpl::template process_tile<1, 1, 1, 0, 2, 2>, + ConvImpl::template process_tile<1, 1, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 1, 0, 3, 0>, + ConvImpl::template process_tile<1, 1, 1, 0, 3, 1>, + ConvImpl::template process_tile<1, 1, 1, 0, 3, 2>, + ConvImpl::template process_tile<1, 1, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 0, 1>, + ConvImpl::template process_tile<1, 1, 1, 1, 0, 2>, + ConvImpl::template process_tile<1, 1, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 1, 1>, + ConvImpl::template process_tile<1, 1, 1, 1, 1, 2>, + ConvImpl::template process_tile<1, 1, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 1, 1, 2, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 2, 1>, + ConvImpl::template process_tile<1, 1, 1, 1, 2, 2>, + ConvImpl::template process_tile<1, 1, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 1, 1, 3, 0>, + ConvImpl::template process_tile<1, 1, 1, 1, 3, 1>, + ConvImpl::template process_tile<1, 1, 1, 1, 3, 2>, + ConvImpl::template process_tile<1, 1, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 0, 1>, + ConvImpl::template process_tile<1, 1, 1, 2, 0, 2>, + ConvImpl::template process_tile<1, 1, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 1, 1>, + ConvImpl::template process_tile<1, 1, 1, 2, 1, 2>, + ConvImpl::template process_tile<1, 1, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 1, 2, 2, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 2, 1>, + ConvImpl::template process_tile<1, 1, 1, 2, 2, 2>, + ConvImpl::template process_tile<1, 1, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 1, 2, 3, 0>, + ConvImpl::template process_tile<1, 1, 1, 2, 3, 1>, + ConvImpl::template process_tile<1, 1, 1, 2, 3, 2>, + ConvImpl::template process_tile<1, 1, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 3, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 3, 0, 1>, + ConvImpl::template process_tile<1, 1, 1, 3, 0, 2>, + ConvImpl::template process_tile<1, 1, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 3, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 3, 1, 1>, + ConvImpl::template process_tile<1, 1, 1, 3, 1, 2>, + ConvImpl::template process_tile<1, 1, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 1, 3, 2, 0>, + ConvImpl::template process_tile<1, 1, 1, 3, 2, 1>, + ConvImpl::template process_tile<1, 1, 1, 3, 2, 2>, + ConvImpl::template process_tile<1, 1, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 1, 3, 3, 0>, + ConvImpl::template process_tile<1, 1, 1, 3, 3, 1>, + ConvImpl::template process_tile<1, 1, 1, 3, 3, 2>, + ConvImpl::template process_tile<1, 1, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 1, 4, 0, 0>, + ConvImpl::template process_tile<1, 1, 1, 4, 0, 1>, + ConvImpl::template process_tile<1, 1, 1, 4, 0, 2>, + ConvImpl::template process_tile<1, 1, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 1, 4, 1, 0>, + ConvImpl::template process_tile<1, 1, 1, 4, 1, 1>, + ConvImpl::template process_tile<1, 1, 1, 4, 1, 2>, + ConvImpl::template process_tile<1, 1, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 1, 4, 2, 0>, + ConvImpl::template process_tile<1, 1, 1, 4, 2, 1>, + ConvImpl::template process_tile<1, 1, 1, 4, 2, 2>, + ConvImpl::template process_tile<1, 1, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 1, 4, 3, 0>, + ConvImpl::template process_tile<1, 1, 1, 4, 3, 1>, + ConvImpl::template process_tile<1, 1, 1, 4, 3, 2>, + ConvImpl::template process_tile<1, 1, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 0, 1>, + ConvImpl::template process_tile<1, 1, 2, 0, 0, 2>, + ConvImpl::template process_tile<1, 1, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 1, 1>, + ConvImpl::template process_tile<1, 1, 2, 0, 1, 2>, + ConvImpl::template process_tile<1, 1, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 2, 0, 2, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 2, 1>, + ConvImpl::template process_tile<1, 1, 2, 0, 2, 2>, + ConvImpl::template process_tile<1, 1, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 2, 0, 3, 0>, + ConvImpl::template process_tile<1, 1, 2, 0, 3, 1>, + ConvImpl::template process_tile<1, 1, 2, 0, 3, 2>, + ConvImpl::template process_tile<1, 1, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 0, 1>, + ConvImpl::template process_tile<1, 1, 2, 1, 0, 2>, + ConvImpl::template process_tile<1, 1, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 1, 1>, + ConvImpl::template process_tile<1, 1, 2, 1, 1, 2>, + ConvImpl::template process_tile<1, 1, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 2, 1, 2, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 2, 1>, + ConvImpl::template process_tile<1, 1, 2, 1, 2, 2>, + ConvImpl::template process_tile<1, 1, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 2, 1, 3, 0>, + ConvImpl::template process_tile<1, 1, 2, 1, 3, 1>, + ConvImpl::template process_tile<1, 1, 2, 1, 3, 2>, + ConvImpl::template process_tile<1, 1, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 0, 1>, + ConvImpl::template process_tile<1, 1, 2, 2, 0, 2>, + ConvImpl::template process_tile<1, 1, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 1, 1>, + ConvImpl::template process_tile<1, 1, 2, 2, 1, 2>, + ConvImpl::template process_tile<1, 1, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 2, 2, 2, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 2, 1>, + ConvImpl::template process_tile<1, 1, 2, 2, 2, 2>, + ConvImpl::template process_tile<1, 1, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 2, 2, 3, 0>, + ConvImpl::template process_tile<1, 1, 2, 2, 3, 1>, + ConvImpl::template process_tile<1, 1, 2, 2, 3, 2>, + ConvImpl::template process_tile<1, 1, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 3, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 3, 0, 1>, + ConvImpl::template process_tile<1, 1, 2, 3, 0, 2>, + ConvImpl::template process_tile<1, 1, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 3, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 3, 1, 1>, + ConvImpl::template process_tile<1, 1, 2, 3, 1, 2>, + ConvImpl::template process_tile<1, 1, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 2, 3, 2, 0>, + ConvImpl::template process_tile<1, 1, 2, 3, 2, 1>, + ConvImpl::template process_tile<1, 1, 2, 3, 2, 2>, + ConvImpl::template process_tile<1, 1, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 2, 3, 3, 0>, + ConvImpl::template process_tile<1, 1, 2, 3, 3, 1>, + ConvImpl::template process_tile<1, 1, 2, 3, 3, 2>, + ConvImpl::template process_tile<1, 1, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 2, 4, 0, 0>, + ConvImpl::template process_tile<1, 1, 2, 4, 0, 1>, + ConvImpl::template process_tile<1, 1, 2, 4, 0, 2>, + ConvImpl::template process_tile<1, 1, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 2, 4, 1, 0>, + ConvImpl::template process_tile<1, 1, 2, 4, 1, 1>, + ConvImpl::template process_tile<1, 1, 2, 4, 1, 2>, + ConvImpl::template process_tile<1, 1, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 2, 4, 2, 0>, + ConvImpl::template process_tile<1, 1, 2, 4, 2, 1>, + ConvImpl::template process_tile<1, 1, 2, 4, 2, 2>, + ConvImpl::template process_tile<1, 1, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 2, 4, 3, 0>, + ConvImpl::template process_tile<1, 1, 2, 4, 3, 1>, + ConvImpl::template process_tile<1, 1, 2, 4, 3, 2>, + ConvImpl::template process_tile<1, 1, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 3, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 3, 0, 0, 1>, + ConvImpl::template process_tile<1, 1, 3, 0, 0, 2>, + ConvImpl::template process_tile<1, 1, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 3, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 3, 0, 1, 1>, + ConvImpl::template process_tile<1, 1, 3, 0, 1, 2>, + ConvImpl::template process_tile<1, 1, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 3, 0, 2, 0>, + ConvImpl::template process_tile<1, 1, 3, 0, 2, 1>, + ConvImpl::template process_tile<1, 1, 3, 0, 2, 2>, + ConvImpl::template process_tile<1, 1, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 3, 0, 3, 0>, + ConvImpl::template process_tile<1, 1, 3, 0, 3, 1>, + ConvImpl::template process_tile<1, 1, 3, 0, 3, 2>, + ConvImpl::template process_tile<1, 1, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 3, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 3, 1, 0, 1>, + ConvImpl::template process_tile<1, 1, 3, 1, 0, 2>, + ConvImpl::template process_tile<1, 1, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 3, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 3, 1, 1, 1>, + ConvImpl::template process_tile<1, 1, 3, 1, 1, 2>, + ConvImpl::template process_tile<1, 1, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 3, 1, 2, 0>, + ConvImpl::template process_tile<1, 1, 3, 1, 2, 1>, + ConvImpl::template process_tile<1, 1, 3, 1, 2, 2>, + ConvImpl::template process_tile<1, 1, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 3, 1, 3, 0>, + ConvImpl::template process_tile<1, 1, 3, 1, 3, 1>, + ConvImpl::template process_tile<1, 1, 3, 1, 3, 2>, + ConvImpl::template process_tile<1, 1, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 3, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 3, 2, 0, 1>, + ConvImpl::template process_tile<1, 1, 3, 2, 0, 2>, + ConvImpl::template process_tile<1, 1, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 3, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 3, 2, 1, 1>, + ConvImpl::template process_tile<1, 1, 3, 2, 1, 2>, + ConvImpl::template process_tile<1, 1, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 3, 2, 2, 0>, + ConvImpl::template process_tile<1, 1, 3, 2, 2, 1>, + ConvImpl::template process_tile<1, 1, 3, 2, 2, 2>, + ConvImpl::template process_tile<1, 1, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 3, 2, 3, 0>, + ConvImpl::template process_tile<1, 1, 3, 2, 3, 1>, + ConvImpl::template process_tile<1, 1, 3, 2, 3, 2>, + ConvImpl::template process_tile<1, 1, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 3, 3, 0, 0>, + ConvImpl::template process_tile<1, 1, 3, 3, 0, 1>, + ConvImpl::template process_tile<1, 1, 3, 3, 0, 2>, + ConvImpl::template process_tile<1, 1, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 3, 3, 1, 0>, + ConvImpl::template process_tile<1, 1, 3, 3, 1, 1>, + ConvImpl::template process_tile<1, 1, 3, 3, 1, 2>, + ConvImpl::template process_tile<1, 1, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 3, 3, 2, 0>, + ConvImpl::template process_tile<1, 1, 3, 3, 2, 1>, + ConvImpl::template process_tile<1, 1, 3, 3, 2, 2>, + ConvImpl::template process_tile<1, 1, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 3, 3, 3, 0>, + ConvImpl::template process_tile<1, 1, 3, 3, 3, 1>, + ConvImpl::template process_tile<1, 1, 3, 3, 3, 2>, + ConvImpl::template process_tile<1, 1, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 3, 4, 0, 0>, + ConvImpl::template process_tile<1, 1, 3, 4, 0, 1>, + ConvImpl::template process_tile<1, 1, 3, 4, 0, 2>, + ConvImpl::template process_tile<1, 1, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 3, 4, 1, 0>, + ConvImpl::template process_tile<1, 1, 3, 4, 1, 1>, + ConvImpl::template process_tile<1, 1, 3, 4, 1, 2>, + ConvImpl::template process_tile<1, 1, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 3, 4, 2, 0>, + ConvImpl::template process_tile<1, 1, 3, 4, 2, 1>, + ConvImpl::template process_tile<1, 1, 3, 4, 2, 2>, + ConvImpl::template process_tile<1, 1, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 3, 4, 3, 0>, + ConvImpl::template process_tile<1, 1, 3, 4, 3, 1>, + ConvImpl::template process_tile<1, 1, 3, 4, 3, 2>, + ConvImpl::template process_tile<1, 1, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 4, 0, 0, 0>, + ConvImpl::template process_tile<1, 1, 4, 0, 0, 1>, + ConvImpl::template process_tile<1, 1, 4, 0, 0, 2>, + ConvImpl::template process_tile<1, 1, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 4, 0, 1, 0>, + ConvImpl::template process_tile<1, 1, 4, 0, 1, 1>, + ConvImpl::template process_tile<1, 1, 4, 0, 1, 2>, + ConvImpl::template process_tile<1, 1, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 4, 0, 2, 0>, + ConvImpl::template process_tile<1, 1, 4, 0, 2, 1>, + ConvImpl::template process_tile<1, 1, 4, 0, 2, 2>, + ConvImpl::template process_tile<1, 1, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 4, 0, 3, 0>, + ConvImpl::template process_tile<1, 1, 4, 0, 3, 1>, + ConvImpl::template process_tile<1, 1, 4, 0, 3, 2>, + ConvImpl::template process_tile<1, 1, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 4, 1, 0, 0>, + ConvImpl::template process_tile<1, 1, 4, 1, 0, 1>, + ConvImpl::template process_tile<1, 1, 4, 1, 0, 2>, + ConvImpl::template process_tile<1, 1, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 4, 1, 1, 0>, + ConvImpl::template process_tile<1, 1, 4, 1, 1, 1>, + ConvImpl::template process_tile<1, 1, 4, 1, 1, 2>, + ConvImpl::template process_tile<1, 1, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 4, 1, 2, 0>, + ConvImpl::template process_tile<1, 1, 4, 1, 2, 1>, + ConvImpl::template process_tile<1, 1, 4, 1, 2, 2>, + ConvImpl::template process_tile<1, 1, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 4, 1, 3, 0>, + ConvImpl::template process_tile<1, 1, 4, 1, 3, 1>, + ConvImpl::template process_tile<1, 1, 4, 1, 3, 2>, + ConvImpl::template process_tile<1, 1, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 4, 2, 0, 0>, + ConvImpl::template process_tile<1, 1, 4, 2, 0, 1>, + ConvImpl::template process_tile<1, 1, 4, 2, 0, 2>, + ConvImpl::template process_tile<1, 1, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 4, 2, 1, 0>, + ConvImpl::template process_tile<1, 1, 4, 2, 1, 1>, + ConvImpl::template process_tile<1, 1, 4, 2, 1, 2>, + ConvImpl::template process_tile<1, 1, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 4, 2, 2, 0>, + ConvImpl::template process_tile<1, 1, 4, 2, 2, 1>, + ConvImpl::template process_tile<1, 1, 4, 2, 2, 2>, + ConvImpl::template process_tile<1, 1, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 4, 2, 3, 0>, + ConvImpl::template process_tile<1, 1, 4, 2, 3, 1>, + ConvImpl::template process_tile<1, 1, 4, 2, 3, 2>, + ConvImpl::template process_tile<1, 1, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 4, 3, 0, 0>, + ConvImpl::template process_tile<1, 1, 4, 3, 0, 1>, + ConvImpl::template process_tile<1, 1, 4, 3, 0, 2>, + ConvImpl::template process_tile<1, 1, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 4, 3, 1, 0>, + ConvImpl::template process_tile<1, 1, 4, 3, 1, 1>, + ConvImpl::template process_tile<1, 1, 4, 3, 1, 2>, + ConvImpl::template process_tile<1, 1, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 4, 3, 2, 0>, + ConvImpl::template process_tile<1, 1, 4, 3, 2, 1>, + ConvImpl::template process_tile<1, 1, 4, 3, 2, 2>, + ConvImpl::template process_tile<1, 1, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 4, 3, 3, 0>, + ConvImpl::template process_tile<1, 1, 4, 3, 3, 1>, + ConvImpl::template process_tile<1, 1, 4, 3, 3, 2>, + ConvImpl::template process_tile<1, 1, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + ConvImpl::template process_tile<1, 1, 4, 4, 0, 0>, + ConvImpl::template process_tile<1, 1, 4, 4, 0, 1>, + ConvImpl::template process_tile<1, 1, 4, 4, 0, 2>, + ConvImpl::template process_tile<1, 1, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + ConvImpl::template process_tile<1, 1, 4, 4, 1, 0>, + ConvImpl::template process_tile<1, 1, 4, 4, 1, 1>, + ConvImpl::template process_tile<1, 1, 4, 4, 1, 2>, + ConvImpl::template process_tile<1, 1, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + ConvImpl::template process_tile<1, 1, 4, 4, 2, 0>, + ConvImpl::template process_tile<1, 1, 4, 4, 2, 1>, + ConvImpl::template process_tile<1, 1, 4, 4, 2, 2>, + ConvImpl::template process_tile<1, 1, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + ConvImpl::template process_tile<1, 1, 4, 4, 3, 0>, + ConvImpl::template process_tile<1, 1, 4, 4, 3, 1>, + ConvImpl::template process_tile<1, 1, 4, 4, 3, 2>, + ConvImpl::template process_tile<1, 1, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + }, // Input pad bottom = 4 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<4, 4, 3, 3, 1, 1, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_2x2_fp32_fp32.cpp b/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_2x2_fp32_fp32.cpp new file mode 100644 index 0000000000..2104c0bbf7 --- /dev/null +++ b/src/core/NEON/kernels/convolution/depthwise/depthwise_4x4_3x3_2x2_fp32_fp32.cpp @@ -0,0 +1,5207 @@ +/* + * Copyright (c) 2018 ARM Limited. + * + * SPDX-License-Identifier: MIT + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ +#include "arm_compute/core/NEON/kernels/convolution/depthwise/impl_fp32_fp32.hpp" + +namespace depthwise +{ +using Conv = DepthwiseConvolution<4, 4, 3, 3, 2, 2, float, float>; +using ConvImpl = DepthwiseConvolutionImpl<4, 4, 3, 3, 2, 2, float, float>; + +template <> +const Conv::TileFn Conv::tile_fns + [max_in_pad_top] + [max_in_pad_left] + [max_in_pad_bottom] + [max_in_pad_right] + [max_out_pad_bottom] + [max_out_pad_right] = { + { // Input pad top = 0 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 0, 0, 0>, + Conv::template process_tile<0, 0, 0, 0, 0, 1>, + Conv::template process_tile<0, 0, 0, 0, 0, 2>, + Conv::template process_tile<0, 0, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 0, 1, 0>, + Conv::template process_tile<0, 0, 0, 0, 1, 1>, + Conv::template process_tile<0, 0, 0, 0, 1, 2>, + Conv::template process_tile<0, 0, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 0, 2, 0>, + Conv::template process_tile<0, 0, 0, 0, 2, 1>, + Conv::template process_tile<0, 0, 0, 0, 2, 2>, + Conv::template process_tile<0, 0, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 0, 3, 0>, + Conv::template process_tile<0, 0, 0, 0, 3, 1>, + Conv::template process_tile<0, 0, 0, 0, 3, 2>, + Conv::template process_tile<0, 0, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 1, 0, 0>, + Conv::template process_tile<0, 0, 0, 1, 0, 1>, + Conv::template process_tile<0, 0, 0, 1, 0, 2>, + Conv::template process_tile<0, 0, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 1, 1, 0>, + Conv::template process_tile<0, 0, 0, 1, 1, 1>, + Conv::template process_tile<0, 0, 0, 1, 1, 2>, + Conv::template process_tile<0, 0, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 1, 2, 0>, + Conv::template process_tile<0, 0, 0, 1, 2, 1>, + Conv::template process_tile<0, 0, 0, 1, 2, 2>, + Conv::template process_tile<0, 0, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 1, 3, 0>, + Conv::template process_tile<0, 0, 0, 1, 3, 1>, + Conv::template process_tile<0, 0, 0, 1, 3, 2>, + Conv::template process_tile<0, 0, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 2, 0, 0>, + Conv::template process_tile<0, 0, 0, 2, 0, 1>, + Conv::template process_tile<0, 0, 0, 2, 0, 2>, + Conv::template process_tile<0, 0, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 2, 1, 0>, + Conv::template process_tile<0, 0, 0, 2, 1, 1>, + Conv::template process_tile<0, 0, 0, 2, 1, 2>, + Conv::template process_tile<0, 0, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 2, 2, 0>, + Conv::template process_tile<0, 0, 0, 2, 2, 1>, + Conv::template process_tile<0, 0, 0, 2, 2, 2>, + Conv::template process_tile<0, 0, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 2, 3, 0>, + Conv::template process_tile<0, 0, 0, 2, 3, 1>, + Conv::template process_tile<0, 0, 0, 2, 3, 2>, + Conv::template process_tile<0, 0, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 3, 0, 0>, + Conv::template process_tile<0, 0, 0, 3, 0, 1>, + Conv::template process_tile<0, 0, 0, 3, 0, 2>, + Conv::template process_tile<0, 0, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 3, 1, 0>, + Conv::template process_tile<0, 0, 0, 3, 1, 1>, + Conv::template process_tile<0, 0, 0, 3, 1, 2>, + Conv::template process_tile<0, 0, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 3, 2, 0>, + Conv::template process_tile<0, 0, 0, 3, 2, 1>, + Conv::template process_tile<0, 0, 0, 3, 2, 2>, + Conv::template process_tile<0, 0, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 3, 3, 0>, + Conv::template process_tile<0, 0, 0, 3, 3, 1>, + Conv::template process_tile<0, 0, 0, 3, 3, 2>, + Conv::template process_tile<0, 0, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 4, 0, 0>, + Conv::template process_tile<0, 0, 0, 4, 0, 1>, + Conv::template process_tile<0, 0, 0, 4, 0, 2>, + Conv::template process_tile<0, 0, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 4, 1, 0>, + Conv::template process_tile<0, 0, 0, 4, 1, 1>, + Conv::template process_tile<0, 0, 0, 4, 1, 2>, + Conv::template process_tile<0, 0, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 4, 2, 0>, + Conv::template process_tile<0, 0, 0, 4, 2, 1>, + Conv::template process_tile<0, 0, 0, 4, 2, 2>, + Conv::template process_tile<0, 0, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 4, 3, 0>, + Conv::template process_tile<0, 0, 0, 4, 3, 1>, + Conv::template process_tile<0, 0, 0, 4, 3, 2>, + Conv::template process_tile<0, 0, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 5, 0, 0>, + Conv::template process_tile<0, 0, 0, 5, 0, 1>, + Conv::template process_tile<0, 0, 0, 5, 0, 2>, + Conv::template process_tile<0, 0, 0, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 5, 1, 0>, + Conv::template process_tile<0, 0, 0, 5, 1, 1>, + Conv::template process_tile<0, 0, 0, 5, 1, 2>, + Conv::template process_tile<0, 0, 0, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 5, 2, 0>, + Conv::template process_tile<0, 0, 0, 5, 2, 1>, + Conv::template process_tile<0, 0, 0, 5, 2, 2>, + Conv::template process_tile<0, 0, 0, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 5, 3, 0>, + Conv::template process_tile<0, 0, 0, 5, 3, 1>, + Conv::template process_tile<0, 0, 0, 5, 3, 2>, + Conv::template process_tile<0, 0, 0, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 0, 6, 0, 0>, + Conv::template process_tile<0, 0, 0, 6, 0, 1>, + Conv::template process_tile<0, 0, 0, 6, 0, 2>, + Conv::template process_tile<0, 0, 0, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 0, 6, 1, 0>, + Conv::template process_tile<0, 0, 0, 6, 1, 1>, + Conv::template process_tile<0, 0, 0, 6, 1, 2>, + Conv::template process_tile<0, 0, 0, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 0, 6, 2, 0>, + Conv::template process_tile<0, 0, 0, 6, 2, 1>, + Conv::template process_tile<0, 0, 0, 6, 2, 2>, + Conv::template process_tile<0, 0, 0, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 0, 6, 3, 0>, + Conv::template process_tile<0, 0, 0, 6, 3, 1>, + Conv::template process_tile<0, 0, 0, 6, 3, 2>, + Conv::template process_tile<0, 0, 0, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 0, 0, 0>, + Conv::template process_tile<0, 0, 1, 0, 0, 1>, + Conv::template process_tile<0, 0, 1, 0, 0, 2>, + Conv::template process_tile<0, 0, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 0, 1, 0>, + Conv::template process_tile<0, 0, 1, 0, 1, 1>, + Conv::template process_tile<0, 0, 1, 0, 1, 2>, + Conv::template process_tile<0, 0, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 0, 2, 0>, + Conv::template process_tile<0, 0, 1, 0, 2, 1>, + Conv::template process_tile<0, 0, 1, 0, 2, 2>, + Conv::template process_tile<0, 0, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 0, 3, 0>, + Conv::template process_tile<0, 0, 1, 0, 3, 1>, + Conv::template process_tile<0, 0, 1, 0, 3, 2>, + Conv::template process_tile<0, 0, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 1, 0, 0>, + Conv::template process_tile<0, 0, 1, 1, 0, 1>, + Conv::template process_tile<0, 0, 1, 1, 0, 2>, + Conv::template process_tile<0, 0, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 1, 1, 0>, + Conv::template process_tile<0, 0, 1, 1, 1, 1>, + Conv::template process_tile<0, 0, 1, 1, 1, 2>, + Conv::template process_tile<0, 0, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 1, 2, 0>, + Conv::template process_tile<0, 0, 1, 1, 2, 1>, + Conv::template process_tile<0, 0, 1, 1, 2, 2>, + Conv::template process_tile<0, 0, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 1, 3, 0>, + Conv::template process_tile<0, 0, 1, 1, 3, 1>, + Conv::template process_tile<0, 0, 1, 1, 3, 2>, + Conv::template process_tile<0, 0, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 2, 0, 0>, + Conv::template process_tile<0, 0, 1, 2, 0, 1>, + Conv::template process_tile<0, 0, 1, 2, 0, 2>, + Conv::template process_tile<0, 0, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 2, 1, 0>, + Conv::template process_tile<0, 0, 1, 2, 1, 1>, + Conv::template process_tile<0, 0, 1, 2, 1, 2>, + Conv::template process_tile<0, 0, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 2, 2, 0>, + Conv::template process_tile<0, 0, 1, 2, 2, 1>, + Conv::template process_tile<0, 0, 1, 2, 2, 2>, + Conv::template process_tile<0, 0, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 2, 3, 0>, + Conv::template process_tile<0, 0, 1, 2, 3, 1>, + Conv::template process_tile<0, 0, 1, 2, 3, 2>, + Conv::template process_tile<0, 0, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 3, 0, 0>, + Conv::template process_tile<0, 0, 1, 3, 0, 1>, + Conv::template process_tile<0, 0, 1, 3, 0, 2>, + Conv::template process_tile<0, 0, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 3, 1, 0>, + Conv::template process_tile<0, 0, 1, 3, 1, 1>, + Conv::template process_tile<0, 0, 1, 3, 1, 2>, + Conv::template process_tile<0, 0, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 3, 2, 0>, + Conv::template process_tile<0, 0, 1, 3, 2, 1>, + Conv::template process_tile<0, 0, 1, 3, 2, 2>, + Conv::template process_tile<0, 0, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 3, 3, 0>, + Conv::template process_tile<0, 0, 1, 3, 3, 1>, + Conv::template process_tile<0, 0, 1, 3, 3, 2>, + Conv::template process_tile<0, 0, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 4, 0, 0>, + Conv::template process_tile<0, 0, 1, 4, 0, 1>, + Conv::template process_tile<0, 0, 1, 4, 0, 2>, + Conv::template process_tile<0, 0, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 4, 1, 0>, + Conv::template process_tile<0, 0, 1, 4, 1, 1>, + Conv::template process_tile<0, 0, 1, 4, 1, 2>, + Conv::template process_tile<0, 0, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 4, 2, 0>, + Conv::template process_tile<0, 0, 1, 4, 2, 1>, + Conv::template process_tile<0, 0, 1, 4, 2, 2>, + Conv::template process_tile<0, 0, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 4, 3, 0>, + Conv::template process_tile<0, 0, 1, 4, 3, 1>, + Conv::template process_tile<0, 0, 1, 4, 3, 2>, + Conv::template process_tile<0, 0, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 5, 0, 0>, + Conv::template process_tile<0, 0, 1, 5, 0, 1>, + Conv::template process_tile<0, 0, 1, 5, 0, 2>, + Conv::template process_tile<0, 0, 1, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 5, 1, 0>, + Conv::template process_tile<0, 0, 1, 5, 1, 1>, + Conv::template process_tile<0, 0, 1, 5, 1, 2>, + Conv::template process_tile<0, 0, 1, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 5, 2, 0>, + Conv::template process_tile<0, 0, 1, 5, 2, 1>, + Conv::template process_tile<0, 0, 1, 5, 2, 2>, + Conv::template process_tile<0, 0, 1, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 5, 3, 0>, + Conv::template process_tile<0, 0, 1, 5, 3, 1>, + Conv::template process_tile<0, 0, 1, 5, 3, 2>, + Conv::template process_tile<0, 0, 1, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 1, 6, 0, 0>, + Conv::template process_tile<0, 0, 1, 6, 0, 1>, + Conv::template process_tile<0, 0, 1, 6, 0, 2>, + Conv::template process_tile<0, 0, 1, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 1, 6, 1, 0>, + Conv::template process_tile<0, 0, 1, 6, 1, 1>, + Conv::template process_tile<0, 0, 1, 6, 1, 2>, + Conv::template process_tile<0, 0, 1, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 1, 6, 2, 0>, + Conv::template process_tile<0, 0, 1, 6, 2, 1>, + Conv::template process_tile<0, 0, 1, 6, 2, 2>, + Conv::template process_tile<0, 0, 1, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 1, 6, 3, 0>, + Conv::template process_tile<0, 0, 1, 6, 3, 1>, + Conv::template process_tile<0, 0, 1, 6, 3, 2>, + Conv::template process_tile<0, 0, 1, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 0, 0, 0>, + Conv::template process_tile<0, 0, 2, 0, 0, 1>, + Conv::template process_tile<0, 0, 2, 0, 0, 2>, + Conv::template process_tile<0, 0, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 0, 1, 0>, + Conv::template process_tile<0, 0, 2, 0, 1, 1>, + Conv::template process_tile<0, 0, 2, 0, 1, 2>, + Conv::template process_tile<0, 0, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 0, 2, 0>, + Conv::template process_tile<0, 0, 2, 0, 2, 1>, + Conv::template process_tile<0, 0, 2, 0, 2, 2>, + Conv::template process_tile<0, 0, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 0, 3, 0>, + Conv::template process_tile<0, 0, 2, 0, 3, 1>, + Conv::template process_tile<0, 0, 2, 0, 3, 2>, + Conv::template process_tile<0, 0, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 1, 0, 0>, + Conv::template process_tile<0, 0, 2, 1, 0, 1>, + Conv::template process_tile<0, 0, 2, 1, 0, 2>, + Conv::template process_tile<0, 0, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 1, 1, 0>, + Conv::template process_tile<0, 0, 2, 1, 1, 1>, + Conv::template process_tile<0, 0, 2, 1, 1, 2>, + Conv::template process_tile<0, 0, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 1, 2, 0>, + Conv::template process_tile<0, 0, 2, 1, 2, 1>, + Conv::template process_tile<0, 0, 2, 1, 2, 2>, + Conv::template process_tile<0, 0, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 1, 3, 0>, + Conv::template process_tile<0, 0, 2, 1, 3, 1>, + Conv::template process_tile<0, 0, 2, 1, 3, 2>, + Conv::template process_tile<0, 0, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 2, 0, 0>, + Conv::template process_tile<0, 0, 2, 2, 0, 1>, + Conv::template process_tile<0, 0, 2, 2, 0, 2>, + Conv::template process_tile<0, 0, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 2, 1, 0>, + Conv::template process_tile<0, 0, 2, 2, 1, 1>, + Conv::template process_tile<0, 0, 2, 2, 1, 2>, + Conv::template process_tile<0, 0, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 2, 2, 0>, + Conv::template process_tile<0, 0, 2, 2, 2, 1>, + Conv::template process_tile<0, 0, 2, 2, 2, 2>, + Conv::template process_tile<0, 0, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 2, 3, 0>, + Conv::template process_tile<0, 0, 2, 2, 3, 1>, + Conv::template process_tile<0, 0, 2, 2, 3, 2>, + Conv::template process_tile<0, 0, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 3, 0, 0>, + Conv::template process_tile<0, 0, 2, 3, 0, 1>, + Conv::template process_tile<0, 0, 2, 3, 0, 2>, + Conv::template process_tile<0, 0, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 3, 1, 0>, + Conv::template process_tile<0, 0, 2, 3, 1, 1>, + Conv::template process_tile<0, 0, 2, 3, 1, 2>, + Conv::template process_tile<0, 0, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 3, 2, 0>, + Conv::template process_tile<0, 0, 2, 3, 2, 1>, + Conv::template process_tile<0, 0, 2, 3, 2, 2>, + Conv::template process_tile<0, 0, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 3, 3, 0>, + Conv::template process_tile<0, 0, 2, 3, 3, 1>, + Conv::template process_tile<0, 0, 2, 3, 3, 2>, + Conv::template process_tile<0, 0, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 4, 0, 0>, + Conv::template process_tile<0, 0, 2, 4, 0, 1>, + Conv::template process_tile<0, 0, 2, 4, 0, 2>, + Conv::template process_tile<0, 0, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 4, 1, 0>, + Conv::template process_tile<0, 0, 2, 4, 1, 1>, + Conv::template process_tile<0, 0, 2, 4, 1, 2>, + Conv::template process_tile<0, 0, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 4, 2, 0>, + Conv::template process_tile<0, 0, 2, 4, 2, 1>, + Conv::template process_tile<0, 0, 2, 4, 2, 2>, + Conv::template process_tile<0, 0, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 4, 3, 0>, + Conv::template process_tile<0, 0, 2, 4, 3, 1>, + Conv::template process_tile<0, 0, 2, 4, 3, 2>, + Conv::template process_tile<0, 0, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 5, 0, 0>, + Conv::template process_tile<0, 0, 2, 5, 0, 1>, + Conv::template process_tile<0, 0, 2, 5, 0, 2>, + Conv::template process_tile<0, 0, 2, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 5, 1, 0>, + Conv::template process_tile<0, 0, 2, 5, 1, 1>, + Conv::template process_tile<0, 0, 2, 5, 1, 2>, + Conv::template process_tile<0, 0, 2, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 5, 2, 0>, + Conv::template process_tile<0, 0, 2, 5, 2, 1>, + Conv::template process_tile<0, 0, 2, 5, 2, 2>, + Conv::template process_tile<0, 0, 2, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 5, 3, 0>, + Conv::template process_tile<0, 0, 2, 5, 3, 1>, + Conv::template process_tile<0, 0, 2, 5, 3, 2>, + Conv::template process_tile<0, 0, 2, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 2, 6, 0, 0>, + Conv::template process_tile<0, 0, 2, 6, 0, 1>, + Conv::template process_tile<0, 0, 2, 6, 0, 2>, + Conv::template process_tile<0, 0, 2, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 2, 6, 1, 0>, + Conv::template process_tile<0, 0, 2, 6, 1, 1>, + Conv::template process_tile<0, 0, 2, 6, 1, 2>, + Conv::template process_tile<0, 0, 2, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 2, 6, 2, 0>, + Conv::template process_tile<0, 0, 2, 6, 2, 1>, + Conv::template process_tile<0, 0, 2, 6, 2, 2>, + Conv::template process_tile<0, 0, 2, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 2, 6, 3, 0>, + Conv::template process_tile<0, 0, 2, 6, 3, 1>, + Conv::template process_tile<0, 0, 2, 6, 3, 2>, + Conv::template process_tile<0, 0, 2, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 0, 0, 0>, + Conv::template process_tile<0, 0, 3, 0, 0, 1>, + Conv::template process_tile<0, 0, 3, 0, 0, 2>, + Conv::template process_tile<0, 0, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 0, 1, 0>, + Conv::template process_tile<0, 0, 3, 0, 1, 1>, + Conv::template process_tile<0, 0, 3, 0, 1, 2>, + Conv::template process_tile<0, 0, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 0, 2, 0>, + Conv::template process_tile<0, 0, 3, 0, 2, 1>, + Conv::template process_tile<0, 0, 3, 0, 2, 2>, + Conv::template process_tile<0, 0, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 0, 3, 0>, + Conv::template process_tile<0, 0, 3, 0, 3, 1>, + Conv::template process_tile<0, 0, 3, 0, 3, 2>, + Conv::template process_tile<0, 0, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 1, 0, 0>, + Conv::template process_tile<0, 0, 3, 1, 0, 1>, + Conv::template process_tile<0, 0, 3, 1, 0, 2>, + Conv::template process_tile<0, 0, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 1, 1, 0>, + Conv::template process_tile<0, 0, 3, 1, 1, 1>, + Conv::template process_tile<0, 0, 3, 1, 1, 2>, + Conv::template process_tile<0, 0, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 1, 2, 0>, + Conv::template process_tile<0, 0, 3, 1, 2, 1>, + Conv::template process_tile<0, 0, 3, 1, 2, 2>, + Conv::template process_tile<0, 0, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 1, 3, 0>, + Conv::template process_tile<0, 0, 3, 1, 3, 1>, + Conv::template process_tile<0, 0, 3, 1, 3, 2>, + Conv::template process_tile<0, 0, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 2, 0, 0>, + Conv::template process_tile<0, 0, 3, 2, 0, 1>, + Conv::template process_tile<0, 0, 3, 2, 0, 2>, + Conv::template process_tile<0, 0, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 2, 1, 0>, + Conv::template process_tile<0, 0, 3, 2, 1, 1>, + Conv::template process_tile<0, 0, 3, 2, 1, 2>, + Conv::template process_tile<0, 0, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 2, 2, 0>, + Conv::template process_tile<0, 0, 3, 2, 2, 1>, + Conv::template process_tile<0, 0, 3, 2, 2, 2>, + Conv::template process_tile<0, 0, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 2, 3, 0>, + Conv::template process_tile<0, 0, 3, 2, 3, 1>, + Conv::template process_tile<0, 0, 3, 2, 3, 2>, + Conv::template process_tile<0, 0, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 3, 0, 0>, + Conv::template process_tile<0, 0, 3, 3, 0, 1>, + Conv::template process_tile<0, 0, 3, 3, 0, 2>, + Conv::template process_tile<0, 0, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 3, 1, 0>, + Conv::template process_tile<0, 0, 3, 3, 1, 1>, + Conv::template process_tile<0, 0, 3, 3, 1, 2>, + Conv::template process_tile<0, 0, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 3, 2, 0>, + Conv::template process_tile<0, 0, 3, 3, 2, 1>, + Conv::template process_tile<0, 0, 3, 3, 2, 2>, + Conv::template process_tile<0, 0, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 3, 3, 0>, + Conv::template process_tile<0, 0, 3, 3, 3, 1>, + Conv::template process_tile<0, 0, 3, 3, 3, 2>, + Conv::template process_tile<0, 0, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 4, 0, 0>, + Conv::template process_tile<0, 0, 3, 4, 0, 1>, + Conv::template process_tile<0, 0, 3, 4, 0, 2>, + Conv::template process_tile<0, 0, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 4, 1, 0>, + Conv::template process_tile<0, 0, 3, 4, 1, 1>, + Conv::template process_tile<0, 0, 3, 4, 1, 2>, + Conv::template process_tile<0, 0, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 4, 2, 0>, + Conv::template process_tile<0, 0, 3, 4, 2, 1>, + Conv::template process_tile<0, 0, 3, 4, 2, 2>, + Conv::template process_tile<0, 0, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 4, 3, 0>, + Conv::template process_tile<0, 0, 3, 4, 3, 1>, + Conv::template process_tile<0, 0, 3, 4, 3, 2>, + Conv::template process_tile<0, 0, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 5, 0, 0>, + Conv::template process_tile<0, 0, 3, 5, 0, 1>, + Conv::template process_tile<0, 0, 3, 5, 0, 2>, + Conv::template process_tile<0, 0, 3, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 5, 1, 0>, + Conv::template process_tile<0, 0, 3, 5, 1, 1>, + Conv::template process_tile<0, 0, 3, 5, 1, 2>, + Conv::template process_tile<0, 0, 3, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 5, 2, 0>, + Conv::template process_tile<0, 0, 3, 5, 2, 1>, + Conv::template process_tile<0, 0, 3, 5, 2, 2>, + Conv::template process_tile<0, 0, 3, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 5, 3, 0>, + Conv::template process_tile<0, 0, 3, 5, 3, 1>, + Conv::template process_tile<0, 0, 3, 5, 3, 2>, + Conv::template process_tile<0, 0, 3, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 3, 6, 0, 0>, + Conv::template process_tile<0, 0, 3, 6, 0, 1>, + Conv::template process_tile<0, 0, 3, 6, 0, 2>, + Conv::template process_tile<0, 0, 3, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 3, 6, 1, 0>, + Conv::template process_tile<0, 0, 3, 6, 1, 1>, + Conv::template process_tile<0, 0, 3, 6, 1, 2>, + Conv::template process_tile<0, 0, 3, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 3, 6, 2, 0>, + Conv::template process_tile<0, 0, 3, 6, 2, 1>, + Conv::template process_tile<0, 0, 3, 6, 2, 2>, + Conv::template process_tile<0, 0, 3, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 3, 6, 3, 0>, + Conv::template process_tile<0, 0, 3, 6, 3, 1>, + Conv::template process_tile<0, 0, 3, 6, 3, 2>, + Conv::template process_tile<0, 0, 3, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 0, 0, 0>, + Conv::template process_tile<0, 0, 4, 0, 0, 1>, + Conv::template process_tile<0, 0, 4, 0, 0, 2>, + Conv::template process_tile<0, 0, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 0, 1, 0>, + Conv::template process_tile<0, 0, 4, 0, 1, 1>, + Conv::template process_tile<0, 0, 4, 0, 1, 2>, + Conv::template process_tile<0, 0, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 0, 2, 0>, + Conv::template process_tile<0, 0, 4, 0, 2, 1>, + Conv::template process_tile<0, 0, 4, 0, 2, 2>, + Conv::template process_tile<0, 0, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 0, 3, 0>, + Conv::template process_tile<0, 0, 4, 0, 3, 1>, + Conv::template process_tile<0, 0, 4, 0, 3, 2>, + Conv::template process_tile<0, 0, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 1, 0, 0>, + Conv::template process_tile<0, 0, 4, 1, 0, 1>, + Conv::template process_tile<0, 0, 4, 1, 0, 2>, + Conv::template process_tile<0, 0, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 1, 1, 0>, + Conv::template process_tile<0, 0, 4, 1, 1, 1>, + Conv::template process_tile<0, 0, 4, 1, 1, 2>, + Conv::template process_tile<0, 0, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 1, 2, 0>, + Conv::template process_tile<0, 0, 4, 1, 2, 1>, + Conv::template process_tile<0, 0, 4, 1, 2, 2>, + Conv::template process_tile<0, 0, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 1, 3, 0>, + Conv::template process_tile<0, 0, 4, 1, 3, 1>, + Conv::template process_tile<0, 0, 4, 1, 3, 2>, + Conv::template process_tile<0, 0, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 2, 0, 0>, + Conv::template process_tile<0, 0, 4, 2, 0, 1>, + Conv::template process_tile<0, 0, 4, 2, 0, 2>, + Conv::template process_tile<0, 0, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 2, 1, 0>, + Conv::template process_tile<0, 0, 4, 2, 1, 1>, + Conv::template process_tile<0, 0, 4, 2, 1, 2>, + Conv::template process_tile<0, 0, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 2, 2, 0>, + Conv::template process_tile<0, 0, 4, 2, 2, 1>, + Conv::template process_tile<0, 0, 4, 2, 2, 2>, + Conv::template process_tile<0, 0, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 2, 3, 0>, + Conv::template process_tile<0, 0, 4, 2, 3, 1>, + Conv::template process_tile<0, 0, 4, 2, 3, 2>, + Conv::template process_tile<0, 0, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 3, 0, 0>, + Conv::template process_tile<0, 0, 4, 3, 0, 1>, + Conv::template process_tile<0, 0, 4, 3, 0, 2>, + Conv::template process_tile<0, 0, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 3, 1, 0>, + Conv::template process_tile<0, 0, 4, 3, 1, 1>, + Conv::template process_tile<0, 0, 4, 3, 1, 2>, + Conv::template process_tile<0, 0, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 3, 2, 0>, + Conv::template process_tile<0, 0, 4, 3, 2, 1>, + Conv::template process_tile<0, 0, 4, 3, 2, 2>, + Conv::template process_tile<0, 0, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 3, 3, 0>, + Conv::template process_tile<0, 0, 4, 3, 3, 1>, + Conv::template process_tile<0, 0, 4, 3, 3, 2>, + Conv::template process_tile<0, 0, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 4, 0, 0>, + Conv::template process_tile<0, 0, 4, 4, 0, 1>, + Conv::template process_tile<0, 0, 4, 4, 0, 2>, + Conv::template process_tile<0, 0, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 4, 1, 0>, + Conv::template process_tile<0, 0, 4, 4, 1, 1>, + Conv::template process_tile<0, 0, 4, 4, 1, 2>, + Conv::template process_tile<0, 0, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 4, 2, 0>, + Conv::template process_tile<0, 0, 4, 4, 2, 1>, + Conv::template process_tile<0, 0, 4, 4, 2, 2>, + Conv::template process_tile<0, 0, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 4, 3, 0>, + Conv::template process_tile<0, 0, 4, 4, 3, 1>, + Conv::template process_tile<0, 0, 4, 4, 3, 2>, + Conv::template process_tile<0, 0, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 5, 0, 0>, + Conv::template process_tile<0, 0, 4, 5, 0, 1>, + Conv::template process_tile<0, 0, 4, 5, 0, 2>, + Conv::template process_tile<0, 0, 4, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 5, 1, 0>, + Conv::template process_tile<0, 0, 4, 5, 1, 1>, + Conv::template process_tile<0, 0, 4, 5, 1, 2>, + Conv::template process_tile<0, 0, 4, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 5, 2, 0>, + Conv::template process_tile<0, 0, 4, 5, 2, 1>, + Conv::template process_tile<0, 0, 4, 5, 2, 2>, + Conv::template process_tile<0, 0, 4, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 5, 3, 0>, + Conv::template process_tile<0, 0, 4, 5, 3, 1>, + Conv::template process_tile<0, 0, 4, 5, 3, 2>, + Conv::template process_tile<0, 0, 4, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 4, 6, 0, 0>, + Conv::template process_tile<0, 0, 4, 6, 0, 1>, + Conv::template process_tile<0, 0, 4, 6, 0, 2>, + Conv::template process_tile<0, 0, 4, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 4, 6, 1, 0>, + Conv::template process_tile<0, 0, 4, 6, 1, 1>, + Conv::template process_tile<0, 0, 4, 6, 1, 2>, + Conv::template process_tile<0, 0, 4, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 4, 6, 2, 0>, + Conv::template process_tile<0, 0, 4, 6, 2, 1>, + Conv::template process_tile<0, 0, 4, 6, 2, 2>, + Conv::template process_tile<0, 0, 4, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 4, 6, 3, 0>, + Conv::template process_tile<0, 0, 4, 6, 3, 1>, + Conv::template process_tile<0, 0, 4, 6, 3, 2>, + Conv::template process_tile<0, 0, 4, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 0, 0, 0>, + Conv::template process_tile<0, 0, 5, 0, 0, 1>, + Conv::template process_tile<0, 0, 5, 0, 0, 2>, + Conv::template process_tile<0, 0, 5, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 0, 1, 0>, + Conv::template process_tile<0, 0, 5, 0, 1, 1>, + Conv::template process_tile<0, 0, 5, 0, 1, 2>, + Conv::template process_tile<0, 0, 5, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 0, 2, 0>, + Conv::template process_tile<0, 0, 5, 0, 2, 1>, + Conv::template process_tile<0, 0, 5, 0, 2, 2>, + Conv::template process_tile<0, 0, 5, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 0, 3, 0>, + Conv::template process_tile<0, 0, 5, 0, 3, 1>, + Conv::template process_tile<0, 0, 5, 0, 3, 2>, + Conv::template process_tile<0, 0, 5, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 1, 0, 0>, + Conv::template process_tile<0, 0, 5, 1, 0, 1>, + Conv::template process_tile<0, 0, 5, 1, 0, 2>, + Conv::template process_tile<0, 0, 5, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 1, 1, 0>, + Conv::template process_tile<0, 0, 5, 1, 1, 1>, + Conv::template process_tile<0, 0, 5, 1, 1, 2>, + Conv::template process_tile<0, 0, 5, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 1, 2, 0>, + Conv::template process_tile<0, 0, 5, 1, 2, 1>, + Conv::template process_tile<0, 0, 5, 1, 2, 2>, + Conv::template process_tile<0, 0, 5, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 1, 3, 0>, + Conv::template process_tile<0, 0, 5, 1, 3, 1>, + Conv::template process_tile<0, 0, 5, 1, 3, 2>, + Conv::template process_tile<0, 0, 5, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 2, 0, 0>, + Conv::template process_tile<0, 0, 5, 2, 0, 1>, + Conv::template process_tile<0, 0, 5, 2, 0, 2>, + Conv::template process_tile<0, 0, 5, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 2, 1, 0>, + Conv::template process_tile<0, 0, 5, 2, 1, 1>, + Conv::template process_tile<0, 0, 5, 2, 1, 2>, + Conv::template process_tile<0, 0, 5, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 2, 2, 0>, + Conv::template process_tile<0, 0, 5, 2, 2, 1>, + Conv::template process_tile<0, 0, 5, 2, 2, 2>, + Conv::template process_tile<0, 0, 5, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 2, 3, 0>, + Conv::template process_tile<0, 0, 5, 2, 3, 1>, + Conv::template process_tile<0, 0, 5, 2, 3, 2>, + Conv::template process_tile<0, 0, 5, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 3, 0, 0>, + Conv::template process_tile<0, 0, 5, 3, 0, 1>, + Conv::template process_tile<0, 0, 5, 3, 0, 2>, + Conv::template process_tile<0, 0, 5, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 3, 1, 0>, + Conv::template process_tile<0, 0, 5, 3, 1, 1>, + Conv::template process_tile<0, 0, 5, 3, 1, 2>, + Conv::template process_tile<0, 0, 5, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 3, 2, 0>, + Conv::template process_tile<0, 0, 5, 3, 2, 1>, + Conv::template process_tile<0, 0, 5, 3, 2, 2>, + Conv::template process_tile<0, 0, 5, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 3, 3, 0>, + Conv::template process_tile<0, 0, 5, 3, 3, 1>, + Conv::template process_tile<0, 0, 5, 3, 3, 2>, + Conv::template process_tile<0, 0, 5, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 4, 0, 0>, + Conv::template process_tile<0, 0, 5, 4, 0, 1>, + Conv::template process_tile<0, 0, 5, 4, 0, 2>, + Conv::template process_tile<0, 0, 5, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 4, 1, 0>, + Conv::template process_tile<0, 0, 5, 4, 1, 1>, + Conv::template process_tile<0, 0, 5, 4, 1, 2>, + Conv::template process_tile<0, 0, 5, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 4, 2, 0>, + Conv::template process_tile<0, 0, 5, 4, 2, 1>, + Conv::template process_tile<0, 0, 5, 4, 2, 2>, + Conv::template process_tile<0, 0, 5, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 4, 3, 0>, + Conv::template process_tile<0, 0, 5, 4, 3, 1>, + Conv::template process_tile<0, 0, 5, 4, 3, 2>, + Conv::template process_tile<0, 0, 5, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 5, 0, 0>, + Conv::template process_tile<0, 0, 5, 5, 0, 1>, + Conv::template process_tile<0, 0, 5, 5, 0, 2>, + Conv::template process_tile<0, 0, 5, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 5, 1, 0>, + Conv::template process_tile<0, 0, 5, 5, 1, 1>, + Conv::template process_tile<0, 0, 5, 5, 1, 2>, + Conv::template process_tile<0, 0, 5, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 5, 2, 0>, + Conv::template process_tile<0, 0, 5, 5, 2, 1>, + Conv::template process_tile<0, 0, 5, 5, 2, 2>, + Conv::template process_tile<0, 0, 5, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 5, 3, 0>, + Conv::template process_tile<0, 0, 5, 5, 3, 1>, + Conv::template process_tile<0, 0, 5, 5, 3, 2>, + Conv::template process_tile<0, 0, 5, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 5, 6, 0, 0>, + Conv::template process_tile<0, 0, 5, 6, 0, 1>, + Conv::template process_tile<0, 0, 5, 6, 0, 2>, + Conv::template process_tile<0, 0, 5, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 5, 6, 1, 0>, + Conv::template process_tile<0, 0, 5, 6, 1, 1>, + Conv::template process_tile<0, 0, 5, 6, 1, 2>, + Conv::template process_tile<0, 0, 5, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 5, 6, 2, 0>, + Conv::template process_tile<0, 0, 5, 6, 2, 1>, + Conv::template process_tile<0, 0, 5, 6, 2, 2>, + Conv::template process_tile<0, 0, 5, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 5, 6, 3, 0>, + Conv::template process_tile<0, 0, 5, 6, 3, 1>, + Conv::template process_tile<0, 0, 5, 6, 3, 2>, + Conv::template process_tile<0, 0, 5, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 0, 0, 0>, + Conv::template process_tile<0, 0, 6, 0, 0, 1>, + Conv::template process_tile<0, 0, 6, 0, 0, 2>, + Conv::template process_tile<0, 0, 6, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 0, 1, 0>, + Conv::template process_tile<0, 0, 6, 0, 1, 1>, + Conv::template process_tile<0, 0, 6, 0, 1, 2>, + Conv::template process_tile<0, 0, 6, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 0, 2, 0>, + Conv::template process_tile<0, 0, 6, 0, 2, 1>, + Conv::template process_tile<0, 0, 6, 0, 2, 2>, + Conv::template process_tile<0, 0, 6, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 0, 3, 0>, + Conv::template process_tile<0, 0, 6, 0, 3, 1>, + Conv::template process_tile<0, 0, 6, 0, 3, 2>, + Conv::template process_tile<0, 0, 6, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 1, 0, 0>, + Conv::template process_tile<0, 0, 6, 1, 0, 1>, + Conv::template process_tile<0, 0, 6, 1, 0, 2>, + Conv::template process_tile<0, 0, 6, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 1, 1, 0>, + Conv::template process_tile<0, 0, 6, 1, 1, 1>, + Conv::template process_tile<0, 0, 6, 1, 1, 2>, + Conv::template process_tile<0, 0, 6, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 1, 2, 0>, + Conv::template process_tile<0, 0, 6, 1, 2, 1>, + Conv::template process_tile<0, 0, 6, 1, 2, 2>, + Conv::template process_tile<0, 0, 6, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 1, 3, 0>, + Conv::template process_tile<0, 0, 6, 1, 3, 1>, + Conv::template process_tile<0, 0, 6, 1, 3, 2>, + Conv::template process_tile<0, 0, 6, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 2, 0, 0>, + Conv::template process_tile<0, 0, 6, 2, 0, 1>, + Conv::template process_tile<0, 0, 6, 2, 0, 2>, + Conv::template process_tile<0, 0, 6, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 2, 1, 0>, + Conv::template process_tile<0, 0, 6, 2, 1, 1>, + Conv::template process_tile<0, 0, 6, 2, 1, 2>, + Conv::template process_tile<0, 0, 6, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 2, 2, 0>, + Conv::template process_tile<0, 0, 6, 2, 2, 1>, + Conv::template process_tile<0, 0, 6, 2, 2, 2>, + Conv::template process_tile<0, 0, 6, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 2, 3, 0>, + Conv::template process_tile<0, 0, 6, 2, 3, 1>, + Conv::template process_tile<0, 0, 6, 2, 3, 2>, + Conv::template process_tile<0, 0, 6, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 3, 0, 0>, + Conv::template process_tile<0, 0, 6, 3, 0, 1>, + Conv::template process_tile<0, 0, 6, 3, 0, 2>, + Conv::template process_tile<0, 0, 6, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 3, 1, 0>, + Conv::template process_tile<0, 0, 6, 3, 1, 1>, + Conv::template process_tile<0, 0, 6, 3, 1, 2>, + Conv::template process_tile<0, 0, 6, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 3, 2, 0>, + Conv::template process_tile<0, 0, 6, 3, 2, 1>, + Conv::template process_tile<0, 0, 6, 3, 2, 2>, + Conv::template process_tile<0, 0, 6, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 3, 3, 0>, + Conv::template process_tile<0, 0, 6, 3, 3, 1>, + Conv::template process_tile<0, 0, 6, 3, 3, 2>, + Conv::template process_tile<0, 0, 6, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 4, 0, 0>, + Conv::template process_tile<0, 0, 6, 4, 0, 1>, + Conv::template process_tile<0, 0, 6, 4, 0, 2>, + Conv::template process_tile<0, 0, 6, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 4, 1, 0>, + Conv::template process_tile<0, 0, 6, 4, 1, 1>, + Conv::template process_tile<0, 0, 6, 4, 1, 2>, + Conv::template process_tile<0, 0, 6, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 4, 2, 0>, + Conv::template process_tile<0, 0, 6, 4, 2, 1>, + Conv::template process_tile<0, 0, 6, 4, 2, 2>, + Conv::template process_tile<0, 0, 6, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 4, 3, 0>, + Conv::template process_tile<0, 0, 6, 4, 3, 1>, + Conv::template process_tile<0, 0, 6, 4, 3, 2>, + Conv::template process_tile<0, 0, 6, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 5, 0, 0>, + Conv::template process_tile<0, 0, 6, 5, 0, 1>, + Conv::template process_tile<0, 0, 6, 5, 0, 2>, + Conv::template process_tile<0, 0, 6, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 5, 1, 0>, + Conv::template process_tile<0, 0, 6, 5, 1, 1>, + Conv::template process_tile<0, 0, 6, 5, 1, 2>, + Conv::template process_tile<0, 0, 6, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 5, 2, 0>, + Conv::template process_tile<0, 0, 6, 5, 2, 1>, + Conv::template process_tile<0, 0, 6, 5, 2, 2>, + Conv::template process_tile<0, 0, 6, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 5, 3, 0>, + Conv::template process_tile<0, 0, 6, 5, 3, 1>, + Conv::template process_tile<0, 0, 6, 5, 3, 2>, + Conv::template process_tile<0, 0, 6, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 0, 6, 6, 0, 0>, + Conv::template process_tile<0, 0, 6, 6, 0, 1>, + Conv::template process_tile<0, 0, 6, 6, 0, 2>, + Conv::template process_tile<0, 0, 6, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 0, 6, 6, 1, 0>, + Conv::template process_tile<0, 0, 6, 6, 1, 1>, + Conv::template process_tile<0, 0, 6, 6, 1, 2>, + Conv::template process_tile<0, 0, 6, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 0, 6, 6, 2, 0>, + Conv::template process_tile<0, 0, 6, 6, 2, 1>, + Conv::template process_tile<0, 0, 6, 6, 2, 2>, + Conv::template process_tile<0, 0, 6, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 0, 6, 6, 3, 0>, + Conv::template process_tile<0, 0, 6, 6, 3, 1>, + Conv::template process_tile<0, 0, 6, 6, 3, 2>, + Conv::template process_tile<0, 0, 6, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 0, 0, 0>, + Conv::template process_tile<0, 1, 0, 0, 0, 1>, + Conv::template process_tile<0, 1, 0, 0, 0, 2>, + Conv::template process_tile<0, 1, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 0, 1, 0>, + Conv::template process_tile<0, 1, 0, 0, 1, 1>, + Conv::template process_tile<0, 1, 0, 0, 1, 2>, + Conv::template process_tile<0, 1, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 0, 2, 0>, + Conv::template process_tile<0, 1, 0, 0, 2, 1>, + Conv::template process_tile<0, 1, 0, 0, 2, 2>, + Conv::template process_tile<0, 1, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 0, 3, 0>, + Conv::template process_tile<0, 1, 0, 0, 3, 1>, + Conv::template process_tile<0, 1, 0, 0, 3, 2>, + Conv::template process_tile<0, 1, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 1, 0, 0>, + Conv::template process_tile<0, 1, 0, 1, 0, 1>, + Conv::template process_tile<0, 1, 0, 1, 0, 2>, + Conv::template process_tile<0, 1, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 1, 1, 0>, + Conv::template process_tile<0, 1, 0, 1, 1, 1>, + Conv::template process_tile<0, 1, 0, 1, 1, 2>, + Conv::template process_tile<0, 1, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 1, 2, 0>, + Conv::template process_tile<0, 1, 0, 1, 2, 1>, + Conv::template process_tile<0, 1, 0, 1, 2, 2>, + Conv::template process_tile<0, 1, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 1, 3, 0>, + Conv::template process_tile<0, 1, 0, 1, 3, 1>, + Conv::template process_tile<0, 1, 0, 1, 3, 2>, + Conv::template process_tile<0, 1, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 2, 0, 0>, + Conv::template process_tile<0, 1, 0, 2, 0, 1>, + Conv::template process_tile<0, 1, 0, 2, 0, 2>, + Conv::template process_tile<0, 1, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 2, 1, 0>, + Conv::template process_tile<0, 1, 0, 2, 1, 1>, + Conv::template process_tile<0, 1, 0, 2, 1, 2>, + Conv::template process_tile<0, 1, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 2, 2, 0>, + Conv::template process_tile<0, 1, 0, 2, 2, 1>, + Conv::template process_tile<0, 1, 0, 2, 2, 2>, + Conv::template process_tile<0, 1, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 2, 3, 0>, + Conv::template process_tile<0, 1, 0, 2, 3, 1>, + Conv::template process_tile<0, 1, 0, 2, 3, 2>, + Conv::template process_tile<0, 1, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 3, 0, 0>, + Conv::template process_tile<0, 1, 0, 3, 0, 1>, + Conv::template process_tile<0, 1, 0, 3, 0, 2>, + Conv::template process_tile<0, 1, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 3, 1, 0>, + Conv::template process_tile<0, 1, 0, 3, 1, 1>, + Conv::template process_tile<0, 1, 0, 3, 1, 2>, + Conv::template process_tile<0, 1, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 3, 2, 0>, + Conv::template process_tile<0, 1, 0, 3, 2, 1>, + Conv::template process_tile<0, 1, 0, 3, 2, 2>, + Conv::template process_tile<0, 1, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 3, 3, 0>, + Conv::template process_tile<0, 1, 0, 3, 3, 1>, + Conv::template process_tile<0, 1, 0, 3, 3, 2>, + Conv::template process_tile<0, 1, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 4, 0, 0>, + Conv::template process_tile<0, 1, 0, 4, 0, 1>, + Conv::template process_tile<0, 1, 0, 4, 0, 2>, + Conv::template process_tile<0, 1, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 4, 1, 0>, + Conv::template process_tile<0, 1, 0, 4, 1, 1>, + Conv::template process_tile<0, 1, 0, 4, 1, 2>, + Conv::template process_tile<0, 1, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 4, 2, 0>, + Conv::template process_tile<0, 1, 0, 4, 2, 1>, + Conv::template process_tile<0, 1, 0, 4, 2, 2>, + Conv::template process_tile<0, 1, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 4, 3, 0>, + Conv::template process_tile<0, 1, 0, 4, 3, 1>, + Conv::template process_tile<0, 1, 0, 4, 3, 2>, + Conv::template process_tile<0, 1, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 5, 0, 0>, + Conv::template process_tile<0, 1, 0, 5, 0, 1>, + Conv::template process_tile<0, 1, 0, 5, 0, 2>, + Conv::template process_tile<0, 1, 0, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 5, 1, 0>, + Conv::template process_tile<0, 1, 0, 5, 1, 1>, + Conv::template process_tile<0, 1, 0, 5, 1, 2>, + Conv::template process_tile<0, 1, 0, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 5, 2, 0>, + Conv::template process_tile<0, 1, 0, 5, 2, 1>, + Conv::template process_tile<0, 1, 0, 5, 2, 2>, + Conv::template process_tile<0, 1, 0, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 5, 3, 0>, + Conv::template process_tile<0, 1, 0, 5, 3, 1>, + Conv::template process_tile<0, 1, 0, 5, 3, 2>, + Conv::template process_tile<0, 1, 0, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 0, 6, 0, 0>, + Conv::template process_tile<0, 1, 0, 6, 0, 1>, + Conv::template process_tile<0, 1, 0, 6, 0, 2>, + Conv::template process_tile<0, 1, 0, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 0, 6, 1, 0>, + Conv::template process_tile<0, 1, 0, 6, 1, 1>, + Conv::template process_tile<0, 1, 0, 6, 1, 2>, + Conv::template process_tile<0, 1, 0, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 0, 6, 2, 0>, + Conv::template process_tile<0, 1, 0, 6, 2, 1>, + Conv::template process_tile<0, 1, 0, 6, 2, 2>, + Conv::template process_tile<0, 1, 0, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 0, 6, 3, 0>, + Conv::template process_tile<0, 1, 0, 6, 3, 1>, + Conv::template process_tile<0, 1, 0, 6, 3, 2>, + Conv::template process_tile<0, 1, 0, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 0, 0, 0>, + Conv::template process_tile<0, 1, 1, 0, 0, 1>, + Conv::template process_tile<0, 1, 1, 0, 0, 2>, + Conv::template process_tile<0, 1, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 0, 1, 0>, + Conv::template process_tile<0, 1, 1, 0, 1, 1>, + Conv::template process_tile<0, 1, 1, 0, 1, 2>, + Conv::template process_tile<0, 1, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 0, 2, 0>, + Conv::template process_tile<0, 1, 1, 0, 2, 1>, + Conv::template process_tile<0, 1, 1, 0, 2, 2>, + Conv::template process_tile<0, 1, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 0, 3, 0>, + Conv::template process_tile<0, 1, 1, 0, 3, 1>, + Conv::template process_tile<0, 1, 1, 0, 3, 2>, + Conv::template process_tile<0, 1, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 1, 0, 0>, + Conv::template process_tile<0, 1, 1, 1, 0, 1>, + Conv::template process_tile<0, 1, 1, 1, 0, 2>, + Conv::template process_tile<0, 1, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 1, 1, 0>, + Conv::template process_tile<0, 1, 1, 1, 1, 1>, + Conv::template process_tile<0, 1, 1, 1, 1, 2>, + Conv::template process_tile<0, 1, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 1, 2, 0>, + Conv::template process_tile<0, 1, 1, 1, 2, 1>, + Conv::template process_tile<0, 1, 1, 1, 2, 2>, + Conv::template process_tile<0, 1, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 1, 3, 0>, + Conv::template process_tile<0, 1, 1, 1, 3, 1>, + Conv::template process_tile<0, 1, 1, 1, 3, 2>, + Conv::template process_tile<0, 1, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 2, 0, 0>, + Conv::template process_tile<0, 1, 1, 2, 0, 1>, + Conv::template process_tile<0, 1, 1, 2, 0, 2>, + Conv::template process_tile<0, 1, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 2, 1, 0>, + Conv::template process_tile<0, 1, 1, 2, 1, 1>, + Conv::template process_tile<0, 1, 1, 2, 1, 2>, + Conv::template process_tile<0, 1, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 2, 2, 0>, + Conv::template process_tile<0, 1, 1, 2, 2, 1>, + Conv::template process_tile<0, 1, 1, 2, 2, 2>, + Conv::template process_tile<0, 1, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 2, 3, 0>, + Conv::template process_tile<0, 1, 1, 2, 3, 1>, + Conv::template process_tile<0, 1, 1, 2, 3, 2>, + Conv::template process_tile<0, 1, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 3, 0, 0>, + Conv::template process_tile<0, 1, 1, 3, 0, 1>, + Conv::template process_tile<0, 1, 1, 3, 0, 2>, + Conv::template process_tile<0, 1, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 3, 1, 0>, + Conv::template process_tile<0, 1, 1, 3, 1, 1>, + Conv::template process_tile<0, 1, 1, 3, 1, 2>, + Conv::template process_tile<0, 1, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 3, 2, 0>, + Conv::template process_tile<0, 1, 1, 3, 2, 1>, + Conv::template process_tile<0, 1, 1, 3, 2, 2>, + Conv::template process_tile<0, 1, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 3, 3, 0>, + Conv::template process_tile<0, 1, 1, 3, 3, 1>, + Conv::template process_tile<0, 1, 1, 3, 3, 2>, + Conv::template process_tile<0, 1, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 4, 0, 0>, + Conv::template process_tile<0, 1, 1, 4, 0, 1>, + Conv::template process_tile<0, 1, 1, 4, 0, 2>, + Conv::template process_tile<0, 1, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 4, 1, 0>, + Conv::template process_tile<0, 1, 1, 4, 1, 1>, + Conv::template process_tile<0, 1, 1, 4, 1, 2>, + Conv::template process_tile<0, 1, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 4, 2, 0>, + Conv::template process_tile<0, 1, 1, 4, 2, 1>, + Conv::template process_tile<0, 1, 1, 4, 2, 2>, + Conv::template process_tile<0, 1, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 4, 3, 0>, + Conv::template process_tile<0, 1, 1, 4, 3, 1>, + Conv::template process_tile<0, 1, 1, 4, 3, 2>, + Conv::template process_tile<0, 1, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 5, 0, 0>, + Conv::template process_tile<0, 1, 1, 5, 0, 1>, + Conv::template process_tile<0, 1, 1, 5, 0, 2>, + Conv::template process_tile<0, 1, 1, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 5, 1, 0>, + Conv::template process_tile<0, 1, 1, 5, 1, 1>, + Conv::template process_tile<0, 1, 1, 5, 1, 2>, + Conv::template process_tile<0, 1, 1, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 5, 2, 0>, + Conv::template process_tile<0, 1, 1, 5, 2, 1>, + Conv::template process_tile<0, 1, 1, 5, 2, 2>, + Conv::template process_tile<0, 1, 1, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 5, 3, 0>, + Conv::template process_tile<0, 1, 1, 5, 3, 1>, + Conv::template process_tile<0, 1, 1, 5, 3, 2>, + Conv::template process_tile<0, 1, 1, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 1, 6, 0, 0>, + Conv::template process_tile<0, 1, 1, 6, 0, 1>, + Conv::template process_tile<0, 1, 1, 6, 0, 2>, + Conv::template process_tile<0, 1, 1, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 1, 6, 1, 0>, + Conv::template process_tile<0, 1, 1, 6, 1, 1>, + Conv::template process_tile<0, 1, 1, 6, 1, 2>, + Conv::template process_tile<0, 1, 1, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 1, 6, 2, 0>, + Conv::template process_tile<0, 1, 1, 6, 2, 1>, + Conv::template process_tile<0, 1, 1, 6, 2, 2>, + Conv::template process_tile<0, 1, 1, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 1, 6, 3, 0>, + Conv::template process_tile<0, 1, 1, 6, 3, 1>, + Conv::template process_tile<0, 1, 1, 6, 3, 2>, + Conv::template process_tile<0, 1, 1, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 0, 0, 0>, + Conv::template process_tile<0, 1, 2, 0, 0, 1>, + Conv::template process_tile<0, 1, 2, 0, 0, 2>, + Conv::template process_tile<0, 1, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 0, 1, 0>, + Conv::template process_tile<0, 1, 2, 0, 1, 1>, + Conv::template process_tile<0, 1, 2, 0, 1, 2>, + Conv::template process_tile<0, 1, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 0, 2, 0>, + Conv::template process_tile<0, 1, 2, 0, 2, 1>, + Conv::template process_tile<0, 1, 2, 0, 2, 2>, + Conv::template process_tile<0, 1, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 0, 3, 0>, + Conv::template process_tile<0, 1, 2, 0, 3, 1>, + Conv::template process_tile<0, 1, 2, 0, 3, 2>, + Conv::template process_tile<0, 1, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 1, 0, 0>, + Conv::template process_tile<0, 1, 2, 1, 0, 1>, + Conv::template process_tile<0, 1, 2, 1, 0, 2>, + Conv::template process_tile<0, 1, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 1, 1, 0>, + Conv::template process_tile<0, 1, 2, 1, 1, 1>, + Conv::template process_tile<0, 1, 2, 1, 1, 2>, + Conv::template process_tile<0, 1, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 1, 2, 0>, + Conv::template process_tile<0, 1, 2, 1, 2, 1>, + Conv::template process_tile<0, 1, 2, 1, 2, 2>, + Conv::template process_tile<0, 1, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 1, 3, 0>, + Conv::template process_tile<0, 1, 2, 1, 3, 1>, + Conv::template process_tile<0, 1, 2, 1, 3, 2>, + Conv::template process_tile<0, 1, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 2, 0, 0>, + Conv::template process_tile<0, 1, 2, 2, 0, 1>, + Conv::template process_tile<0, 1, 2, 2, 0, 2>, + Conv::template process_tile<0, 1, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 2, 1, 0>, + Conv::template process_tile<0, 1, 2, 2, 1, 1>, + Conv::template process_tile<0, 1, 2, 2, 1, 2>, + Conv::template process_tile<0, 1, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 2, 2, 0>, + Conv::template process_tile<0, 1, 2, 2, 2, 1>, + Conv::template process_tile<0, 1, 2, 2, 2, 2>, + Conv::template process_tile<0, 1, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 2, 3, 0>, + Conv::template process_tile<0, 1, 2, 2, 3, 1>, + Conv::template process_tile<0, 1, 2, 2, 3, 2>, + Conv::template process_tile<0, 1, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 3, 0, 0>, + Conv::template process_tile<0, 1, 2, 3, 0, 1>, + Conv::template process_tile<0, 1, 2, 3, 0, 2>, + Conv::template process_tile<0, 1, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 3, 1, 0>, + Conv::template process_tile<0, 1, 2, 3, 1, 1>, + Conv::template process_tile<0, 1, 2, 3, 1, 2>, + Conv::template process_tile<0, 1, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 3, 2, 0>, + Conv::template process_tile<0, 1, 2, 3, 2, 1>, + Conv::template process_tile<0, 1, 2, 3, 2, 2>, + Conv::template process_tile<0, 1, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 3, 3, 0>, + Conv::template process_tile<0, 1, 2, 3, 3, 1>, + Conv::template process_tile<0, 1, 2, 3, 3, 2>, + Conv::template process_tile<0, 1, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 4, 0, 0>, + Conv::template process_tile<0, 1, 2, 4, 0, 1>, + Conv::template process_tile<0, 1, 2, 4, 0, 2>, + Conv::template process_tile<0, 1, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 4, 1, 0>, + Conv::template process_tile<0, 1, 2, 4, 1, 1>, + Conv::template process_tile<0, 1, 2, 4, 1, 2>, + Conv::template process_tile<0, 1, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 4, 2, 0>, + Conv::template process_tile<0, 1, 2, 4, 2, 1>, + Conv::template process_tile<0, 1, 2, 4, 2, 2>, + Conv::template process_tile<0, 1, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 4, 3, 0>, + Conv::template process_tile<0, 1, 2, 4, 3, 1>, + Conv::template process_tile<0, 1, 2, 4, 3, 2>, + Conv::template process_tile<0, 1, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 5, 0, 0>, + Conv::template process_tile<0, 1, 2, 5, 0, 1>, + Conv::template process_tile<0, 1, 2, 5, 0, 2>, + Conv::template process_tile<0, 1, 2, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 5, 1, 0>, + Conv::template process_tile<0, 1, 2, 5, 1, 1>, + Conv::template process_tile<0, 1, 2, 5, 1, 2>, + Conv::template process_tile<0, 1, 2, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 5, 2, 0>, + Conv::template process_tile<0, 1, 2, 5, 2, 1>, + Conv::template process_tile<0, 1, 2, 5, 2, 2>, + Conv::template process_tile<0, 1, 2, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 5, 3, 0>, + Conv::template process_tile<0, 1, 2, 5, 3, 1>, + Conv::template process_tile<0, 1, 2, 5, 3, 2>, + Conv::template process_tile<0, 1, 2, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 2, 6, 0, 0>, + Conv::template process_tile<0, 1, 2, 6, 0, 1>, + Conv::template process_tile<0, 1, 2, 6, 0, 2>, + Conv::template process_tile<0, 1, 2, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 2, 6, 1, 0>, + Conv::template process_tile<0, 1, 2, 6, 1, 1>, + Conv::template process_tile<0, 1, 2, 6, 1, 2>, + Conv::template process_tile<0, 1, 2, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 2, 6, 2, 0>, + Conv::template process_tile<0, 1, 2, 6, 2, 1>, + Conv::template process_tile<0, 1, 2, 6, 2, 2>, + Conv::template process_tile<0, 1, 2, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 2, 6, 3, 0>, + Conv::template process_tile<0, 1, 2, 6, 3, 1>, + Conv::template process_tile<0, 1, 2, 6, 3, 2>, + Conv::template process_tile<0, 1, 2, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 0, 0, 0>, + Conv::template process_tile<0, 1, 3, 0, 0, 1>, + Conv::template process_tile<0, 1, 3, 0, 0, 2>, + Conv::template process_tile<0, 1, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 0, 1, 0>, + Conv::template process_tile<0, 1, 3, 0, 1, 1>, + Conv::template process_tile<0, 1, 3, 0, 1, 2>, + Conv::template process_tile<0, 1, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 0, 2, 0>, + Conv::template process_tile<0, 1, 3, 0, 2, 1>, + Conv::template process_tile<0, 1, 3, 0, 2, 2>, + Conv::template process_tile<0, 1, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 0, 3, 0>, + Conv::template process_tile<0, 1, 3, 0, 3, 1>, + Conv::template process_tile<0, 1, 3, 0, 3, 2>, + Conv::template process_tile<0, 1, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 1, 0, 0>, + Conv::template process_tile<0, 1, 3, 1, 0, 1>, + Conv::template process_tile<0, 1, 3, 1, 0, 2>, + Conv::template process_tile<0, 1, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 1, 1, 0>, + Conv::template process_tile<0, 1, 3, 1, 1, 1>, + Conv::template process_tile<0, 1, 3, 1, 1, 2>, + Conv::template process_tile<0, 1, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 1, 2, 0>, + Conv::template process_tile<0, 1, 3, 1, 2, 1>, + Conv::template process_tile<0, 1, 3, 1, 2, 2>, + Conv::template process_tile<0, 1, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 1, 3, 0>, + Conv::template process_tile<0, 1, 3, 1, 3, 1>, + Conv::template process_tile<0, 1, 3, 1, 3, 2>, + Conv::template process_tile<0, 1, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 2, 0, 0>, + Conv::template process_tile<0, 1, 3, 2, 0, 1>, + Conv::template process_tile<0, 1, 3, 2, 0, 2>, + Conv::template process_tile<0, 1, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 2, 1, 0>, + Conv::template process_tile<0, 1, 3, 2, 1, 1>, + Conv::template process_tile<0, 1, 3, 2, 1, 2>, + Conv::template process_tile<0, 1, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 2, 2, 0>, + Conv::template process_tile<0, 1, 3, 2, 2, 1>, + Conv::template process_tile<0, 1, 3, 2, 2, 2>, + Conv::template process_tile<0, 1, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 2, 3, 0>, + Conv::template process_tile<0, 1, 3, 2, 3, 1>, + Conv::template process_tile<0, 1, 3, 2, 3, 2>, + Conv::template process_tile<0, 1, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 3, 0, 0>, + Conv::template process_tile<0, 1, 3, 3, 0, 1>, + Conv::template process_tile<0, 1, 3, 3, 0, 2>, + Conv::template process_tile<0, 1, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 3, 1, 0>, + Conv::template process_tile<0, 1, 3, 3, 1, 1>, + Conv::template process_tile<0, 1, 3, 3, 1, 2>, + Conv::template process_tile<0, 1, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 3, 2, 0>, + Conv::template process_tile<0, 1, 3, 3, 2, 1>, + Conv::template process_tile<0, 1, 3, 3, 2, 2>, + Conv::template process_tile<0, 1, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 3, 3, 0>, + Conv::template process_tile<0, 1, 3, 3, 3, 1>, + Conv::template process_tile<0, 1, 3, 3, 3, 2>, + Conv::template process_tile<0, 1, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 4, 0, 0>, + Conv::template process_tile<0, 1, 3, 4, 0, 1>, + Conv::template process_tile<0, 1, 3, 4, 0, 2>, + Conv::template process_tile<0, 1, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 4, 1, 0>, + Conv::template process_tile<0, 1, 3, 4, 1, 1>, + Conv::template process_tile<0, 1, 3, 4, 1, 2>, + Conv::template process_tile<0, 1, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 4, 2, 0>, + Conv::template process_tile<0, 1, 3, 4, 2, 1>, + Conv::template process_tile<0, 1, 3, 4, 2, 2>, + Conv::template process_tile<0, 1, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 4, 3, 0>, + Conv::template process_tile<0, 1, 3, 4, 3, 1>, + Conv::template process_tile<0, 1, 3, 4, 3, 2>, + Conv::template process_tile<0, 1, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 5, 0, 0>, + Conv::template process_tile<0, 1, 3, 5, 0, 1>, + Conv::template process_tile<0, 1, 3, 5, 0, 2>, + Conv::template process_tile<0, 1, 3, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 5, 1, 0>, + Conv::template process_tile<0, 1, 3, 5, 1, 1>, + Conv::template process_tile<0, 1, 3, 5, 1, 2>, + Conv::template process_tile<0, 1, 3, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 5, 2, 0>, + Conv::template process_tile<0, 1, 3, 5, 2, 1>, + Conv::template process_tile<0, 1, 3, 5, 2, 2>, + Conv::template process_tile<0, 1, 3, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 5, 3, 0>, + Conv::template process_tile<0, 1, 3, 5, 3, 1>, + Conv::template process_tile<0, 1, 3, 5, 3, 2>, + Conv::template process_tile<0, 1, 3, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 3, 6, 0, 0>, + Conv::template process_tile<0, 1, 3, 6, 0, 1>, + Conv::template process_tile<0, 1, 3, 6, 0, 2>, + Conv::template process_tile<0, 1, 3, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 3, 6, 1, 0>, + Conv::template process_tile<0, 1, 3, 6, 1, 1>, + Conv::template process_tile<0, 1, 3, 6, 1, 2>, + Conv::template process_tile<0, 1, 3, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 3, 6, 2, 0>, + Conv::template process_tile<0, 1, 3, 6, 2, 1>, + Conv::template process_tile<0, 1, 3, 6, 2, 2>, + Conv::template process_tile<0, 1, 3, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 3, 6, 3, 0>, + Conv::template process_tile<0, 1, 3, 6, 3, 1>, + Conv::template process_tile<0, 1, 3, 6, 3, 2>, + Conv::template process_tile<0, 1, 3, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 0, 0, 0>, + Conv::template process_tile<0, 1, 4, 0, 0, 1>, + Conv::template process_tile<0, 1, 4, 0, 0, 2>, + Conv::template process_tile<0, 1, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 0, 1, 0>, + Conv::template process_tile<0, 1, 4, 0, 1, 1>, + Conv::template process_tile<0, 1, 4, 0, 1, 2>, + Conv::template process_tile<0, 1, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 0, 2, 0>, + Conv::template process_tile<0, 1, 4, 0, 2, 1>, + Conv::template process_tile<0, 1, 4, 0, 2, 2>, + Conv::template process_tile<0, 1, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 0, 3, 0>, + Conv::template process_tile<0, 1, 4, 0, 3, 1>, + Conv::template process_tile<0, 1, 4, 0, 3, 2>, + Conv::template process_tile<0, 1, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 1, 0, 0>, + Conv::template process_tile<0, 1, 4, 1, 0, 1>, + Conv::template process_tile<0, 1, 4, 1, 0, 2>, + Conv::template process_tile<0, 1, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 1, 1, 0>, + Conv::template process_tile<0, 1, 4, 1, 1, 1>, + Conv::template process_tile<0, 1, 4, 1, 1, 2>, + Conv::template process_tile<0, 1, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 1, 2, 0>, + Conv::template process_tile<0, 1, 4, 1, 2, 1>, + Conv::template process_tile<0, 1, 4, 1, 2, 2>, + Conv::template process_tile<0, 1, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 1, 3, 0>, + Conv::template process_tile<0, 1, 4, 1, 3, 1>, + Conv::template process_tile<0, 1, 4, 1, 3, 2>, + Conv::template process_tile<0, 1, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 2, 0, 0>, + Conv::template process_tile<0, 1, 4, 2, 0, 1>, + Conv::template process_tile<0, 1, 4, 2, 0, 2>, + Conv::template process_tile<0, 1, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 2, 1, 0>, + Conv::template process_tile<0, 1, 4, 2, 1, 1>, + Conv::template process_tile<0, 1, 4, 2, 1, 2>, + Conv::template process_tile<0, 1, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 2, 2, 0>, + Conv::template process_tile<0, 1, 4, 2, 2, 1>, + Conv::template process_tile<0, 1, 4, 2, 2, 2>, + Conv::template process_tile<0, 1, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 2, 3, 0>, + Conv::template process_tile<0, 1, 4, 2, 3, 1>, + Conv::template process_tile<0, 1, 4, 2, 3, 2>, + Conv::template process_tile<0, 1, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 3, 0, 0>, + Conv::template process_tile<0, 1, 4, 3, 0, 1>, + Conv::template process_tile<0, 1, 4, 3, 0, 2>, + Conv::template process_tile<0, 1, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 3, 1, 0>, + Conv::template process_tile<0, 1, 4, 3, 1, 1>, + Conv::template process_tile<0, 1, 4, 3, 1, 2>, + Conv::template process_tile<0, 1, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 3, 2, 0>, + Conv::template process_tile<0, 1, 4, 3, 2, 1>, + Conv::template process_tile<0, 1, 4, 3, 2, 2>, + Conv::template process_tile<0, 1, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 3, 3, 0>, + Conv::template process_tile<0, 1, 4, 3, 3, 1>, + Conv::template process_tile<0, 1, 4, 3, 3, 2>, + Conv::template process_tile<0, 1, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 4, 0, 0>, + Conv::template process_tile<0, 1, 4, 4, 0, 1>, + Conv::template process_tile<0, 1, 4, 4, 0, 2>, + Conv::template process_tile<0, 1, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 4, 1, 0>, + Conv::template process_tile<0, 1, 4, 4, 1, 1>, + Conv::template process_tile<0, 1, 4, 4, 1, 2>, + Conv::template process_tile<0, 1, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 4, 2, 0>, + Conv::template process_tile<0, 1, 4, 4, 2, 1>, + Conv::template process_tile<0, 1, 4, 4, 2, 2>, + Conv::template process_tile<0, 1, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 4, 3, 0>, + Conv::template process_tile<0, 1, 4, 4, 3, 1>, + Conv::template process_tile<0, 1, 4, 4, 3, 2>, + Conv::template process_tile<0, 1, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 5, 0, 0>, + Conv::template process_tile<0, 1, 4, 5, 0, 1>, + Conv::template process_tile<0, 1, 4, 5, 0, 2>, + Conv::template process_tile<0, 1, 4, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 5, 1, 0>, + Conv::template process_tile<0, 1, 4, 5, 1, 1>, + Conv::template process_tile<0, 1, 4, 5, 1, 2>, + Conv::template process_tile<0, 1, 4, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 5, 2, 0>, + Conv::template process_tile<0, 1, 4, 5, 2, 1>, + Conv::template process_tile<0, 1, 4, 5, 2, 2>, + Conv::template process_tile<0, 1, 4, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 5, 3, 0>, + Conv::template process_tile<0, 1, 4, 5, 3, 1>, + Conv::template process_tile<0, 1, 4, 5, 3, 2>, + Conv::template process_tile<0, 1, 4, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 4, 6, 0, 0>, + Conv::template process_tile<0, 1, 4, 6, 0, 1>, + Conv::template process_tile<0, 1, 4, 6, 0, 2>, + Conv::template process_tile<0, 1, 4, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 4, 6, 1, 0>, + Conv::template process_tile<0, 1, 4, 6, 1, 1>, + Conv::template process_tile<0, 1, 4, 6, 1, 2>, + Conv::template process_tile<0, 1, 4, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 4, 6, 2, 0>, + Conv::template process_tile<0, 1, 4, 6, 2, 1>, + Conv::template process_tile<0, 1, 4, 6, 2, 2>, + Conv::template process_tile<0, 1, 4, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 4, 6, 3, 0>, + Conv::template process_tile<0, 1, 4, 6, 3, 1>, + Conv::template process_tile<0, 1, 4, 6, 3, 2>, + Conv::template process_tile<0, 1, 4, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 0, 0, 0>, + Conv::template process_tile<0, 1, 5, 0, 0, 1>, + Conv::template process_tile<0, 1, 5, 0, 0, 2>, + Conv::template process_tile<0, 1, 5, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 0, 1, 0>, + Conv::template process_tile<0, 1, 5, 0, 1, 1>, + Conv::template process_tile<0, 1, 5, 0, 1, 2>, + Conv::template process_tile<0, 1, 5, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 0, 2, 0>, + Conv::template process_tile<0, 1, 5, 0, 2, 1>, + Conv::template process_tile<0, 1, 5, 0, 2, 2>, + Conv::template process_tile<0, 1, 5, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 0, 3, 0>, + Conv::template process_tile<0, 1, 5, 0, 3, 1>, + Conv::template process_tile<0, 1, 5, 0, 3, 2>, + Conv::template process_tile<0, 1, 5, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 1, 0, 0>, + Conv::template process_tile<0, 1, 5, 1, 0, 1>, + Conv::template process_tile<0, 1, 5, 1, 0, 2>, + Conv::template process_tile<0, 1, 5, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 1, 1, 0>, + Conv::template process_tile<0, 1, 5, 1, 1, 1>, + Conv::template process_tile<0, 1, 5, 1, 1, 2>, + Conv::template process_tile<0, 1, 5, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 1, 2, 0>, + Conv::template process_tile<0, 1, 5, 1, 2, 1>, + Conv::template process_tile<0, 1, 5, 1, 2, 2>, + Conv::template process_tile<0, 1, 5, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 1, 3, 0>, + Conv::template process_tile<0, 1, 5, 1, 3, 1>, + Conv::template process_tile<0, 1, 5, 1, 3, 2>, + Conv::template process_tile<0, 1, 5, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 2, 0, 0>, + Conv::template process_tile<0, 1, 5, 2, 0, 1>, + Conv::template process_tile<0, 1, 5, 2, 0, 2>, + Conv::template process_tile<0, 1, 5, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 2, 1, 0>, + Conv::template process_tile<0, 1, 5, 2, 1, 1>, + Conv::template process_tile<0, 1, 5, 2, 1, 2>, + Conv::template process_tile<0, 1, 5, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 2, 2, 0>, + Conv::template process_tile<0, 1, 5, 2, 2, 1>, + Conv::template process_tile<0, 1, 5, 2, 2, 2>, + Conv::template process_tile<0, 1, 5, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 2, 3, 0>, + Conv::template process_tile<0, 1, 5, 2, 3, 1>, + Conv::template process_tile<0, 1, 5, 2, 3, 2>, + Conv::template process_tile<0, 1, 5, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 3, 0, 0>, + Conv::template process_tile<0, 1, 5, 3, 0, 1>, + Conv::template process_tile<0, 1, 5, 3, 0, 2>, + Conv::template process_tile<0, 1, 5, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 3, 1, 0>, + Conv::template process_tile<0, 1, 5, 3, 1, 1>, + Conv::template process_tile<0, 1, 5, 3, 1, 2>, + Conv::template process_tile<0, 1, 5, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 3, 2, 0>, + Conv::template process_tile<0, 1, 5, 3, 2, 1>, + Conv::template process_tile<0, 1, 5, 3, 2, 2>, + Conv::template process_tile<0, 1, 5, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 3, 3, 0>, + Conv::template process_tile<0, 1, 5, 3, 3, 1>, + Conv::template process_tile<0, 1, 5, 3, 3, 2>, + Conv::template process_tile<0, 1, 5, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 4, 0, 0>, + Conv::template process_tile<0, 1, 5, 4, 0, 1>, + Conv::template process_tile<0, 1, 5, 4, 0, 2>, + Conv::template process_tile<0, 1, 5, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 4, 1, 0>, + Conv::template process_tile<0, 1, 5, 4, 1, 1>, + Conv::template process_tile<0, 1, 5, 4, 1, 2>, + Conv::template process_tile<0, 1, 5, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 4, 2, 0>, + Conv::template process_tile<0, 1, 5, 4, 2, 1>, + Conv::template process_tile<0, 1, 5, 4, 2, 2>, + Conv::template process_tile<0, 1, 5, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 4, 3, 0>, + Conv::template process_tile<0, 1, 5, 4, 3, 1>, + Conv::template process_tile<0, 1, 5, 4, 3, 2>, + Conv::template process_tile<0, 1, 5, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 5, 0, 0>, + Conv::template process_tile<0, 1, 5, 5, 0, 1>, + Conv::template process_tile<0, 1, 5, 5, 0, 2>, + Conv::template process_tile<0, 1, 5, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 5, 1, 0>, + Conv::template process_tile<0, 1, 5, 5, 1, 1>, + Conv::template process_tile<0, 1, 5, 5, 1, 2>, + Conv::template process_tile<0, 1, 5, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 5, 2, 0>, + Conv::template process_tile<0, 1, 5, 5, 2, 1>, + Conv::template process_tile<0, 1, 5, 5, 2, 2>, + Conv::template process_tile<0, 1, 5, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 5, 3, 0>, + Conv::template process_tile<0, 1, 5, 5, 3, 1>, + Conv::template process_tile<0, 1, 5, 5, 3, 2>, + Conv::template process_tile<0, 1, 5, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 5, 6, 0, 0>, + Conv::template process_tile<0, 1, 5, 6, 0, 1>, + Conv::template process_tile<0, 1, 5, 6, 0, 2>, + Conv::template process_tile<0, 1, 5, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 5, 6, 1, 0>, + Conv::template process_tile<0, 1, 5, 6, 1, 1>, + Conv::template process_tile<0, 1, 5, 6, 1, 2>, + Conv::template process_tile<0, 1, 5, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 5, 6, 2, 0>, + Conv::template process_tile<0, 1, 5, 6, 2, 1>, + Conv::template process_tile<0, 1, 5, 6, 2, 2>, + Conv::template process_tile<0, 1, 5, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 5, 6, 3, 0>, + Conv::template process_tile<0, 1, 5, 6, 3, 1>, + Conv::template process_tile<0, 1, 5, 6, 3, 2>, + Conv::template process_tile<0, 1, 5, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 0, 0, 0>, + Conv::template process_tile<0, 1, 6, 0, 0, 1>, + Conv::template process_tile<0, 1, 6, 0, 0, 2>, + Conv::template process_tile<0, 1, 6, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 0, 1, 0>, + Conv::template process_tile<0, 1, 6, 0, 1, 1>, + Conv::template process_tile<0, 1, 6, 0, 1, 2>, + Conv::template process_tile<0, 1, 6, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 0, 2, 0>, + Conv::template process_tile<0, 1, 6, 0, 2, 1>, + Conv::template process_tile<0, 1, 6, 0, 2, 2>, + Conv::template process_tile<0, 1, 6, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 0, 3, 0>, + Conv::template process_tile<0, 1, 6, 0, 3, 1>, + Conv::template process_tile<0, 1, 6, 0, 3, 2>, + Conv::template process_tile<0, 1, 6, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 1, 0, 0>, + Conv::template process_tile<0, 1, 6, 1, 0, 1>, + Conv::template process_tile<0, 1, 6, 1, 0, 2>, + Conv::template process_tile<0, 1, 6, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 1, 1, 0>, + Conv::template process_tile<0, 1, 6, 1, 1, 1>, + Conv::template process_tile<0, 1, 6, 1, 1, 2>, + Conv::template process_tile<0, 1, 6, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 1, 2, 0>, + Conv::template process_tile<0, 1, 6, 1, 2, 1>, + Conv::template process_tile<0, 1, 6, 1, 2, 2>, + Conv::template process_tile<0, 1, 6, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 1, 3, 0>, + Conv::template process_tile<0, 1, 6, 1, 3, 1>, + Conv::template process_tile<0, 1, 6, 1, 3, 2>, + Conv::template process_tile<0, 1, 6, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 2, 0, 0>, + Conv::template process_tile<0, 1, 6, 2, 0, 1>, + Conv::template process_tile<0, 1, 6, 2, 0, 2>, + Conv::template process_tile<0, 1, 6, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 2, 1, 0>, + Conv::template process_tile<0, 1, 6, 2, 1, 1>, + Conv::template process_tile<0, 1, 6, 2, 1, 2>, + Conv::template process_tile<0, 1, 6, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 2, 2, 0>, + Conv::template process_tile<0, 1, 6, 2, 2, 1>, + Conv::template process_tile<0, 1, 6, 2, 2, 2>, + Conv::template process_tile<0, 1, 6, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 2, 3, 0>, + Conv::template process_tile<0, 1, 6, 2, 3, 1>, + Conv::template process_tile<0, 1, 6, 2, 3, 2>, + Conv::template process_tile<0, 1, 6, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 3, 0, 0>, + Conv::template process_tile<0, 1, 6, 3, 0, 1>, + Conv::template process_tile<0, 1, 6, 3, 0, 2>, + Conv::template process_tile<0, 1, 6, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 3, 1, 0>, + Conv::template process_tile<0, 1, 6, 3, 1, 1>, + Conv::template process_tile<0, 1, 6, 3, 1, 2>, + Conv::template process_tile<0, 1, 6, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 3, 2, 0>, + Conv::template process_tile<0, 1, 6, 3, 2, 1>, + Conv::template process_tile<0, 1, 6, 3, 2, 2>, + Conv::template process_tile<0, 1, 6, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 3, 3, 0>, + Conv::template process_tile<0, 1, 6, 3, 3, 1>, + Conv::template process_tile<0, 1, 6, 3, 3, 2>, + Conv::template process_tile<0, 1, 6, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 4, 0, 0>, + Conv::template process_tile<0, 1, 6, 4, 0, 1>, + Conv::template process_tile<0, 1, 6, 4, 0, 2>, + Conv::template process_tile<0, 1, 6, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 4, 1, 0>, + Conv::template process_tile<0, 1, 6, 4, 1, 1>, + Conv::template process_tile<0, 1, 6, 4, 1, 2>, + Conv::template process_tile<0, 1, 6, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 4, 2, 0>, + Conv::template process_tile<0, 1, 6, 4, 2, 1>, + Conv::template process_tile<0, 1, 6, 4, 2, 2>, + Conv::template process_tile<0, 1, 6, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 4, 3, 0>, + Conv::template process_tile<0, 1, 6, 4, 3, 1>, + Conv::template process_tile<0, 1, 6, 4, 3, 2>, + Conv::template process_tile<0, 1, 6, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 5, 0, 0>, + Conv::template process_tile<0, 1, 6, 5, 0, 1>, + Conv::template process_tile<0, 1, 6, 5, 0, 2>, + Conv::template process_tile<0, 1, 6, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 5, 1, 0>, + Conv::template process_tile<0, 1, 6, 5, 1, 1>, + Conv::template process_tile<0, 1, 6, 5, 1, 2>, + Conv::template process_tile<0, 1, 6, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 5, 2, 0>, + Conv::template process_tile<0, 1, 6, 5, 2, 1>, + Conv::template process_tile<0, 1, 6, 5, 2, 2>, + Conv::template process_tile<0, 1, 6, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 5, 3, 0>, + Conv::template process_tile<0, 1, 6, 5, 3, 1>, + Conv::template process_tile<0, 1, 6, 5, 3, 2>, + Conv::template process_tile<0, 1, 6, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<0, 1, 6, 6, 0, 0>, + Conv::template process_tile<0, 1, 6, 6, 0, 1>, + Conv::template process_tile<0, 1, 6, 6, 0, 2>, + Conv::template process_tile<0, 1, 6, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<0, 1, 6, 6, 1, 0>, + Conv::template process_tile<0, 1, 6, 6, 1, 1>, + Conv::template process_tile<0, 1, 6, 6, 1, 2>, + Conv::template process_tile<0, 1, 6, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<0, 1, 6, 6, 2, 0>, + Conv::template process_tile<0, 1, 6, 6, 2, 1>, + Conv::template process_tile<0, 1, 6, 6, 2, 2>, + Conv::template process_tile<0, 1, 6, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<0, 1, 6, 6, 3, 0>, + Conv::template process_tile<0, 1, 6, 6, 3, 1>, + Conv::template process_tile<0, 1, 6, 6, 3, 2>, + Conv::template process_tile<0, 1, 6, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 1 + }, // Input pad top = 0 + { // Input pad top = 1 + { // Input pad left = 0 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 0, 0, 0>, + Conv::template process_tile<1, 0, 0, 0, 0, 1>, + Conv::template process_tile<1, 0, 0, 0, 0, 2>, + Conv::template process_tile<1, 0, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 0, 1, 0>, + Conv::template process_tile<1, 0, 0, 0, 1, 1>, + Conv::template process_tile<1, 0, 0, 0, 1, 2>, + Conv::template process_tile<1, 0, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 0, 2, 0>, + Conv::template process_tile<1, 0, 0, 0, 2, 1>, + Conv::template process_tile<1, 0, 0, 0, 2, 2>, + Conv::template process_tile<1, 0, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 0, 3, 0>, + Conv::template process_tile<1, 0, 0, 0, 3, 1>, + Conv::template process_tile<1, 0, 0, 0, 3, 2>, + Conv::template process_tile<1, 0, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 1, 0, 0>, + Conv::template process_tile<1, 0, 0, 1, 0, 1>, + Conv::template process_tile<1, 0, 0, 1, 0, 2>, + Conv::template process_tile<1, 0, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 1, 1, 0>, + Conv::template process_tile<1, 0, 0, 1, 1, 1>, + Conv::template process_tile<1, 0, 0, 1, 1, 2>, + Conv::template process_tile<1, 0, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 1, 2, 0>, + Conv::template process_tile<1, 0, 0, 1, 2, 1>, + Conv::template process_tile<1, 0, 0, 1, 2, 2>, + Conv::template process_tile<1, 0, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 1, 3, 0>, + Conv::template process_tile<1, 0, 0, 1, 3, 1>, + Conv::template process_tile<1, 0, 0, 1, 3, 2>, + Conv::template process_tile<1, 0, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 2, 0, 0>, + Conv::template process_tile<1, 0, 0, 2, 0, 1>, + Conv::template process_tile<1, 0, 0, 2, 0, 2>, + Conv::template process_tile<1, 0, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 2, 1, 0>, + Conv::template process_tile<1, 0, 0, 2, 1, 1>, + Conv::template process_tile<1, 0, 0, 2, 1, 2>, + Conv::template process_tile<1, 0, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 2, 2, 0>, + Conv::template process_tile<1, 0, 0, 2, 2, 1>, + Conv::template process_tile<1, 0, 0, 2, 2, 2>, + Conv::template process_tile<1, 0, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 2, 3, 0>, + Conv::template process_tile<1, 0, 0, 2, 3, 1>, + Conv::template process_tile<1, 0, 0, 2, 3, 2>, + Conv::template process_tile<1, 0, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 3, 0, 0>, + Conv::template process_tile<1, 0, 0, 3, 0, 1>, + Conv::template process_tile<1, 0, 0, 3, 0, 2>, + Conv::template process_tile<1, 0, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 3, 1, 0>, + Conv::template process_tile<1, 0, 0, 3, 1, 1>, + Conv::template process_tile<1, 0, 0, 3, 1, 2>, + Conv::template process_tile<1, 0, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 3, 2, 0>, + Conv::template process_tile<1, 0, 0, 3, 2, 1>, + Conv::template process_tile<1, 0, 0, 3, 2, 2>, + Conv::template process_tile<1, 0, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 3, 3, 0>, + Conv::template process_tile<1, 0, 0, 3, 3, 1>, + Conv::template process_tile<1, 0, 0, 3, 3, 2>, + Conv::template process_tile<1, 0, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 4, 0, 0>, + Conv::template process_tile<1, 0, 0, 4, 0, 1>, + Conv::template process_tile<1, 0, 0, 4, 0, 2>, + Conv::template process_tile<1, 0, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 4, 1, 0>, + Conv::template process_tile<1, 0, 0, 4, 1, 1>, + Conv::template process_tile<1, 0, 0, 4, 1, 2>, + Conv::template process_tile<1, 0, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 4, 2, 0>, + Conv::template process_tile<1, 0, 0, 4, 2, 1>, + Conv::template process_tile<1, 0, 0, 4, 2, 2>, + Conv::template process_tile<1, 0, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 4, 3, 0>, + Conv::template process_tile<1, 0, 0, 4, 3, 1>, + Conv::template process_tile<1, 0, 0, 4, 3, 2>, + Conv::template process_tile<1, 0, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 5, 0, 0>, + Conv::template process_tile<1, 0, 0, 5, 0, 1>, + Conv::template process_tile<1, 0, 0, 5, 0, 2>, + Conv::template process_tile<1, 0, 0, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 5, 1, 0>, + Conv::template process_tile<1, 0, 0, 5, 1, 1>, + Conv::template process_tile<1, 0, 0, 5, 1, 2>, + Conv::template process_tile<1, 0, 0, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 5, 2, 0>, + Conv::template process_tile<1, 0, 0, 5, 2, 1>, + Conv::template process_tile<1, 0, 0, 5, 2, 2>, + Conv::template process_tile<1, 0, 0, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 5, 3, 0>, + Conv::template process_tile<1, 0, 0, 5, 3, 1>, + Conv::template process_tile<1, 0, 0, 5, 3, 2>, + Conv::template process_tile<1, 0, 0, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 0, 6, 0, 0>, + Conv::template process_tile<1, 0, 0, 6, 0, 1>, + Conv::template process_tile<1, 0, 0, 6, 0, 2>, + Conv::template process_tile<1, 0, 0, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 0, 6, 1, 0>, + Conv::template process_tile<1, 0, 0, 6, 1, 1>, + Conv::template process_tile<1, 0, 0, 6, 1, 2>, + Conv::template process_tile<1, 0, 0, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 0, 6, 2, 0>, + Conv::template process_tile<1, 0, 0, 6, 2, 1>, + Conv::template process_tile<1, 0, 0, 6, 2, 2>, + Conv::template process_tile<1, 0, 0, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 0, 6, 3, 0>, + Conv::template process_tile<1, 0, 0, 6, 3, 1>, + Conv::template process_tile<1, 0, 0, 6, 3, 2>, + Conv::template process_tile<1, 0, 0, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 0, 0, 0>, + Conv::template process_tile<1, 0, 1, 0, 0, 1>, + Conv::template process_tile<1, 0, 1, 0, 0, 2>, + Conv::template process_tile<1, 0, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 0, 1, 0>, + Conv::template process_tile<1, 0, 1, 0, 1, 1>, + Conv::template process_tile<1, 0, 1, 0, 1, 2>, + Conv::template process_tile<1, 0, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 0, 2, 0>, + Conv::template process_tile<1, 0, 1, 0, 2, 1>, + Conv::template process_tile<1, 0, 1, 0, 2, 2>, + Conv::template process_tile<1, 0, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 0, 3, 0>, + Conv::template process_tile<1, 0, 1, 0, 3, 1>, + Conv::template process_tile<1, 0, 1, 0, 3, 2>, + Conv::template process_tile<1, 0, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 1, 0, 0>, + Conv::template process_tile<1, 0, 1, 1, 0, 1>, + Conv::template process_tile<1, 0, 1, 1, 0, 2>, + Conv::template process_tile<1, 0, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 1, 1, 0>, + Conv::template process_tile<1, 0, 1, 1, 1, 1>, + Conv::template process_tile<1, 0, 1, 1, 1, 2>, + Conv::template process_tile<1, 0, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 1, 2, 0>, + Conv::template process_tile<1, 0, 1, 1, 2, 1>, + Conv::template process_tile<1, 0, 1, 1, 2, 2>, + Conv::template process_tile<1, 0, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 1, 3, 0>, + Conv::template process_tile<1, 0, 1, 1, 3, 1>, + Conv::template process_tile<1, 0, 1, 1, 3, 2>, + Conv::template process_tile<1, 0, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 2, 0, 0>, + Conv::template process_tile<1, 0, 1, 2, 0, 1>, + Conv::template process_tile<1, 0, 1, 2, 0, 2>, + Conv::template process_tile<1, 0, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 2, 1, 0>, + Conv::template process_tile<1, 0, 1, 2, 1, 1>, + Conv::template process_tile<1, 0, 1, 2, 1, 2>, + Conv::template process_tile<1, 0, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 2, 2, 0>, + Conv::template process_tile<1, 0, 1, 2, 2, 1>, + Conv::template process_tile<1, 0, 1, 2, 2, 2>, + Conv::template process_tile<1, 0, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 2, 3, 0>, + Conv::template process_tile<1, 0, 1, 2, 3, 1>, + Conv::template process_tile<1, 0, 1, 2, 3, 2>, + Conv::template process_tile<1, 0, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 3, 0, 0>, + Conv::template process_tile<1, 0, 1, 3, 0, 1>, + Conv::template process_tile<1, 0, 1, 3, 0, 2>, + Conv::template process_tile<1, 0, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 3, 1, 0>, + Conv::template process_tile<1, 0, 1, 3, 1, 1>, + Conv::template process_tile<1, 0, 1, 3, 1, 2>, + Conv::template process_tile<1, 0, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 3, 2, 0>, + Conv::template process_tile<1, 0, 1, 3, 2, 1>, + Conv::template process_tile<1, 0, 1, 3, 2, 2>, + Conv::template process_tile<1, 0, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 3, 3, 0>, + Conv::template process_tile<1, 0, 1, 3, 3, 1>, + Conv::template process_tile<1, 0, 1, 3, 3, 2>, + Conv::template process_tile<1, 0, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 4, 0, 0>, + Conv::template process_tile<1, 0, 1, 4, 0, 1>, + Conv::template process_tile<1, 0, 1, 4, 0, 2>, + Conv::template process_tile<1, 0, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 4, 1, 0>, + Conv::template process_tile<1, 0, 1, 4, 1, 1>, + Conv::template process_tile<1, 0, 1, 4, 1, 2>, + Conv::template process_tile<1, 0, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 4, 2, 0>, + Conv::template process_tile<1, 0, 1, 4, 2, 1>, + Conv::template process_tile<1, 0, 1, 4, 2, 2>, + Conv::template process_tile<1, 0, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 4, 3, 0>, + Conv::template process_tile<1, 0, 1, 4, 3, 1>, + Conv::template process_tile<1, 0, 1, 4, 3, 2>, + Conv::template process_tile<1, 0, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 5, 0, 0>, + Conv::template process_tile<1, 0, 1, 5, 0, 1>, + Conv::template process_tile<1, 0, 1, 5, 0, 2>, + Conv::template process_tile<1, 0, 1, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 5, 1, 0>, + Conv::template process_tile<1, 0, 1, 5, 1, 1>, + Conv::template process_tile<1, 0, 1, 5, 1, 2>, + Conv::template process_tile<1, 0, 1, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 5, 2, 0>, + Conv::template process_tile<1, 0, 1, 5, 2, 1>, + Conv::template process_tile<1, 0, 1, 5, 2, 2>, + Conv::template process_tile<1, 0, 1, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 5, 3, 0>, + Conv::template process_tile<1, 0, 1, 5, 3, 1>, + Conv::template process_tile<1, 0, 1, 5, 3, 2>, + Conv::template process_tile<1, 0, 1, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 1, 6, 0, 0>, + Conv::template process_tile<1, 0, 1, 6, 0, 1>, + Conv::template process_tile<1, 0, 1, 6, 0, 2>, + Conv::template process_tile<1, 0, 1, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 1, 6, 1, 0>, + Conv::template process_tile<1, 0, 1, 6, 1, 1>, + Conv::template process_tile<1, 0, 1, 6, 1, 2>, + Conv::template process_tile<1, 0, 1, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 1, 6, 2, 0>, + Conv::template process_tile<1, 0, 1, 6, 2, 1>, + Conv::template process_tile<1, 0, 1, 6, 2, 2>, + Conv::template process_tile<1, 0, 1, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 1, 6, 3, 0>, + Conv::template process_tile<1, 0, 1, 6, 3, 1>, + Conv::template process_tile<1, 0, 1, 6, 3, 2>, + Conv::template process_tile<1, 0, 1, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 0, 0, 0>, + Conv::template process_tile<1, 0, 2, 0, 0, 1>, + Conv::template process_tile<1, 0, 2, 0, 0, 2>, + Conv::template process_tile<1, 0, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 0, 1, 0>, + Conv::template process_tile<1, 0, 2, 0, 1, 1>, + Conv::template process_tile<1, 0, 2, 0, 1, 2>, + Conv::template process_tile<1, 0, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 0, 2, 0>, + Conv::template process_tile<1, 0, 2, 0, 2, 1>, + Conv::template process_tile<1, 0, 2, 0, 2, 2>, + Conv::template process_tile<1, 0, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 0, 3, 0>, + Conv::template process_tile<1, 0, 2, 0, 3, 1>, + Conv::template process_tile<1, 0, 2, 0, 3, 2>, + Conv::template process_tile<1, 0, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 1, 0, 0>, + Conv::template process_tile<1, 0, 2, 1, 0, 1>, + Conv::template process_tile<1, 0, 2, 1, 0, 2>, + Conv::template process_tile<1, 0, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 1, 1, 0>, + Conv::template process_tile<1, 0, 2, 1, 1, 1>, + Conv::template process_tile<1, 0, 2, 1, 1, 2>, + Conv::template process_tile<1, 0, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 1, 2, 0>, + Conv::template process_tile<1, 0, 2, 1, 2, 1>, + Conv::template process_tile<1, 0, 2, 1, 2, 2>, + Conv::template process_tile<1, 0, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 1, 3, 0>, + Conv::template process_tile<1, 0, 2, 1, 3, 1>, + Conv::template process_tile<1, 0, 2, 1, 3, 2>, + Conv::template process_tile<1, 0, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 2, 0, 0>, + Conv::template process_tile<1, 0, 2, 2, 0, 1>, + Conv::template process_tile<1, 0, 2, 2, 0, 2>, + Conv::template process_tile<1, 0, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 2, 1, 0>, + Conv::template process_tile<1, 0, 2, 2, 1, 1>, + Conv::template process_tile<1, 0, 2, 2, 1, 2>, + Conv::template process_tile<1, 0, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 2, 2, 0>, + Conv::template process_tile<1, 0, 2, 2, 2, 1>, + Conv::template process_tile<1, 0, 2, 2, 2, 2>, + Conv::template process_tile<1, 0, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 2, 3, 0>, + Conv::template process_tile<1, 0, 2, 2, 3, 1>, + Conv::template process_tile<1, 0, 2, 2, 3, 2>, + Conv::template process_tile<1, 0, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 3, 0, 0>, + Conv::template process_tile<1, 0, 2, 3, 0, 1>, + Conv::template process_tile<1, 0, 2, 3, 0, 2>, + Conv::template process_tile<1, 0, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 3, 1, 0>, + Conv::template process_tile<1, 0, 2, 3, 1, 1>, + Conv::template process_tile<1, 0, 2, 3, 1, 2>, + Conv::template process_tile<1, 0, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 3, 2, 0>, + Conv::template process_tile<1, 0, 2, 3, 2, 1>, + Conv::template process_tile<1, 0, 2, 3, 2, 2>, + Conv::template process_tile<1, 0, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 3, 3, 0>, + Conv::template process_tile<1, 0, 2, 3, 3, 1>, + Conv::template process_tile<1, 0, 2, 3, 3, 2>, + Conv::template process_tile<1, 0, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 4, 0, 0>, + Conv::template process_tile<1, 0, 2, 4, 0, 1>, + Conv::template process_tile<1, 0, 2, 4, 0, 2>, + Conv::template process_tile<1, 0, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 4, 1, 0>, + Conv::template process_tile<1, 0, 2, 4, 1, 1>, + Conv::template process_tile<1, 0, 2, 4, 1, 2>, + Conv::template process_tile<1, 0, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 4, 2, 0>, + Conv::template process_tile<1, 0, 2, 4, 2, 1>, + Conv::template process_tile<1, 0, 2, 4, 2, 2>, + Conv::template process_tile<1, 0, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 4, 3, 0>, + Conv::template process_tile<1, 0, 2, 4, 3, 1>, + Conv::template process_tile<1, 0, 2, 4, 3, 2>, + Conv::template process_tile<1, 0, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 5, 0, 0>, + Conv::template process_tile<1, 0, 2, 5, 0, 1>, + Conv::template process_tile<1, 0, 2, 5, 0, 2>, + Conv::template process_tile<1, 0, 2, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 5, 1, 0>, + Conv::template process_tile<1, 0, 2, 5, 1, 1>, + Conv::template process_tile<1, 0, 2, 5, 1, 2>, + Conv::template process_tile<1, 0, 2, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 5, 2, 0>, + Conv::template process_tile<1, 0, 2, 5, 2, 1>, + Conv::template process_tile<1, 0, 2, 5, 2, 2>, + Conv::template process_tile<1, 0, 2, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 5, 3, 0>, + Conv::template process_tile<1, 0, 2, 5, 3, 1>, + Conv::template process_tile<1, 0, 2, 5, 3, 2>, + Conv::template process_tile<1, 0, 2, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 2, 6, 0, 0>, + Conv::template process_tile<1, 0, 2, 6, 0, 1>, + Conv::template process_tile<1, 0, 2, 6, 0, 2>, + Conv::template process_tile<1, 0, 2, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 2, 6, 1, 0>, + Conv::template process_tile<1, 0, 2, 6, 1, 1>, + Conv::template process_tile<1, 0, 2, 6, 1, 2>, + Conv::template process_tile<1, 0, 2, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 2, 6, 2, 0>, + Conv::template process_tile<1, 0, 2, 6, 2, 1>, + Conv::template process_tile<1, 0, 2, 6, 2, 2>, + Conv::template process_tile<1, 0, 2, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 2, 6, 3, 0>, + Conv::template process_tile<1, 0, 2, 6, 3, 1>, + Conv::template process_tile<1, 0, 2, 6, 3, 2>, + Conv::template process_tile<1, 0, 2, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 0, 0, 0>, + Conv::template process_tile<1, 0, 3, 0, 0, 1>, + Conv::template process_tile<1, 0, 3, 0, 0, 2>, + Conv::template process_tile<1, 0, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 0, 1, 0>, + Conv::template process_tile<1, 0, 3, 0, 1, 1>, + Conv::template process_tile<1, 0, 3, 0, 1, 2>, + Conv::template process_tile<1, 0, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 0, 2, 0>, + Conv::template process_tile<1, 0, 3, 0, 2, 1>, + Conv::template process_tile<1, 0, 3, 0, 2, 2>, + Conv::template process_tile<1, 0, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 0, 3, 0>, + Conv::template process_tile<1, 0, 3, 0, 3, 1>, + Conv::template process_tile<1, 0, 3, 0, 3, 2>, + Conv::template process_tile<1, 0, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 1, 0, 0>, + Conv::template process_tile<1, 0, 3, 1, 0, 1>, + Conv::template process_tile<1, 0, 3, 1, 0, 2>, + Conv::template process_tile<1, 0, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 1, 1, 0>, + Conv::template process_tile<1, 0, 3, 1, 1, 1>, + Conv::template process_tile<1, 0, 3, 1, 1, 2>, + Conv::template process_tile<1, 0, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 1, 2, 0>, + Conv::template process_tile<1, 0, 3, 1, 2, 1>, + Conv::template process_tile<1, 0, 3, 1, 2, 2>, + Conv::template process_tile<1, 0, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 1, 3, 0>, + Conv::template process_tile<1, 0, 3, 1, 3, 1>, + Conv::template process_tile<1, 0, 3, 1, 3, 2>, + Conv::template process_tile<1, 0, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 2, 0, 0>, + Conv::template process_tile<1, 0, 3, 2, 0, 1>, + Conv::template process_tile<1, 0, 3, 2, 0, 2>, + Conv::template process_tile<1, 0, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 2, 1, 0>, + Conv::template process_tile<1, 0, 3, 2, 1, 1>, + Conv::template process_tile<1, 0, 3, 2, 1, 2>, + Conv::template process_tile<1, 0, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 2, 2, 0>, + Conv::template process_tile<1, 0, 3, 2, 2, 1>, + Conv::template process_tile<1, 0, 3, 2, 2, 2>, + Conv::template process_tile<1, 0, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 2, 3, 0>, + Conv::template process_tile<1, 0, 3, 2, 3, 1>, + Conv::template process_tile<1, 0, 3, 2, 3, 2>, + Conv::template process_tile<1, 0, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 3, 0, 0>, + Conv::template process_tile<1, 0, 3, 3, 0, 1>, + Conv::template process_tile<1, 0, 3, 3, 0, 2>, + Conv::template process_tile<1, 0, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 3, 1, 0>, + Conv::template process_tile<1, 0, 3, 3, 1, 1>, + Conv::template process_tile<1, 0, 3, 3, 1, 2>, + Conv::template process_tile<1, 0, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 3, 2, 0>, + Conv::template process_tile<1, 0, 3, 3, 2, 1>, + Conv::template process_tile<1, 0, 3, 3, 2, 2>, + Conv::template process_tile<1, 0, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 3, 3, 0>, + Conv::template process_tile<1, 0, 3, 3, 3, 1>, + Conv::template process_tile<1, 0, 3, 3, 3, 2>, + Conv::template process_tile<1, 0, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 4, 0, 0>, + Conv::template process_tile<1, 0, 3, 4, 0, 1>, + Conv::template process_tile<1, 0, 3, 4, 0, 2>, + Conv::template process_tile<1, 0, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 4, 1, 0>, + Conv::template process_tile<1, 0, 3, 4, 1, 1>, + Conv::template process_tile<1, 0, 3, 4, 1, 2>, + Conv::template process_tile<1, 0, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 4, 2, 0>, + Conv::template process_tile<1, 0, 3, 4, 2, 1>, + Conv::template process_tile<1, 0, 3, 4, 2, 2>, + Conv::template process_tile<1, 0, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 4, 3, 0>, + Conv::template process_tile<1, 0, 3, 4, 3, 1>, + Conv::template process_tile<1, 0, 3, 4, 3, 2>, + Conv::template process_tile<1, 0, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 5, 0, 0>, + Conv::template process_tile<1, 0, 3, 5, 0, 1>, + Conv::template process_tile<1, 0, 3, 5, 0, 2>, + Conv::template process_tile<1, 0, 3, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 5, 1, 0>, + Conv::template process_tile<1, 0, 3, 5, 1, 1>, + Conv::template process_tile<1, 0, 3, 5, 1, 2>, + Conv::template process_tile<1, 0, 3, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 5, 2, 0>, + Conv::template process_tile<1, 0, 3, 5, 2, 1>, + Conv::template process_tile<1, 0, 3, 5, 2, 2>, + Conv::template process_tile<1, 0, 3, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 5, 3, 0>, + Conv::template process_tile<1, 0, 3, 5, 3, 1>, + Conv::template process_tile<1, 0, 3, 5, 3, 2>, + Conv::template process_tile<1, 0, 3, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 3, 6, 0, 0>, + Conv::template process_tile<1, 0, 3, 6, 0, 1>, + Conv::template process_tile<1, 0, 3, 6, 0, 2>, + Conv::template process_tile<1, 0, 3, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 3, 6, 1, 0>, + Conv::template process_tile<1, 0, 3, 6, 1, 1>, + Conv::template process_tile<1, 0, 3, 6, 1, 2>, + Conv::template process_tile<1, 0, 3, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 3, 6, 2, 0>, + Conv::template process_tile<1, 0, 3, 6, 2, 1>, + Conv::template process_tile<1, 0, 3, 6, 2, 2>, + Conv::template process_tile<1, 0, 3, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 3, 6, 3, 0>, + Conv::template process_tile<1, 0, 3, 6, 3, 1>, + Conv::template process_tile<1, 0, 3, 6, 3, 2>, + Conv::template process_tile<1, 0, 3, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 0, 0, 0>, + Conv::template process_tile<1, 0, 4, 0, 0, 1>, + Conv::template process_tile<1, 0, 4, 0, 0, 2>, + Conv::template process_tile<1, 0, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 0, 1, 0>, + Conv::template process_tile<1, 0, 4, 0, 1, 1>, + Conv::template process_tile<1, 0, 4, 0, 1, 2>, + Conv::template process_tile<1, 0, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 0, 2, 0>, + Conv::template process_tile<1, 0, 4, 0, 2, 1>, + Conv::template process_tile<1, 0, 4, 0, 2, 2>, + Conv::template process_tile<1, 0, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 0, 3, 0>, + Conv::template process_tile<1, 0, 4, 0, 3, 1>, + Conv::template process_tile<1, 0, 4, 0, 3, 2>, + Conv::template process_tile<1, 0, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 1, 0, 0>, + Conv::template process_tile<1, 0, 4, 1, 0, 1>, + Conv::template process_tile<1, 0, 4, 1, 0, 2>, + Conv::template process_tile<1, 0, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 1, 1, 0>, + Conv::template process_tile<1, 0, 4, 1, 1, 1>, + Conv::template process_tile<1, 0, 4, 1, 1, 2>, + Conv::template process_tile<1, 0, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 1, 2, 0>, + Conv::template process_tile<1, 0, 4, 1, 2, 1>, + Conv::template process_tile<1, 0, 4, 1, 2, 2>, + Conv::template process_tile<1, 0, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 1, 3, 0>, + Conv::template process_tile<1, 0, 4, 1, 3, 1>, + Conv::template process_tile<1, 0, 4, 1, 3, 2>, + Conv::template process_tile<1, 0, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 2, 0, 0>, + Conv::template process_tile<1, 0, 4, 2, 0, 1>, + Conv::template process_tile<1, 0, 4, 2, 0, 2>, + Conv::template process_tile<1, 0, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 2, 1, 0>, + Conv::template process_tile<1, 0, 4, 2, 1, 1>, + Conv::template process_tile<1, 0, 4, 2, 1, 2>, + Conv::template process_tile<1, 0, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 2, 2, 0>, + Conv::template process_tile<1, 0, 4, 2, 2, 1>, + Conv::template process_tile<1, 0, 4, 2, 2, 2>, + Conv::template process_tile<1, 0, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 2, 3, 0>, + Conv::template process_tile<1, 0, 4, 2, 3, 1>, + Conv::template process_tile<1, 0, 4, 2, 3, 2>, + Conv::template process_tile<1, 0, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 3, 0, 0>, + Conv::template process_tile<1, 0, 4, 3, 0, 1>, + Conv::template process_tile<1, 0, 4, 3, 0, 2>, + Conv::template process_tile<1, 0, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 3, 1, 0>, + Conv::template process_tile<1, 0, 4, 3, 1, 1>, + Conv::template process_tile<1, 0, 4, 3, 1, 2>, + Conv::template process_tile<1, 0, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 3, 2, 0>, + Conv::template process_tile<1, 0, 4, 3, 2, 1>, + Conv::template process_tile<1, 0, 4, 3, 2, 2>, + Conv::template process_tile<1, 0, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 3, 3, 0>, + Conv::template process_tile<1, 0, 4, 3, 3, 1>, + Conv::template process_tile<1, 0, 4, 3, 3, 2>, + Conv::template process_tile<1, 0, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 4, 0, 0>, + Conv::template process_tile<1, 0, 4, 4, 0, 1>, + Conv::template process_tile<1, 0, 4, 4, 0, 2>, + Conv::template process_tile<1, 0, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 4, 1, 0>, + Conv::template process_tile<1, 0, 4, 4, 1, 1>, + Conv::template process_tile<1, 0, 4, 4, 1, 2>, + Conv::template process_tile<1, 0, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 4, 2, 0>, + Conv::template process_tile<1, 0, 4, 4, 2, 1>, + Conv::template process_tile<1, 0, 4, 4, 2, 2>, + Conv::template process_tile<1, 0, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 4, 3, 0>, + Conv::template process_tile<1, 0, 4, 4, 3, 1>, + Conv::template process_tile<1, 0, 4, 4, 3, 2>, + Conv::template process_tile<1, 0, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 5, 0, 0>, + Conv::template process_tile<1, 0, 4, 5, 0, 1>, + Conv::template process_tile<1, 0, 4, 5, 0, 2>, + Conv::template process_tile<1, 0, 4, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 5, 1, 0>, + Conv::template process_tile<1, 0, 4, 5, 1, 1>, + Conv::template process_tile<1, 0, 4, 5, 1, 2>, + Conv::template process_tile<1, 0, 4, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 5, 2, 0>, + Conv::template process_tile<1, 0, 4, 5, 2, 1>, + Conv::template process_tile<1, 0, 4, 5, 2, 2>, + Conv::template process_tile<1, 0, 4, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 5, 3, 0>, + Conv::template process_tile<1, 0, 4, 5, 3, 1>, + Conv::template process_tile<1, 0, 4, 5, 3, 2>, + Conv::template process_tile<1, 0, 4, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 4, 6, 0, 0>, + Conv::template process_tile<1, 0, 4, 6, 0, 1>, + Conv::template process_tile<1, 0, 4, 6, 0, 2>, + Conv::template process_tile<1, 0, 4, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 4, 6, 1, 0>, + Conv::template process_tile<1, 0, 4, 6, 1, 1>, + Conv::template process_tile<1, 0, 4, 6, 1, 2>, + Conv::template process_tile<1, 0, 4, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 4, 6, 2, 0>, + Conv::template process_tile<1, 0, 4, 6, 2, 1>, + Conv::template process_tile<1, 0, 4, 6, 2, 2>, + Conv::template process_tile<1, 0, 4, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 4, 6, 3, 0>, + Conv::template process_tile<1, 0, 4, 6, 3, 1>, + Conv::template process_tile<1, 0, 4, 6, 3, 2>, + Conv::template process_tile<1, 0, 4, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 0, 0, 0>, + Conv::template process_tile<1, 0, 5, 0, 0, 1>, + Conv::template process_tile<1, 0, 5, 0, 0, 2>, + Conv::template process_tile<1, 0, 5, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 0, 1, 0>, + Conv::template process_tile<1, 0, 5, 0, 1, 1>, + Conv::template process_tile<1, 0, 5, 0, 1, 2>, + Conv::template process_tile<1, 0, 5, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 0, 2, 0>, + Conv::template process_tile<1, 0, 5, 0, 2, 1>, + Conv::template process_tile<1, 0, 5, 0, 2, 2>, + Conv::template process_tile<1, 0, 5, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 0, 3, 0>, + Conv::template process_tile<1, 0, 5, 0, 3, 1>, + Conv::template process_tile<1, 0, 5, 0, 3, 2>, + Conv::template process_tile<1, 0, 5, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 1, 0, 0>, + Conv::template process_tile<1, 0, 5, 1, 0, 1>, + Conv::template process_tile<1, 0, 5, 1, 0, 2>, + Conv::template process_tile<1, 0, 5, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 1, 1, 0>, + Conv::template process_tile<1, 0, 5, 1, 1, 1>, + Conv::template process_tile<1, 0, 5, 1, 1, 2>, + Conv::template process_tile<1, 0, 5, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 1, 2, 0>, + Conv::template process_tile<1, 0, 5, 1, 2, 1>, + Conv::template process_tile<1, 0, 5, 1, 2, 2>, + Conv::template process_tile<1, 0, 5, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 1, 3, 0>, + Conv::template process_tile<1, 0, 5, 1, 3, 1>, + Conv::template process_tile<1, 0, 5, 1, 3, 2>, + Conv::template process_tile<1, 0, 5, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 2, 0, 0>, + Conv::template process_tile<1, 0, 5, 2, 0, 1>, + Conv::template process_tile<1, 0, 5, 2, 0, 2>, + Conv::template process_tile<1, 0, 5, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 2, 1, 0>, + Conv::template process_tile<1, 0, 5, 2, 1, 1>, + Conv::template process_tile<1, 0, 5, 2, 1, 2>, + Conv::template process_tile<1, 0, 5, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 2, 2, 0>, + Conv::template process_tile<1, 0, 5, 2, 2, 1>, + Conv::template process_tile<1, 0, 5, 2, 2, 2>, + Conv::template process_tile<1, 0, 5, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 2, 3, 0>, + Conv::template process_tile<1, 0, 5, 2, 3, 1>, + Conv::template process_tile<1, 0, 5, 2, 3, 2>, + Conv::template process_tile<1, 0, 5, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 3, 0, 0>, + Conv::template process_tile<1, 0, 5, 3, 0, 1>, + Conv::template process_tile<1, 0, 5, 3, 0, 2>, + Conv::template process_tile<1, 0, 5, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 3, 1, 0>, + Conv::template process_tile<1, 0, 5, 3, 1, 1>, + Conv::template process_tile<1, 0, 5, 3, 1, 2>, + Conv::template process_tile<1, 0, 5, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 3, 2, 0>, + Conv::template process_tile<1, 0, 5, 3, 2, 1>, + Conv::template process_tile<1, 0, 5, 3, 2, 2>, + Conv::template process_tile<1, 0, 5, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 3, 3, 0>, + Conv::template process_tile<1, 0, 5, 3, 3, 1>, + Conv::template process_tile<1, 0, 5, 3, 3, 2>, + Conv::template process_tile<1, 0, 5, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 4, 0, 0>, + Conv::template process_tile<1, 0, 5, 4, 0, 1>, + Conv::template process_tile<1, 0, 5, 4, 0, 2>, + Conv::template process_tile<1, 0, 5, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 4, 1, 0>, + Conv::template process_tile<1, 0, 5, 4, 1, 1>, + Conv::template process_tile<1, 0, 5, 4, 1, 2>, + Conv::template process_tile<1, 0, 5, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 4, 2, 0>, + Conv::template process_tile<1, 0, 5, 4, 2, 1>, + Conv::template process_tile<1, 0, 5, 4, 2, 2>, + Conv::template process_tile<1, 0, 5, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 4, 3, 0>, + Conv::template process_tile<1, 0, 5, 4, 3, 1>, + Conv::template process_tile<1, 0, 5, 4, 3, 2>, + Conv::template process_tile<1, 0, 5, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 5, 0, 0>, + Conv::template process_tile<1, 0, 5, 5, 0, 1>, + Conv::template process_tile<1, 0, 5, 5, 0, 2>, + Conv::template process_tile<1, 0, 5, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 5, 1, 0>, + Conv::template process_tile<1, 0, 5, 5, 1, 1>, + Conv::template process_tile<1, 0, 5, 5, 1, 2>, + Conv::template process_tile<1, 0, 5, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 5, 2, 0>, + Conv::template process_tile<1, 0, 5, 5, 2, 1>, + Conv::template process_tile<1, 0, 5, 5, 2, 2>, + Conv::template process_tile<1, 0, 5, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 5, 3, 0>, + Conv::template process_tile<1, 0, 5, 5, 3, 1>, + Conv::template process_tile<1, 0, 5, 5, 3, 2>, + Conv::template process_tile<1, 0, 5, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 5, 6, 0, 0>, + Conv::template process_tile<1, 0, 5, 6, 0, 1>, + Conv::template process_tile<1, 0, 5, 6, 0, 2>, + Conv::template process_tile<1, 0, 5, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 5, 6, 1, 0>, + Conv::template process_tile<1, 0, 5, 6, 1, 1>, + Conv::template process_tile<1, 0, 5, 6, 1, 2>, + Conv::template process_tile<1, 0, 5, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 5, 6, 2, 0>, + Conv::template process_tile<1, 0, 5, 6, 2, 1>, + Conv::template process_tile<1, 0, 5, 6, 2, 2>, + Conv::template process_tile<1, 0, 5, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 5, 6, 3, 0>, + Conv::template process_tile<1, 0, 5, 6, 3, 1>, + Conv::template process_tile<1, 0, 5, 6, 3, 2>, + Conv::template process_tile<1, 0, 5, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 0, 0, 0>, + Conv::template process_tile<1, 0, 6, 0, 0, 1>, + Conv::template process_tile<1, 0, 6, 0, 0, 2>, + Conv::template process_tile<1, 0, 6, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 0, 1, 0>, + Conv::template process_tile<1, 0, 6, 0, 1, 1>, + Conv::template process_tile<1, 0, 6, 0, 1, 2>, + Conv::template process_tile<1, 0, 6, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 0, 2, 0>, + Conv::template process_tile<1, 0, 6, 0, 2, 1>, + Conv::template process_tile<1, 0, 6, 0, 2, 2>, + Conv::template process_tile<1, 0, 6, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 0, 3, 0>, + Conv::template process_tile<1, 0, 6, 0, 3, 1>, + Conv::template process_tile<1, 0, 6, 0, 3, 2>, + Conv::template process_tile<1, 0, 6, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 1, 0, 0>, + Conv::template process_tile<1, 0, 6, 1, 0, 1>, + Conv::template process_tile<1, 0, 6, 1, 0, 2>, + Conv::template process_tile<1, 0, 6, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 1, 1, 0>, + Conv::template process_tile<1, 0, 6, 1, 1, 1>, + Conv::template process_tile<1, 0, 6, 1, 1, 2>, + Conv::template process_tile<1, 0, 6, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 1, 2, 0>, + Conv::template process_tile<1, 0, 6, 1, 2, 1>, + Conv::template process_tile<1, 0, 6, 1, 2, 2>, + Conv::template process_tile<1, 0, 6, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 1, 3, 0>, + Conv::template process_tile<1, 0, 6, 1, 3, 1>, + Conv::template process_tile<1, 0, 6, 1, 3, 2>, + Conv::template process_tile<1, 0, 6, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 2, 0, 0>, + Conv::template process_tile<1, 0, 6, 2, 0, 1>, + Conv::template process_tile<1, 0, 6, 2, 0, 2>, + Conv::template process_tile<1, 0, 6, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 2, 1, 0>, + Conv::template process_tile<1, 0, 6, 2, 1, 1>, + Conv::template process_tile<1, 0, 6, 2, 1, 2>, + Conv::template process_tile<1, 0, 6, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 2, 2, 0>, + Conv::template process_tile<1, 0, 6, 2, 2, 1>, + Conv::template process_tile<1, 0, 6, 2, 2, 2>, + Conv::template process_tile<1, 0, 6, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 2, 3, 0>, + Conv::template process_tile<1, 0, 6, 2, 3, 1>, + Conv::template process_tile<1, 0, 6, 2, 3, 2>, + Conv::template process_tile<1, 0, 6, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 3, 0, 0>, + Conv::template process_tile<1, 0, 6, 3, 0, 1>, + Conv::template process_tile<1, 0, 6, 3, 0, 2>, + Conv::template process_tile<1, 0, 6, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 3, 1, 0>, + Conv::template process_tile<1, 0, 6, 3, 1, 1>, + Conv::template process_tile<1, 0, 6, 3, 1, 2>, + Conv::template process_tile<1, 0, 6, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 3, 2, 0>, + Conv::template process_tile<1, 0, 6, 3, 2, 1>, + Conv::template process_tile<1, 0, 6, 3, 2, 2>, + Conv::template process_tile<1, 0, 6, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 3, 3, 0>, + Conv::template process_tile<1, 0, 6, 3, 3, 1>, + Conv::template process_tile<1, 0, 6, 3, 3, 2>, + Conv::template process_tile<1, 0, 6, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 4, 0, 0>, + Conv::template process_tile<1, 0, 6, 4, 0, 1>, + Conv::template process_tile<1, 0, 6, 4, 0, 2>, + Conv::template process_tile<1, 0, 6, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 4, 1, 0>, + Conv::template process_tile<1, 0, 6, 4, 1, 1>, + Conv::template process_tile<1, 0, 6, 4, 1, 2>, + Conv::template process_tile<1, 0, 6, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 4, 2, 0>, + Conv::template process_tile<1, 0, 6, 4, 2, 1>, + Conv::template process_tile<1, 0, 6, 4, 2, 2>, + Conv::template process_tile<1, 0, 6, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 4, 3, 0>, + Conv::template process_tile<1, 0, 6, 4, 3, 1>, + Conv::template process_tile<1, 0, 6, 4, 3, 2>, + Conv::template process_tile<1, 0, 6, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 5, 0, 0>, + Conv::template process_tile<1, 0, 6, 5, 0, 1>, + Conv::template process_tile<1, 0, 6, 5, 0, 2>, + Conv::template process_tile<1, 0, 6, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 5, 1, 0>, + Conv::template process_tile<1, 0, 6, 5, 1, 1>, + Conv::template process_tile<1, 0, 6, 5, 1, 2>, + Conv::template process_tile<1, 0, 6, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 5, 2, 0>, + Conv::template process_tile<1, 0, 6, 5, 2, 1>, + Conv::template process_tile<1, 0, 6, 5, 2, 2>, + Conv::template process_tile<1, 0, 6, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 5, 3, 0>, + Conv::template process_tile<1, 0, 6, 5, 3, 1>, + Conv::template process_tile<1, 0, 6, 5, 3, 2>, + Conv::template process_tile<1, 0, 6, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 0, 6, 6, 0, 0>, + Conv::template process_tile<1, 0, 6, 6, 0, 1>, + Conv::template process_tile<1, 0, 6, 6, 0, 2>, + Conv::template process_tile<1, 0, 6, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 0, 6, 6, 1, 0>, + Conv::template process_tile<1, 0, 6, 6, 1, 1>, + Conv::template process_tile<1, 0, 6, 6, 1, 2>, + Conv::template process_tile<1, 0, 6, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 0, 6, 6, 2, 0>, + Conv::template process_tile<1, 0, 6, 6, 2, 1>, + Conv::template process_tile<1, 0, 6, 6, 2, 2>, + Conv::template process_tile<1, 0, 6, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 0, 6, 6, 3, 0>, + Conv::template process_tile<1, 0, 6, 6, 3, 1>, + Conv::template process_tile<1, 0, 6, 6, 3, 2>, + Conv::template process_tile<1, 0, 6, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 0 + { // Input pad left = 1 + { // Input pad bottom = 0 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 0, 0, 0>, + Conv::template process_tile<1, 1, 0, 0, 0, 1>, + Conv::template process_tile<1, 1, 0, 0, 0, 2>, + Conv::template process_tile<1, 1, 0, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 0, 1, 0>, + Conv::template process_tile<1, 1, 0, 0, 1, 1>, + Conv::template process_tile<1, 1, 0, 0, 1, 2>, + Conv::template process_tile<1, 1, 0, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 0, 2, 0>, + Conv::template process_tile<1, 1, 0, 0, 2, 1>, + Conv::template process_tile<1, 1, 0, 0, 2, 2>, + Conv::template process_tile<1, 1, 0, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 0, 3, 0>, + Conv::template process_tile<1, 1, 0, 0, 3, 1>, + Conv::template process_tile<1, 1, 0, 0, 3, 2>, + Conv::template process_tile<1, 1, 0, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 1, 0, 0>, + Conv::template process_tile<1, 1, 0, 1, 0, 1>, + Conv::template process_tile<1, 1, 0, 1, 0, 2>, + Conv::template process_tile<1, 1, 0, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 1, 1, 0>, + Conv::template process_tile<1, 1, 0, 1, 1, 1>, + Conv::template process_tile<1, 1, 0, 1, 1, 2>, + Conv::template process_tile<1, 1, 0, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 1, 2, 0>, + Conv::template process_tile<1, 1, 0, 1, 2, 1>, + Conv::template process_tile<1, 1, 0, 1, 2, 2>, + Conv::template process_tile<1, 1, 0, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 1, 3, 0>, + Conv::template process_tile<1, 1, 0, 1, 3, 1>, + Conv::template process_tile<1, 1, 0, 1, 3, 2>, + Conv::template process_tile<1, 1, 0, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 2, 0, 0>, + Conv::template process_tile<1, 1, 0, 2, 0, 1>, + Conv::template process_tile<1, 1, 0, 2, 0, 2>, + Conv::template process_tile<1, 1, 0, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 2, 1, 0>, + Conv::template process_tile<1, 1, 0, 2, 1, 1>, + Conv::template process_tile<1, 1, 0, 2, 1, 2>, + Conv::template process_tile<1, 1, 0, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 2, 2, 0>, + Conv::template process_tile<1, 1, 0, 2, 2, 1>, + Conv::template process_tile<1, 1, 0, 2, 2, 2>, + Conv::template process_tile<1, 1, 0, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 2, 3, 0>, + Conv::template process_tile<1, 1, 0, 2, 3, 1>, + Conv::template process_tile<1, 1, 0, 2, 3, 2>, + Conv::template process_tile<1, 1, 0, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 3, 0, 0>, + Conv::template process_tile<1, 1, 0, 3, 0, 1>, + Conv::template process_tile<1, 1, 0, 3, 0, 2>, + Conv::template process_tile<1, 1, 0, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 3, 1, 0>, + Conv::template process_tile<1, 1, 0, 3, 1, 1>, + Conv::template process_tile<1, 1, 0, 3, 1, 2>, + Conv::template process_tile<1, 1, 0, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 3, 2, 0>, + Conv::template process_tile<1, 1, 0, 3, 2, 1>, + Conv::template process_tile<1, 1, 0, 3, 2, 2>, + Conv::template process_tile<1, 1, 0, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 3, 3, 0>, + Conv::template process_tile<1, 1, 0, 3, 3, 1>, + Conv::template process_tile<1, 1, 0, 3, 3, 2>, + Conv::template process_tile<1, 1, 0, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 4, 0, 0>, + Conv::template process_tile<1, 1, 0, 4, 0, 1>, + Conv::template process_tile<1, 1, 0, 4, 0, 2>, + Conv::template process_tile<1, 1, 0, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 4, 1, 0>, + Conv::template process_tile<1, 1, 0, 4, 1, 1>, + Conv::template process_tile<1, 1, 0, 4, 1, 2>, + Conv::template process_tile<1, 1, 0, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 4, 2, 0>, + Conv::template process_tile<1, 1, 0, 4, 2, 1>, + Conv::template process_tile<1, 1, 0, 4, 2, 2>, + Conv::template process_tile<1, 1, 0, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 4, 3, 0>, + Conv::template process_tile<1, 1, 0, 4, 3, 1>, + Conv::template process_tile<1, 1, 0, 4, 3, 2>, + Conv::template process_tile<1, 1, 0, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 5, 0, 0>, + Conv::template process_tile<1, 1, 0, 5, 0, 1>, + Conv::template process_tile<1, 1, 0, 5, 0, 2>, + Conv::template process_tile<1, 1, 0, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 5, 1, 0>, + Conv::template process_tile<1, 1, 0, 5, 1, 1>, + Conv::template process_tile<1, 1, 0, 5, 1, 2>, + Conv::template process_tile<1, 1, 0, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 5, 2, 0>, + Conv::template process_tile<1, 1, 0, 5, 2, 1>, + Conv::template process_tile<1, 1, 0, 5, 2, 2>, + Conv::template process_tile<1, 1, 0, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 5, 3, 0>, + Conv::template process_tile<1, 1, 0, 5, 3, 1>, + Conv::template process_tile<1, 1, 0, 5, 3, 2>, + Conv::template process_tile<1, 1, 0, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 0, 6, 0, 0>, + Conv::template process_tile<1, 1, 0, 6, 0, 1>, + Conv::template process_tile<1, 1, 0, 6, 0, 2>, + Conv::template process_tile<1, 1, 0, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 0, 6, 1, 0>, + Conv::template process_tile<1, 1, 0, 6, 1, 1>, + Conv::template process_tile<1, 1, 0, 6, 1, 2>, + Conv::template process_tile<1, 1, 0, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 0, 6, 2, 0>, + Conv::template process_tile<1, 1, 0, 6, 2, 1>, + Conv::template process_tile<1, 1, 0, 6, 2, 2>, + Conv::template process_tile<1, 1, 0, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 0, 6, 3, 0>, + Conv::template process_tile<1, 1, 0, 6, 3, 1>, + Conv::template process_tile<1, 1, 0, 6, 3, 2>, + Conv::template process_tile<1, 1, 0, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 0 + { // Input pad bottom = 1 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 0, 0, 0>, + Conv::template process_tile<1, 1, 1, 0, 0, 1>, + Conv::template process_tile<1, 1, 1, 0, 0, 2>, + Conv::template process_tile<1, 1, 1, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 0, 1, 0>, + Conv::template process_tile<1, 1, 1, 0, 1, 1>, + Conv::template process_tile<1, 1, 1, 0, 1, 2>, + Conv::template process_tile<1, 1, 1, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 0, 2, 0>, + Conv::template process_tile<1, 1, 1, 0, 2, 1>, + Conv::template process_tile<1, 1, 1, 0, 2, 2>, + Conv::template process_tile<1, 1, 1, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 0, 3, 0>, + Conv::template process_tile<1, 1, 1, 0, 3, 1>, + Conv::template process_tile<1, 1, 1, 0, 3, 2>, + Conv::template process_tile<1, 1, 1, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 1, 0, 0>, + Conv::template process_tile<1, 1, 1, 1, 0, 1>, + Conv::template process_tile<1, 1, 1, 1, 0, 2>, + Conv::template process_tile<1, 1, 1, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 1, 1, 0>, + Conv::template process_tile<1, 1, 1, 1, 1, 1>, + Conv::template process_tile<1, 1, 1, 1, 1, 2>, + Conv::template process_tile<1, 1, 1, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 1, 2, 0>, + Conv::template process_tile<1, 1, 1, 1, 2, 1>, + Conv::template process_tile<1, 1, 1, 1, 2, 2>, + Conv::template process_tile<1, 1, 1, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 1, 3, 0>, + Conv::template process_tile<1, 1, 1, 1, 3, 1>, + Conv::template process_tile<1, 1, 1, 1, 3, 2>, + Conv::template process_tile<1, 1, 1, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 2, 0, 0>, + Conv::template process_tile<1, 1, 1, 2, 0, 1>, + Conv::template process_tile<1, 1, 1, 2, 0, 2>, + Conv::template process_tile<1, 1, 1, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 2, 1, 0>, + Conv::template process_tile<1, 1, 1, 2, 1, 1>, + Conv::template process_tile<1, 1, 1, 2, 1, 2>, + Conv::template process_tile<1, 1, 1, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 2, 2, 0>, + Conv::template process_tile<1, 1, 1, 2, 2, 1>, + Conv::template process_tile<1, 1, 1, 2, 2, 2>, + Conv::template process_tile<1, 1, 1, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 2, 3, 0>, + Conv::template process_tile<1, 1, 1, 2, 3, 1>, + Conv::template process_tile<1, 1, 1, 2, 3, 2>, + Conv::template process_tile<1, 1, 1, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 3, 0, 0>, + Conv::template process_tile<1, 1, 1, 3, 0, 1>, + Conv::template process_tile<1, 1, 1, 3, 0, 2>, + Conv::template process_tile<1, 1, 1, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 3, 1, 0>, + Conv::template process_tile<1, 1, 1, 3, 1, 1>, + Conv::template process_tile<1, 1, 1, 3, 1, 2>, + Conv::template process_tile<1, 1, 1, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 3, 2, 0>, + Conv::template process_tile<1, 1, 1, 3, 2, 1>, + Conv::template process_tile<1, 1, 1, 3, 2, 2>, + Conv::template process_tile<1, 1, 1, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 3, 3, 0>, + Conv::template process_tile<1, 1, 1, 3, 3, 1>, + Conv::template process_tile<1, 1, 1, 3, 3, 2>, + Conv::template process_tile<1, 1, 1, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 4, 0, 0>, + Conv::template process_tile<1, 1, 1, 4, 0, 1>, + Conv::template process_tile<1, 1, 1, 4, 0, 2>, + Conv::template process_tile<1, 1, 1, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 4, 1, 0>, + Conv::template process_tile<1, 1, 1, 4, 1, 1>, + Conv::template process_tile<1, 1, 1, 4, 1, 2>, + Conv::template process_tile<1, 1, 1, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 4, 2, 0>, + Conv::template process_tile<1, 1, 1, 4, 2, 1>, + Conv::template process_tile<1, 1, 1, 4, 2, 2>, + Conv::template process_tile<1, 1, 1, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 4, 3, 0>, + Conv::template process_tile<1, 1, 1, 4, 3, 1>, + Conv::template process_tile<1, 1, 1, 4, 3, 2>, + Conv::template process_tile<1, 1, 1, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 5, 0, 0>, + Conv::template process_tile<1, 1, 1, 5, 0, 1>, + Conv::template process_tile<1, 1, 1, 5, 0, 2>, + Conv::template process_tile<1, 1, 1, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 5, 1, 0>, + Conv::template process_tile<1, 1, 1, 5, 1, 1>, + Conv::template process_tile<1, 1, 1, 5, 1, 2>, + Conv::template process_tile<1, 1, 1, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 5, 2, 0>, + Conv::template process_tile<1, 1, 1, 5, 2, 1>, + Conv::template process_tile<1, 1, 1, 5, 2, 2>, + Conv::template process_tile<1, 1, 1, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 5, 3, 0>, + Conv::template process_tile<1, 1, 1, 5, 3, 1>, + Conv::template process_tile<1, 1, 1, 5, 3, 2>, + Conv::template process_tile<1, 1, 1, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 1, 6, 0, 0>, + Conv::template process_tile<1, 1, 1, 6, 0, 1>, + Conv::template process_tile<1, 1, 1, 6, 0, 2>, + Conv::template process_tile<1, 1, 1, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 1, 6, 1, 0>, + Conv::template process_tile<1, 1, 1, 6, 1, 1>, + Conv::template process_tile<1, 1, 1, 6, 1, 2>, + Conv::template process_tile<1, 1, 1, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 1, 6, 2, 0>, + Conv::template process_tile<1, 1, 1, 6, 2, 1>, + Conv::template process_tile<1, 1, 1, 6, 2, 2>, + Conv::template process_tile<1, 1, 1, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 1, 6, 3, 0>, + Conv::template process_tile<1, 1, 1, 6, 3, 1>, + Conv::template process_tile<1, 1, 1, 6, 3, 2>, + Conv::template process_tile<1, 1, 1, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 1 + { // Input pad bottom = 2 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 0, 0, 0>, + Conv::template process_tile<1, 1, 2, 0, 0, 1>, + Conv::template process_tile<1, 1, 2, 0, 0, 2>, + Conv::template process_tile<1, 1, 2, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 0, 1, 0>, + Conv::template process_tile<1, 1, 2, 0, 1, 1>, + Conv::template process_tile<1, 1, 2, 0, 1, 2>, + Conv::template process_tile<1, 1, 2, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 0, 2, 0>, + Conv::template process_tile<1, 1, 2, 0, 2, 1>, + Conv::template process_tile<1, 1, 2, 0, 2, 2>, + Conv::template process_tile<1, 1, 2, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 0, 3, 0>, + Conv::template process_tile<1, 1, 2, 0, 3, 1>, + Conv::template process_tile<1, 1, 2, 0, 3, 2>, + Conv::template process_tile<1, 1, 2, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 1, 0, 0>, + Conv::template process_tile<1, 1, 2, 1, 0, 1>, + Conv::template process_tile<1, 1, 2, 1, 0, 2>, + Conv::template process_tile<1, 1, 2, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 1, 1, 0>, + Conv::template process_tile<1, 1, 2, 1, 1, 1>, + Conv::template process_tile<1, 1, 2, 1, 1, 2>, + Conv::template process_tile<1, 1, 2, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 1, 2, 0>, + Conv::template process_tile<1, 1, 2, 1, 2, 1>, + Conv::template process_tile<1, 1, 2, 1, 2, 2>, + Conv::template process_tile<1, 1, 2, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 1, 3, 0>, + Conv::template process_tile<1, 1, 2, 1, 3, 1>, + Conv::template process_tile<1, 1, 2, 1, 3, 2>, + Conv::template process_tile<1, 1, 2, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 2, 0, 0>, + Conv::template process_tile<1, 1, 2, 2, 0, 1>, + Conv::template process_tile<1, 1, 2, 2, 0, 2>, + Conv::template process_tile<1, 1, 2, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 2, 1, 0>, + Conv::template process_tile<1, 1, 2, 2, 1, 1>, + Conv::template process_tile<1, 1, 2, 2, 1, 2>, + Conv::template process_tile<1, 1, 2, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 2, 2, 0>, + Conv::template process_tile<1, 1, 2, 2, 2, 1>, + Conv::template process_tile<1, 1, 2, 2, 2, 2>, + Conv::template process_tile<1, 1, 2, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 2, 3, 0>, + Conv::template process_tile<1, 1, 2, 2, 3, 1>, + Conv::template process_tile<1, 1, 2, 2, 3, 2>, + Conv::template process_tile<1, 1, 2, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 3, 0, 0>, + Conv::template process_tile<1, 1, 2, 3, 0, 1>, + Conv::template process_tile<1, 1, 2, 3, 0, 2>, + Conv::template process_tile<1, 1, 2, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 3, 1, 0>, + Conv::template process_tile<1, 1, 2, 3, 1, 1>, + Conv::template process_tile<1, 1, 2, 3, 1, 2>, + Conv::template process_tile<1, 1, 2, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 3, 2, 0>, + Conv::template process_tile<1, 1, 2, 3, 2, 1>, + Conv::template process_tile<1, 1, 2, 3, 2, 2>, + Conv::template process_tile<1, 1, 2, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 3, 3, 0>, + Conv::template process_tile<1, 1, 2, 3, 3, 1>, + Conv::template process_tile<1, 1, 2, 3, 3, 2>, + Conv::template process_tile<1, 1, 2, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 4, 0, 0>, + Conv::template process_tile<1, 1, 2, 4, 0, 1>, + Conv::template process_tile<1, 1, 2, 4, 0, 2>, + Conv::template process_tile<1, 1, 2, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 4, 1, 0>, + Conv::template process_tile<1, 1, 2, 4, 1, 1>, + Conv::template process_tile<1, 1, 2, 4, 1, 2>, + Conv::template process_tile<1, 1, 2, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 4, 2, 0>, + Conv::template process_tile<1, 1, 2, 4, 2, 1>, + Conv::template process_tile<1, 1, 2, 4, 2, 2>, + Conv::template process_tile<1, 1, 2, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 4, 3, 0>, + Conv::template process_tile<1, 1, 2, 4, 3, 1>, + Conv::template process_tile<1, 1, 2, 4, 3, 2>, + Conv::template process_tile<1, 1, 2, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 5, 0, 0>, + Conv::template process_tile<1, 1, 2, 5, 0, 1>, + Conv::template process_tile<1, 1, 2, 5, 0, 2>, + Conv::template process_tile<1, 1, 2, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 5, 1, 0>, + Conv::template process_tile<1, 1, 2, 5, 1, 1>, + Conv::template process_tile<1, 1, 2, 5, 1, 2>, + Conv::template process_tile<1, 1, 2, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 5, 2, 0>, + Conv::template process_tile<1, 1, 2, 5, 2, 1>, + Conv::template process_tile<1, 1, 2, 5, 2, 2>, + Conv::template process_tile<1, 1, 2, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 5, 3, 0>, + Conv::template process_tile<1, 1, 2, 5, 3, 1>, + Conv::template process_tile<1, 1, 2, 5, 3, 2>, + Conv::template process_tile<1, 1, 2, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 2, 6, 0, 0>, + Conv::template process_tile<1, 1, 2, 6, 0, 1>, + Conv::template process_tile<1, 1, 2, 6, 0, 2>, + Conv::template process_tile<1, 1, 2, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 2, 6, 1, 0>, + Conv::template process_tile<1, 1, 2, 6, 1, 1>, + Conv::template process_tile<1, 1, 2, 6, 1, 2>, + Conv::template process_tile<1, 1, 2, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 2, 6, 2, 0>, + Conv::template process_tile<1, 1, 2, 6, 2, 1>, + Conv::template process_tile<1, 1, 2, 6, 2, 2>, + Conv::template process_tile<1, 1, 2, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 2, 6, 3, 0>, + Conv::template process_tile<1, 1, 2, 6, 3, 1>, + Conv::template process_tile<1, 1, 2, 6, 3, 2>, + Conv::template process_tile<1, 1, 2, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 2 + { // Input pad bottom = 3 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 0, 0, 0>, + Conv::template process_tile<1, 1, 3, 0, 0, 1>, + Conv::template process_tile<1, 1, 3, 0, 0, 2>, + Conv::template process_tile<1, 1, 3, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 0, 1, 0>, + Conv::template process_tile<1, 1, 3, 0, 1, 1>, + Conv::template process_tile<1, 1, 3, 0, 1, 2>, + Conv::template process_tile<1, 1, 3, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 0, 2, 0>, + Conv::template process_tile<1, 1, 3, 0, 2, 1>, + Conv::template process_tile<1, 1, 3, 0, 2, 2>, + Conv::template process_tile<1, 1, 3, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 0, 3, 0>, + Conv::template process_tile<1, 1, 3, 0, 3, 1>, + Conv::template process_tile<1, 1, 3, 0, 3, 2>, + Conv::template process_tile<1, 1, 3, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 1, 0, 0>, + Conv::template process_tile<1, 1, 3, 1, 0, 1>, + Conv::template process_tile<1, 1, 3, 1, 0, 2>, + Conv::template process_tile<1, 1, 3, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 1, 1, 0>, + Conv::template process_tile<1, 1, 3, 1, 1, 1>, + Conv::template process_tile<1, 1, 3, 1, 1, 2>, + Conv::template process_tile<1, 1, 3, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 1, 2, 0>, + Conv::template process_tile<1, 1, 3, 1, 2, 1>, + Conv::template process_tile<1, 1, 3, 1, 2, 2>, + Conv::template process_tile<1, 1, 3, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 1, 3, 0>, + Conv::template process_tile<1, 1, 3, 1, 3, 1>, + Conv::template process_tile<1, 1, 3, 1, 3, 2>, + Conv::template process_tile<1, 1, 3, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 2, 0, 0>, + Conv::template process_tile<1, 1, 3, 2, 0, 1>, + Conv::template process_tile<1, 1, 3, 2, 0, 2>, + Conv::template process_tile<1, 1, 3, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 2, 1, 0>, + Conv::template process_tile<1, 1, 3, 2, 1, 1>, + Conv::template process_tile<1, 1, 3, 2, 1, 2>, + Conv::template process_tile<1, 1, 3, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 2, 2, 0>, + Conv::template process_tile<1, 1, 3, 2, 2, 1>, + Conv::template process_tile<1, 1, 3, 2, 2, 2>, + Conv::template process_tile<1, 1, 3, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 2, 3, 0>, + Conv::template process_tile<1, 1, 3, 2, 3, 1>, + Conv::template process_tile<1, 1, 3, 2, 3, 2>, + Conv::template process_tile<1, 1, 3, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 3, 0, 0>, + Conv::template process_tile<1, 1, 3, 3, 0, 1>, + Conv::template process_tile<1, 1, 3, 3, 0, 2>, + Conv::template process_tile<1, 1, 3, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 3, 1, 0>, + Conv::template process_tile<1, 1, 3, 3, 1, 1>, + Conv::template process_tile<1, 1, 3, 3, 1, 2>, + Conv::template process_tile<1, 1, 3, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 3, 2, 0>, + Conv::template process_tile<1, 1, 3, 3, 2, 1>, + Conv::template process_tile<1, 1, 3, 3, 2, 2>, + Conv::template process_tile<1, 1, 3, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 3, 3, 0>, + Conv::template process_tile<1, 1, 3, 3, 3, 1>, + Conv::template process_tile<1, 1, 3, 3, 3, 2>, + Conv::template process_tile<1, 1, 3, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 4, 0, 0>, + Conv::template process_tile<1, 1, 3, 4, 0, 1>, + Conv::template process_tile<1, 1, 3, 4, 0, 2>, + Conv::template process_tile<1, 1, 3, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 4, 1, 0>, + Conv::template process_tile<1, 1, 3, 4, 1, 1>, + Conv::template process_tile<1, 1, 3, 4, 1, 2>, + Conv::template process_tile<1, 1, 3, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 4, 2, 0>, + Conv::template process_tile<1, 1, 3, 4, 2, 1>, + Conv::template process_tile<1, 1, 3, 4, 2, 2>, + Conv::template process_tile<1, 1, 3, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 4, 3, 0>, + Conv::template process_tile<1, 1, 3, 4, 3, 1>, + Conv::template process_tile<1, 1, 3, 4, 3, 2>, + Conv::template process_tile<1, 1, 3, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 5, 0, 0>, + Conv::template process_tile<1, 1, 3, 5, 0, 1>, + Conv::template process_tile<1, 1, 3, 5, 0, 2>, + Conv::template process_tile<1, 1, 3, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 5, 1, 0>, + Conv::template process_tile<1, 1, 3, 5, 1, 1>, + Conv::template process_tile<1, 1, 3, 5, 1, 2>, + Conv::template process_tile<1, 1, 3, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 5, 2, 0>, + Conv::template process_tile<1, 1, 3, 5, 2, 1>, + Conv::template process_tile<1, 1, 3, 5, 2, 2>, + Conv::template process_tile<1, 1, 3, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 5, 3, 0>, + Conv::template process_tile<1, 1, 3, 5, 3, 1>, + Conv::template process_tile<1, 1, 3, 5, 3, 2>, + Conv::template process_tile<1, 1, 3, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 3, 6, 0, 0>, + Conv::template process_tile<1, 1, 3, 6, 0, 1>, + Conv::template process_tile<1, 1, 3, 6, 0, 2>, + Conv::template process_tile<1, 1, 3, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 3, 6, 1, 0>, + Conv::template process_tile<1, 1, 3, 6, 1, 1>, + Conv::template process_tile<1, 1, 3, 6, 1, 2>, + Conv::template process_tile<1, 1, 3, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 3, 6, 2, 0>, + Conv::template process_tile<1, 1, 3, 6, 2, 1>, + Conv::template process_tile<1, 1, 3, 6, 2, 2>, + Conv::template process_tile<1, 1, 3, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 3, 6, 3, 0>, + Conv::template process_tile<1, 1, 3, 6, 3, 1>, + Conv::template process_tile<1, 1, 3, 6, 3, 2>, + Conv::template process_tile<1, 1, 3, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 3 + { // Input pad bottom = 4 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 0, 0, 0>, + Conv::template process_tile<1, 1, 4, 0, 0, 1>, + Conv::template process_tile<1, 1, 4, 0, 0, 2>, + Conv::template process_tile<1, 1, 4, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 0, 1, 0>, + Conv::template process_tile<1, 1, 4, 0, 1, 1>, + Conv::template process_tile<1, 1, 4, 0, 1, 2>, + Conv::template process_tile<1, 1, 4, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 0, 2, 0>, + Conv::template process_tile<1, 1, 4, 0, 2, 1>, + Conv::template process_tile<1, 1, 4, 0, 2, 2>, + Conv::template process_tile<1, 1, 4, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 0, 3, 0>, + Conv::template process_tile<1, 1, 4, 0, 3, 1>, + Conv::template process_tile<1, 1, 4, 0, 3, 2>, + Conv::template process_tile<1, 1, 4, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 1, 0, 0>, + Conv::template process_tile<1, 1, 4, 1, 0, 1>, + Conv::template process_tile<1, 1, 4, 1, 0, 2>, + Conv::template process_tile<1, 1, 4, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 1, 1, 0>, + Conv::template process_tile<1, 1, 4, 1, 1, 1>, + Conv::template process_tile<1, 1, 4, 1, 1, 2>, + Conv::template process_tile<1, 1, 4, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 1, 2, 0>, + Conv::template process_tile<1, 1, 4, 1, 2, 1>, + Conv::template process_tile<1, 1, 4, 1, 2, 2>, + Conv::template process_tile<1, 1, 4, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 1, 3, 0>, + Conv::template process_tile<1, 1, 4, 1, 3, 1>, + Conv::template process_tile<1, 1, 4, 1, 3, 2>, + Conv::template process_tile<1, 1, 4, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 2, 0, 0>, + Conv::template process_tile<1, 1, 4, 2, 0, 1>, + Conv::template process_tile<1, 1, 4, 2, 0, 2>, + Conv::template process_tile<1, 1, 4, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 2, 1, 0>, + Conv::template process_tile<1, 1, 4, 2, 1, 1>, + Conv::template process_tile<1, 1, 4, 2, 1, 2>, + Conv::template process_tile<1, 1, 4, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 2, 2, 0>, + Conv::template process_tile<1, 1, 4, 2, 2, 1>, + Conv::template process_tile<1, 1, 4, 2, 2, 2>, + Conv::template process_tile<1, 1, 4, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 2, 3, 0>, + Conv::template process_tile<1, 1, 4, 2, 3, 1>, + Conv::template process_tile<1, 1, 4, 2, 3, 2>, + Conv::template process_tile<1, 1, 4, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 3, 0, 0>, + Conv::template process_tile<1, 1, 4, 3, 0, 1>, + Conv::template process_tile<1, 1, 4, 3, 0, 2>, + Conv::template process_tile<1, 1, 4, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 3, 1, 0>, + Conv::template process_tile<1, 1, 4, 3, 1, 1>, + Conv::template process_tile<1, 1, 4, 3, 1, 2>, + Conv::template process_tile<1, 1, 4, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 3, 2, 0>, + Conv::template process_tile<1, 1, 4, 3, 2, 1>, + Conv::template process_tile<1, 1, 4, 3, 2, 2>, + Conv::template process_tile<1, 1, 4, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 3, 3, 0>, + Conv::template process_tile<1, 1, 4, 3, 3, 1>, + Conv::template process_tile<1, 1, 4, 3, 3, 2>, + Conv::template process_tile<1, 1, 4, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 4, 0, 0>, + Conv::template process_tile<1, 1, 4, 4, 0, 1>, + Conv::template process_tile<1, 1, 4, 4, 0, 2>, + Conv::template process_tile<1, 1, 4, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 4, 1, 0>, + Conv::template process_tile<1, 1, 4, 4, 1, 1>, + Conv::template process_tile<1, 1, 4, 4, 1, 2>, + Conv::template process_tile<1, 1, 4, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 4, 2, 0>, + Conv::template process_tile<1, 1, 4, 4, 2, 1>, + Conv::template process_tile<1, 1, 4, 4, 2, 2>, + Conv::template process_tile<1, 1, 4, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 4, 3, 0>, + Conv::template process_tile<1, 1, 4, 4, 3, 1>, + Conv::template process_tile<1, 1, 4, 4, 3, 2>, + Conv::template process_tile<1, 1, 4, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 5, 0, 0>, + Conv::template process_tile<1, 1, 4, 5, 0, 1>, + Conv::template process_tile<1, 1, 4, 5, 0, 2>, + Conv::template process_tile<1, 1, 4, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 5, 1, 0>, + Conv::template process_tile<1, 1, 4, 5, 1, 1>, + Conv::template process_tile<1, 1, 4, 5, 1, 2>, + Conv::template process_tile<1, 1, 4, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 5, 2, 0>, + Conv::template process_tile<1, 1, 4, 5, 2, 1>, + Conv::template process_tile<1, 1, 4, 5, 2, 2>, + Conv::template process_tile<1, 1, 4, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 5, 3, 0>, + Conv::template process_tile<1, 1, 4, 5, 3, 1>, + Conv::template process_tile<1, 1, 4, 5, 3, 2>, + Conv::template process_tile<1, 1, 4, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 4, 6, 0, 0>, + Conv::template process_tile<1, 1, 4, 6, 0, 1>, + Conv::template process_tile<1, 1, 4, 6, 0, 2>, + Conv::template process_tile<1, 1, 4, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 4, 6, 1, 0>, + Conv::template process_tile<1, 1, 4, 6, 1, 1>, + Conv::template process_tile<1, 1, 4, 6, 1, 2>, + Conv::template process_tile<1, 1, 4, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 4, 6, 2, 0>, + Conv::template process_tile<1, 1, 4, 6, 2, 1>, + Conv::template process_tile<1, 1, 4, 6, 2, 2>, + Conv::template process_tile<1, 1, 4, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 4, 6, 3, 0>, + Conv::template process_tile<1, 1, 4, 6, 3, 1>, + Conv::template process_tile<1, 1, 4, 6, 3, 2>, + Conv::template process_tile<1, 1, 4, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 4 + { // Input pad bottom = 5 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 0, 0, 0>, + Conv::template process_tile<1, 1, 5, 0, 0, 1>, + Conv::template process_tile<1, 1, 5, 0, 0, 2>, + Conv::template process_tile<1, 1, 5, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 0, 1, 0>, + Conv::template process_tile<1, 1, 5, 0, 1, 1>, + Conv::template process_tile<1, 1, 5, 0, 1, 2>, + Conv::template process_tile<1, 1, 5, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 0, 2, 0>, + Conv::template process_tile<1, 1, 5, 0, 2, 1>, + Conv::template process_tile<1, 1, 5, 0, 2, 2>, + Conv::template process_tile<1, 1, 5, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 0, 3, 0>, + Conv::template process_tile<1, 1, 5, 0, 3, 1>, + Conv::template process_tile<1, 1, 5, 0, 3, 2>, + Conv::template process_tile<1, 1, 5, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 1, 0, 0>, + Conv::template process_tile<1, 1, 5, 1, 0, 1>, + Conv::template process_tile<1, 1, 5, 1, 0, 2>, + Conv::template process_tile<1, 1, 5, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 1, 1, 0>, + Conv::template process_tile<1, 1, 5, 1, 1, 1>, + Conv::template process_tile<1, 1, 5, 1, 1, 2>, + Conv::template process_tile<1, 1, 5, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 1, 2, 0>, + Conv::template process_tile<1, 1, 5, 1, 2, 1>, + Conv::template process_tile<1, 1, 5, 1, 2, 2>, + Conv::template process_tile<1, 1, 5, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 1, 3, 0>, + Conv::template process_tile<1, 1, 5, 1, 3, 1>, + Conv::template process_tile<1, 1, 5, 1, 3, 2>, + Conv::template process_tile<1, 1, 5, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 2, 0, 0>, + Conv::template process_tile<1, 1, 5, 2, 0, 1>, + Conv::template process_tile<1, 1, 5, 2, 0, 2>, + Conv::template process_tile<1, 1, 5, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 2, 1, 0>, + Conv::template process_tile<1, 1, 5, 2, 1, 1>, + Conv::template process_tile<1, 1, 5, 2, 1, 2>, + Conv::template process_tile<1, 1, 5, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 2, 2, 0>, + Conv::template process_tile<1, 1, 5, 2, 2, 1>, + Conv::template process_tile<1, 1, 5, 2, 2, 2>, + Conv::template process_tile<1, 1, 5, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 2, 3, 0>, + Conv::template process_tile<1, 1, 5, 2, 3, 1>, + Conv::template process_tile<1, 1, 5, 2, 3, 2>, + Conv::template process_tile<1, 1, 5, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 3, 0, 0>, + Conv::template process_tile<1, 1, 5, 3, 0, 1>, + Conv::template process_tile<1, 1, 5, 3, 0, 2>, + Conv::template process_tile<1, 1, 5, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 3, 1, 0>, + Conv::template process_tile<1, 1, 5, 3, 1, 1>, + Conv::template process_tile<1, 1, 5, 3, 1, 2>, + Conv::template process_tile<1, 1, 5, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 3, 2, 0>, + Conv::template process_tile<1, 1, 5, 3, 2, 1>, + Conv::template process_tile<1, 1, 5, 3, 2, 2>, + Conv::template process_tile<1, 1, 5, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 3, 3, 0>, + Conv::template process_tile<1, 1, 5, 3, 3, 1>, + Conv::template process_tile<1, 1, 5, 3, 3, 2>, + Conv::template process_tile<1, 1, 5, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 4, 0, 0>, + Conv::template process_tile<1, 1, 5, 4, 0, 1>, + Conv::template process_tile<1, 1, 5, 4, 0, 2>, + Conv::template process_tile<1, 1, 5, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 4, 1, 0>, + Conv::template process_tile<1, 1, 5, 4, 1, 1>, + Conv::template process_tile<1, 1, 5, 4, 1, 2>, + Conv::template process_tile<1, 1, 5, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 4, 2, 0>, + Conv::template process_tile<1, 1, 5, 4, 2, 1>, + Conv::template process_tile<1, 1, 5, 4, 2, 2>, + Conv::template process_tile<1, 1, 5, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 4, 3, 0>, + Conv::template process_tile<1, 1, 5, 4, 3, 1>, + Conv::template process_tile<1, 1, 5, 4, 3, 2>, + Conv::template process_tile<1, 1, 5, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 5, 0, 0>, + Conv::template process_tile<1, 1, 5, 5, 0, 1>, + Conv::template process_tile<1, 1, 5, 5, 0, 2>, + Conv::template process_tile<1, 1, 5, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 5, 1, 0>, + Conv::template process_tile<1, 1, 5, 5, 1, 1>, + Conv::template process_tile<1, 1, 5, 5, 1, 2>, + Conv::template process_tile<1, 1, 5, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 5, 2, 0>, + Conv::template process_tile<1, 1, 5, 5, 2, 1>, + Conv::template process_tile<1, 1, 5, 5, 2, 2>, + Conv::template process_tile<1, 1, 5, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 5, 3, 0>, + Conv::template process_tile<1, 1, 5, 5, 3, 1>, + Conv::template process_tile<1, 1, 5, 5, 3, 2>, + Conv::template process_tile<1, 1, 5, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 5, 6, 0, 0>, + Conv::template process_tile<1, 1, 5, 6, 0, 1>, + Conv::template process_tile<1, 1, 5, 6, 0, 2>, + Conv::template process_tile<1, 1, 5, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 5, 6, 1, 0>, + Conv::template process_tile<1, 1, 5, 6, 1, 1>, + Conv::template process_tile<1, 1, 5, 6, 1, 2>, + Conv::template process_tile<1, 1, 5, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 5, 6, 2, 0>, + Conv::template process_tile<1, 1, 5, 6, 2, 1>, + Conv::template process_tile<1, 1, 5, 6, 2, 2>, + Conv::template process_tile<1, 1, 5, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 5, 6, 3, 0>, + Conv::template process_tile<1, 1, 5, 6, 3, 1>, + Conv::template process_tile<1, 1, 5, 6, 3, 2>, + Conv::template process_tile<1, 1, 5, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 5 + { // Input pad bottom = 6 + { // Input pad right = 0 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 0, 0, 0>, + Conv::template process_tile<1, 1, 6, 0, 0, 1>, + Conv::template process_tile<1, 1, 6, 0, 0, 2>, + Conv::template process_tile<1, 1, 6, 0, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 0, 1, 0>, + Conv::template process_tile<1, 1, 6, 0, 1, 1>, + Conv::template process_tile<1, 1, 6, 0, 1, 2>, + Conv::template process_tile<1, 1, 6, 0, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 0, 2, 0>, + Conv::template process_tile<1, 1, 6, 0, 2, 1>, + Conv::template process_tile<1, 1, 6, 0, 2, 2>, + Conv::template process_tile<1, 1, 6, 0, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 0, 3, 0>, + Conv::template process_tile<1, 1, 6, 0, 3, 1>, + Conv::template process_tile<1, 1, 6, 0, 3, 2>, + Conv::template process_tile<1, 1, 6, 0, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 0 + { // Input pad right = 1 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 1, 0, 0>, + Conv::template process_tile<1, 1, 6, 1, 0, 1>, + Conv::template process_tile<1, 1, 6, 1, 0, 2>, + Conv::template process_tile<1, 1, 6, 1, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 1, 1, 0>, + Conv::template process_tile<1, 1, 6, 1, 1, 1>, + Conv::template process_tile<1, 1, 6, 1, 1, 2>, + Conv::template process_tile<1, 1, 6, 1, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 1, 2, 0>, + Conv::template process_tile<1, 1, 6, 1, 2, 1>, + Conv::template process_tile<1, 1, 6, 1, 2, 2>, + Conv::template process_tile<1, 1, 6, 1, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 1, 3, 0>, + Conv::template process_tile<1, 1, 6, 1, 3, 1>, + Conv::template process_tile<1, 1, 6, 1, 3, 2>, + Conv::template process_tile<1, 1, 6, 1, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 1 + { // Input pad right = 2 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 2, 0, 0>, + Conv::template process_tile<1, 1, 6, 2, 0, 1>, + Conv::template process_tile<1, 1, 6, 2, 0, 2>, + Conv::template process_tile<1, 1, 6, 2, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 2, 1, 0>, + Conv::template process_tile<1, 1, 6, 2, 1, 1>, + Conv::template process_tile<1, 1, 6, 2, 1, 2>, + Conv::template process_tile<1, 1, 6, 2, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 2, 2, 0>, + Conv::template process_tile<1, 1, 6, 2, 2, 1>, + Conv::template process_tile<1, 1, 6, 2, 2, 2>, + Conv::template process_tile<1, 1, 6, 2, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 2, 3, 0>, + Conv::template process_tile<1, 1, 6, 2, 3, 1>, + Conv::template process_tile<1, 1, 6, 2, 3, 2>, + Conv::template process_tile<1, 1, 6, 2, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 2 + { // Input pad right = 3 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 3, 0, 0>, + Conv::template process_tile<1, 1, 6, 3, 0, 1>, + Conv::template process_tile<1, 1, 6, 3, 0, 2>, + Conv::template process_tile<1, 1, 6, 3, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 3, 1, 0>, + Conv::template process_tile<1, 1, 6, 3, 1, 1>, + Conv::template process_tile<1, 1, 6, 3, 1, 2>, + Conv::template process_tile<1, 1, 6, 3, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 3, 2, 0>, + Conv::template process_tile<1, 1, 6, 3, 2, 1>, + Conv::template process_tile<1, 1, 6, 3, 2, 2>, + Conv::template process_tile<1, 1, 6, 3, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 3, 3, 0>, + Conv::template process_tile<1, 1, 6, 3, 3, 1>, + Conv::template process_tile<1, 1, 6, 3, 3, 2>, + Conv::template process_tile<1, 1, 6, 3, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 3 + { // Input pad right = 4 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 4, 0, 0>, + Conv::template process_tile<1, 1, 6, 4, 0, 1>, + Conv::template process_tile<1, 1, 6, 4, 0, 2>, + Conv::template process_tile<1, 1, 6, 4, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 4, 1, 0>, + Conv::template process_tile<1, 1, 6, 4, 1, 1>, + Conv::template process_tile<1, 1, 6, 4, 1, 2>, + Conv::template process_tile<1, 1, 6, 4, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 4, 2, 0>, + Conv::template process_tile<1, 1, 6, 4, 2, 1>, + Conv::template process_tile<1, 1, 6, 4, 2, 2>, + Conv::template process_tile<1, 1, 6, 4, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 4, 3, 0>, + Conv::template process_tile<1, 1, 6, 4, 3, 1>, + Conv::template process_tile<1, 1, 6, 4, 3, 2>, + Conv::template process_tile<1, 1, 6, 4, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 4 + { // Input pad right = 5 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 5, 0, 0>, + Conv::template process_tile<1, 1, 6, 5, 0, 1>, + Conv::template process_tile<1, 1, 6, 5, 0, 2>, + Conv::template process_tile<1, 1, 6, 5, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 5, 1, 0>, + Conv::template process_tile<1, 1, 6, 5, 1, 1>, + Conv::template process_tile<1, 1, 6, 5, 1, 2>, + Conv::template process_tile<1, 1, 6, 5, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 5, 2, 0>, + Conv::template process_tile<1, 1, 6, 5, 2, 1>, + Conv::template process_tile<1, 1, 6, 5, 2, 2>, + Conv::template process_tile<1, 1, 6, 5, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 5, 3, 0>, + Conv::template process_tile<1, 1, 6, 5, 3, 1>, + Conv::template process_tile<1, 1, 6, 5, 3, 2>, + Conv::template process_tile<1, 1, 6, 5, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 5 + { // Input pad right = 6 + { // Output pad bottom = 0 + Conv::template process_tile<1, 1, 6, 6, 0, 0>, + Conv::template process_tile<1, 1, 6, 6, 0, 1>, + Conv::template process_tile<1, 1, 6, 6, 0, 2>, + Conv::template process_tile<1, 1, 6, 6, 0, 3>, + }, // Output pad bottom = 0 + { // Output pad bottom = 1 + Conv::template process_tile<1, 1, 6, 6, 1, 0>, + Conv::template process_tile<1, 1, 6, 6, 1, 1>, + Conv::template process_tile<1, 1, 6, 6, 1, 2>, + Conv::template process_tile<1, 1, 6, 6, 1, 3>, + }, // Output pad bottom = 1 + { // Output pad bottom = 2 + Conv::template process_tile<1, 1, 6, 6, 2, 0>, + Conv::template process_tile<1, 1, 6, 6, 2, 1>, + Conv::template process_tile<1, 1, 6, 6, 2, 2>, + Conv::template process_tile<1, 1, 6, 6, 2, 3>, + }, // Output pad bottom = 2 + { // Output pad bottom = 3 + Conv::template process_tile<1, 1, 6, 6, 3, 0>, + Conv::template process_tile<1, 1, 6, 6, 3, 1>, + Conv::template process_tile<1, 1, 6, 6, 3, 2>, + Conv::template process_tile<1, 1, 6, 6, 3, 3>, + }, // Output pad bottom = 3 + }, // Input pad right = 6 + }, // Input pad bottom = 6 + }, // Input pad left = 1 + }, // Input pad top = 1 +}; + + +template class DepthwiseConvolution<4, 4, 3, 3, 2, 2, float, float>; +} // namespace depthwise diff --git a/src/core/NEON/kernels/winograd/batched_blocked_gemm.cpp b/src/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.cpp index 52c2db866a..ac83bf9dd2 100644 --- a/src/core/NEON/kernels/winograd/batched_blocked_gemm.cpp +++ b/src/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.cpp @@ -22,8 +22,9 @@ * SOFTWARE. */ -#include "batched_blocked_gemm.hpp" -#include "gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/gemm.hpp" + using namespace winograd; template <const int MB, const int NB, typename TIn, typename TOut> diff --git a/src/core/NEON/kernels/winograd/transforms/input_2x2_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/input_2x2_3x3_fp32.cpp index 381ae92182..6d8afc0def 100644 --- a/src/core/NEON/kernels/winograd/transforms/input_2x2_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/input_2x2_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/input.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/input_2x2_5x5_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/input_2x2_5x5_fp32.cpp index a6ebca1bce..d9ebe8b7cd 100644 --- a/src/core/NEON/kernels/winograd/transforms/input_2x2_5x5_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/input_2x2_5x5_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/input.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/input_4x4_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/input_4x4_3x3_fp32.cpp index 477aaaf34e..04d1573e4c 100644 --- a/src/core/NEON/kernels/winograd/transforms/input_4x4_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/input_4x4_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/input.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/input.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/output_2x2_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/output_2x2_3x3_fp32.cpp index 58db7d2ecd..a95ce0e7d2 100644 --- a/src/core/NEON/kernels/winograd/transforms/output_2x2_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/output_2x2_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/output.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/output.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/output_2x2_5x5_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/output_2x2_5x5_fp32.cpp index bfd670090a..262f71118c 100644 --- a/src/core/NEON/kernels/winograd/transforms/output_2x2_5x5_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/output_2x2_5x5_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/output.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/output.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/output_4x4_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/output_4x4_3x3_fp32.cpp index 45210d7976..8f47736f0c 100644 --- a/src/core/NEON/kernels/winograd/transforms/output_4x4_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/output_4x4_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "transforms/output.hpp" -#include "winograd_gemm.hpp" -#include "arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/output.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/weights_2x2_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/weights_2x2_3x3_fp32.cpp index c0b282431e..6c71461f81 100644 --- a/src/core/NEON/kernels/winograd/transforms/weights_2x2_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/weights_2x2_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "arm.hpp" -#include "winograd_gemm.hpp" -#include "transforms/kernel.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/kernel.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/weights_2x2_5x5_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/weights_2x2_5x5_fp32.cpp index acf6b913f8..2f4f6e1ba2 100644 --- a/src/core/NEON/kernels/winograd/transforms/weights_2x2_5x5_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/weights_2x2_5x5_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "arm.hpp" -#include "winograd_gemm.hpp" -#include "transforms/kernel.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/kernel.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/transforms/weights_4x4_3x3_fp32.cpp b/src/core/NEON/kernels/convolution/winograd/transforms/weights_4x4_3x3_fp32.cpp index de659c38e0..a56a475fc9 100644 --- a/src/core/NEON/kernels/winograd/transforms/weights_4x4_3x3_fp32.cpp +++ b/src/core/NEON/kernels/convolution/winograd/transforms/weights_4x4_3x3_fp32.cpp @@ -22,9 +22,9 @@ * SOFTWARE. */ -#include "arm.hpp" -#include "winograd_gemm.hpp" -#include "transforms/kernel.hpp" +#include "arm_compute/core/NEON/kernels/convolution/common/arm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/transforms/kernel.hpp" namespace winograd { diff --git a/src/core/NEON/kernels/winograd/winograd_gemm.cpp b/src/core/NEON/kernels/convolution/winograd/winograd_gemm.cpp index 05426450a6..8f8cd250bf 100644 --- a/src/core/NEON/kernels/winograd/winograd_gemm.cpp +++ b/src/core/NEON/kernels/convolution/winograd/winograd_gemm.cpp @@ -21,8 +21,9 @@ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ -#include "winograd_gemm.hpp" -#include "batched_blocked_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/batched_blocked_gemm.hpp" + using namespace winograd; /** Get the output shape of a convolution. */ diff --git a/src/core/Utils.cpp b/src/core/Utils.cpp index 83a843de58..f4b45532cf 100644 --- a/src/core/Utils.cpp +++ b/src/core/Utils.cpp @@ -250,6 +250,21 @@ std::string arm_compute::lower_string(const std::string &val) return res; } +PadStrideInfo arm_compute::calculate_same_pad(TensorShape input_shape, TensorShape weights_shape, PadStrideInfo conv_info) +{ + const auto &strides = conv_info.stride(); + const int out_width = std::ceil(float(input_shape.x()) / float(strides.first)); + const int out_height = std::ceil(float(input_shape.y()) / float(strides.second)); + const int pad_width = ((out_width - 1) * strides.first + weights_shape.x() - input_shape.x()); + const int pad_height = ((out_height - 1) * strides.second + weights_shape.y() - input_shape.y()); + const int same_pad_left = pad_width / 2; + const int same_pad_top = pad_height / 2; + const int same_pad_right = pad_width - same_pad_left; + const int same_pad_bottom = pad_height - same_pad_top; + + return PadStrideInfo(strides.first, strides.second, same_pad_left, same_pad_right, same_pad_top, same_pad_bottom, DimensionRoundingType::CEIL); +} + TensorShape arm_compute::deconvolution_output_shape(const std::pair<unsigned int, unsigned int> &out_dims, TensorShape input, TensorShape weights) { TensorShape out_shape(input); diff --git a/src/graph/operations/NESimpleOperations.cpp b/src/graph/operations/NESimpleOperations.cpp index 88bf3ec0a0..5a00e230ea 100644 --- a/src/graph/operations/NESimpleOperations.cpp +++ b/src/graph/operations/NESimpleOperations.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2017 ARM Limited. + * Copyright (c) 2017-2018 ARM Limited. * * SPDX-License-Identifier: MIT * @@ -149,13 +149,23 @@ REGISTER_SIMPLE_OPERATION(NEDepthwiseConvolutionOperation, NEON, OperationType:: auto *biases = ctx.num_inputs() == 3 ? dynamic_cast<arm_compute::ITensor *>(ctx.input(2)) : nullptr; auto *out = dynamic_cast<arm_compute::ITensor *>(ctx.output(0)); const auto conv_info = ctx.parameter<PadStrideInfo>("ConvolutionInfo"); + const auto opt3x3 = ctx.parameter<bool>("Optimized3x3"); // Create and configure function std::unique_ptr<arm_compute::IFunction> func; - // TODO (COMPMID-769): Add support for asymmetric padding in NEDepthwiseConvolutionLayer3x3 to enable opt3x3 support - auto depwthwise_conv = arm_compute::support::cpp14::make_unique<arm_compute::NEDepthwiseConvolutionLayer>(); - depwthwise_conv->configure(in, weights, biases, out, conv_info); - func = std::move(depwthwise_conv); + bool run_3x3_opt = opt3x3 && weights->info()->dimension(0) == 3; + if(run_3x3_opt) + { + auto depwthwise_conv = arm_compute::support::cpp14::make_unique<arm_compute::NEDepthwiseConvolutionLayer3x3>(); + depwthwise_conv->configure(in, weights, biases, out, conv_info); + func = std::move(depwthwise_conv); + } + else + { + auto depwthwise_conv = arm_compute::support::cpp14::make_unique<arm_compute::NEDepthwiseConvolutionLayer>(); + depwthwise_conv->configure(in, weights, biases, out, conv_info); + func = std::move(depwthwise_conv); + } // Log info ARM_COMPUTE_LOG_GRAPH_INFO("Instantiating NEDepthwiseConvolutionLayer" diff --git a/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp b/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp index 1f3e5d1192..d35e3e6026 100644 --- a/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp +++ b/src/runtime/NEON/functions/NEDepthwiseConvolutionLayer.cpp @@ -33,9 +33,11 @@ using namespace arm_compute; using namespace arm_compute::misc; +using namespace arm_compute::misc::shape_calculator; NEDepthwiseConvolutionLayer3x3::NEDepthwiseConvolutionLayer3x3() - : _kernel(), _output_stage_kernel(), _border_handler(), _accumulator(), _has_bias(false), _is_quantized(false) + : _dwc_kernel(), _output_stage_kernel(), _border_handler(), _permute_input(), _permute_weights(), _permute_output(), _accumulator(), _input_nhwc(), _weights_hwio(), _output_nhwc(), _has_bias(false), + _is_quantized(false), _is_optimized(false), _are_weights_reshaped(false) { } @@ -48,20 +50,49 @@ void NEDepthwiseConvolutionLayer3x3::configure(ITensor *input, const ITensor *we _is_quantized = is_data_type_quantized_asymmetric(input->info()->data_type()); _has_bias = biases != nullptr; + _is_optimized = NEDepthwiseConvolutionLayer3x3Kernel::is_optimized_execution_possible(input->info()->tensor_shape(), + conv_info, + input->info()->data_type()); + _are_weights_reshaped = false; - // Allocate the intermediate accumulator tensor in case of fixed point input - if(_is_quantized) + if(_is_optimized) { - _accumulator.allocator()->init(TensorInfo(output->info()->tensor_shape(), 1, DataType::S32)); - _accumulator.info()->set_quantization_info(input->info()->quantization_info()); - zero_value = PixelValue(static_cast<uint32_t>(input->info()->quantization_info().offset)); + // Configure the function to transform the input tensor from NCHW -> NHWC + _permute_input.configure(input, &_input_nhwc, PermutationVector(2U, 0U, 1U)); + + // Configure the function to transform the weights tensor from IHW -> HWI + _permute_weights.configure(weights, &_weights_hwio, PermutationVector(2U, 0U, 1U)); + + // Configure optimized depthwise + _dwc_kernel.configure(&_input_nhwc, &_weights_hwio, &_output_nhwc, conv_info, DataLayout::NHWC); + + // Configure the function to transform the convoluted output to ACL's native ordering format NCHW + _permute_output.configure(&_output_nhwc, output, PermutationVector(1U, 2U, 0U)); + + // Allocate tensors + _input_nhwc.allocator()->allocate(); + _weights_hwio.allocator()->allocate(); + _output_nhwc.allocator()->allocate(); + + // Create convolver (deferred) + _dwc_kernel.generate_convolver(); } + else + { + // Allocate the intermediate accumulator tensor in case of fixed point input + if(_is_quantized) + { + _accumulator.allocator()->init(TensorInfo(output->info()->tensor_shape(), 1, DataType::S32)); + _accumulator.info()->set_quantization_info(input->info()->quantization_info()); + zero_value = PixelValue(static_cast<uint32_t>(input->info()->quantization_info().offset)); + } - // Configure depthwise convolution kernel - _kernel.configure(input, weights, (_is_quantized) ? &_accumulator : output, conv_info); + // Configure depthwise convolution kernel + _dwc_kernel.configure(input, weights, (_is_quantized) ? &_accumulator : output, conv_info); - // Configure border handler - _border_handler.configure(input, _kernel.border_size(), BorderMode::CONSTANT, zero_value); + // Configure border handler + _border_handler.configure(input, _dwc_kernel.border_size(), BorderMode::CONSTANT, zero_value); + } // Configure biases accumulation if(_has_bias || _is_quantized) @@ -83,8 +114,35 @@ void NEDepthwiseConvolutionLayer3x3::configure(ITensor *input, const ITensor *we void NEDepthwiseConvolutionLayer3x3::run() { - NEScheduler::get().schedule(&_border_handler, Window::DimX); - NEScheduler::get().schedule(&_kernel, Window::DimX); + // Permute weights in HWIO format if the optimized kernel will be executedd + if(!_are_weights_reshaped && _is_optimized) + { + _are_weights_reshaped = true; + _permute_weights.run(); + } + + // Handle input + if(_is_optimized) + { + // Permute input to NHWC format execution + _permute_input.run(); + } + else + { + // Fill border in NCHW format execution + NEScheduler::get().schedule(&_border_handler, Window::DimX); + } + + // Execute depthwise convolution + NEScheduler::get().schedule(&_dwc_kernel, Window::DimX); + + // Permute output to ACL's native NCHW format in case of NHWC execution + if(_is_optimized) + { + _permute_output.run(); + } + + // Add biases if(_has_bias || _is_quantized) { NEScheduler::get().schedule(&_output_stage_kernel, Window::DimX); diff --git a/src/runtime/NEON/functions/NEWinogradLayer.cpp b/src/runtime/NEON/functions/NEWinogradLayer.cpp index dd878ab18a..d2d40dfcb0 100644 --- a/src/runtime/NEON/functions/NEWinogradLayer.cpp +++ b/src/runtime/NEON/functions/NEWinogradLayer.cpp @@ -28,7 +28,7 @@ #include "arm_compute/runtime/NEON/NEScheduler.h" #include "support/ToolchainSupport.h" -#include "arm_compute/core/NEON/kernels/winograd/winograd_gemm.hpp" +#include "arm_compute/core/NEON/kernels/convolution/winograd/winograd_gemm.hpp" namespace { diff --git a/tests/datasets/DepthwiseConvolutionLayerDataset.h b/tests/datasets/DepthwiseConvolutionLayerDataset.h index d3eb2c5d9e..f1dfb981aa 100644 --- a/tests/datasets/DepthwiseConvolutionLayerDataset.h +++ b/tests/datasets/DepthwiseConvolutionLayerDataset.h @@ -174,6 +174,23 @@ public: add_config(TensorShape(177U, 311U, 22U), TensorShape(3U, 3U, 22U), TensorShape(89U, 311U, 22U), PadStrideInfo(2, 1, 1, 1)); } }; +class OptimizedDepthwiseConvolutionLayerDataset3x3 final : public DepthwiseConvolutionLayerDataset +{ +public: + OptimizedDepthwiseConvolutionLayerDataset3x3() + { + // Stride 1 + add_config(TensorShape(7U, 7U, 16U), TensorShape(3U, 3U, 16U), TensorShape(5U, 5U, 16U), PadStrideInfo(1, 1, 0, 0, DimensionRoundingType::CEIL)); + add_config(TensorShape(7U, 7U, 16U), TensorShape(3U, 3U, 16U), TensorShape(7U, 7U, 16U), PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)); + add_config(TensorShape(28U, 28U, 16U), TensorShape(3U, 3U, 16U), TensorShape(26U, 26U, 16U), PadStrideInfo(1, 1, 0, 0, DimensionRoundingType::CEIL)); + add_config(TensorShape(28U, 28U, 16U), TensorShape(3U, 3U, 16U), TensorShape(28U, 28U, 16U), PadStrideInfo(1, 1, 1, 1, DimensionRoundingType::CEIL)); + // Stride 2 + add_config(TensorShape(7U, 7U, 32U), TensorShape(3U, 3U, 32U), TensorShape(3U, 3U, 32U), PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)); + add_config(TensorShape(7U, 7U, 32U), TensorShape(3U, 3U, 32U), TensorShape(4U, 4U, 32U), PadStrideInfo(2, 2, 1, 1, 1, 1, DimensionRoundingType::CEIL)); + add_config(TensorShape(8U, 8U, 32U), TensorShape(3U, 3U, 32U), TensorShape(3U, 3U, 32U), PadStrideInfo(2, 2, 0, 0, DimensionRoundingType::CEIL)); + add_config(TensorShape(8U, 8U, 32U), TensorShape(3U, 3U, 32U), TensorShape(4U, 4U, 32U), PadStrideInfo(2, 2, 0, 1, 0, 1, DimensionRoundingType::CEIL)); + } +}; } // namespace datasets } // namespace test } // namespace arm_compute diff --git a/tests/validation/NEON/DepthwiseConvolutionLayer.cpp b/tests/validation/NEON/DepthwiseConvolutionLayer.cpp index f8c04dab3e..47e8896fd6 100644 --- a/tests/validation/NEON/DepthwiseConvolutionLayer.cpp +++ b/tests/validation/NEON/DepthwiseConvolutionLayer.cpp @@ -121,6 +121,12 @@ FIXTURE_DATA_TEST_CASE(RunLarge, NEDepthwiseConvolutionLayerFixture3x3<float>, f { validate(Accessor(_target), _reference, tolerance_f32); } +FIXTURE_DATA_TEST_CASE(RunOptimized, NEDepthwiseConvolutionLayerFixture3x3<float>, framework::DatasetMode::ALL, combine(datasets::OptimizedDepthwiseConvolutionLayerDataset3x3(), + framework::dataset::make("DataType", + DataType::F32))) +{ + validate(Accessor(_target), _reference, tolerance_f32); +} TEST_SUITE_END() TEST_SUITE_END() diff --git a/tests/validation/reference/DepthwiseConvolutionLayer.cpp b/tests/validation/reference/DepthwiseConvolutionLayer.cpp index 66e3a4b783..ffea1bcf89 100644 --- a/tests/validation/reference/DepthwiseConvolutionLayer.cpp +++ b/tests/validation/reference/DepthwiseConvolutionLayer.cpp @@ -67,10 +67,10 @@ SimpleTensor<T> depthwise_convolution(const SimpleTensor<T> &src, const SimpleTe const int filter_half_width = filter_width / 2; const int filter_half_height = filter_height / 2; - const int pad_left = std::min(static_cast<int>(conv_info.pad_left()), filter_half_width); - const int pad_top = std::min(static_cast<int>(conv_info.pad_top()), filter_half_height); - const int pad_right = std::min(static_cast<int>(conv_info.pad_right()), filter_half_width); - const int pad_bottom = std::min(static_cast<int>(conv_info.pad_bottom()), filter_half_height); + const int pad_left = conv_info.pad_left(); + const int pad_top = conv_info.pad_top(); + const int pad_right = conv_info.pad_right(); + const int pad_bottom = conv_info.pad_bottom(); const int minimum_x = -pad_left + filter_half_width; const int minimum_y = -pad_top + filter_half_height; |