1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "DebugTestImpl.hpp"
7
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10
11
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, std::size_t Dim>
DebugTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::TensorInfo & inputTensorInfo,armnn::TensorInfo & outputTensorInfo,std::vector<float> & inputData,std::vector<float> & outputExpectedData,armnn::DebugQueueDescriptor descriptor,const std::string expectedStringOutput,const float qScale=1.0f,const int32_t qOffset=0)21 LayerTestResult<T, Dim> DebugTestImpl(
22 armnn::IWorkloadFactory& workloadFactory,
23 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
24 armnn::TensorInfo& inputTensorInfo,
25 armnn::TensorInfo& outputTensorInfo,
26 std::vector<float>& inputData,
27 std::vector<float>& outputExpectedData,
28 armnn::DebugQueueDescriptor descriptor,
29 const std::string expectedStringOutput,
30 const float qScale = 1.0f,
31 const int32_t qOffset = 0)
32 {
33 IgnoreUnused(memoryManager);
34 if(armnn::IsQuantizedType<T>())
35 {
36 inputTensorInfo.SetQuantizationScale(qScale);
37 inputTensorInfo.SetQuantizationOffset(qOffset);
38
39 outputTensorInfo.SetQuantizationScale(qScale);
40 outputTensorInfo.SetQuantizationOffset(qOffset);
41 }
42
43 boost::multi_array<T, Dim> input =
44 MakeTensor<T, Dim>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
45
46 LayerTestResult<T, Dim> ret(outputTensorInfo);
47 ret.outputExpected =
48 MakeTensor<T, Dim>(outputTensorInfo, armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
49
50 ARMNN_NO_DEPRECATE_WARN_BEGIN
51 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
52 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
53 ARMNN_NO_DEPRECATE_WARN_END
54
55 armnn::WorkloadInfo info;
56 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
57 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
58
59 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDebug(descriptor, info);
60
61 inputHandle->Allocate();
62 outputHandle->Allocate();
63
64 CopyDataToITensorHandle(inputHandle.get(), input.data());
65
66 std::ostringstream oss;
67 std::streambuf* coutStreambuf = std::cout.rdbuf();
68 std::cout.rdbuf(oss.rdbuf());
69
70 ExecuteWorkload(*workload, memoryManager);
71
72 std::cout.rdbuf(coutStreambuf);
73
74 BOOST_TEST(oss.str() == expectedStringOutput);
75
76 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
77
78 return ret;
79 }
80
81 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Debug4dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)82 LayerTestResult<T, 4> Debug4dTest(
83 armnn::IWorkloadFactory& workloadFactory,
84 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
85 {
86 armnn::TensorInfo inputTensorInfo;
87 armnn::TensorInfo outputTensorInfo;
88
89 unsigned int inputShape[] = {1, 2, 2, 3};
90 unsigned int outputShape[] = {1, 2, 2, 3};
91
92 armnn::DebugQueueDescriptor desc;
93 desc.m_Guid = 1;
94 desc.m_LayerName = "TestOutput";
95 desc.m_SlotIndex = 0;
96
97 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
98 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
99
100 std::vector<float> input = std::vector<float>(
101 {
102 1.0f, 2.0f, 3.0f,
103 4.0f, 5.0f, 6.0f,
104 7.0f, 8.0f, 9.0f,
105 10.0f, 11.0f, 12.0f,
106 });
107
108 std::vector<float> outputExpected = std::vector<float>(
109 {
110 1.0f, 2.0f, 3.0f,
111 4.0f, 5.0f, 6.0f,
112 7.0f, 8.0f, 9.0f,
113 10.0f, 11.0f, 12.0f,
114 });
115
116 const std::string expectedStringOutput =
117 "{ \"layerGuid\": 1,"
118 " \"layerName\": \"TestOutput\","
119 " \"outputSlot\": 0,"
120 " \"shape\": [1, 2, 2, 3],"
121 " \"min\": 1, \"max\": 12,"
122 " \"data\": [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]] }\n";
123
124 return DebugTestImpl<T, 4>(workloadFactory,
125 memoryManager,
126 inputTensorInfo,
127 outputTensorInfo,
128 input,
129 outputExpected,
130 desc,
131 expectedStringOutput);
132 }
133
134 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Debug3dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)135 LayerTestResult<T, 3> Debug3dTest(
136 armnn::IWorkloadFactory& workloadFactory,
137 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
138 {
139 armnn::TensorInfo inputTensorInfo;
140 armnn::TensorInfo outputTensorInfo;
141
142 unsigned int inputShape[] = {3, 3, 1};
143 unsigned int outputShape[] = {3, 3, 1};
144
145 armnn::DebugQueueDescriptor desc;
146 desc.m_Guid = 1;
147 desc.m_LayerName = "TestOutput";
148 desc.m_SlotIndex = 0;
149
150 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
151 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
152
153 std::vector<float> input = std::vector<float>(
154 {
155 1.0f, 2.0f, 3.0f,
156 4.0f, 5.0f, 6.0f,
157 7.0f, 8.0f, 9.0f,
158 });
159
160 std::vector<float> outputExpected = std::vector<float>(
161 {
162 1.0f, 2.0f, 3.0f,
163 4.0f, 5.0f, 6.0f,
164 7.0f, 8.0f, 9.0f,
165 });
166
167 const std::string expectedStringOutput =
168 "{ \"layerGuid\": 1,"
169 " \"layerName\": \"TestOutput\","
170 " \"outputSlot\": 0,"
171 " \"shape\": [3, 3, 1],"
172 " \"min\": 1, \"max\": 9,"
173 " \"data\": [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]] }\n";
174
175 return DebugTestImpl<T, 3>(workloadFactory,
176 memoryManager,
177 inputTensorInfo,
178 outputTensorInfo,
179 input,
180 outputExpected,
181 desc,
182 expectedStringOutput);
183 }
184
185 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Debug2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)186 LayerTestResult<T, 2> Debug2dTest(
187 armnn::IWorkloadFactory& workloadFactory,
188 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
189 {
190 armnn::TensorInfo inputTensorInfo;
191 armnn::TensorInfo outputTensorInfo;
192
193 unsigned int inputShape[] = {2, 2};
194 unsigned int outputShape[] = {2, 2};
195
196 armnn::DebugQueueDescriptor desc;
197 desc.m_Guid = 1;
198 desc.m_LayerName = "TestOutput";
199 desc.m_SlotIndex = 0;
200
201 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
202 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
203
204 std::vector<float> input = std::vector<float>(
205 {
206 1.0f, 2.0f,
207 3.0f, 4.0f,
208 });
209
210 std::vector<float> outputExpected = std::vector<float>(
211 {
212 1.0f, 2.0f,
213 3.0f, 4.0f,
214 });
215
216 const std::string expectedStringOutput =
217 "{ \"layerGuid\": 1,"
218 " \"layerName\": \"TestOutput\","
219 " \"outputSlot\": 0,"
220 " \"shape\": [2, 2],"
221 " \"min\": 1, \"max\": 4,"
222 " \"data\": [[1, 2], [3, 4]] }\n";
223
224 return DebugTestImpl<T, 2>(workloadFactory,
225 memoryManager,
226 inputTensorInfo,
227 outputTensorInfo,
228 input,
229 outputExpected,
230 desc,
231 expectedStringOutput);
232 }
233
234 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Debug1dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)235 LayerTestResult<T, 1> Debug1dTest(
236 armnn::IWorkloadFactory& workloadFactory,
237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
238 {
239 armnn::TensorInfo inputTensorInfo;
240 armnn::TensorInfo outputTensorInfo;
241
242 unsigned int inputShape[] = {4};
243 unsigned int outputShape[] = {4};
244
245 armnn::DebugQueueDescriptor desc;
246 desc.m_Guid = 1;
247 desc.m_LayerName = "TestOutput";
248 desc.m_SlotIndex = 0;
249
250 inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
251 outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
252
253 std::vector<float> input = std::vector<float>(
254 {
255 1.0f, 2.0f, 3.0f, 4.0f,
256 });
257
258 std::vector<float> outputExpected = std::vector<float>(
259 {
260 1.0f, 2.0f, 3.0f, 4.0f,
261 });
262
263 const std::string expectedStringOutput =
264 "{ \"layerGuid\": 1,"
265 " \"layerName\": \"TestOutput\","
266 " \"outputSlot\": 0,"
267 " \"shape\": [4],"
268 " \"min\": 1, \"max\": 4,"
269 " \"data\": [1, 2, 3, 4] }\n";
270
271 return DebugTestImpl<T, 1>(workloadFactory,
272 memoryManager,
273 inputTensorInfo,
274 outputTensorInfo,
275 input,
276 outputExpected,
277 desc,
278 expectedStringOutput);
279 }
280
281 } // anonymous namespace
282
Debug4dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)283 LayerTestResult<float, 4> Debug4dFloat32Test(
284 armnn::IWorkloadFactory& workloadFactory,
285 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
286 {
287 return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
288 }
289
Debug3dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)290 LayerTestResult<float, 3> Debug3dFloat32Test(
291 armnn::IWorkloadFactory& workloadFactory,
292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
293 {
294 return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
295 }
296
Debug2dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)297 LayerTestResult<float, 2> Debug2dFloat32Test(
298 armnn::IWorkloadFactory& workloadFactory,
299 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
300 {
301 return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
302 }
303
Debug1dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)304 LayerTestResult<float, 1> Debug1dFloat32Test(
305 armnn::IWorkloadFactory& workloadFactory,
306 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
307 {
308 return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
309 }
310
Debug4dBFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)311 LayerTestResult<armnn::BFloat16, 4> Debug4dBFloat16Test(
312 armnn::IWorkloadFactory& workloadFactory,
313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
314 {
315 return Debug4dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
316 }
317
Debug3dBFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)318 LayerTestResult<armnn::BFloat16, 3> Debug3dBFloat16Test(
319 armnn::IWorkloadFactory& workloadFactory,
320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
321 {
322 return Debug3dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
323 }
324
Debug2dBFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)325 LayerTestResult<armnn::BFloat16, 2> Debug2dBFloat16Test(
326 armnn::IWorkloadFactory& workloadFactory,
327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
328 {
329 return Debug2dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
330 }
331
Debug1dBFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)332 LayerTestResult<armnn::BFloat16, 1> Debug1dBFloat16Test(
333 armnn::IWorkloadFactory& workloadFactory,
334 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
335 {
336 return Debug1dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
337 }
338
Debug4dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)339 LayerTestResult<uint8_t, 4> Debug4dUint8Test(
340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
342 {
343 return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
344 }
345
Debug3dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)346 LayerTestResult<uint8_t, 3> Debug3dUint8Test(
347 armnn::IWorkloadFactory& workloadFactory,
348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
349 {
350 return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
351 }
352
Debug2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)353 LayerTestResult<uint8_t, 2> Debug2dUint8Test(
354 armnn::IWorkloadFactory& workloadFactory,
355 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
356 {
357 return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
358 }
359
Debug1dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)360 LayerTestResult<uint8_t, 1> Debug1dUint8Test(
361 armnn::IWorkloadFactory& workloadFactory,
362 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
363 {
364 return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
365 }
366
Debug4dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)367 LayerTestResult<int16_t, 4> Debug4dInt16Test(
368 armnn::IWorkloadFactory& workloadFactory,
369 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
370 {
371 return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
372 }
373
Debug3dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)374 LayerTestResult<int16_t, 3> Debug3dInt16Test(
375 armnn::IWorkloadFactory& workloadFactory,
376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
377 {
378 return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
379 }
380
Debug2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)381 LayerTestResult<int16_t, 2> Debug2dInt16Test(
382 armnn::IWorkloadFactory& workloadFactory,
383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
384 {
385 return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
386 }
387
Debug1dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)388 LayerTestResult<int16_t, 1> Debug1dInt16Test(
389 armnn::IWorkloadFactory& workloadFactory,
390 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
391 {
392 return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
393 }
394