xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/SpaceToDepthTestImpl.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SpaceToDepthTestImpl.hpp"
7 
8 #include <armnnUtils/QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
12 #include <armnnUtils/Permute.hpp>
13 
14 #include <armnnTestUtils/TensorCopyUtils.hpp>
15 #include <armnnTestUtils/WorkloadTestUtils.hpp>
16 
17 #include <armnnTestUtils/TensorHelpers.hpp>
18 
19 namespace
20 {
21 
22 template<typename T>
SpaceToDepthTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::TensorInfo & inputTensorInfo,armnn::TensorInfo & outputTensorInfo,std::vector<float> & inputData,std::vector<float> & outputExpectedData,armnn::SpaceToDepthQueueDescriptor descriptor,const float qScale=1.0f,const int32_t qOffset=0)23 LayerTestResult<T, 4> SpaceToDepthTestImpl(
24     armnn::IWorkloadFactory& workloadFactory,
25     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26     const armnn::ITensorHandleFactory& tensorHandleFactory,
27     armnn::TensorInfo& inputTensorInfo,
28     armnn::TensorInfo& outputTensorInfo,
29     std::vector<float>& inputData,
30     std::vector<float>& outputExpectedData,
31     armnn::SpaceToDepthQueueDescriptor descriptor,
32     const float qScale = 1.0f,
33     const int32_t qOffset = 0)
34 {
35     IgnoreUnused(memoryManager);
36     const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
37 
38     if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
39     {
40         inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
41         outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
42 
43         std::vector<float> inputTmp(inputData.size());
44         armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
45             inputData.data(), inputTmp.data(), sizeof(float));
46         inputData = inputTmp;
47 
48         std::vector<float> outputTmp(outputExpectedData.size());
49         armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
50             outputExpectedData.data(), outputTmp.data(), sizeof(float));
51         outputExpectedData = outputTmp;
52     }
53 
54     if(armnn::IsQuantizedType<T>())
55     {
56         inputTensorInfo.SetQuantizationScale(qScale);
57         inputTensorInfo.SetQuantizationOffset(qOffset);
58         outputTensorInfo.SetQuantizationScale(qScale);
59         outputTensorInfo.SetQuantizationOffset(qOffset);
60     }
61 
62     std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
63     std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset);
64     std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
65 
66     std::unique_ptr<armnn::ITensorHandle> inputHandle  = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
67     std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
68 
69     armnn::WorkloadInfo info;
70     AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
71     AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
72 
73     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::SpaceToDepth,
74                                                                                 descriptor,
75                                                                                 info);
76 
77     inputHandle->Allocate();
78     outputHandle->Allocate();
79 
80     CopyDataToITensorHandle(inputHandle.get(), input.data());
81 
82     workload->Execute();
83 
84     CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
85 
86     return LayerTestResult<T, 4>(actualOutput,
87                                  expectedOutput,
88                                  outputHandle->GetShape(),
89                                  outputTensorInfo.GetShape());
90 }
91 
92 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SpaceToDepthSimpleTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)93 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
94     armnn::IWorkloadFactory& workloadFactory,
95     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
96     const armnn::ITensorHandleFactory& tensorHandleFactory,
97     armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
98 {
99     unsigned int inputShape[] = {1, 2, 2, 1};
100     unsigned int outputShape[] = {1, 1, 1, 4};
101 
102     std::vector<float> input = std::vector<float>(
103     {
104         1.0f, 2.0f, 3.0f, 4.0f
105     });
106 
107     std::vector<float> outputExpected = std::vector<float>(
108     {
109         1.0f, 2.0f, 3.0f, 4.0f
110     });
111 
112     armnn::TensorInfo inputTensorInfo;
113     armnn::TensorInfo outputTensorInfo;
114 
115     armnn::SpaceToDepthQueueDescriptor desc;
116     desc.m_Parameters.m_DataLayout = dataLayout;
117     desc.m_Parameters.m_BlockSize = 2;
118 
119     inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
120     outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
121 
122     return SpaceToDepthTestImpl<T>(
123         workloadFactory, memoryManager, tensorHandleFactory,
124         inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
125 }
126 
127 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SpaceToDepthSimpleTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)128 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
129     armnn::IWorkloadFactory& workloadFactory,
130     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
131     const armnn::ITensorHandleFactory& tensorHandleFactory,
132     armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
133 {
134     unsigned int inputShape[]  = {1, 2, 2, 2};
135     unsigned int outputShape[] = {1, 1, 1, 8};
136 
137     std::vector<float> input = std::vector<float>(
138     {
139         1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
140     });
141 
142     std::vector<float> outputExpected = std::vector<float>(
143     {
144         1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
145     });
146 
147     armnn::TensorInfo inputTensorInfo;
148     armnn::TensorInfo outputTensorInfo;
149 
150     armnn::SpaceToDepthQueueDescriptor desc;
151     desc.m_Parameters.m_DataLayout = dataLayout;
152     desc.m_Parameters.m_BlockSize = 2;
153 
154     inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
155     outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
156 
157     return SpaceToDepthTestImpl<T>(
158         workloadFactory, memoryManager, tensorHandleFactory,
159         inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
160 }
161 
162 } // anonymous namespace
163 
SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)164 LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
165     armnn::IWorkloadFactory& workloadFactory,
166     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
167     const armnn::ITensorHandleFactory& tensorHandleFactory)
168 {
169     return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
170         workloadFactory,
171         memoryManager,
172         tensorHandleFactory);
173 }
174 
SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)175 LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
176     armnn::IWorkloadFactory& workloadFactory,
177     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
178     const armnn::ITensorHandleFactory& tensorHandleFactory)
179 {
180     return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
181         workloadFactory,
182         memoryManager,
183         tensorHandleFactory,
184         armnn::DataLayout::NCHW);
185 }
186 
SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)187 LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
188     armnn::IWorkloadFactory& workloadFactory,
189     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
190     const armnn::ITensorHandleFactory& tensorHandleFactory)
191 {
192     return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
193         workloadFactory,
194         memoryManager,
195         tensorHandleFactory);
196 }
197 
SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)198 LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
199     armnn::IWorkloadFactory& workloadFactory,
200     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
201     const armnn::ITensorHandleFactory& tensorHandleFactory)
202 {
203     return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
204         workloadFactory,
205         memoryManager,
206         tensorHandleFactory,
207         armnn::DataLayout::NCHW);
208 }
209 
SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)210 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
211     armnn::IWorkloadFactory& workloadFactory,
212     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
213     const armnn::ITensorHandleFactory& tensorHandleFactory)
214 {
215     return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
216         workloadFactory,
217         memoryManager,
218         tensorHandleFactory);
219 }
220 
SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)221 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
222     armnn::IWorkloadFactory& workloadFactory,
223     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
224     const armnn::ITensorHandleFactory& tensorHandleFactory)
225 {
226     return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
227         workloadFactory,
228         memoryManager,
229         tensorHandleFactory,
230         armnn::DataLayout::NCHW);
231 }
232 
SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)233 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
234     armnn::IWorkloadFactory& workloadFactory,
235     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
236     const armnn::ITensorHandleFactory& tensorHandleFactory)
237 {
238     return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
239         workloadFactory,
240         memoryManager,
241         tensorHandleFactory);
242 }
243 
SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)244 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
245     armnn::IWorkloadFactory& workloadFactory,
246     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
247     const armnn::ITensorHandleFactory& tensorHandleFactory)
248 {
249     return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
250         workloadFactory,
251         memoryManager,
252         tensorHandleFactory,
253         armnn::DataLayout::NCHW);
254 }
255 
SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)256 LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
257     armnn::IWorkloadFactory& workloadFactory,
258     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
259     const armnn::ITensorHandleFactory& tensorHandleFactory)
260 {
261     return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
262         workloadFactory,
263         memoryManager,
264         tensorHandleFactory);
265 }
266 
SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)267 LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
268     armnn::IWorkloadFactory& workloadFactory,
269     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
270     const armnn::ITensorHandleFactory& tensorHandleFactory)
271 {
272     return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
273         workloadFactory,
274         memoryManager,
275         tensorHandleFactory,
276         armnn::DataLayout::NCHW);
277 }
278