blob: 4d4a6bc1565f9c2281cc5087ea7c2e55df07da91 [file] [log] [blame]
Aron Virginas-Tar73f66422019-09-23 19:11:59 +01001//
2// Copyright © 2019 Arm Ltd. All rights reserved.
3// 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
54 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputInfo);
55 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
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.CreateDepthToSpace(descriptor, info);
62
63 inputHandle->Allocate();
64 outputHandle->Allocate();
65
66 CopyDataToITensorHandle(inputHandle.get(), input.origin());
67
68 workload->Execute();
69
70 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
71 return result;
72}
73
74} // anonymous namespace
75
76template<armnn::DataType ArmnnType, typename T>
77LayerTestResult<T, 4> DepthToSpaceTest1(
78 armnn::IWorkloadFactory& workloadFactory,
79 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
80 armnn::DataLayout dataLayout)
81{
82 unsigned int inputShape[] = { 1, 1, 1, 8 };
83 unsigned int outputShape[] = { 1, 2, 2, 2 };
84
85 // in:
86 // [[[[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]]]
87 //
88 // out:
89 // [[[[1, 2, 3], [4, 5, 6]],
90 // [[7, 8, 9], [10, 11, 12]]]]
91
92 std::vector<float> input = { 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f };
93 std::vector<float> expectedOutput = input;
94
95 armnn::DepthToSpaceQueueDescriptor desc;
96 desc.m_Parameters.m_DataLayout = dataLayout;
97 desc.m_Parameters.m_BlockSize = 2;
98
99 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
100 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
101
102 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
103}
104
105template<armnn::DataType ArmnnType, typename T>
106LayerTestResult<T, 4> DepthToSpaceTest2(
107 armnn::IWorkloadFactory& workloadFactory,
108 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
109 armnn::DataLayout dataLayout)
110{
111 unsigned int inputShape[] = { 1, 2, 2, 4 };
112 unsigned int outputShape[] = { 1, 4, 4, 1 };
113
114 // in:
115 // [[[[1, 2, 3, 4],
116 // [5, 6, 7, 8]],
117 // [[9, 10, 11, 12],
118 // [13, 14, 15, 16]]]]
119 //
120 // out:
121 // [[[ [1], [2], [5], [6]],
122 // [ [3], [4], [7], [8]],
123 // [ [9], [10], [13], [14]],
124 // [ [11], [12], [15], [16]]]]
125
126 std::vector<float> input =
127 {
128 1.f, 2.f, 3.f, 4.f,
129
130 5.f, 6.f, 7.f, 8.f,
131
132 9.f, 10.f, 11.f, 12.f,
133
134 13.f, 14.f, 15.f, 16.f
135 };
136
137 std::vector<float> expectedOutput
138 {
139 1.f, 2.f, 5.f, 6.f,
140 3.f, 4.f, 7.f, 8.f,
141 9.f, 10.f, 13.f, 14.f,
142 11.f, 12.f, 15.f, 16.f
143 };
144
145 armnn::DepthToSpaceQueueDescriptor desc;
146 desc.m_Parameters.m_DataLayout = dataLayout;
147 desc.m_Parameters.m_BlockSize = 2;
148
149 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
150 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
151
152 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
153}
154
155template<armnn::DataType ArmnnType, typename T>
156LayerTestResult<T, 4> DepthToSpaceTest3(
157 armnn::IWorkloadFactory& workloadFactory,
158 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
159 armnn::DataLayout dataLayout)
160{
161 unsigned int inputShape[] = { 2, 1, 1, 4 };
162 unsigned int outputShape[] = { 2, 2, 2, 1 };
163
164 std::vector<float> input =
165 {
166 1.f, 2.f, 3.f, 4.f, // batch 0
167 5.f, 6.f, 7.f, 8.f // batch 1
168 };
169
170 std::vector<float> expectedOutput = input;
171
172 armnn::DepthToSpaceQueueDescriptor desc;
173 desc.m_Parameters.m_DataLayout = dataLayout;
174 desc.m_Parameters.m_BlockSize = 2;
175
176 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
177 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
178
179 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
180}
181
182template<armnn::DataType ArmnnType, typename T>
183LayerTestResult<T, 4> DepthToSpaceTest4(
184 armnn::IWorkloadFactory& workloadFactory,
185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
186 armnn::DataLayout dataLayout)
187{
188 unsigned int inputShape[] = { 2, 2, 2, 4 };
189 unsigned int outputShape[] = { 2, 4, 4, 1 };
190
191 std::vector<float> input =
192 {
193 1.f, 2.f, 3.f, 4.f,
194
195 5.f, 6.f, 7.f, 8.f,
196
197 9.f, 10.f, 11.f, 12.f,
198
199 13.f, 14.f, 15.f, 16.f,
200
201
202 17.f, 18.f, 19.f, 20.f,
203
204 21.f, 22.f, 23.f, 24.f,
205
206 25.f, 26.f, 27.f, 28.f,
207
208 29.f, 30.f, 31.f, 32.f
209 };
210
211 std::vector<float> expectedOutput
212 {
213 1.f, 2.f, 5.f, 6.f,
214 3.f, 4.f, 7.f, 8.f,
215 9.f, 10.f, 13.f, 14.f,
216 11.f, 12.f, 15.f, 16.f,
217
218
219 17.f, 18.f, 21.f, 22.f,
220 19.f, 20.f, 23.f, 24.f,
221 25.f, 26.f, 29.f, 30.f,
222 27.f, 28.f, 31.f, 32.f
223 };
224
225 armnn::DepthToSpaceQueueDescriptor desc;
226 desc.m_Parameters.m_DataLayout = dataLayout;
227 desc.m_Parameters.m_BlockSize = 2;
228
229 armnn::TensorInfo inputInfo(4, inputShape, ArmnnType);
230 armnn::TensorInfo outputInfo(4, outputShape, ArmnnType);
231
232 return DepthToSpaceTestImpl<T>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
233}
234
235// Float32
236template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
237DepthToSpaceTest1<armnn::DataType::Float32>(
238 armnn::IWorkloadFactory& workloadFactory,
239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
240 armnn::DataLayout dataLayout);
241
242template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
243DepthToSpaceTest2<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>
249DepthToSpaceTest3<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>
255DepthToSpaceTest4<armnn::DataType::Float32>(
256 armnn::IWorkloadFactory& workloadFactory,
257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
258 armnn::DataLayout dataLayout);
259
260// Float16
261template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
262DepthToSpaceTest1<armnn::DataType::Float16>(
263 armnn::IWorkloadFactory& workloadFactory,
264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
265 armnn::DataLayout dataLayout);
266
267template LayerTestResult<armnn::ResolveType<armnn::DataType::Float16>, 4>
268DepthToSpaceTest2<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>
274DepthToSpaceTest3<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>
280DepthToSpaceTest4<armnn::DataType::Float16>(
281 armnn::IWorkloadFactory& workloadFactory,
282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
283 armnn::DataLayout dataLayout);
284
285// QuantisedAsymm8
Derek Lambertif90c56d2020-01-10 17:14:08 +0000286template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
287DepthToSpaceTest1<armnn::DataType::QAsymmU8>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100288 armnn::IWorkloadFactory& workloadFactory,
289 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
290 armnn::DataLayout dataLayout);
291
Derek Lambertif90c56d2020-01-10 17:14:08 +0000292template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 4>
293DepthToSpaceTest2<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>
299DepthToSpaceTest3<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>
305DepthToSpaceTest4<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
310// QuantisedSymm16
Derek Lambertif90c56d2020-01-10 17:14:08 +0000311template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
312DepthToSpaceTest1<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100313 armnn::IWorkloadFactory& workloadFactory,
314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
315 armnn::DataLayout dataLayout);
316
Derek Lambertif90c56d2020-01-10 17:14:08 +0000317template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
318DepthToSpaceTest2<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100319 armnn::IWorkloadFactory& workloadFactory,
320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
321 armnn::DataLayout dataLayout);
322
Derek Lambertif90c56d2020-01-10 17:14:08 +0000323template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
324DepthToSpaceTest3<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100325 armnn::IWorkloadFactory& workloadFactory,
326 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
327 armnn::DataLayout dataLayout);
328
Derek Lambertif90c56d2020-01-10 17:14:08 +0000329template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
330DepthToSpaceTest4<armnn::DataType::QSymmS16>(
Aron Virginas-Tar73f66422019-09-23 19:11:59 +0100331 armnn::IWorkloadFactory& workloadFactory,
332 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
333 armnn::DataLayout dataLayout);