aboutsummaryrefslogtreecommitdiff
path: root/src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp
diff options
context:
space:
mode:
authorViet-Hoa Do <viet-hoa.do@arm.com>2022-08-03 16:39:23 +0100
committerViet-Hoa Do <viet-hoa.do@arm.com>2022-08-08 14:58:58 +0000
commit65c8db87a2f442cc17ef90d05406e705ca7a9c1e (patch)
tree6ff8df6955114af93eca811cdd0d0c6bca4ebe7e /src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp
parent992a741599647d07e6c5b852d9978e9d32f30992 (diff)
downloadComputeLibrary-65c8db87a2f442cc17ef90d05406e705ca7a9c1e.tar.gz
Fix for AI benchmark ResNet regression
* For 3x3 kernel, only choose the implementation with larger tile size if the input tensor is larger than the tile. Resolves: COMPMID-5467 Signed-off-by: Viet-Hoa Do <viet-hoa.do@arm.com> Change-Id: I2cf95ddb25f477cb05da3b3501e0afe9548fc33a Reviewed-on: https://review.mlplatform.org/c/ml/ComputeLibrary/+/8022 Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com> Comments-Addressed: Arm Jenkins <bsgcomp@arm.com> Benchmark: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp')
-rw-r--r--src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp b/src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp
index a23cb1d6b3..510f69baaa 100644
--- a/src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp
+++ b/src/core/NEON/kernels/convolution/winograd/winograd_implementations.hpp
@@ -38,6 +38,7 @@ enum class MethodConstraints
RequiresSVE2 = 0x2,
RequiresSME = 0x4,
RequiresSME2 = 0x8,
+ LargerShape = 0x10, // Input tensor shape is larger than the output transform tile shape.
};
constexpr inline bool operator!(const MethodConstraints &c)
@@ -66,6 +67,14 @@ inline bool constraints_met(const MethodConstraints &c, const CPUInfo *ci, const
);
}
+inline bool output_transform_constraints_met(const output_transform::ITransform *transform, const MethodConstraints &c, const CPUInfo *ci, const ConvolutionArgs &conv_args, const WinogradConfig *cfg)
+{
+ return (
+ constraints_met(c, ci, conv_args, cfg) &&
+ (!(c & MethodConstraints::LargerShape) || (conv_args.input_shape.rows > transform->get_output_rows() && conv_args.input_shape.cols > transform->get_output_cols()))
+ );
+}
+
namespace weight_transform {
template <typename TIn, typename TOut=TIn>
@@ -209,7 +218,7 @@ inline std::vector<const output_transform::ITransform *> get_output_transforms(
impl->transform.get() != nullptr; impl++)
{
if(
- constraints_met(impl->constraints, ci, conv_args, cfg) &&
+ output_transform_constraints_met(impl->transform.get(), impl->constraints, ci, conv_args, cfg) &&
impl->transform->get_kernel_rows() == conv_args.kernel_shape.rows &&
impl->transform->get_kernel_cols() == conv_args.kernel_shape.cols &&
(cfg->output_rows == 0 || cfg->output_rows == impl->transform->get_output_rows()) &&