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 <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10
11
12 #include <armnnUtils/Permute.hpp>
13
14 #include <backendsCommon/test/TensorCopyUtils.hpp>
15 #include <backendsCommon/test/WorkloadTestUtils.hpp>
16
17 #include <test/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 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo,
63 armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
64
65 LayerTestResult<T, 4> ret(outputTensorInfo);
66 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo,
67 armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
68
69 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
70 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
71
72 armnn::WorkloadInfo info;
73 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
74 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
75
76 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
77
78 inputHandle->Allocate();
79 outputHandle->Allocate();
80
81 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
82
83 workload->Execute();
84
85 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
86
87 return ret;
88 }
89
90 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)91 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
92 armnn::IWorkloadFactory& workloadFactory,
93 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
94 const armnn::ITensorHandleFactory& tensorHandleFactory,
95 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
96 {
97 unsigned int inputShape[] = {1, 2, 2, 1};
98 unsigned int outputShape[] = {1, 1, 1, 4};
99
100 std::vector<float> input = std::vector<float>(
101 {
102 1.0f, 2.0f, 3.0f, 4.0f
103 });
104
105 std::vector<float> outputExpected = std::vector<float>(
106 {
107 1.0f, 2.0f, 3.0f, 4.0f
108 });
109
110 armnn::TensorInfo inputTensorInfo;
111 armnn::TensorInfo outputTensorInfo;
112
113 armnn::SpaceToDepthQueueDescriptor desc;
114 desc.m_Parameters.m_DataLayout = dataLayout;
115 desc.m_Parameters.m_BlockSize = 2;
116
117 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
118 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
119
120 return SpaceToDepthTestImpl<T>(
121 workloadFactory, memoryManager, tensorHandleFactory,
122 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
123 }
124
125 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)126 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
127 armnn::IWorkloadFactory& workloadFactory,
128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
129 const armnn::ITensorHandleFactory& tensorHandleFactory,
130 armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
131 {
132 unsigned int inputShape[] = {1, 2, 2, 2};
133 unsigned int outputShape[] = {1, 1, 1, 8};
134
135 std::vector<float> input = std::vector<float>(
136 {
137 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
138 });
139
140 std::vector<float> outputExpected = std::vector<float>(
141 {
142 1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
143 });
144
145 armnn::TensorInfo inputTensorInfo;
146 armnn::TensorInfo outputTensorInfo;
147
148 armnn::SpaceToDepthQueueDescriptor desc;
149 desc.m_Parameters.m_DataLayout = dataLayout;
150 desc.m_Parameters.m_BlockSize = 2;
151
152 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
153 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
154
155 return SpaceToDepthTestImpl<T>(
156 workloadFactory, memoryManager, tensorHandleFactory,
157 inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
158 }
159
160 } // anonymous namespace
161
SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)162 LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
163 armnn::IWorkloadFactory& workloadFactory,
164 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
165 const armnn::ITensorHandleFactory& tensorHandleFactory)
166 {
167 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
168 workloadFactory,
169 memoryManager,
170 tensorHandleFactory);
171 }
172
SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)173 LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
174 armnn::IWorkloadFactory& workloadFactory,
175 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
176 const armnn::ITensorHandleFactory& tensorHandleFactory)
177 {
178 return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
179 workloadFactory,
180 memoryManager,
181 tensorHandleFactory,
182 armnn::DataLayout::NCHW);
183 }
184
SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)185 LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
186 armnn::IWorkloadFactory& workloadFactory,
187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188 const armnn::ITensorHandleFactory& tensorHandleFactory)
189 {
190 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
191 workloadFactory,
192 memoryManager,
193 tensorHandleFactory);
194 }
195
SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)196 LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
197 armnn::IWorkloadFactory& workloadFactory,
198 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
199 const armnn::ITensorHandleFactory& tensorHandleFactory)
200 {
201 return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
202 workloadFactory,
203 memoryManager,
204 tensorHandleFactory,
205 armnn::DataLayout::NCHW);
206 }
207
SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)208 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
209 armnn::IWorkloadFactory& workloadFactory,
210 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
211 const armnn::ITensorHandleFactory& tensorHandleFactory)
212 {
213 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
214 workloadFactory,
215 memoryManager,
216 tensorHandleFactory);
217 }
218
SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)219 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
220 armnn::IWorkloadFactory& workloadFactory,
221 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
222 const armnn::ITensorHandleFactory& tensorHandleFactory)
223 {
224 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
225 workloadFactory,
226 memoryManager,
227 tensorHandleFactory,
228 armnn::DataLayout::NCHW);
229 }
230
SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)231 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
232 armnn::IWorkloadFactory& workloadFactory,
233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
234 const armnn::ITensorHandleFactory& tensorHandleFactory)
235 {
236 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
237 workloadFactory,
238 memoryManager,
239 tensorHandleFactory);
240 }
241
SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)242 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
243 armnn::IWorkloadFactory& workloadFactory,
244 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
245 const armnn::ITensorHandleFactory& tensorHandleFactory)
246 {
247 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
248 workloadFactory,
249 memoryManager,
250 tensorHandleFactory,
251 armnn::DataLayout::NCHW);
252 }
253
SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)254 LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
255 armnn::IWorkloadFactory& workloadFactory,
256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
257 const armnn::ITensorHandleFactory& tensorHandleFactory)
258 {
259 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
260 workloadFactory,
261 memoryManager,
262 tensorHandleFactory);
263 }
264
SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)265 LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
266 armnn::IWorkloadFactory& workloadFactory,
267 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268 const armnn::ITensorHandleFactory& tensorHandleFactory)
269 {
270 return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
271 workloadFactory,
272 memoryManager,
273 tensorHandleFactory,
274 armnn::DataLayout::NCHW);
275 }
276