blob: 42fe4876ff8cce4c787bbf3daf98bbed0e1bafc5 [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
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
50 std::unique_ptr<armnn::ITensorHandle> inputHandle =
51 workloadFactory.CreateTensorHandle(inputTensorInfo);
52
53 std::unique_ptr<armnn::ITensorHandle> outputHandle =
54 workloadFactory.CreateTensorHandle(outputTensorInfo);
55
56 armnn::WorkloadInfo info;
57 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
58 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
59
60 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDebug(descriptor, info);
61
62 inputHandle->Allocate();
63 outputHandle->Allocate();
64
65 CopyDataToITensorHandle(inputHandle.get(), input.data());
Matteo Martincigh49124022019-01-11 13:25:59 +000066
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000067 std::ostringstream oss;
68 std::streambuf* coutStreambuf = std::cout.rdbuf();
69 std::cout.rdbuf(oss.rdbuf());
70
71 ExecuteWorkload(*workload, memoryManager);
Matteo Martincigh49124022019-01-11 13:25:59 +000072
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000073 std::cout.rdbuf(coutStreambuf);
Matteo Martincigh49124022019-01-11 13:25:59 +000074
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000075 BOOST_TEST(oss.str() == expectedStringOutput);
76
77 CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
78
79 return ret;
80}
81
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000082template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010083LayerTestResult<T, 4> Debug4dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000084 armnn::IWorkloadFactory& workloadFactory,
85 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
86{
87 armnn::TensorInfo inputTensorInfo;
88 armnn::TensorInfo outputTensorInfo;
89
90 unsigned int inputShape[] = {1, 2, 2, 3};
91 unsigned int outputShape[] = {1, 2, 2, 3};
92
93 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +000094 desc.m_Guid = 1;
95 desc.m_LayerName = "TestOutput";
96 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000097
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000098 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
99 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000100
101 std::vector<float> input = std::vector<float>(
102 {
103 1.0f, 2.0f, 3.0f,
104 4.0f, 5.0f, 6.0f,
105 7.0f, 8.0f, 9.0f,
106 10.0f, 11.0f, 12.0f,
107 });
108
109 std::vector<float> outputExpected = std::vector<float>(
110 {
111 1.0f, 2.0f, 3.0f,
112 4.0f, 5.0f, 6.0f,
113 7.0f, 8.0f, 9.0f,
114 10.0f, 11.0f, 12.0f,
115 });
116
117 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000118 "{ \"layerGuid\": 1,"
119 " \"layerName\": \"TestOutput\","
120 " \"outputSlot\": 0,"
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000121 " \"shape\": [1, 2, 2, 3],"
122 " \"min\": 1, \"max\": 12,"
123 " \"data\": [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]] }\n";
124
125 return DebugTestImpl<T, 4>(workloadFactory,
126 memoryManager,
127 inputTensorInfo,
128 outputTensorInfo,
129 input,
130 outputExpected,
131 desc,
132 expectedStringOutput);
133}
134
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000135template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100136LayerTestResult<T, 3> Debug3dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000137 armnn::IWorkloadFactory& workloadFactory,
138 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
139{
140 armnn::TensorInfo inputTensorInfo;
141 armnn::TensorInfo outputTensorInfo;
142
143 unsigned int inputShape[] = {3, 3, 1};
144 unsigned int outputShape[] = {3, 3, 1};
145
146 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000147 desc.m_Guid = 1;
148 desc.m_LayerName = "TestOutput";
149 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000150
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000151 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
152 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000153
154 std::vector<float> input = std::vector<float>(
155 {
156 1.0f, 2.0f, 3.0f,
157 4.0f, 5.0f, 6.0f,
158 7.0f, 8.0f, 9.0f,
159 });
160
161 std::vector<float> outputExpected = std::vector<float>(
162 {
163 1.0f, 2.0f, 3.0f,
164 4.0f, 5.0f, 6.0f,
165 7.0f, 8.0f, 9.0f,
166 });
167
168 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000169 "{ \"layerGuid\": 1,"
170 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000171 " \"outputSlot\": 0,"
172 " \"shape\": [3, 3, 1],"
173 " \"min\": 1, \"max\": 9,"
174 " \"data\": [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]] }\n";
175
176 return DebugTestImpl<T, 3>(workloadFactory,
177 memoryManager,
178 inputTensorInfo,
179 outputTensorInfo,
180 input,
181 outputExpected,
182 desc,
183 expectedStringOutput);
184}
185
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000186template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100187LayerTestResult<T, 2> Debug2dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000188 armnn::IWorkloadFactory& workloadFactory,
189 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
190{
191 armnn::TensorInfo inputTensorInfo;
192 armnn::TensorInfo outputTensorInfo;
193
194 unsigned int inputShape[] = {2, 2};
195 unsigned int outputShape[] = {2, 2};
196
197 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000198 desc.m_Guid = 1;
199 desc.m_LayerName = "TestOutput";
200 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000201
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000202 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
203 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000204
205 std::vector<float> input = std::vector<float>(
206 {
207 1.0f, 2.0f,
208 3.0f, 4.0f,
209 });
210
211 std::vector<float> outputExpected = std::vector<float>(
212 {
213 1.0f, 2.0f,
214 3.0f, 4.0f,
215 });
216
217 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000218 "{ \"layerGuid\": 1,"
219 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000220 " \"outputSlot\": 0,"
221 " \"shape\": [2, 2],"
222 " \"min\": 1, \"max\": 4,"
223 " \"data\": [[1, 2], [3, 4]] }\n";
224
225 return DebugTestImpl<T, 2>(workloadFactory,
226 memoryManager,
227 inputTensorInfo,
228 outputTensorInfo,
229 input,
230 outputExpected,
231 desc,
232 expectedStringOutput);
233}
234
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000235template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100236LayerTestResult<T, 1> Debug1dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000237 armnn::IWorkloadFactory& workloadFactory,
238 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
239{
240 armnn::TensorInfo inputTensorInfo;
241 armnn::TensorInfo outputTensorInfo;
242
243 unsigned int inputShape[] = {4};
244 unsigned int outputShape[] = {4};
245
246 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000247 desc.m_Guid = 1;
248 desc.m_LayerName = "TestOutput";
249 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000250
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000251 inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
252 outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000253
254 std::vector<float> input = std::vector<float>(
255 {
256 1.0f, 2.0f, 3.0f, 4.0f,
257 });
258
259 std::vector<float> outputExpected = std::vector<float>(
260 {
261 1.0f, 2.0f, 3.0f, 4.0f,
262 });
263
264 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000265 "{ \"layerGuid\": 1,"
266 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000267 " \"outputSlot\": 0,"
268 " \"shape\": [4],"
269 " \"min\": 1, \"max\": 4,"
270 " \"data\": [1, 2, 3, 4] }\n";
271
272 return DebugTestImpl<T, 1>(workloadFactory,
273 memoryManager,
274 inputTensorInfo,
275 outputTensorInfo,
276 input,
277 outputExpected,
278 desc,
279 expectedStringOutput);
280}
281
282} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100283
284LayerTestResult<float, 4> Debug4dFloat32Test(
285 armnn::IWorkloadFactory& workloadFactory,
286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
287{
288 return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
289}
290
291LayerTestResult<float, 3> Debug3dFloat32Test(
292 armnn::IWorkloadFactory& workloadFactory,
293 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
294{
295 return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
296}
297
298LayerTestResult<float, 2> Debug2dFloat32Test(
299 armnn::IWorkloadFactory& workloadFactory,
300 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
301{
302 return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
303}
304
305LayerTestResult<float, 1> Debug1dFloat32Test(
306 armnn::IWorkloadFactory& workloadFactory,
307 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
308{
309 return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
310}
311
Narumol Prangnawarat403a1852020-03-12 14:24:13 +0000312LayerTestResult<armnn::BFloat16, 4> Debug4dBFloat16Test(
313 armnn::IWorkloadFactory& workloadFactory,
314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
315{
316 return Debug4dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
317}
318
319LayerTestResult<armnn::BFloat16, 3> Debug3dBFloat16Test(
320 armnn::IWorkloadFactory& workloadFactory,
321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
322{
323 return Debug3dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
324}
325
326LayerTestResult<armnn::BFloat16, 2> Debug2dBFloat16Test(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
329{
330 return Debug2dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
331}
332
333LayerTestResult<armnn::BFloat16, 1> Debug1dBFloat16Test(
334 armnn::IWorkloadFactory& workloadFactory,
335 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
336{
337 return Debug1dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
338}
339
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100340LayerTestResult<uint8_t, 4> Debug4dUint8Test(
341 armnn::IWorkloadFactory& workloadFactory,
342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
343{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000344 return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100345}
346
347LayerTestResult<uint8_t, 3> Debug3dUint8Test(
348 armnn::IWorkloadFactory& workloadFactory,
349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
350{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000351 return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100352}
353
354LayerTestResult<uint8_t, 2> Debug2dUint8Test(
355 armnn::IWorkloadFactory& workloadFactory,
356 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
357{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000358 return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100359}
360
361LayerTestResult<uint8_t, 1> Debug1dUint8Test(
362 armnn::IWorkloadFactory& workloadFactory,
363 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
364{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000365 return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100366}
367
368LayerTestResult<int16_t, 4> Debug4dInt16Test(
369 armnn::IWorkloadFactory& workloadFactory,
370 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
371{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000372 return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100373}
374
375LayerTestResult<int16_t, 3> Debug3dInt16Test(
376 armnn::IWorkloadFactory& workloadFactory,
377 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
378{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000379 return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100380}
381
382LayerTestResult<int16_t, 2> Debug2dInt16Test(
383 armnn::IWorkloadFactory& workloadFactory,
384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
385{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000386 return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100387}
388
389LayerTestResult<int16_t, 1> Debug1dInt16Test(
390 armnn::IWorkloadFactory& workloadFactory,
391 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
392{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000393 return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100394}