1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "SpaceToDepthTestImpl.hpp"
7
8 #include <armnnUtils/QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10
11
12 #include <armnnUtils/Permute.hpp>
13
14 #include <armnnTestUtils/TensorCopyUtils.hpp>
15 #include <armnnTestUtils/WorkloadTestUtils.hpp>
16
17 #include <armnnTestUtils/TensorHelpers.hpp>
18
19 namespace
20 {
21
22 template<typename T>
SpaceToDepthTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::TensorInfo & inputTensorInfo,armnn::TensorInfo & outputTensorInfo,std::vector<float> & inputData,std::vector<float> & outputExpectedData,armnn::SpaceToDepthQueueDescriptor descriptor,const float qScale=1.0f,const int32_t qOffset=0)23 LayerTestResult<T, 4> SpaceToDepthTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26 const armnn::ITensorHandleFactory& tensorHandleFactory,
27 armnn::TensorInfo& inputTensorInfo,
28 armnn::TensorInfo& outputTensorInfo,
29 std::vector<float>& inputData,
30 std::vector<float>& outputExpectedData,
31 armnn::SpaceToDepthQueueDescriptor descriptor,
32 const float qScale = 1.0f,
33 const int32_t qOffset = 0)
34 {
35 IgnoreUnused(memoryManager);
36 const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
37
38 if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
39 {
40 inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
41 outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
42
43 std::vector<float> inputTmp(inputData.size());
44 armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
45 inputData.data(), inputTmp.data(), sizeof(float));
46 inputData = inputTmp;
47
48 std::vector<float> outputTmp(outputExpectedData.size());
49 armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
50 outputExpectedData.data(), outputTmp.data(), sizeof(float));
51 outputExpectedData = outputTmp;
52 }
53
54 if(armnn::IsQuantizedType<T>())
55 {
56 inputTensorInfo.SetQuantizationScale(qScale);
57 inputTensorInfo.SetQuantizationOffset(qOffset);
58 outputTensorInfo.SetQuantizationScale(qScale);
59 outputTensorInfo.SetQuantizationOffset(qOffset);
60 }
61
62 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
63 std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset);
64 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
65
66 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
67 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
68
69 armnn::WorkloadInfo info;
70 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
71 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
72
73 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::SpaceToDepth,
74 descriptor,
75 info);
76
77 inputHandle->Allocate();
78 outputHandle->Allocate();
79
80 CopyDataToITensorHandle(inputHandle.get(), input.data());
81
82 workload->Execute();
83
84 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
85
86 return LayerTestResult<T, 4>(actualOutput,
87 expectedOutput,
88 outputHandle->GetShape(),
89 outputTensorInfo.GetShape());
90 }
91
92 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SpaceToDepthSimpleTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)93 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
94 armnn::IWorkloadFactory& workloadFactory,
95 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
96 const armnn::ITensorHandleFactory& tensorHandleFactory,
97 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
98 {
99 unsigned int inputShape[] = {1, 2, 2, 1};
100 unsigned int outputShape[] = {1, 1, 1, 4};
101
102 std::vector<float> input = std::vector<float>(
103 {
104 1.0f, 2.0f, 3.0f, 4.0f
105 });
106
107 std::vector<float> outputExpected = std::vector<float>(
108 {
109 1.0f, 2.0f, 3.0f, 4.0f
110 });
111
112 armnn::TensorInfo inputTensorInfo;
113 armnn::TensorInfo outputTensorInfo;
114
115 armnn::SpaceToDepthQueueDescriptor desc;
116 desc.m_Parameters.m_DataLayout = dataLayout;
117 desc.m_Parameters.m_BlockSize = 2;
118
119 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
120 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
121
122 return SpaceToDepthTestImpl<T>(
123 workloadFactory, memoryManager, tensorHandleFactory,
124 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
125 }
126
127 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SpaceToDepthSimpleTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)128 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
129 armnn::IWorkloadFactory& workloadFactory,
130 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
131 const armnn::ITensorHandleFactory& tensorHandleFactory,
132 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
133 {
134 unsigned int inputShape[] = {1, 2, 2, 2};
135 unsigned int outputShape[] = {1, 1, 1, 8};
136
137 std::vector<float> input = std::vector<float>(
138 {
139 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
140 });
141
142 std::vector<float> outputExpected = std::vector<float>(
143 {
144 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
145 });
146
147 armnn::TensorInfo inputTensorInfo;
148 armnn::TensorInfo outputTensorInfo;
149
150 armnn::SpaceToDepthQueueDescriptor desc;
151 desc.m_Parameters.m_DataLayout = dataLayout;
152 desc.m_Parameters.m_BlockSize = 2;
153
154 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
155 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
156
157 return SpaceToDepthTestImpl<T>(
158 workloadFactory, memoryManager, tensorHandleFactory,
159 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
160 }
161
162 } // anonymous namespace
163
SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)164 LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
165 armnn::IWorkloadFactory& workloadFactory,
166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
167 const armnn::ITensorHandleFactory& tensorHandleFactory)
168 {
169 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
170 workloadFactory,
171 memoryManager,
172 tensorHandleFactory);
173 }
174
SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)175 LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
176 armnn::IWorkloadFactory& workloadFactory,
177 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
178 const armnn::ITensorHandleFactory& tensorHandleFactory)
179 {
180 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
181 workloadFactory,
182 memoryManager,
183 tensorHandleFactory,
184 armnn::DataLayout::NCHW);
185 }
186
SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)187 LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
188 armnn::IWorkloadFactory& workloadFactory,
189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
190 const armnn::ITensorHandleFactory& tensorHandleFactory)
191 {
192 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
193 workloadFactory,
194 memoryManager,
195 tensorHandleFactory);
196 }
197
SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)198 LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
199 armnn::IWorkloadFactory& workloadFactory,
200 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
201 const armnn::ITensorHandleFactory& tensorHandleFactory)
202 {
203 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
204 workloadFactory,
205 memoryManager,
206 tensorHandleFactory,
207 armnn::DataLayout::NCHW);
208 }
209
SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)210 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
211 armnn::IWorkloadFactory& workloadFactory,
212 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
213 const armnn::ITensorHandleFactory& tensorHandleFactory)
214 {
215 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
216 workloadFactory,
217 memoryManager,
218 tensorHandleFactory);
219 }
220
SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)221 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
222 armnn::IWorkloadFactory& workloadFactory,
223 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
224 const armnn::ITensorHandleFactory& tensorHandleFactory)
225 {
226 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
227 workloadFactory,
228 memoryManager,
229 tensorHandleFactory,
230 armnn::DataLayout::NCHW);
231 }
232
SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)233 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
234 armnn::IWorkloadFactory& workloadFactory,
235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
236 const armnn::ITensorHandleFactory& tensorHandleFactory)
237 {
238 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
239 workloadFactory,
240 memoryManager,
241 tensorHandleFactory);
242 }
243
SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)244 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
245 armnn::IWorkloadFactory& workloadFactory,
246 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
247 const armnn::ITensorHandleFactory& tensorHandleFactory)
248 {
249 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
250 workloadFactory,
251 memoryManager,
252 tensorHandleFactory,
253 armnn::DataLayout::NCHW);
254 }
255
SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)256 LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
257 armnn::IWorkloadFactory& workloadFactory,
258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
259 const armnn::ITensorHandleFactory& tensorHandleFactory)
260 {
261 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
262 workloadFactory,
263 memoryManager,
264 tensorHandleFactory);
265 }
266
SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)267 LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
268 armnn::IWorkloadFactory& workloadFactory,
269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
270 const armnn::ITensorHandleFactory& tensorHandleFactory)
271 {
272 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
273 workloadFactory,
274 memoryManager,
275 tensorHandleFactory,
276 armnn::DataLayout::NCHW);
277 }
278