ArmNN
 25.11
Loading...
Searching...
No Matches
NeonConcatWorkload.cpp
Go to the documentation of this file.
1//
2// Copyright © 2017-2023 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
7
9
14
15namespace armnn
16{
17using namespace armcomputetensorutils;
18
19namespace
20{
21size_t CalcAxis(const armnn::OriginsDescriptor& descriptor)
22{
23 return (descriptor.GetNumDimensions() - descriptor.GetConcatAxis()) - 1;
24}
25} //namespace
26
27arm_compute::Status NeonConcatWorkloadValidate(const std::vector<const TensorInfo*>& inputs,
28 const TensorInfo& output,
29 const OriginsDescriptor& descriptor)
30
31{
32 std::vector<arm_compute::TensorInfo> aclInputs;
33 for (const TensorInfo* input : inputs)
34 {
35 arm_compute::TensorInfo aclInputInfo = BuildArmComputeTensorInfo(*input, armnn::DataLayout::NCHW);
36 aclInputs.emplace_back(aclInputInfo);
37 }
38 const arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
39 std::vector<const arm_compute::ITensorInfo*> aclInputPtrs;
40 for (arm_compute::ITensorInfo& input : aclInputs)
41 {
42 aclInputPtrs.emplace_back(&input);
43 }
44
45 size_t aclAxis = CalcAxis(descriptor);
46 return arm_compute::NEConcatenateLayer::validate(aclInputPtrs, &aclOutputInfo, aclAxis);
47}
48
50const ConcatQueueDescriptor& descriptor, const WorkloadInfo& info)
52{
53 // Report Profiling Details
54 ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonConcatWorkload_Construct",
55 descriptor.m_Parameters,
56 info,
57 this->GetGuid());
58
59 bool allInputsAreSubtensors = true;
60
61 // Check that all inputs are sub-tensors
62 for (auto input : descriptor.m_Inputs)
63 {
64 if (!input->GetParent())
65 {
66 // Non sub-tensor input found so we need to execute the concat function
67 allInputsAreSubtensors = false;
68 break;
69 }
70 }
71
72 if (allInputsAreSubtensors)
73 {
74 // Can skip configuring the concat function since it's not executed
75 return;
76 }
77
78 std::vector<const arm_compute::ITensor *> aclInputs;
79 for (auto input : m_Data.m_Inputs)
80 {
81 arm_compute::ITensor& aclInput = armnn::PolymorphicPointerDowncast<IAclTensorHandle>(input)->GetTensor();
82 aclInputs.emplace_back(&aclInput);
83 }
84 arm_compute::ITensor& output = armnn::PolymorphicPointerDowncast<IAclTensorHandle>(
85 m_Data.m_Outputs[0])->GetTensor();
86
87 // Create the layer function
88 m_Layer.reset(new arm_compute::NEConcatenateLayer());
89
90 // Configure input and output tensors
91 size_t aclAxis = CalcAxis(descriptor.m_Parameters);
92 m_Layer->configure(aclInputs, &output, aclAxis);
93
94 // Prepare
95 m_Layer->prepare();
96}
97
99{
100 if (m_Layer)
101 {
102 ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID("NeonConcatWorkload_Execute");
103 m_Layer->run();
104 }
105}
106
107} //namespace armnn
108
#define ARMNN_SCOPED_PROFILING_EVENT_NEON_NAME_GUID(label)
Creates a profiling event that uses GetGuid() and GetName() from the calling class.
#define ARMNN_REPORT_PROFILING_WORKLOAD_DESC(name, desc, infos, guid)
NeonBaseWorkload(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info)
NeonConcatWorkload(const ConcatQueueDescriptor &descriptor, const WorkloadInfo &info)
void Execute() const override
Copyright (c) 2021 ARM Limited and Contributors.
auto PolymorphicPointerDowncast(const SourceType &value)
Polymorphic downcast for shared pointers and build in pointers.
arm_compute::Status NeonConcatWorkloadValidate(const std::vector< const TensorInfo * > &inputs, const TensorInfo &output, const OriginsDescriptor &descriptor)
An OriginsDescriptor for the ConcatLayer.
unsigned int GetConcatAxis() const
Get the concatenation axis value.
uint32_t GetNumDimensions() const
Get the number of dimensions.
std::vector< ITensorHandle * > m_Inputs
Contains information about TensorInfos of a layer.