blob: 0539cd147003d2cc89268365295a57b687aa0c04 [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
Sadik Armagan1625efc2021-06-10 18:24:34 +010017#include <doctest/doctest.h>
18
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000019namespace
20{
21
22template<typename T, std::size_t Dim>
23LayerTestResult<T, Dim> DebugTestImpl(
24 armnn::IWorkloadFactory& workloadFactory,
25 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26 armnn::TensorInfo& inputTensorInfo,
27 armnn::TensorInfo& outputTensorInfo,
28 std::vector<float>& inputData,
29 std::vector<float>& outputExpectedData,
30 armnn::DebugQueueDescriptor descriptor,
31 const std::string expectedStringOutput,
32 const float qScale = 1.0f,
33 const int32_t qOffset = 0)
34{
Jan Eilers8eb25602020-03-09 12:13:48 +000035 IgnoreUnused(memoryManager);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000036 if(armnn::IsQuantizedType<T>())
37 {
38 inputTensorInfo.SetQuantizationScale(qScale);
39 inputTensorInfo.SetQuantizationOffset(qOffset);
40
41 outputTensorInfo.SetQuantizationScale(qScale);
42 outputTensorInfo.SetQuantizationOffset(qOffset);
43 }
44
Sadik Armagan483c8112021-06-01 09:24:52 +010045 std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000046
Sadik Armagan483c8112021-06-01 09:24:52 +010047 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
48 std::vector<T> expectedOutput = 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
Sadik Armagan1625efc2021-06-10 18:24:34 +010074 CHECK(oss.str() == expectedStringOutput);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000075
Sadik Armagan483c8112021-06-01 09:24:52 +010076 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000077
Sadik Armagan483c8112021-06-01 09:24:52 +010078 return LayerTestResult<T, Dim>(actualOutput,
79 expectedOutput,
80 outputHandle->GetShape(),
81 outputTensorInfo.GetShape());
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000082}
83
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000084template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010085LayerTestResult<T, 4> Debug4dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000086 armnn::IWorkloadFactory& workloadFactory,
87 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
88{
89 armnn::TensorInfo inputTensorInfo;
90 armnn::TensorInfo outputTensorInfo;
91
92 unsigned int inputShape[] = {1, 2, 2, 3};
93 unsigned int outputShape[] = {1, 2, 2, 3};
94
95 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +000096 desc.m_Guid = 1;
97 desc.m_LayerName = "TestOutput";
98 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000099
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000100 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
101 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000102
103 std::vector<float> input = std::vector<float>(
104 {
105 1.0f, 2.0f, 3.0f,
106 4.0f, 5.0f, 6.0f,
107 7.0f, 8.0f, 9.0f,
108 10.0f, 11.0f, 12.0f,
109 });
110
111 std::vector<float> outputExpected = std::vector<float>(
112 {
113 1.0f, 2.0f, 3.0f,
114 4.0f, 5.0f, 6.0f,
115 7.0f, 8.0f, 9.0f,
116 10.0f, 11.0f, 12.0f,
117 });
118
119 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000120 "{ \"layerGuid\": 1,"
121 " \"layerName\": \"TestOutput\","
122 " \"outputSlot\": 0,"
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000123 " \"shape\": [1, 2, 2, 3],"
124 " \"min\": 1, \"max\": 12,"
125 " \"data\": [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]] }\n";
126
127 return DebugTestImpl<T, 4>(workloadFactory,
128 memoryManager,
129 inputTensorInfo,
130 outputTensorInfo,
131 input,
132 outputExpected,
133 desc,
134 expectedStringOutput);
135}
136
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000137template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100138LayerTestResult<T, 3> Debug3dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000139 armnn::IWorkloadFactory& workloadFactory,
140 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
141{
142 armnn::TensorInfo inputTensorInfo;
143 armnn::TensorInfo outputTensorInfo;
144
145 unsigned int inputShape[] = {3, 3, 1};
146 unsigned int outputShape[] = {3, 3, 1};
147
148 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000149 desc.m_Guid = 1;
150 desc.m_LayerName = "TestOutput";
151 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000152
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000153 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
154 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000155
156 std::vector<float> input = std::vector<float>(
157 {
158 1.0f, 2.0f, 3.0f,
159 4.0f, 5.0f, 6.0f,
160 7.0f, 8.0f, 9.0f,
161 });
162
163 std::vector<float> outputExpected = std::vector<float>(
164 {
165 1.0f, 2.0f, 3.0f,
166 4.0f, 5.0f, 6.0f,
167 7.0f, 8.0f, 9.0f,
168 });
169
170 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000171 "{ \"layerGuid\": 1,"
172 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000173 " \"outputSlot\": 0,"
174 " \"shape\": [3, 3, 1],"
175 " \"min\": 1, \"max\": 9,"
176 " \"data\": [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]] }\n";
177
178 return DebugTestImpl<T, 3>(workloadFactory,
179 memoryManager,
180 inputTensorInfo,
181 outputTensorInfo,
182 input,
183 outputExpected,
184 desc,
185 expectedStringOutput);
186}
187
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000188template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100189LayerTestResult<T, 2> Debug2dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000190 armnn::IWorkloadFactory& workloadFactory,
191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
192{
193 armnn::TensorInfo inputTensorInfo;
194 armnn::TensorInfo outputTensorInfo;
195
196 unsigned int inputShape[] = {2, 2};
197 unsigned int outputShape[] = {2, 2};
198
199 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000200 desc.m_Guid = 1;
201 desc.m_LayerName = "TestOutput";
202 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000203
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000204 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
205 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000206
207 std::vector<float> input = std::vector<float>(
208 {
209 1.0f, 2.0f,
210 3.0f, 4.0f,
211 });
212
213 std::vector<float> outputExpected = std::vector<float>(
214 {
215 1.0f, 2.0f,
216 3.0f, 4.0f,
217 });
218
219 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000220 "{ \"layerGuid\": 1,"
221 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000222 " \"outputSlot\": 0,"
223 " \"shape\": [2, 2],"
224 " \"min\": 1, \"max\": 4,"
225 " \"data\": [[1, 2], [3, 4]] }\n";
226
227 return DebugTestImpl<T, 2>(workloadFactory,
228 memoryManager,
229 inputTensorInfo,
230 outputTensorInfo,
231 input,
232 outputExpected,
233 desc,
234 expectedStringOutput);
235}
236
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000237template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100238LayerTestResult<T, 1> Debug1dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000239 armnn::IWorkloadFactory& workloadFactory,
240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
241{
242 armnn::TensorInfo inputTensorInfo;
243 armnn::TensorInfo outputTensorInfo;
244
245 unsigned int inputShape[] = {4};
246 unsigned int outputShape[] = {4};
247
248 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000249 desc.m_Guid = 1;
250 desc.m_LayerName = "TestOutput";
251 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000252
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000253 inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
254 outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000255
256 std::vector<float> input = std::vector<float>(
257 {
258 1.0f, 2.0f, 3.0f, 4.0f,
259 });
260
261 std::vector<float> outputExpected = std::vector<float>(
262 {
263 1.0f, 2.0f, 3.0f, 4.0f,
264 });
265
266 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000267 "{ \"layerGuid\": 1,"
268 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000269 " \"outputSlot\": 0,"
270 " \"shape\": [4],"
271 " \"min\": 1, \"max\": 4,"
272 " \"data\": [1, 2, 3, 4] }\n";
273
274 return DebugTestImpl<T, 1>(workloadFactory,
275 memoryManager,
276 inputTensorInfo,
277 outputTensorInfo,
278 input,
279 outputExpected,
280 desc,
281 expectedStringOutput);
282}
283
284} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100285
286LayerTestResult<float, 4> Debug4dFloat32Test(
287 armnn::IWorkloadFactory& workloadFactory,
288 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
289{
290 return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
291}
292
293LayerTestResult<float, 3> Debug3dFloat32Test(
294 armnn::IWorkloadFactory& workloadFactory,
295 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
296{
297 return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
298}
299
300LayerTestResult<float, 2> Debug2dFloat32Test(
301 armnn::IWorkloadFactory& workloadFactory,
302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
303{
304 return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
305}
306
307LayerTestResult<float, 1> Debug1dFloat32Test(
308 armnn::IWorkloadFactory& workloadFactory,
309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
310{
311 return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
312}
313
Narumol Prangnawarat403a1852020-03-12 14:24:13 +0000314LayerTestResult<armnn::BFloat16, 4> Debug4dBFloat16Test(
315 armnn::IWorkloadFactory& workloadFactory,
316 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
317{
318 return Debug4dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
319}
320
321LayerTestResult<armnn::BFloat16, 3> Debug3dBFloat16Test(
322 armnn::IWorkloadFactory& workloadFactory,
323 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
324{
325 return Debug3dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
326}
327
328LayerTestResult<armnn::BFloat16, 2> Debug2dBFloat16Test(
329 armnn::IWorkloadFactory& workloadFactory,
330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
331{
332 return Debug2dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
333}
334
335LayerTestResult<armnn::BFloat16, 1> Debug1dBFloat16Test(
336 armnn::IWorkloadFactory& workloadFactory,
337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
338{
339 return Debug1dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
340}
341
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100342LayerTestResult<uint8_t, 4> Debug4dUint8Test(
343 armnn::IWorkloadFactory& workloadFactory,
344 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
345{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000346 return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100347}
348
349LayerTestResult<uint8_t, 3> Debug3dUint8Test(
350 armnn::IWorkloadFactory& workloadFactory,
351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
352{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000353 return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100354}
355
356LayerTestResult<uint8_t, 2> Debug2dUint8Test(
357 armnn::IWorkloadFactory& workloadFactory,
358 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
359{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000360 return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100361}
362
363LayerTestResult<uint8_t, 1> Debug1dUint8Test(
364 armnn::IWorkloadFactory& workloadFactory,
365 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
366{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000367 return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100368}
369
370LayerTestResult<int16_t, 4> Debug4dInt16Test(
371 armnn::IWorkloadFactory& workloadFactory,
372 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
373{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000374 return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100375}
376
377LayerTestResult<int16_t, 3> Debug3dInt16Test(
378 armnn::IWorkloadFactory& workloadFactory,
379 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
380{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000381 return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100382}
383
384LayerTestResult<int16_t, 2> Debug2dInt16Test(
385 armnn::IWorkloadFactory& workloadFactory,
386 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
387{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000388 return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100389}
390
391LayerTestResult<int16_t, 1> Debug1dInt16Test(
392 armnn::IWorkloadFactory& workloadFactory,
393 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
394{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000395 return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100396}