diff options
author | Gian Marco Iodice <gianmarco.iodice@arm.com> | 2018-06-13 14:05:54 +0100 |
---|---|---|
committer | Anthony Barbier <anthony.barbier@arm.com> | 2018-11-02 16:53:57 +0000 |
commit | f1c2bf0971dd1c996da149faf3dd669d566074c7 (patch) | |
tree | 802b3ce5198c3209d77fc6b603c209023fe45650 /src/core/CL/CLHelpers.cpp | |
parent | 89a2b571cfc0ea87c26ba8b1ed1ab87d13244f0e (diff) | |
download | ComputeLibrary-f1c2bf0971dd1c996da149faf3dd669d566074c7.tar.gz |
COMPMID-1201 - Implementing Winograd Convolution Layer 1x3 and 3x1 kernels on OpenCL
Change-Id: I39667bab49daa4da009694163274a59fd3574c73
Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/137595
Tested-by: Jenkins <bsgcomp@arm.com>
Reviewed-by: Giorgio Arena <giorgio.arena@arm.com>
Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com>
Diffstat (limited to 'src/core/CL/CLHelpers.cpp')
-rw-r--r-- | src/core/CL/CLHelpers.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/src/core/CL/CLHelpers.cpp b/src/core/CL/CLHelpers.cpp index 23c24c0337..df06aff647 100644 --- a/src/core/CL/CLHelpers.cpp +++ b/src/core/CL/CLHelpers.cpp @@ -27,6 +27,7 @@ #include "arm_compute/core/Log.h" #include "arm_compute/core/Types.h" +#include <utility> #include <vector> namespace arm_compute @@ -164,4 +165,41 @@ bool device_supports_extension(const cl::Device &device, const char *extension_n return (pos != std::string::npos); } +bool cl_winograd_convolution_layer_supported(const Size2D &output_tile, const Size2D &kernel_size, DataLayout data_layout) +{ + ARM_COMPUTE_ERROR_ON(data_layout == DataLayout::UNKNOWN); + + using WinogradConfiguration = std::pair<std::pair<int, int>, std::pair<int, int>>; + + std::vector<WinogradConfiguration> winograd_filter_transform_nchw = + { + WinogradConfiguration(std::pair<int, int>(1, 2), std::pair<int, int>(1, 3)), + WinogradConfiguration(std::pair<int, int>(1, 4), std::pair<int, int>(1, 3)), + WinogradConfiguration(std::pair<int, int>(2, 1), std::pair<int, int>(3, 1)), + WinogradConfiguration(std::pair<int, int>(4, 1), std::pair<int, int>(3, 1)), + WinogradConfiguration(std::pair<int, int>(2, 2), std::pair<int, int>(3, 3)), + WinogradConfiguration(std::pair<int, int>(4, 4), std::pair<int, int>(3, 3)), + WinogradConfiguration(std::pair<int, int>(4, 4), std::pair<int, int>(5, 5)) + }; + + std::vector<WinogradConfiguration> winograd_filter_transform_nhwc = + { + WinogradConfiguration(std::pair<int, int>(2, 2), std::pair<int, int>(3, 3)), + WinogradConfiguration(std::pair<int, int>(4, 4), std::pair<int, int>(3, 3)), + WinogradConfiguration(std::pair<int, int>(4, 4), std::pair<int, int>(5, 5)) + }; + + auto p = std::make_pair(std::pair<int, int>(output_tile.width, output_tile.height), + std::pair<int, int>(kernel_size.width, kernel_size.height)); + + // Return true if supported + if(data_layout == DataLayout::NCHW) + { + return (std::find(winograd_filter_transform_nchw.begin(), winograd_filter_transform_nchw.end(), p) != winograd_filter_transform_nchw.end()); + } + else + { + return (std::find(winograd_filter_transform_nhwc.begin(), winograd_filter_transform_nhwc.end(), p) != winograd_filter_transform_nhwc.end()); + } +} } // namespace arm_compute |