• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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