blob: a2a54838449a6c7bbbf9791f0b2298fdc2743cd6 [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
Aron Virginas-Tarf97f6da2019-10-01 18:35:44 +010011#include <backendsCommon/test/DataLayoutUtils.hpp>
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010012#include <backendsCommon/test/TensorCopyUtils.hpp>
13#include <backendsCommon/test/WorkloadTestUtils.hpp>
14
15#include <test/TensorHelpers.hpp>
16
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
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010047 boost::multi_array<T, 4> input =
48 MakeTensor<T, 4>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010049
50 LayerTestResult<T, 4> result(outputInfo);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010051 result.outputExpected =
52 MakeTensor<T, 4>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010053
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010054 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010055 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
56 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010057 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010058
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
78template<armnn::DataType ArmnnType, typename T>
79LayerTestResult<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
107template<armnn::DataType ArmnnType, typename T>
108LayerTestResult<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
157template<armnn::DataType ArmnnType, typename T>
158LayerTestResult<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
184template<armnn::DataType ArmnnType, typename T>
185LayerTestResult<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
238template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
239DepthToSpaceTest1<armnn::DataType::Float32>(
240 armnn::IWorkloadFactory& workloadFactory,
241 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
242 armnn::DataLayout dataLayout);
243
244template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
245DepthToSpaceTest2<armnn::DataType::Float32>(
246 armnn::IWorkloadFactory& workloadFactory,
247 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
248 armnn::DataLayout dataLayout);
249
250template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
251DepthToSpaceTest3<armnn::DataType::Float32>(
252 armnn::IWorkloadFactory& workloadFactory,
253 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
254 armnn::DataLayout dataLayout);
255
256template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
257DepthToSpaceTest4<armnn::DataType::Float32>(
258 armnn::IWorkloadFactory& workloadFactory,
259 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
260 armnn::DataLayout dataLayout);
261
262// Float16
263template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
264DepthToSpaceTest1<armnn::DataType::Float16>(
265 armnn::IWorkloadFactory& workloadFactory,
266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
267 armnn::DataLayout dataLayout);
268
269template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
270DepthToSpaceTest2<armnn::DataType::Float16>(
271 armnn::IWorkloadFactory& workloadFactory,
272 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
273 armnn::DataLayout dataLayout);
274
275template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
276DepthToSpaceTest3<armnn::DataType::Float16>(
277 armnn::IWorkloadFactory& workloadFactory,
278 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
279 armnn::DataLayout dataLayout);
280
281template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
282DepthToSpaceTest4<armnn::DataType::Float16>(
283 armnn::IWorkloadFactory& workloadFactory,
284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
285 armnn::DataLayout dataLayout);
286
287// QuantisedAsymm8
Derek Lambertif90c56d2020-01-10 17:14:08 +0000288template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
289DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100290 armnn::IWorkloadFactory& workloadFactory,
291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
292 armnn::DataLayout dataLayout);
293
Derek Lambertif90c56d2020-01-10 17:14:08 +0000294template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
295DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100296 armnn::IWorkloadFactory& workloadFactory,
297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
298 armnn::DataLayout dataLayout);
299
Derek Lambertif90c56d2020-01-10 17:14:08 +0000300template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
301DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100302 armnn::IWorkloadFactory& workloadFactory,
303 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
304 armnn::DataLayout dataLayout);
305
Derek Lambertif90c56d2020-01-10 17:14:08 +0000306template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
307DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100308 armnn::IWorkloadFactory& workloadFactory,
309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
310 armnn::DataLayout dataLayout);
311
Sadik Armagan303980c2020-04-17 12:45:14 +0100312// QuantisedAsymmS8
313template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
314DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
315 armnn::IWorkloadFactory& workloadFactory,
316 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
317 armnn::DataLayout dataLayout);
318
319template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
320DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
321 armnn::IWorkloadFactory& workloadFactory,
322 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
323 armnn::DataLayout dataLayout);
324
325template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
326DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
329 armnn::DataLayout dataLayout);
330
331template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
332DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
333 armnn::IWorkloadFactory& workloadFactory,
334 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
335 armnn::DataLayout dataLayout);
336
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100337// QuantisedSymm16
Derek Lambertif90c56d2020-01-10 17:14:08 +0000338template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
339DepthToSpaceTest1<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
342 armnn::DataLayout dataLayout);
343
Derek Lambertif90c56d2020-01-10 17:14:08 +0000344template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
345DepthToSpaceTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100346 armnn::IWorkloadFactory& workloadFactory,
347 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
348 armnn::DataLayout dataLayout);
349
Derek Lambertif90c56d2020-01-10 17:14:08 +0000350template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
351DepthToSpaceTest3<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100352 armnn::IWorkloadFactory& workloadFactory,
353 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
354 armnn::DataLayout dataLayout);
355
Derek Lambertif90c56d2020-01-10 17:14:08 +0000356template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
357DepthToSpaceTest4<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100358 armnn::IWorkloadFactory& workloadFactory,
359 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
360 armnn::DataLayout dataLayout);