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