blob: 6476e7b0da29d27bfd3130539a29873c6f40def1 [file] [log] [blame]
Aron Virginas-Tar73f66422019-09-23 19:11:59 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar73f66422019-09-23 19:11:59 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "DepthToSpaceTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar73f66422019-09-23 19:11:59 +01009
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010010
Sadik Armagana097d2a2021-11-24 15:47:28 +000011#include <armnnTestUtils/DataLayoutUtils.hpp>
12#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010014
Sadik Armagana097d2a2021-11-24 15:47:28 +000015#include <TensorHelpers.hpp>
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010016
17namespace
18{
19
20template<typename T>
21LayerTestResult<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{
Jan Eilers8eb25602020-03-09 12:13:48 +000032 IgnoreUnused(memoryManager);
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010033 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
34 {
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010035 PermuteTensorNhwcToNchw<float>(inputInfo, inputData);
36 PermuteTensorNhwcToNchw<float>(outputInfo, expectedOutputData);
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010037 }
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
Sadik Armagan483c8112021-06-01 09:24:52 +010047 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010048
Sadik Armagan483c8112021-06-01 09:24:52 +010049 std::vector<T> actualOutput(outputInfo.GetNumElements());
50 std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset);
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010051
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010052 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010053 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
54 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010055 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010056
57 armnn::WorkloadInfo info;
58 AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
59 AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
60
Teresa Charlin611c7fb2022-01-07 09:47:29 +000061 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::DepthToSpace,
62 descriptor,
63 info);
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010064
65 inputHandle->Allocate();
66 outputHandle->Allocate();
67
Sadik Armagan483c8112021-06-01 09:24:52 +010068 CopyDataToITensorHandle(inputHandle.get(), input.data());
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010069
70 workload->Execute();
71
Sadik Armagan483c8112021-06-01 09:24:52 +010072 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
73
74 return LayerTestResult<T, 4>(actualOutput,
75 expectedOutput,
76 outputHandle->GetShape(),
77 outputInfo.GetShape());
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010078}
79
80} // anonymous namespace
81
82template<armnn::DataType ArmnnType, typename T>
83LayerTestResult<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
111template<armnn::DataType ArmnnType, typename T>
112LayerTestResult<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
161template<armnn::DataType ArmnnType, typename T>
162LayerTestResult<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
188template<armnn::DataType ArmnnType, typename T>
189LayerTestResult<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
242template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
243DepthToSpaceTest1<armnn::DataType::Float32>(
244 armnn::IWorkloadFactory& workloadFactory,
245 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
246 armnn::DataLayout dataLayout);
247
248template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
249DepthToSpaceTest2<armnn::DataType::Float32>(
250 armnn::IWorkloadFactory& workloadFactory,
251 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
252 armnn::DataLayout dataLayout);
253
254template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
255DepthToSpaceTest3<armnn::DataType::Float32>(
256 armnn::IWorkloadFactory& workloadFactory,
257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
258 armnn::DataLayout dataLayout);
259
260template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
261DepthToSpaceTest4<armnn::DataType::Float32>(
262 armnn::IWorkloadFactory& workloadFactory,
263 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
264 armnn::DataLayout dataLayout);
265
266// Float16
267template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
268DepthToSpaceTest1<armnn::DataType::Float16>(
269 armnn::IWorkloadFactory& workloadFactory,
270 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
271 armnn::DataLayout dataLayout);
272
273template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
274DepthToSpaceTest2<armnn::DataType::Float16>(
275 armnn::IWorkloadFactory& workloadFactory,
276 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
277 armnn::DataLayout dataLayout);
278
279template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
280DepthToSpaceTest3<armnn::DataType::Float16>(
281 armnn::IWorkloadFactory& workloadFactory,
282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
283 armnn::DataLayout dataLayout);
284
285template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
286DepthToSpaceTest4<armnn::DataType::Float16>(
287 armnn::IWorkloadFactory& workloadFactory,
288 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
289 armnn::DataLayout dataLayout);
290
291// QuantisedAsymm8
Derek Lambertif90c56d2020-01-10 17:14:08 +0000292template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
293DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100294 armnn::IWorkloadFactory& workloadFactory,
295 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
296 armnn::DataLayout dataLayout);
297
Derek Lambertif90c56d2020-01-10 17:14:08 +0000298template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
299DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100300 armnn::IWorkloadFactory& workloadFactory,
301 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
302 armnn::DataLayout dataLayout);
303
Derek Lambertif90c56d2020-01-10 17:14:08 +0000304template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
305DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100306 armnn::IWorkloadFactory& workloadFactory,
307 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
308 armnn::DataLayout dataLayout);
309
Derek Lambertif90c56d2020-01-10 17:14:08 +0000310template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
311DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100312 armnn::IWorkloadFactory& workloadFactory,
313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
314 armnn::DataLayout dataLayout);
315
Sadik Armagan303980c2020-04-17 12:45:14 +0100316// QuantisedAsymmS8
317template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
318DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
319 armnn::IWorkloadFactory& workloadFactory,
320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
321 armnn::DataLayout dataLayout);
322
323template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
324DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
325 armnn::IWorkloadFactory& workloadFactory,
326 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
327 armnn::DataLayout dataLayout);
328
329template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
330DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
331 armnn::IWorkloadFactory& workloadFactory,
332 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
333 armnn::DataLayout dataLayout);
334
335template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
336DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
337 armnn::IWorkloadFactory& workloadFactory,
338 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
339 armnn::DataLayout dataLayout);
340
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100341// QuantisedSymm16
Derek Lambertif90c56d2020-01-10 17:14:08 +0000342template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
343DepthToSpaceTest1<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100344 armnn::IWorkloadFactory& workloadFactory,
345 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
346 armnn::DataLayout dataLayout);
347
Derek Lambertif90c56d2020-01-10 17:14:08 +0000348template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
349DepthToSpaceTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100350 armnn::IWorkloadFactory& workloadFactory,
351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
352 armnn::DataLayout dataLayout);
353
Derek Lambertif90c56d2020-01-10 17:14:08 +0000354template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
355DepthToSpaceTest3<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100356 armnn::IWorkloadFactory& workloadFactory,
357 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
358 armnn::DataLayout dataLayout);
359
Derek Lambertif90c56d2020-01-10 17:14:08 +0000360template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
361DepthToSpaceTest4<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100362 armnn::IWorkloadFactory& workloadFactory,
363 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
364 armnn::DataLayout dataLayout);