blob: ee4f1b366053c44a43afd046b704a1ce565a7176 [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
61 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDepthToSpace(descriptor, info);
62
63 inputHandle->Allocate();
64 outputHandle->Allocate();
65
Sadik Armagan483c8112021-06-01 09:24:52 +010066 CopyDataToITensorHandle(inputHandle.get(), input.data());
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010067
68 workload->Execute();
69
Sadik Armagan483c8112021-06-01 09:24:52 +010070 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
71
72 return LayerTestResult<T, 4>(actualOutput,
73 expectedOutput,
74 outputHandle->GetShape(),
75 outputInfo.GetShape());
Aron Virginas-Tar73f66422019-09-23 19:11:59 +010076}
77
78} // anonymous namespace
79
80template<armnn::DataType ArmnnType, typename T>
81LayerTestResult<T, 4> DepthToSpaceTest1(
82 armnn::IWorkloadFactory& workloadFactory,
83 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
84 armnn::DataLayout dataLayout)
85{
86 unsigned int inputShape[] = { 1, 1, 1, 8 };
87 unsigned int outputShape[] = { 1, 2, 2, 2 };
88
89 // in:
90 // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
91 //
92 // out:
93 // [[[[1, 2, 3], [4, 5, 6]],
94 // [[7, 8, 9], [10, 11, 12]]]]
95
96 std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
97 std::vector<float> expectedOutput = input;
98
99 armnn::DepthToSpaceQueueDescriptor desc;
100 desc.m_Parameters.m_DataLayout = dataLayout;
101 desc.m_Parameters.m_BlockSize = 2;
102
103 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
104 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
105
106 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
107}
108
109template<armnn::DataType ArmnnType, typename T>
110LayerTestResult<T, 4> DepthToSpaceTest2(
111 armnn::IWorkloadFactory& workloadFactory,
112 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
113 armnn::DataLayout dataLayout)
114{
115 unsigned int inputShape[] = { 1, 2, 2, 4 };
116 unsigned int outputShape[] = { 1, 4, 4, 1 };
117
118 // in:
119 // [[[[1, 2, 3, 4],
120 // [5, 6, 7, 8]],
121 // [[9, 10, 11, 12],
122 // [13, 14, 15, 16]]]]
123 //
124 // out:
125 // [[[ [1], [2], [5], [6]],
126 // [ [3], [4], [7], [8]],
127 // [ [9], [10], [13], [14]],
128 // [ [11], [12], [15], [16]]]]
129
130 std::vector<float> input =
131 {
132 1.f, 2.f, 3.f, 4.f,
133
134 5.f, 6.f, 7.f, 8.f,
135
136 9.f, 10.f, 11.f, 12.f,
137
138 13.f, 14.f, 15.f, 16.f
139 };
140
141 std::vector<float> expectedOutput
142 {
143 1.f, 2.f, 5.f, 6.f,
144 3.f, 4.f, 7.f, 8.f,
145 9.f, 10.f, 13.f, 14.f,
146 11.f, 12.f, 15.f, 16.f
147 };
148
149 armnn::DepthToSpaceQueueDescriptor desc;
150 desc.m_Parameters.m_DataLayout = dataLayout;
151 desc.m_Parameters.m_BlockSize = 2;
152
153 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
154 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
155
156 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
157}
158
159template<armnn::DataType ArmnnType, typename T>
160LayerTestResult<T, 4> DepthToSpaceTest3(
161 armnn::IWorkloadFactory& workloadFactory,
162 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
163 armnn::DataLayout dataLayout)
164{
165 unsigned int inputShape[] = { 2, 1, 1, 4 };
166 unsigned int outputShape[] = { 2, 2, 2, 1 };
167
168 std::vector<float> input =
169 {
170 1.f, 2.f, 3.f, 4.f, // batch 0
171 5.f, 6.f, 7.f, 8.f // batch 1
172 };
173
174 std::vector<float> expectedOutput = input;
175
176 armnn::DepthToSpaceQueueDescriptor desc;
177 desc.m_Parameters.m_DataLayout = dataLayout;
178 desc.m_Parameters.m_BlockSize = 2;
179
180 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
181 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
182
183 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
184}
185
186template<armnn::DataType ArmnnType, typename T>
187LayerTestResult<T, 4> DepthToSpaceTest4(
188 armnn::IWorkloadFactory& workloadFactory,
189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
190 armnn::DataLayout dataLayout)
191{
192 unsigned int inputShape[] = { 2, 2, 2, 4 };
193 unsigned int outputShape[] = { 2, 4, 4, 1 };
194
195 std::vector<float> input =
196 {
197 1.f, 2.f, 3.f, 4.f,
198
199 5.f, 6.f, 7.f, 8.f,
200
201 9.f, 10.f, 11.f, 12.f,
202
203 13.f, 14.f, 15.f, 16.f,
204
205
206 17.f, 18.f, 19.f, 20.f,
207
208 21.f, 22.f, 23.f, 24.f,
209
210 25.f, 26.f, 27.f, 28.f,
211
212 29.f, 30.f, 31.f, 32.f
213 };
214
215 std::vector<float> expectedOutput
216 {
217 1.f, 2.f, 5.f, 6.f,
218 3.f, 4.f, 7.f, 8.f,
219 9.f, 10.f, 13.f, 14.f,
220 11.f, 12.f, 15.f, 16.f,
221
222
223 17.f, 18.f, 21.f, 22.f,
224 19.f, 20.f, 23.f, 24.f,
225 25.f, 26.f, 29.f, 30.f,
226 27.f, 28.f, 31.f, 32.f
227 };
228
229 armnn::DepthToSpaceQueueDescriptor desc;
230 desc.m_Parameters.m_DataLayout = dataLayout;
231 desc.m_Parameters.m_BlockSize = 2;
232
233 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
234 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
235
236 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
237}
238
239// Float32
240template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
241DepthToSpaceTest1<armnn::DataType::Float32>(
242 armnn::IWorkloadFactory& workloadFactory,
243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
244 armnn::DataLayout dataLayout);
245
246template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
247DepthToSpaceTest2<armnn::DataType::Float32>(
248 armnn::IWorkloadFactory& workloadFactory,
249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
250 armnn::DataLayout dataLayout);
251
252template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
253DepthToSpaceTest3<armnn::DataType::Float32>(
254 armnn::IWorkloadFactory& workloadFactory,
255 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
256 armnn::DataLayout dataLayout);
257
258template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
259DepthToSpaceTest4<armnn::DataType::Float32>(
260 armnn::IWorkloadFactory& workloadFactory,
261 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
262 armnn::DataLayout dataLayout);
263
264// Float16
265template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
266DepthToSpaceTest1<armnn::DataType::Float16>(
267 armnn::IWorkloadFactory& workloadFactory,
268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
269 armnn::DataLayout dataLayout);
270
271template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
272DepthToSpaceTest2<armnn::DataType::Float16>(
273 armnn::IWorkloadFactory& workloadFactory,
274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
275 armnn::DataLayout dataLayout);
276
277template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
278DepthToSpaceTest3<armnn::DataType::Float16>(
279 armnn::IWorkloadFactory& workloadFactory,
280 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
281 armnn::DataLayout dataLayout);
282
283template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
284DepthToSpaceTest4<armnn::DataType::Float16>(
285 armnn::IWorkloadFactory& workloadFactory,
286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
287 armnn::DataLayout dataLayout);
288
289// QuantisedAsymm8
Derek Lambertif90c56d2020-01-10 17:14:08 +0000290template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
291DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100292 armnn::IWorkloadFactory& workloadFactory,
293 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
294 armnn::DataLayout dataLayout);
295
Derek Lambertif90c56d2020-01-10 17:14:08 +0000296template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
297DepthToSpaceTest2<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100298 armnn::IWorkloadFactory& workloadFactory,
299 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
300 armnn::DataLayout dataLayout);
301
Derek Lambertif90c56d2020-01-10 17:14:08 +0000302template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
303DepthToSpaceTest3<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100304 armnn::IWorkloadFactory& workloadFactory,
305 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
306 armnn::DataLayout dataLayout);
307
Derek Lambertif90c56d2020-01-10 17:14:08 +0000308template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
309DepthToSpaceTest4<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100310 armnn::IWorkloadFactory& workloadFactory,
311 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
312 armnn::DataLayout dataLayout);
313
Sadik Armagan303980c2020-04-17 12:45:14 +0100314// QuantisedAsymmS8
315template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
316DepthToSpaceTest1<armnn::DataType::QAsymmS8>(
317 armnn::IWorkloadFactory& workloadFactory,
318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
319 armnn::DataLayout dataLayout);
320
321template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
322DepthToSpaceTest2<armnn::DataType::QAsymmS8>(
323 armnn::IWorkloadFactory& workloadFactory,
324 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
325 armnn::DataLayout dataLayout);
326
327template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
328DepthToSpaceTest3<armnn::DataType::QAsymmS8>(
329 armnn::IWorkloadFactory& workloadFactory,
330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
331 armnn::DataLayout dataLayout);
332
333template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 4>
334DepthToSpaceTest4<armnn::DataType::QAsymmS8>(
335 armnn::IWorkloadFactory& workloadFactory,
336 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
337 armnn::DataLayout dataLayout);
338
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100339// QuantisedSymm16
Derek Lambertif90c56d2020-01-10 17:14:08 +0000340template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
341DepthToSpaceTest1<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100342 armnn::IWorkloadFactory& workloadFactory,
343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
344 armnn::DataLayout dataLayout);
345
Derek Lambertif90c56d2020-01-10 17:14:08 +0000346template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
347DepthToSpaceTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100348 armnn::IWorkloadFactory& workloadFactory,
349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
350 armnn::DataLayout dataLayout);
351
Derek Lambertif90c56d2020-01-10 17:14:08 +0000352template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
353DepthToSpaceTest3<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100354 armnn::IWorkloadFactory& workloadFactory,
355 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
356 armnn::DataLayout dataLayout);
357
Derek Lambertif90c56d2020-01-10 17:14:08 +0000358template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
359DepthToSpaceTest4<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100360 armnn::IWorkloadFactory& workloadFactory,
361 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
362 armnn::DataLayout dataLayout);