blob: 1997c4bd1162f0c27f33464378f668469c8bd998 [file] [log] [blame]
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// 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
8#include <ResolveType.hpp>
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +00009
10#include <armnn/ArmNN.hpp>
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{
33 if(armnn::IsQuantizedType<T>())
34 {
35 inputTensorInfo.SetQuantizationScale(qScale);
36 inputTensorInfo.SetQuantizationOffset(qOffset);
37
38 outputTensorInfo.SetQuantizationScale(qScale);
39 outputTensorInfo.SetQuantizationOffset(qOffset);
40 }
41
42 boost::multi_array<T, Dim> input =
43 MakeTensor<T, Dim>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
44
45 LayerTestResult<T, Dim> ret(outputTensorInfo);
46 ret.outputExpected =
47 MakeTensor<T, Dim>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, outputExpectedData));
48
49 std::unique_ptr<armnn::ITensorHandle> inputHandle =
50 workloadFactory.CreateTensorHandle(inputTensorInfo);
51
52 std::unique_ptr<armnn::ITensorHandle> outputHandle =
53 workloadFactory.CreateTensorHandle(outputTensorInfo);
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());
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
311LayerTestResult<uint8_t, 4> Debug4dUint8Test(
312 armnn::IWorkloadFactory& workloadFactory,
313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
314{
315 return Debug4dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
316}
317
318LayerTestResult<uint8_t, 3> Debug3dUint8Test(
319 armnn::IWorkloadFactory& workloadFactory,
320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
321{
322 return Debug3dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
323}
324
325LayerTestResult<uint8_t, 2> Debug2dUint8Test(
326 armnn::IWorkloadFactory& workloadFactory,
327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
328{
329 return Debug2dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
330}
331
332LayerTestResult<uint8_t, 1> Debug1dUint8Test(
333 armnn::IWorkloadFactory& workloadFactory,
334 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
335{
336 return Debug1dTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
337}
338
339LayerTestResult<int16_t, 4> Debug4dInt16Test(
340 armnn::IWorkloadFactory& workloadFactory,
341 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
342{
343 return Debug4dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
344}
345
346LayerTestResult<int16_t, 3> Debug3dInt16Test(
347 armnn::IWorkloadFactory& workloadFactory,
348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
349{
350 return Debug3dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
351}
352
353LayerTestResult<int16_t, 2> Debug2dInt16Test(
354 armnn::IWorkloadFactory& workloadFactory,
355 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
356{
357 return Debug2dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
358}
359
360LayerTestResult<int16_t, 1> Debug1dInt16Test(
361 armnn::IWorkloadFactory& workloadFactory,
362 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
363{
364 return Debug1dTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
365}