xref: /aosp_15_r20/external/armnn/src/backends/neon/workloads/NeonResizeWorkload.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "NeonResizeWorkload.hpp"
7 
8 #include "NeonWorkloadUtils.hpp"
9 
10 #include <aclCommon/ArmComputeUtils.hpp>
11 #include <aclCommon/ArmComputeTensorUtils.hpp>
12 #include <armnn/utility/PolymorphicDowncast.hpp>
13 #include <armnn/backends/TensorHandle.hpp>
14 
15 #include <neon/NeonTensorHandle.hpp>
16 
17 using namespace armnn::armcomputetensorutils;
18 
19 namespace armnn
20 {
21 
NeonResizeWorkloadValidate(const TensorInfo & input,const TensorInfo & output,const ResizeDescriptor & descriptor)22 arm_compute::Status NeonResizeWorkloadValidate(const TensorInfo& input,
23                                                const TensorInfo& output,
24                                                const ResizeDescriptor& descriptor)
25 {
26     arm_compute::TensorInfo aclInputInfo  = BuildArmComputeTensorInfo(input);
27     arm_compute::TensorInfo aclOutputInfo = BuildArmComputeTensorInfo(output);
28 
29     arm_compute::DataLayout aclDataLayout = ConvertDataLayout(descriptor.m_DataLayout);
30     aclInputInfo.set_data_layout(aclDataLayout);
31     aclOutputInfo.set_data_layout(aclDataLayout);
32 
33     arm_compute::InterpolationPolicy aclInterpolationPolicy =
34             ConvertResizeMethodToAclInterpolationPolicy(descriptor.m_Method);
35 
36     arm_compute::SamplingPolicy samplingPolicy = descriptor.m_HalfPixelCenters ? arm_compute::SamplingPolicy::CENTER :
37                                                                                  arm_compute::SamplingPolicy::TOP_LEFT;
38 
39     bool usePadding = false;
40 
41     return arm_compute::NEScale::validate(&aclInputInfo,
42                                           &aclOutputInfo,
43                                           arm_compute::ScaleKernelInfo(aclInterpolationPolicy,
44                                                                        arm_compute::BorderMode::REPLICATE,
45                                                                        arm_compute::PixelValue(0.f),
46                                                                        samplingPolicy,
47                                                                        usePadding,
48                                                                        descriptor.m_AlignCorners));
49 
50 }
51 
NeonResizeWorkload(const ResizeQueueDescriptor & descriptor,const WorkloadInfo & info)52 NeonResizeWorkload::NeonResizeWorkload(const ResizeQueueDescriptor& descriptor,
53                                                        const WorkloadInfo& info)
54     : NeonBaseWorkload<ResizeQueueDescriptor>(descriptor, info)
55 {
56     // Report Profiling Details
57     ARMNN_REPORT_PROFILING_WORKLOAD_DESC("NeonResizeWorkload_Construct",
58                                          descriptor.m_Parameters,
59                                          info,
60                                          this->GetGuid());
61 
62     m_Data.ValidateInputsOutputs("NeonResizeWorkload", 1, 1);
63 
64     arm_compute::ITensor& input = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Inputs[0])->GetTensor();
65     arm_compute::ITensor& output = PolymorphicDowncast<IAclTensorHandle*>(m_Data.m_Outputs[0])->GetTensor();
66 
67     arm_compute::DataLayout aclDataLayout = ConvertDataLayout(m_Data.m_Parameters.m_DataLayout);
68     input.info()->set_data_layout(aclDataLayout);
69     output.info()->set_data_layout(aclDataLayout);
70 
71     arm_compute::InterpolationPolicy aclInterpolationPolicy =
72             ConvertResizeMethodToAclInterpolationPolicy(descriptor.m_Parameters.m_Method);
73 
74     arm_compute::SamplingPolicy samplingPolicy = descriptor.m_Parameters.m_HalfPixelCenters
75                                                  ? arm_compute::SamplingPolicy::CENTER
76                                                  : arm_compute::SamplingPolicy::TOP_LEFT;
77 
78     bool usePadding = false;
79 
80     m_ResizeLayer.configure(&input,
81                             &output,
82                             arm_compute::ScaleKernelInfo(aclInterpolationPolicy,
83                                                          arm_compute::BorderMode::REPLICATE,
84                                                          arm_compute::PixelValue(0.f),
85                                                          samplingPolicy,
86                                                          usePadding,
87                                                          descriptor.m_Parameters.m_AlignCorners));
88 };
89 
Execute() const90 void NeonResizeWorkload::Execute() const
91 {
92     ARMNN_SCOPED_PROFILING_EVENT_NEON_GUID("NeonResizeWorkload_Execute", this->GetGuid());
93     m_ResizeLayer.run();
94 }
95 
96 } //namespace armnn
97