blob: 83f761158aac2f6e112663ef0e656b2fa5a73db2 [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(
telsoa01c577f2c2018-08-31 09:22:23 +010062 const Convolution2dQueueDescriptor& descriptor, const WorkloadInfo& info,
63 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010064 : BaseWorkload<Convolution2dQueueDescriptor>(descriptor, info)
telsoa014fcda012018-03-09 14:13:49 +000065{
66 using arm_compute::NEDirectConvolutionLayer;
telsoa014fcda012018-03-09 14:13:49 +000067
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +010068 m_Data.ValidateInputsOutputs("NeonConvolution2dWorkload", 1, 1);
telsoa014fcda012018-03-09 14:13:49 +000069
telsoa01c577f2c2018-08-31 09:22:23 +010070 // todo: check tensor shapes match.
telsoa014fcda012018-03-09 14:13:49 +000071
Jan Eilersbb446e52020-04-02 13:56:54 +010072 arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
73 arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
telsoa014fcda012018-03-09 14:13:49 +000074
Francis Murtaghd59116e2018-10-04 16:03:07 +010075 arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
76 input.info()->set_data_layout(aclDataLayout);
77 output.info()->set_data_layout(aclDataLayout);
78
telsoa01c577f2c2018-08-31 09:22:23 +010079 m_KernelTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010080 BuildArmComputeTensor(*m_KernelTensor, m_Data.m_Weight->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000081
telsoa014fcda012018-03-09 14:13:49 +000082 if (m_Data.m_Parameters.m_BiasEnabled)
83 {
telsoa01c577f2c2018-08-31 09:22:23 +010084 m_BiasTensor = std::make_unique<arm_compute::Tensor>();
Francis Murtaghd59116e2018-10-04 16:03:07 +010085 BuildArmComputeTensor(*m_BiasTensor, m_Data.m_Bias->GetTensorInfo(), m_Data.m_Parameters.m_DataLayout);
telsoa014fcda012018-03-09 14:13:49 +000086 }
87
Aron Virginas-Tar6f3785d2019-07-22 15:30:22 +010088 arm_compute::PadStrideInfo padStrideInfo = BuildArmComputePadStrideInfo(m_Data.m_Parameters);
telsoa014fcda012018-03-09 14:13:49 +000089
Jan Eilers59c66702019-07-11 10:22:36 +010090 const arm_compute::Size2D aclDilationInfo = BuildArmComputeSize2D(m_Data.m_Parameters.m_DilationX,
91 m_Data.m_Parameters.m_DilationY);
92
narpra01fca75c32018-11-16 12:38:41 +000093 auto convolutionLayer = std::make_unique<arm_compute::NEConvolutionLayer>(memoryManager);
94 convolutionLayer->configure(&input,
95 m_KernelTensor.get(),
96 m_BiasTensor.get(),
97 &output,
Jan Eilers59c66702019-07-11 10:22:36 +010098 padStrideInfo,
99 arm_compute::WeightsInfo(),
100 aclDilationInfo);
101
narpra01fca75c32018-11-16 12:38:41 +0000102 m_ConvolutionLayer.reset(convolutionLayer.release());
telsoa014fcda012018-03-09 14:13:49 +0000103
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +0100104 ARMNN_ASSERT(m_ConvolutionLayer);
telsoa014fcda012018-03-09 14:13:49 +0000105
Nattapat Chaimanowong177d8d22018-10-16 13:21:27 +0100106 InitializeArmComputeTensorData(*m_KernelTensor, m_Data.m_Weight);
telsoa014fcda012018-03-09 14:13:49 +0000107
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100108 if (m_Data.m_Parameters.m_BiasEnabled)
109 {
110 InitializeArmComputeTensorData(*m_BiasTensor, m_Data.m_Bias);
111 }
112
113 m_ConvolutionLayer->prepare();
114 FreeUnusedTensors();
telsoa014fcda012018-03-09 14:13:49 +0000115}
116
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100117void NeonConvolution2dWorkload::Execute() const
118{
119 ARMNN_SCOPED_PROFILING_EVENT_NEON("NeonConvolution2dWorkload_Execute");
120 m_ConvolutionLayer->run();
121}
122
123void NeonConvolution2dWorkload::FreeUnusedTensors()
telsoa01c577f2c2018-08-31 09:22:23 +0100124{
125 FreeTensorIfUnused(m_KernelTensor);
126 FreeTensorIfUnused(m_BiasTensor);
127}
128
telsoa014fcda012018-03-09 14:13:49 +0000129} //namespace armnn