xref: /aosp_15_r20/external/armnn/src/backends/backendsCommon/test/layerTests/DepthToSpaceTestImpl.cpp (revision 89c4ff92f2867872bb9e2354d150bf0c8c502810)
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "DepthToSpaceTestImpl.hpp"
7 
8 #include <armnnUtils/QuantizeHelper.hpp>
9 
10 
11 #include <armnnTestUtils/DataLayoutUtils.hpp>
12 #include <armnnTestUtils/TensorCopyUtils.hpp>
13 #include <armnnTestUtils/WorkloadTestUtils.hpp>
14 
15 #include <armnnTestUtils/TensorHelpers.hpp>
16 
17 namespace
18 {
19 
20 template<typename T>
DepthToSpaceTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::TensorInfo & inputInfo,armnn::TensorInfo & outputInfo,std::vector<float> & inputData,std::vector<float> & expectedOutputData,armnn::DepthToSpaceQueueDescriptor descriptor,const float qScale=1.0f,const int32_t qOffset=0)21 LayerTestResult<T, 4> DepthToSpaceTestImpl(
22     armnn::IWorkloadFactory& workloadFactory,
23     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
24     armnn::TensorInfo& inputInfo,
25     armnn::TensorInfo& outputInfo,
26     std::vector<float>& inputData,
27     std::vector<float>& expectedOutputData,
28     armnn::DepthToSpaceQueueDescriptor descriptor,
29     const float qScale = 1.0f,
30     const int32_t qOffset = 0)
31 {
32     IgnoreUnused(memoryManager);
33     if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
34     {
35         PermuteTensorNhwcToNchw<float>(inputInfo, inputData);
36         PermuteTensorNhwcToNchw<float>(outputInfo, expectedOutputData);
37     }
38 
39     if(armnn::IsQuantizedType<T>())
40     {
41         inputInfo.SetQuantizationScale(qScale);
42         inputInfo.SetQuantizationOffset(qOffset);
43         outputInfo.SetQuantizationScale(qScale);
44         outputInfo.SetQuantizationOffset(qOffset);
45     }
46 
47     std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
48 
49     std::vector<T> actualOutput(outputInfo.GetNumElements());
50     std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
51 
52     ARMNN_NO_DEPRECATE_WARN_BEGIN
53     std::unique_ptr<armnn::ITensorHandle> inputHandle  = workloadFactory.CreateTensorHandle(inputInfo);
54     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
55     ARMNN_NO_DEPRECATE_WARN_END
56 
57     armnn::WorkloadInfo info;
58     AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
59     AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
60 
61     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::DepthToSpace,
62                                                                                 descriptor,
63                                                                                 info);
64 
65     inputHandle->Allocate();
66     outputHandle->Allocate();
67 
68     CopyDataToITensorHandle(inputHandle.get(), input.data());
69 
70     workload->Execute();
71 
72     CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
73 
74     return LayerTestResult<T, 4>(actualOutput,
75                                  expectedOutput,
76                                  outputHandle->GetShape(),
77                                  outputInfo.GetShape());
78 }
79 
80 } // anonymous namespace
81 
82 template<armnn::DataType ArmnnType, typename T>
DepthToSpaceTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::DataLayout dataLayout)83 LayerTestResult<T, 4> DepthToSpaceTest1(
84     armnn::IWorkloadFactory& workloadFactory,
85     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
86     armnn::DataLayout dataLayout)
87 {
88     unsigned int inputShape[]  = { 1, 1, 1, 8 };
89     unsigned int outputShape[] = { 1, 2, 2, 2 };
90 
91     // in:
92     // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
93     //
94     // out:
95     // [[[[1, 2, 3], [4, 5, 6]],
96     //   [[7, 8, 9], [10, 11, 12]]]]
97 
98     std::vector<float> input          = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
99     std::vector<float> expectedOutput = input;
100 
101     armnn::DepthToSpaceQueueDescriptor desc;
102     desc.m_Parameters.m_DataLayout = dataLayout;
103     desc.m_Parameters.m_BlockSize  = 2;
104 
105     armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
106     armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
107 
108     return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
109 }
110 
111 template<armnn::DataType ArmnnType, typename T>
DepthToSpaceTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::DataLayout dataLayout)112 LayerTestResult<T, 4> DepthToSpaceTest2(
113     armnn::IWorkloadFactory& workloadFactory,
114     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
115     armnn::DataLayout dataLayout)
116 {
117     unsigned int inputShape[]  = { 1, 2, 2, 4 };
118     unsigned int outputShape[] = { 1, 4, 4, 1 };
119 
120     // in:
121     // [[[[1, 2, 3, 4],
122     //   [5, 6, 7, 8]],
123     //  [[9, 10, 11, 12],
124     //   [13, 14, 15, 16]]]]
125     //
126     // out:
127     // [[[ [1],   [2],  [5],  [6]],
128     //  [ [3],   [4],  [7],  [8]],
129     //  [ [9],  [10], [13],  [14]],
130     //  [ [11], [12], [15],  [16]]]]
131 
132     std::vector<float> input =
133     {
134         1.f,  2.f,  3.f,  4.f,
135 
136         5.f,  6.f,  7.f,  8.f,
137 
138         9.f, 10.f, 11.f, 12.f,
139 
140         13.f, 14.f, 15.f, 16.f
141     };
142 
143     std::vector<float> expectedOutput
144     {
145          1.f,   2.f,   5.f,   6.f,
146          3.f,   4.f,   7.f,   8.f,
147          9.f,  10.f,  13.f,  14.f,
148         11.f,  12.f,  15.f,  16.f
149     };
150 
151     armnn::DepthToSpaceQueueDescriptor desc;
152     desc.m_Parameters.m_DataLayout = dataLayout;
153     desc.m_Parameters.m_BlockSize  = 2;
154 
155     armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
156     armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
157 
158     return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
159 }
160 
161 template<armnn::DataType ArmnnType, typename T>
DepthToSpaceTest3(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::DataLayout dataLayout)162 LayerTestResult<T, 4> DepthToSpaceTest3(
163     armnn::IWorkloadFactory& workloadFactory,
164     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
165     armnn::DataLayout dataLayout)
166 {
167     unsigned int inputShape[]  = { 2, 1, 1, 4 };
168     unsigned int outputShape[] = { 2, 2, 2, 1 };
169 
170     std::vector<float> input =
171     {
172         1.f, 2.f, 3.f, 4.f, // batch 0
173         5.f, 6.f, 7.f, 8.f  // batch 1
174     };
175 
176     std::vector<float> expectedOutput = input;
177 
178     armnn::DepthToSpaceQueueDescriptor desc;
179     desc.m_Parameters.m_DataLayout = dataLayout;
180     desc.m_Parameters.m_BlockSize  = 2;
181 
182     armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
183     armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
184 
185     return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
186 }
187 
188 template<armnn::DataType ArmnnType, typename T>
DepthToSpaceTest4(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::DataLayout dataLayout)189 LayerTestResult<T, 4> DepthToSpaceTest4(
190     armnn::IWorkloadFactory& workloadFactory,
191     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
192     armnn::DataLayout dataLayout)
193 {
194     unsigned int inputShape[]  = { 2, 2, 2, 4 };
195     unsigned int outputShape[] = { 2, 4, 4, 1 };
196 
197     std::vector<float> input =
198     {
199         1.f,  2.f,  3.f,  4.f,
200 
201         5.f,  6.f,  7.f,  8.f,
202 
203         9.f, 10.f, 11.f, 12.f,
204 
205         13.f, 14.f, 15.f, 16.f,
206 
207 
208         17.f, 18.f, 19.f, 20.f,
209 
210         21.f, 22.f, 23.f, 24.f,
211 
212         25.f, 26.f, 27.f, 28.f,
213 
214         29.f, 30.f, 31.f, 32.f
215     };
216 
217     std::vector<float> expectedOutput
218     {
219          1.f,   2.f,   5.f,   6.f,
220          3.f,   4.f,   7.f,   8.f,
221          9.f,  10.f,  13.f,  14.f,
222         11.f,  12.f,  15.f,  16.f,
223 
224 
225         17.f,  18.f,  21.f,  22.f,
226         19.f,  20.f,  23.f,  24.f,
227         25.f,  26.f,  29.f,  30.f,
228         27.f,  28.f,  31.f,  32.f
229     };
230 
231     armnn::DepthToSpaceQueueDescriptor desc;
232     desc.m_Parameters.m_DataLayout = dataLayout;
233     desc.m_Parameters.m_BlockSize  = 2;
234 
235     armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
236     armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
237 
238     return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
239 }
240 
241 // Float32
242 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
243 DepthToSpaceTest1<armnn::DataType::Float32>(
244     armnn::IWorkloadFactory& workloadFactory,
245     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
246     armnn::DataLayout dataLayout);
247 
248 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
249 DepthToSpaceTest2<armnn::DataType::Float32>(
250     armnn::IWorkloadFactory& workloadFactory,
251     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
252     armnn::DataLayout dataLayout);
253 
254 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
255 DepthToSpaceTest3<armnn::DataType::Float32>(
256     armnn::IWorkloadFactory& workloadFactory,
257     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
258     armnn::DataLayout dataLayout);
259 
260 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
261 DepthToSpaceTest4<armnn::DataType::Float32>(
262     armnn::IWorkloadFactory& workloadFactory,
263     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
264     armnn::DataLayout dataLayout);
265 
266 // Float16
267 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
268 DepthToSpaceTest1<armnn::DataType::Float16>(
269     armnn::IWorkloadFactory& workloadFactory,
270     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
271     armnn::DataLayout dataLayout);
272 
273 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
274 DepthToSpaceTest2<armnn::DataType::Float16>(
275     armnn::IWorkloadFactory& workloadFactory,
276     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
277     armnn::DataLayout dataLayout);
278 
279 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
280 DepthToSpaceTest3<armnn::DataType::Float16>(
281     armnn::IWorkloadFactory& workloadFactory,
282     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
283     armnn::DataLayout dataLayout);
284 
285 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
286 DepthToSpaceTest4<armnn::DataType::Float16>(
287     armnn::IWorkloadFactory& workloadFactory,
288     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
289     armnn::DataLayout dataLayout);
290 
291 // QuantisedAsymm8
292 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
293 DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
294     armnn::IWorkloadFactory& workloadFactory,
295     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
296     armnn::DataLayout dataLayout);
297 
298 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
299 DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
300     armnn::IWorkloadFactory& workloadFactory,
301     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
302     armnn::DataLayout dataLayout);
303 
304 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
305 DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
306     armnn::IWorkloadFactory& workloadFactory,
307     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
308     armnn::DataLayout dataLayout);
309 
310 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
311 DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
312     armnn::IWorkloadFactory& workloadFactory,
313     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
314     armnn::DataLayout dataLayout);
315 
316 // QuantisedAsymmS8
317 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
318 DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
319     armnn::IWorkloadFactory& workloadFactory,
320     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
321     armnn::DataLayout dataLayout);
322 
323 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
324 DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
325     armnn::IWorkloadFactory& workloadFactory,
326     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
327     armnn::DataLayout dataLayout);
328 
329 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
330 DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
331     armnn::IWorkloadFactory& workloadFactory,
332     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
333     armnn::DataLayout dataLayout);
334 
335 template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
336 DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
337     armnn::IWorkloadFactory& workloadFactory,
338     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
339     armnn::DataLayout dataLayout);
340 
341 // QuantisedSymm16
342 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
343 DepthToSpaceTest1<armnn::DataType::QSymmS16>(
344     armnn::IWorkloadFactory& workloadFactory,
345     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
346     armnn::DataLayout dataLayout);
347 
348 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
349 DepthToSpaceTest2<armnn::DataType::QSymmS16>(
350     armnn::IWorkloadFactory& workloadFactory,
351     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
352     armnn::DataLayout dataLayout);
353 
354 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
355 DepthToSpaceTest3<armnn::DataType::QSymmS16>(
356     armnn::IWorkloadFactory& workloadFactory,
357     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
358     armnn::DataLayout dataLayout);
359 
360 template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
361 DepthToSpaceTest4<armnn::DataType::QSymmS16>(
362     armnn::IWorkloadFactory& workloadFactory,
363     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
364     armnn::DataLayout dataLayout);
365