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