diff options
author | giuros01 <giuseppe.rossini@arm.com> | 2019-04-01 13:50:22 +0100 |
---|---|---|
committer | Gian Marco Iodice <gianmarco.iodice@arm.com> | 2019-05-10 08:26:44 +0000 |
commit | 46a49a0a8206f0efa7afd514940e180a88ffd732 (patch) | |
tree | 0ec53af4ef65037e357b1d8f6a1d1f65075659f7 /src/runtime/CL/functions/CLDeconvolutionLayer.cpp | |
parent | 879e8dd2fc8523e4059ba9ced9ea0edb57103778 (diff) | |
download | ComputeLibrary-46a49a0a8206f0efa7afd514940e180a88ffd732.tar.gz |
COMPMID-1635: Optimize CLDeconvolutionLayer - Part III
Change-Id: Id2661e093a669ef3eaf2a5116cd278a80c1d5a89
Signed-off-by: giuros01 <giuseppe.rossini@arm.com>
Reviewed-on: https://review.mlplatform.org/c/935
Reviewed-by: Gian Marco Iodice <gianmarco.iodice@arm.com>
Comments-Addressed: Gian Marco Iodice <gianmarco.iodice@arm.com>
Reviewed-by: Isabella Gottardi <isabella.gottardi@arm.com>
Comments-Addressed: Isabella Gottardi <isabella.gottardi@arm.com>
Tested-by: Isabella Gottardi <isabella.gottardi@arm.com>
Tested-by: Arm Jenkins <bsgcomp@arm.com>
Diffstat (limited to 'src/runtime/CL/functions/CLDeconvolutionLayer.cpp')
-rw-r--r-- | src/runtime/CL/functions/CLDeconvolutionLayer.cpp | 65 |
1 files changed, 60 insertions, 5 deletions
diff --git a/src/runtime/CL/functions/CLDeconvolutionLayer.cpp b/src/runtime/CL/functions/CLDeconvolutionLayer.cpp index 2c17473fc7..c6f79d341f 100644 --- a/src/runtime/CL/functions/CLDeconvolutionLayer.cpp +++ b/src/runtime/CL/functions/CLDeconvolutionLayer.cpp @@ -44,11 +44,29 @@ CLDeconvolutionLayer::CLDeconvolutionLayer(std::shared_ptr<IMemoryManager> memor void CLDeconvolutionLayer::configure(ICLTensor *input, ICLTensor *weights, const ICLTensor *bias, ICLTensor *output, const PadStrideInfo &deconv_info, unsigned int inner_border_right, unsigned int inner_border_top, const WeightsInfo &weights_info) { - ARM_COMPUTE_UNUSED(inner_border_right, inner_border_top); ARM_COMPUTE_ERROR_ON_NULLPTR(input, weights, output); - auto f = arm_compute::support::cpp14::make_unique<CLDirectDeconvolutionLayer>(); - f->configure(input, weights, bias, output, deconv_info, weights_info); - _function = std::move(f); + ARM_COMPUTE_UNUSED(inner_border_right, inner_border_top); + + switch(CLDeconvolutionLayer::get_deconvolution_method(input->info(), weights->info(), nullptr, output->info(), deconv_info, weights_info)) + { + case DeconvolutionMethod::DIRECT: + { + auto f = arm_compute::support::cpp14::make_unique<CLDirectDeconvolutionLayer>(); + f->configure(input, weights, bias, output, deconv_info, weights_info); + _function = std::move(f); + break; + } + case DeconvolutionMethod::GEMM: + { + auto f = arm_compute::support::cpp14::make_unique<CLGEMMDeconvolutionLayer>(_memory_manager); + f->configure(input, weights, bias, output, deconv_info); + _function = std::move(f); + break; + } + default: + ARM_COMPUTE_ERROR("Not supported."); + break; + } } Status CLDeconvolutionLayer::validate(const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *bias, ITensorInfo *output, const PadStrideInfo &deconv_info, @@ -56,10 +74,47 @@ Status CLDeconvolutionLayer::validate(const ITensorInfo *input, const ITensorInf { ARM_COMPUTE_RETURN_ERROR_ON_NULLPTR(input, weights, output); ARM_COMPUTE_UNUSED(inner_border_right, inner_border_top); - ARM_COMPUTE_RETURN_ON_ERROR(CLDirectDeconvolutionLayer::validate(input, weights, bias, output, deconv_info, weights_info)); + + switch(CLDeconvolutionLayer::get_deconvolution_method(input, weights, bias, output, deconv_info, weights_info)) + { + case DeconvolutionMethod::DIRECT: + { + // Validate direct convolution layer + ARM_COMPUTE_RETURN_ON_ERROR(CLDirectDeconvolutionLayer::validate(input, weights, bias, output, deconv_info, weights_info)); + break; + } + case DeconvolutionMethod::GEMM: + { + // Validate gemm-based convolution layer + ARM_COMPUTE_RETURN_ON_ERROR(CLGEMMDeconvolutionLayer::validate(input, weights, bias, output, deconv_info)); + break; + } + default: + ARM_COMPUTE_ERROR("Not supported."); + break; + } + return Status{}; } +DeconvolutionMethod CLDeconvolutionLayer::get_deconvolution_method(const ITensorInfo *input, const ITensorInfo *weights, const ITensorInfo *bias, ITensorInfo *output, const PadStrideInfo &deconv_info, + const WeightsInfo &weights_info) +{ + ARM_COMPUTE_UNUSED(output, bias, weights_info); + + const DataLayout data_layout = input->data_layout(); + + const size_t idx_w = get_data_layout_dimension_index(data_layout, DataLayoutDimension::WIDTH); + const size_t idx_h = get_data_layout_dimension_index(data_layout, DataLayoutDimension::HEIGHT); + + if(weights->dimension(idx_w) != deconv_info.stride().first || weights->dimension(idx_h) != deconv_info.stride().second) + { + return DeconvolutionMethod::DIRECT; + } + + return DeconvolutionMethod::GEMM; +} + void CLDeconvolutionLayer::configure(ICLTensor *input, ICLTensor *weights, const ICLTensor *bias, ICLTensor *output, const PadStrideInfo &deconv_info, const WeightsInfo &weights_info) { |