xref: /aosp_15_r20/external/armnn/src/backends/neon/workloads/NeonSpaceToDepthWorkload.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "NeonSpaceToDepthWorkload.hpp"
7 #include "NeonWorkloadUtils.hpp"
8 
9 #include <armnn/utility/NumericCast.hpp>
10 #include <armnn/utility/PolymorphicDowncast.hpp>
11 
12 #include <ResolveType.hpp>
13 
14 namespace armnn
15 {
16 
17 using namespace armcomputetensorutils;
18 
NeonSpaceToDepthWorkloadValidate(const TensorInfo & input,const TensorInfo & output,const SpaceToDepthDescriptor & descriptor)19 arm_compute::Status NeonSpaceToDepthWorkloadValidate(const TensorInfo& input,
20                                                      const TensorInfo& output,
21                                                      const SpaceToDepthDescriptor& descriptor)
22 {
23     DataLayout dataLayout = descriptor.m_DataLayout;
24     const arm_compute::TensorInfo aclInput = BuildArmComputeTensorInfo(input, dataLayout);
25     const arm_compute::TensorInfo aclOutput = BuildArmComputeTensorInfo(output, dataLayout);
26 
27     int32_t blockSize  = armnn::numeric_cast<int32_t>(descriptor.m_BlockSize);
28 
29     return arm_compute::NESpaceToDepthLayer::validate(&aclInput, &aclOutput, blockSize);
30 }
31 
NeonSpaceToDepthWorkload(const SpaceToDepthQueueDescriptor & descriptor,const WorkloadInfo & info)32 NeonSpaceToDepthWorkload::NeonSpaceToDepthWorkload(const SpaceToDepthQueueDescriptor& descriptor,
33                                                    const WorkloadInfo& info)
34     : NeonBaseWorkload<SpaceToDepthQueueDescriptor>(descriptor, info)
35 {
36     // Report Profiling Details
37     ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonSpaceToDepthWorkload_Construct",
38                                          descriptor.m_Parameters,
39                                          info,
40                                          this->GetGuid());
41 
42     m_Data.ValidateInputsOutputs("NeonSpaceToDepthWorkload", 1, 1);
43 
44     arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
45 
46     arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
47     input.info()->set_data_layout(aclDataLayout);
48 
49     int32_t blockSize = armnn::numeric_cast<int32_t>(descriptor.m_Parameters.m_BlockSize);
50 
51     arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
52     output.info()->set_data_layout(aclDataLayout);
53 
54     m_Layer.reset(new arm_compute::NESpaceToDepthLayer());
55     m_Layer->configure(&input, &output, blockSize);
56     m_Layer->prepare();
57 }
58 
Execute() const59 void NeonSpaceToDepthWorkload::Execute() const
60 {
61     if (m_Layer)
62     {
63         ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonSpaceToDepthWorkload_Execute", this->GetGuid());
64         m_Layer->run();
65     }
66 }
67 
68 } //namespace armnn