blob: 5d45642eefa92833d438c89f102eba5af4a40e5c [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
5
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +01006#include "NeonConvolution2dWorkload.hpp"
7
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <backendsCommon/CpuTensorHandle.hpp>
9#include <aclCommon/ArmComputeTensorUtils.hpp>
Matthew Benthamd80a7122019-01-08 17:52:37 +000010#include <neon/workloads/NeonWorkloadUtils.hpp>
11
12#include <arm_compute/runtime/NEON/functions/NEConvolutionLayer.h>
telsoa014fcda012018-03-09 14:13:49 +000013
David Beck711fa312018-09-24 10:46:38 +010014#include <armnn/Types.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <Half.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010016
telsoa014fcda012018-03-09 14:13:49 +000017namespace armnn
18{
19
surmeh013537c2c2018-05-18 16:31:43 +010020using namespace armcomputetensorutils;
21
22arm_compute::Status NeonConvolution2dWorkloadValidate(const TensorInfo& input,
23 const TensorInfo& output,
24 const Convolution2dDescriptor& descriptor,
25 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010026 const Optional<TensorInfo>& biases)
surmeh013537c2c2018-05-18 16:31:43 +010027{
Francis Murtagh351d13d2018-09-24 15:01:18 +010028 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
29 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
30 const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
arovir01a6824102018-08-28 17:40:45 +010031
Jan Eilers59c66702019-07-11 10:22:36 +010032 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(descriptor.m_DilationX,
33 descriptor.m_DilationY);
34
surmeh013537c2c2018-05-18 16:31:43 +010035 arm_compute::TensorInfo aclBiasesInfo;
36 arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr;
37
38 if (descriptor.m_BiasEnabled)
39 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010040 ARMNN_ASSERT(biases.has_value());
arovir01a6824102018-08-28 17:40:45 +010041
David Beck5eec11d2018-10-04 15:43:17 +010042 aclBiasesInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout);
surmeh013537c2c2018-05-18 16:31:43 +010043 optionalAclBiasesInfo = &aclBiasesInfo;
44 }
45
46 arm_compute::PadStrideInfo layerInfo = BuildArmComputePadStrideInfo(descriptor);
47
48 return arm_compute::NEConvolutionLayer::validate(&aclInputInfo,
49 &aclWeightsInfo,
50 optionalAclBiasesInfo,
51 &aclOutputInfo,
Jan Eilers59c66702019-07-11 10:22:36 +010052 layerInfo,
53 arm_compute::WeightsInfo(),
54 aclDilationInfo);
surmeh013537c2c2018-05-18 16:31:43 +010055}
56
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010057NeonConvolution2dWorkload::NeonConvolution2dWorkload(
telsoa01c577f2c2018-08-31 09:22:23 +010058 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info,
59 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010060 : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info)
telsoa014fcda012018-03-09 14:13:49 +000061{
62 using arm_compute::NEDirectConvolutionLayer;
telsoa014fcda012018-03-09 14:13:49 +000063
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010064 m_Data.ValidateInputsOutputs("NeonConvolution2dWorkload", 1, 1);
telsoa014fcda012018-03-09 14:13:49 +000065
telsoa01c577f2c2018-08-31 09:22:23 +010066 // todo: check tensor shapes match.
telsoa014fcda012018-03-09 14:13:49 +000067
Derek Lambertic81855f2019-06-13 17:34:19 +010068 arm_compute::ITensor& input = boost::polymorphic_downcast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
69 arm_compute::ITensor& output = boost::polymorphic_downcast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
telsoa014fcda012018-03-09 14:13:49 +000070
Francis Murtaghd59116e2018-10-04 16:03:07 +010071 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
72 input.info()->set_data_layout(aclDataLayout);
73 output.info()->set_data_layout(aclDataLayout);
74
telsoa01c577f2c2018-08-31 09:22:23 +010075 m_KernelTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010076 BuildArmComputeTensor(*m_KernelTensor, m_Data.m_Weight->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000077
telsoa014fcda012018-03-09 14:13:49 +000078 if (m_Data.m_Parameters.m_BiasEnabled)
79 {
telsoa01c577f2c2018-08-31 09:22:23 +010080 m_BiasTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010081 BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000082 }
83
Aron Virginas-Tar6f3785d2019-07-22 15:30:22 +010084 arm_compute::PadStrideInfo padStrideInfo = BuildArmComputePadStrideInfo(m_Data.m_Parameters);
telsoa014fcda012018-03-09 14:13:49 +000085
Jan Eilers59c66702019-07-11 10:22:36 +010086 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(m_Data.m_Parameters.m_DilationX,
87 m_Data.m_Parameters.m_DilationY);
88
narpra01fca75c32018-11-16 12:38:41 +000089 auto convolutionLayer = std::make_unique<arm_compute::NEConvolutionLayer>(memoryManager);
90 convolutionLayer->configure(&input,
91 m_KernelTensor.get(),
92 m_BiasTensor.get(),
93 &output,
Jan Eilers59c66702019-07-11 10:22:36 +010094 padStrideInfo,
95 arm_compute::WeightsInfo(),
96 aclDilationInfo);
97
narpra01fca75c32018-11-16 12:38:41 +000098 m_ConvolutionLayer.reset(convolutionLayer.release());
telsoa014fcda012018-03-09 14:13:49 +000099
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100100 ARMNN_ASSERT(m_ConvolutionLayer);
telsoa014fcda012018-03-09 14:13:49 +0000101
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100102 InitializeArmComputeTensorData(*m_KernelTensor, m_Data.m_Weight);
telsoa014fcda012018-03-09 14:13:49 +0000103
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100104 if (m_Data.m_Parameters.m_BiasEnabled)
105 {
106 InitializeArmComputeTensorData(*m_BiasTensor, m_Data.m_Bias);
107 }
108
109 m_ConvolutionLayer->prepare();
110 FreeUnusedTensors();
telsoa014fcda012018-03-09 14:13:49 +0000111}
112
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100113void NeonConvolution2dWorkload::Execute() const
114{
115 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonConvolution2dWorkload_Execute");
116 m_ConvolutionLayer->run();
117}
118
119void NeonConvolution2dWorkload::FreeUnusedTensors()
telsoa01c577f2c2018-08-31 09:22:23 +0100120{
121 FreeTensorIfUnused(m_KernelTensor);
122 FreeTensorIfUnused(m_BiasTensor);
123}
124
telsoa014fcda012018-03-09 14:13:49 +0000125} //namespace armnn