blob: 144baec0cab79da56a48678ca0d101f3ff923237 [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 <aclCommon/ArmComputeTensorUtils.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +01009#include <armnn/utility/PolymorphicDowncast.hpp>
10#include <backendsCommon/CpuTensorHandle.hpp>
Matthew Benthamd80a7122019-01-08 17:52:37 +000011#include <neon/workloads/NeonWorkloadUtils.hpp>
12
13#include <arm_compute/runtime/NEON/functions/NEConvolutionLayer.h>
telsoa014fcda012018-03-09 14:13:49 +000014
David Beck711fa312018-09-24 10:46:38 +010015#include <armnn/Types.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <Half.hpp>
telsoa01c577f2c2018-08-31 09:22:23 +010017
telsoa014fcda012018-03-09 14:13:49 +000018namespace armnn
19{
20
surmeh013537c2c2018-05-18 16:31:43 +010021using namespace armcomputetensorutils;
22
23arm_compute::Status NeonConvolution2dWorkloadValidate(const TensorInfo& input,
24 const TensorInfo& output,
25 const Convolution2dDescriptor& descriptor,
26 const TensorInfo& weights,
David Beck5eec11d2018-10-04 15:43:17 +010027 const Optional<TensorInfo>& biases)
surmeh013537c2c2018-05-18 16:31:43 +010028{
Francis Murtagh351d13d2018-09-24 15:01:18 +010029 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
30 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
31 const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
arovir01a6824102018-08-28 17:40:45 +010032
Jan Eilers59c66702019-07-11 10:22:36 +010033 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(descriptor.m_DilationX,
34 descriptor.m_DilationY);
35
surmeh013537c2c2018-05-18 16:31:43 +010036 arm_compute::TensorInfo aclBiasesInfo;
37 arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr;
38
39 if (descriptor.m_BiasEnabled)
40 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010041 ARMNN_ASSERT(biases.has_value());
arovir01a6824102018-08-28 17:40:45 +010042
David Beck5eec11d2018-10-04 15:43:17 +010043 aclBiasesInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout);
surmeh013537c2c2018-05-18 16:31:43 +010044 optionalAclBiasesInfo = &aclBiasesInfo;
45 }
46
47 arm_compute::PadStrideInfo layerInfo = BuildArmComputePadStrideInfo(descriptor);
48
49 return arm_compute::NEConvolutionLayer::validate(&aclInputInfo,
50 &aclWeightsInfo,
51 optionalAclBiasesInfo,
52 &aclOutputInfo,
Jan Eilers59c66702019-07-11 10:22:36 +010053 layerInfo,
54 arm_compute::WeightsInfo(),
55 aclDilationInfo);
surmeh013537c2c2018-05-18 16:31:43 +010056}
57
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010058NeonConvolution2dWorkload::NeonConvolution2dWorkload(
telsoa01c577f2c2018-08-31 09:22:23 +010059 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info,
60 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010061 : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info)
telsoa014fcda012018-03-09 14:13:49 +000062{
63 using arm_compute::NEDirectConvolutionLayer;
telsoa014fcda012018-03-09 14:13:49 +000064
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010065 m_Data.ValidateInputsOutputs("NeonConvolution2dWorkload", 1, 1);
telsoa014fcda012018-03-09 14:13:49 +000066
telsoa01c577f2c2018-08-31 09:22:23 +010067 // todo: check tensor shapes match.
telsoa014fcda012018-03-09 14:13:49 +000068
Jan Eilersbb446e52020-04-02 13:56:54 +010069 arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
70 arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
telsoa014fcda012018-03-09 14:13:49 +000071
Francis Murtaghd59116e2018-10-04 16:03:07 +010072 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
73 input.info()->set_data_layout(aclDataLayout);
74 output.info()->set_data_layout(aclDataLayout);
75
telsoa01c577f2c2018-08-31 09:22:23 +010076 m_KernelTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010077 BuildArmComputeTensor(*m_KernelTensor, m_Data.m_Weight->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000078
telsoa014fcda012018-03-09 14:13:49 +000079 if (m_Data.m_Parameters.m_BiasEnabled)
80 {
telsoa01c577f2c2018-08-31 09:22:23 +010081 m_BiasTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010082 BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000083 }
84
Aron Virginas-Tar6f3785d2019-07-22 15:30:22 +010085 arm_compute::PadStrideInfo padStrideInfo = BuildArmComputePadStrideInfo(m_Data.m_Parameters);
telsoa014fcda012018-03-09 14:13:49 +000086
Jan Eilers59c66702019-07-11 10:22:36 +010087 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(m_Data.m_Parameters.m_DilationX,
88 m_Data.m_Parameters.m_DilationY);
89
narpra01fca75c32018-11-16 12:38:41 +000090 auto convolutionLayer = std::make_unique<arm_compute::NEConvolutionLayer>(memoryManager);
91 convolutionLayer->configure(&input,
92 m_KernelTensor.get(),
93 m_BiasTensor.get(),
94 &output,
Jan Eilers59c66702019-07-11 10:22:36 +010095 padStrideInfo,
96 arm_compute::WeightsInfo(),
97 aclDilationInfo);
98
narpra01fca75c32018-11-16 12:38:41 +000099 m_ConvolutionLayer.reset(convolutionLayer.release());
telsoa014fcda012018-03-09 14:13:49 +0000100
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100101 ARMNN_ASSERT(m_ConvolutionLayer);
telsoa014fcda012018-03-09 14:13:49 +0000102
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100103 InitializeArmComputeTensorData(*m_KernelTensor, m_Data.m_Weight);
telsoa014fcda012018-03-09 14:13:49 +0000104
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100105 if (m_Data.m_Parameters.m_BiasEnabled)
106 {
107 InitializeArmComputeTensorData(*m_BiasTensor, m_Data.m_Bias);
108 }
109
110 m_ConvolutionLayer->prepare();
111 FreeUnusedTensors();
telsoa014fcda012018-03-09 14:13:49 +0000112}
113
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100114void NeonConvolution2dWorkload::Execute() const
115{
116 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonConvolution2dWorkload_Execute");
117 m_ConvolutionLayer->run();
118}
119
120void NeonConvolution2dWorkload::FreeUnusedTensors()
telsoa01c577f2c2018-08-31 09:22:23 +0100121{
122 FreeTensorIfUnused(m_KernelTensor);
123 FreeTensorIfUnused(m_BiasTensor);
124}
125
telsoa014fcda012018-03-09 14:13:49 +0000126} //namespace armnn