24 #ifndef ARM_COMPUTE_CPUWINOGRADCONV2DKERNEL_H 25 #define ARM_COMPUTE_CPUWINOGRADCONV2DKERNEL_H 27 #include "src/core/NEON/kernels/convolution/common/convolution.hpp" 28 #include "src/core/NEON/kernels/convolution/common/tensor.hpp" 31 #include "src/core/NEON/kernels/convolution/winograd/winograd_layer.hpp" 63 virtual unsigned int get_input_storage_size(
int num_batches,
int num_channels,
int num_rows,
int num_cols,
bool same_padding)
const = 0;
75 virtual int get_matrix_stride(
int num_batches,
int num_channels,
int num_rows,
int num_cols,
bool same_padding)
const = 0;
89 virtual void configure(
const ITensorInfo *input_nhwc,
const int num_batches,
const int num_rows,
const int num_cols,
const int num_channels,
99 template <
typename T,
int OutputTileRows,
int OutputTileCols,
int KernelRows,
int KernelCols>
130 bool same_padding)
const override;
159 bool same_padding)
const override;
164 const char *
name()
const override 166 return "CpuWinogradConv2dTransformInputKernel";
183 const int num_batches,
186 const int num_channels,
187 const PaddingType padding,
189 const int matrix_stride,
196 using WinogradBase = winograd::WinogradGEMM<OutputTileRows, OutputTileCols, KernelRows, KernelCols, winograd::WinogradRoots::Integers>;
198 using WinogradConv =
typename WinogradBase::template Convolution<T, T>;
211 using InputTransform =
typename WinogradBase::template InputTransform<T, T>;
213 std::unique_ptr<InputTransform> _transform{
nullptr };
244 virtual unsigned int get_output_storage_size(
int num_batches,
int num_rows,
int num_cols,
int num_output_channels)
const = 0;
255 virtual int get_matrix_stride(
int num_batches,
int num_rows,
int num_cols,
int num_output_channels)
const = 0;
265 virtual std::pair<unsigned int, unsigned int> get_output_shape(
287 const int matrix_stride,
289 const int num_batches,
292 const int num_channels,
302 template <
typename T,
int OutputTileRows,
int OutputTileCols,
int KernelRows,
int KernelCols>
306 const char *
name()
const override 308 return "CpuWinogradConv2dTransformOutputKernel";
335 unsigned int get_output_storage_size(
int num_batches,
int num_rows,
int num_cols,
int num_output_channels)
const override;
346 int get_matrix_stride(
int num_batches,
int num_rows,
int num_cols,
int num_output_channels)
const override;
355 std::pair<unsigned int, unsigned int> get_output_shape(
358 bool padding_same)
const override;
388 const int matrix_stride,
390 const int num_batches,
393 const int num_channels,
411 using WinogradBase = winograd::WinogradGEMM<OutputTileRows, OutputTileCols, KernelRows, KernelCols, winograd::WinogradRoots::Integers>;
412 using WinogradConv =
typename WinogradBase::template Convolution<T, T>;
413 using OutputTransform =
typename WinogradBase::template OutputTransform<T, T>;
415 std::unique_ptr<OutputTransform> _transform{
nullptr };
417 int _matrix_row_stride;
447 virtual unsigned int get_weight_storage_size(
int num_output_channels,
int num_input_channels)
const = 0;
455 virtual int get_matrix_stride(
int num_output_channels,
int num_input_channels)
const = 0;
466 virtual void configure(
const ITensorInfo *weights_hwio,
ITensorInfo *output,
const int matrix_stride,
const int num_output_channels,
const int num_input_channels) = 0;
479 template <
typename T,
int OutputTileRows,
int OutputTileCols,
int KernelRows,
int KernelCols>
496 const char *
name()
const override 498 return "CpuWinogradConv2dTransformWeightsKernel";
514 #ifndef DOXYGEN_SKIP_THIS 523 void configure(
const ITensorInfo *weights_hwio,
ITensorInfo *output,
const int matrix_stride,
const int num_output_channels,
const int num_input_channels)
override;
534 unsigned int get_weight_storage_size(
int num_output_channels,
int num_input_channels)
const override;
543 int get_matrix_stride(
int num_output_channels,
int num_input_channels)
const override;
548 using WinogradBase = winograd::WinogradGEMM<OutputTileRows, OutputTileCols, KernelRows, KernelCols, winograd::WinogradRoots::Integers>;
549 using WinogradConv =
typename WinogradBase::template Convolution<T, T>;
550 using WeightsTransform =
typename WinogradBase::template WeightsTransform<T, T>;
552 std::unique_ptr<WeightsTransform> _transform{
nullptr };
553 int _num_output_channels;
558 template <
typename TIn,
typename TOut,
int OutputTileRows,
int OutputTileCols,
int KernelRows,
int KernelCols>
563 using WinogradBase = winograd::WinogradGEMM<OutputTileRows, OutputTileCols, KernelRows, KernelCols, winograd::WinogradRoots::Integers>;
566 using WinogradConv =
typename WinogradBase::template Convolution<TIn, TOut>;
const Window & window() const
The maximum window the kernel can be executed on.
winograd::WinogradGEMM< OutputTileRows, OutputTileCols, KernelRows, KernelCols, winograd::WinogradRoots::Integers > WinogradBase
Winograd base kernel.
Common interface for all kernels implemented in C++.
Store the tensor's metadata.
virtual void run_op(ITensorPack &tensors, const Window &window, const ThreadInfo &info)
Execute the kernel on the passed window.
Copyright (c) 2017-2021 Arm Limited.
virtual bool is_parallelisable() const
Indicates whether or not the kernel is parallelisable.
typename WinogradBase::template Convolution< TIn, TOut > WinogradConv
Winograd convolution kernel.
ScaleKernelInfo info(interpolation_policy, default_border_mode, PixelValue(), sampling_policy, false)
Kernel to perform Winograd.
Information about executing thread and CPU.
Describe a multidimensional execution window.
Status validate(const ITensorInfo *scores_in, const ITensorInfo *boxes_in, const ITensorInfo *batch_splits_in, const ITensorInfo *scores_out, const ITensorInfo *boxes_out, const ITensorInfo *classes, const ITensorInfo *batch_splits_out, const ITensorInfo *keeps, const ITensorInfo *keeps_size, const BoxNMSLimitInfo info)