blob: f2127c0f0c7234d322285b4492b27bca6a90c360 [file] [log] [blame]
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +00001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +00003// SPDX-License-Identifier: MIT
4//
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "DebugTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000010
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000011
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010012#include <backendsCommon/test/TensorCopyUtils.hpp>
13#include <backendsCommon/test/WorkloadTestUtils.hpp>
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000014
15#include <test/TensorHelpers.hpp>
16
17namespace
18{
19
20template<typename T, std::size_t Dim>
21LayerTestResult<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{
Jan Eilers8eb25602020-03-09 12:13:48 +000033 IgnoreUnused(memoryManager);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000034 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 =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010044 MakeTensor<T, Dim>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000045
46 LayerTestResult<T, Dim> ret(outputTensorInfo);
47 ret.outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010048 MakeTensor<T, Dim>(outputTensorInfo, armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000049
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +010050 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
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000054
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());
Matteo Martincigh49124022019-01-11 13:25:59 +000065
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000066 std::ostringstream oss;
67 std::streambuf* coutStreambuf = std::cout.rdbuf();
68 std::cout.rdbuf(oss.rdbuf());
69
70 ExecuteWorkload(*workload, memoryManager);
Matteo Martincigh49124022019-01-11 13:25:59 +000071
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000072 std::cout.rdbuf(coutStreambuf);
Matteo Martincigh49124022019-01-11 13:25:59 +000073
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000074 BOOST_TEST(oss.str() == expectedStringOutput);
75
76 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
77
78 return ret;
79}
80
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000081template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010082LayerTestResult<T, 4> Debug4dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000083 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;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +000093 desc.m_Guid = 1;
94 desc.m_LayerName = "TestOutput";
95 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000096
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000097 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
98 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000099
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 =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000117 "{ \"layerGuid\": 1,"
118 " \"layerName\": \"TestOutput\","
119 " \"outputSlot\": 0,"
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000120 " \"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
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000134template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100135LayerTestResult<T, 3> Debug3dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000136 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;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000146 desc.m_Guid = 1;
147 desc.m_LayerName = "TestOutput";
148 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000149
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000150 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
151 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000152
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 =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000168 "{ \"layerGuid\": 1,"
169 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000170 " \"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
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000185template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100186LayerTestResult<T, 2> Debug2dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000187 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;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000197 desc.m_Guid = 1;
198 desc.m_LayerName = "TestOutput";
199 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000200
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000201 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
202 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000203
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 =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000217 "{ \"layerGuid\": 1,"
218 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000219 " \"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
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000234template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100235LayerTestResult<T, 1> Debug1dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000236 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;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000246 desc.m_Guid = 1;
247 desc.m_LayerName = "TestOutput";
248 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000249
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000250 inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
251 outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000252
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 =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000264 "{ \"layerGuid\": 1,"
265 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000266 " \"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
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100282
283LayerTestResult<float, 4> Debug4dFloat32Test(
284 armnn::IWorkloadFactory& workloadFactory,
285 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
286{
287 return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
288}
289
290LayerTestResult<float, 3> Debug3dFloat32Test(
291 armnn::IWorkloadFactory& workloadFactory,
292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
293{
294 return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
295}
296
297LayerTestResult<float, 2> Debug2dFloat32Test(
298 armnn::IWorkloadFactory& workloadFactory,
299 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
300{
301 return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
302}
303
304LayerTestResult<float, 1> Debug1dFloat32Test(
305 armnn::IWorkloadFactory& workloadFactory,
306 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
307{
308 return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
309}
310
Narumol Prangnawarat403a1852020-03-12 14:24:13 +0000311LayerTestResult<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
318LayerTestResult<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
325LayerTestResult<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
332LayerTestResult<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
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100339LayerTestResult<uint8_t, 4> Debug4dUint8Test(
340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
342{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000343 return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100344}
345
346LayerTestResult<uint8_t, 3> Debug3dUint8Test(
347 armnn::IWorkloadFactory& workloadFactory,
348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
349{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000350 return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100351}
352
353LayerTestResult<uint8_t, 2> Debug2dUint8Test(
354 armnn::IWorkloadFactory& workloadFactory,
355 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
356{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000357 return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100358}
359
360LayerTestResult<uint8_t, 1> Debug1dUint8Test(
361 armnn::IWorkloadFactory& workloadFactory,
362 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
363{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000364 return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100365}
366
367LayerTestResult<int16_t, 4> Debug4dInt16Test(
368 armnn::IWorkloadFactory& workloadFactory,
369 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
370{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000371 return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100372}
373
374LayerTestResult<int16_t, 3> Debug3dInt16Test(
375 armnn::IWorkloadFactory& workloadFactory,
376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
377{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000378 return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100379}
380
381LayerTestResult<int16_t, 2> Debug2dInt16Test(
382 armnn::IWorkloadFactory& workloadFactory,
383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
384{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000385 return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100386}
387
388LayerTestResult<int16_t, 1> Debug1dInt16Test(
389 armnn::IWorkloadFactory& workloadFactory,
390 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
391{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000392 return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100393}