blob: d35b9685bebcab0735e6bd3441455a00534bd202 [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,
Sadik Armagan045f6be2020-09-10 13:37:32 +010024 const TensorInfo& output,
25 const Convolution2dDescriptor& descriptor,
26 const TensorInfo& weights,
27 const Optional<TensorInfo>& biases,
28 bool isFastMathEnabled)
surmeh013537c2c2018-05-18 16:31:43 +010029{
Francis Murtagh351d13d2018-09-24 15:01:18 +010030 const arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(input, descriptor.m_DataLayout);
31 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output, descriptor.m_DataLayout);
32 const arm_compute::TensorInfo aclWeightsInfo = BuildArmComputeTensorInfo(weights, descriptor.m_DataLayout);
arovir01a6824102018-08-28 17:40:45 +010033
Jan Eilers59c66702019-07-11 10:22:36 +010034 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(descriptor.m_DilationX,
35 descriptor.m_DilationY);
36
surmeh013537c2c2018-05-18 16:31:43 +010037 arm_compute::TensorInfo aclBiasesInfo;
38 arm_compute::TensorInfo *optionalAclBiasesInfo = nullptr;
39
40 if (descriptor.m_BiasEnabled)
41 {
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010042 ARMNN_ASSERT(biases.has_value());
arovir01a6824102018-08-28 17:40:45 +010043
David Beck5eec11d2018-10-04 15:43:17 +010044 aclBiasesInfo = BuildArmComputeTensorInfo(biases.value(), descriptor.m_DataLayout);
surmeh013537c2c2018-05-18 16:31:43 +010045 optionalAclBiasesInfo = &aclBiasesInfo;
46 }
47
48 arm_compute::PadStrideInfo layerInfo = BuildArmComputePadStrideInfo(descriptor);
49
50 return arm_compute::NEConvolutionLayer::validate(&aclInputInfo,
51 &aclWeightsInfo,
52 optionalAclBiasesInfo,
53 &aclOutputInfo,
Jan Eilers59c66702019-07-11 10:22:36 +010054 layerInfo,
55 arm_compute::WeightsInfo(),
Sadik Armagan045f6be2020-09-10 13:37:32 +010056 aclDilationInfo,
57 arm_compute::ActivationLayerInfo(),
58 isFastMathEnabled);
surmeh013537c2c2018-05-18 16:31:43 +010059}
60
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010061NeonConvolution2dWorkload::NeonConvolution2dWorkload(
Sadik Armagan04a72972020-09-14 15:44:18 +010062 const Convolution2dQueueDescriptor& descriptor,
63 const WorkloadInfo& info,
64 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager,
65 const bool isFastMathEnabled)
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010066 : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info)
telsoa014fcda012018-03-09 14:13:49 +000067{
68 using arm_compute::NEDirectConvolutionLayer;
telsoa014fcda012018-03-09 14:13:49 +000069
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010070 m_Data.ValidateInputsOutputs("NeonConvolution2dWorkload", 1, 1);
telsoa014fcda012018-03-09 14:13:49 +000071
telsoa01c577f2c2018-08-31 09:22:23 +010072 // todo: check tensor shapes match.
telsoa014fcda012018-03-09 14:13:49 +000073
Jan Eilersbb446e52020-04-02 13:56:54 +010074 arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
75 arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
telsoa014fcda012018-03-09 14:13:49 +000076
Francis Murtaghd59116e2018-10-04 16:03:07 +010077 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
78 input.info()->set_data_layout(aclDataLayout);
79 output.info()->set_data_layout(aclDataLayout);
80
telsoa01c577f2c2018-08-31 09:22:23 +010081 m_KernelTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010082 BuildArmComputeTensor(*m_KernelTensor, m_Data.m_Weight->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000083
telsoa014fcda012018-03-09 14:13:49 +000084 if (m_Data.m_Parameters.m_BiasEnabled)
85 {
telsoa01c577f2c2018-08-31 09:22:23 +010086 m_BiasTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010087 BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000088 }
89
Aron Virginas-Tar6f3785d2019-07-22 15:30:22 +010090 arm_compute::PadStrideInfo padStrideInfo = BuildArmComputePadStrideInfo(m_Data.m_Parameters);
telsoa014fcda012018-03-09 14:13:49 +000091
Jan Eilers59c66702019-07-11 10:22:36 +010092 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(m_Data.m_Parameters.m_DilationX,
93 m_Data.m_Parameters.m_DilationY);
94
narpra01fca75c32018-11-16 12:38:41 +000095 auto convolutionLayer = std::make_unique<arm_compute::NEConvolutionLayer>(memoryManager);
96 convolutionLayer->configure(&input,
97 m_KernelTensor.get(),
98 m_BiasTensor.get(),
99 &output,
Jan Eilers59c66702019-07-11 10:22:36 +0100100 padStrideInfo,
101 arm_compute::WeightsInfo(),
Sadik Armagan04a72972020-09-14 15:44:18 +0100102 aclDilationInfo,
103 arm_compute::ActivationLayerInfo(),
104 isFastMathEnabled);
105
106 m_ConvolutionMethod =
107 convolutionLayer->get_convolution_method(input.info(),
108 m_KernelTensor->info(),
109 output.info(),
110 padStrideInfo,
111 arm_compute::WeightsInfo(),
112 aclDilationInfo,
113 arm_compute::ActivationLayerInfo(),
114 isFastMathEnabled);
Jan Eilers59c66702019-07-11 10:22:36 +0100115
narpra01fca75c32018-11-16 12:38:41 +0000116 m_ConvolutionLayer.reset(convolutionLayer.release());
telsoa014fcda012018-03-09 14:13:49 +0000117
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100118 ARMNN_ASSERT(m_ConvolutionLayer);
telsoa014fcda012018-03-09 14:13:49 +0000119
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100120 InitializeArmComputeTensorData(*m_KernelTensor, m_Data.m_Weight);
telsoa014fcda012018-03-09 14:13:49 +0000121
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100122 if (m_Data.m_Parameters.m_BiasEnabled)
123 {
124 InitializeArmComputeTensorData(*m_BiasTensor, m_Data.m_Bias);
125 }
126
127 m_ConvolutionLayer->prepare();
128 FreeUnusedTensors();
telsoa014fcda012018-03-09 14:13:49 +0000129}
130
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100131void NeonConvolution2dWorkload::Execute() const
132{
133 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonConvolution2dWorkload_Execute");
134 m_ConvolutionLayer->run();
135}
136
Sadik Armagan04a72972020-09-14 15:44:18 +0100137arm_compute::ConvolutionMethod NeonConvolution2dWorkload::GetConvolutionMethod() const
138{
139 return m_ConvolutionMethod;
140}
141
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100142void NeonConvolution2dWorkload::FreeUnusedTensors()
telsoa01c577f2c2018-08-31 09:22:23 +0100143{
144 FreeTensorIfUnused(m_KernelTensor);
145 FreeTensorIfUnused(m_BiasTensor);
146}
147
telsoa014fcda012018-03-09 14:13:49 +0000148} //namespace armnn