blob: 9226f215aaa88ee51ed162641d0944bf6b583f40 [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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/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
Sadik Armagana097d2a2021-11-24 15:47:28 +000012#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000013#include <armnnTestUtils/WorkloadTestUtils.hpp>
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000014
Colm Donelanc42a9872022-02-02 16:35:09 +000015#include <armnnTestUtils/TensorHelpers.hpp>
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000016
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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000059 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Debug,
60 descriptor,
61 info);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000062
63 inputHandle->Allocate();
64 outputHandle->Allocate();
65
66 CopyDataToITensorHandle(inputHandle.get(), input.data());
Matteo Martincigh49124022019-01-11 13:25:59 +000067
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000068 std::ostringstream oss;
69 std::streambuf* coutStreambuf = std::cout.rdbuf();
70 std::cout.rdbuf(oss.rdbuf());
71
72 ExecuteWorkload(*workload, memoryManager);
Matteo Martincigh49124022019-01-11 13:25:59 +000073
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000074 std::cout.rdbuf(coutStreambuf);
Matteo Martincigh49124022019-01-11 13:25:59 +000075
Sadik Armagan1625efc2021-06-10 18:24:34 +010076 CHECK(oss.str() == expectedStringOutput);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000077
Sadik Armagan483c8112021-06-01 09:24:52 +010078 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000079
Sadik Armagan483c8112021-06-01 09:24:52 +010080 return LayerTestResult<T, Dim>(actualOutput,
81 expectedOutput,
82 outputHandle->GetShape(),
83 outputTensorInfo.GetShape());
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000084}
85
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000086template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010087LayerTestResult<T, 4> Debug4dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +000088 armnn::IWorkloadFactory& workloadFactory,
89 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
90{
91 armnn::TensorInfo inputTensorInfo;
92 armnn::TensorInfo outputTensorInfo;
93
94 unsigned int inputShape[] = {1, 2, 2, 3};
95 unsigned int outputShape[] = {1, 2, 2, 3};
96
97 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +000098 desc.m_Guid = 1;
99 desc.m_LayerName = "TestOutput";
100 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000101
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000102 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
103 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000104
105 std::vector<float> input = std::vector<float>(
106 {
107 1.0f, 2.0f, 3.0f,
108 4.0f, 5.0f, 6.0f,
109 7.0f, 8.0f, 9.0f,
110 10.0f, 11.0f, 12.0f,
111 });
112
113 std::vector<float> outputExpected = std::vector<float>(
114 {
115 1.0f, 2.0f, 3.0f,
116 4.0f, 5.0f, 6.0f,
117 7.0f, 8.0f, 9.0f,
118 10.0f, 11.0f, 12.0f,
119 });
120
121 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000122 "{ \"layerGuid\": 1,"
123 " \"layerName\": \"TestOutput\","
124 " \"outputSlot\": 0,"
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000125 " \"shape\": [1, 2, 2, 3],"
126 " \"min\": 1, \"max\": 12,"
127 " \"data\": [[[[1, 2, 3], [4, 5, 6]], [[7, 8, 9], [10, 11, 12]]]] }\n";
128
129 return DebugTestImpl<T, 4>(workloadFactory,
130 memoryManager,
131 inputTensorInfo,
132 outputTensorInfo,
133 input,
134 outputExpected,
135 desc,
136 expectedStringOutput);
137}
138
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000139template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100140LayerTestResult<T, 3> Debug3dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000141 armnn::IWorkloadFactory& workloadFactory,
142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
143{
144 armnn::TensorInfo inputTensorInfo;
145 armnn::TensorInfo outputTensorInfo;
146
147 unsigned int inputShape[] = {3, 3, 1};
148 unsigned int outputShape[] = {3, 3, 1};
149
150 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000151 desc.m_Guid = 1;
152 desc.m_LayerName = "TestOutput";
153 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000154
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000155 inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
156 outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000157
158 std::vector<float> input = std::vector<float>(
159 {
160 1.0f, 2.0f, 3.0f,
161 4.0f, 5.0f, 6.0f,
162 7.0f, 8.0f, 9.0f,
163 });
164
165 std::vector<float> outputExpected = std::vector<float>(
166 {
167 1.0f, 2.0f, 3.0f,
168 4.0f, 5.0f, 6.0f,
169 7.0f, 8.0f, 9.0f,
170 });
171
172 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000173 "{ \"layerGuid\": 1,"
174 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000175 " \"outputSlot\": 0,"
176 " \"shape\": [3, 3, 1],"
177 " \"min\": 1, \"max\": 9,"
178 " \"data\": [[[1], [2], [3]], [[4], [5], [6]], [[7], [8], [9]]] }\n";
179
180 return DebugTestImpl<T, 3>(workloadFactory,
181 memoryManager,
182 inputTensorInfo,
183 outputTensorInfo,
184 input,
185 outputExpected,
186 desc,
187 expectedStringOutput);
188}
189
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000190template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100191LayerTestResult<T, 2> Debug2dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000192 armnn::IWorkloadFactory& workloadFactory,
193 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
194{
195 armnn::TensorInfo inputTensorInfo;
196 armnn::TensorInfo outputTensorInfo;
197
198 unsigned int inputShape[] = {2, 2};
199 unsigned int outputShape[] = {2, 2};
200
201 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000202 desc.m_Guid = 1;
203 desc.m_LayerName = "TestOutput";
204 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000205
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000206 inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
207 outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000208
209 std::vector<float> input = std::vector<float>(
210 {
211 1.0f, 2.0f,
212 3.0f, 4.0f,
213 });
214
215 std::vector<float> outputExpected = std::vector<float>(
216 {
217 1.0f, 2.0f,
218 3.0f, 4.0f,
219 });
220
221 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000222 "{ \"layerGuid\": 1,"
223 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000224 " \"outputSlot\": 0,"
225 " \"shape\": [2, 2],"
226 " \"min\": 1, \"max\": 4,"
227 " \"data\": [[1, 2], [3, 4]] }\n";
228
229 return DebugTestImpl<T, 2>(workloadFactory,
230 memoryManager,
231 inputTensorInfo,
232 outputTensorInfo,
233 input,
234 outputExpected,
235 desc,
236 expectedStringOutput);
237}
238
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000239template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100240LayerTestResult<T, 1> Debug1dTest(
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000241 armnn::IWorkloadFactory& workloadFactory,
242 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
243{
244 armnn::TensorInfo inputTensorInfo;
245 armnn::TensorInfo outputTensorInfo;
246
247 unsigned int inputShape[] = {4};
248 unsigned int outputShape[] = {4};
249
250 armnn::DebugQueueDescriptor desc;
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000251 desc.m_Guid = 1;
252 desc.m_LayerName = "TestOutput";
253 desc.m_SlotIndex = 0;
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000254
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000255 inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
256 outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000257
258 std::vector<float> input = std::vector<float>(
259 {
260 1.0f, 2.0f, 3.0f, 4.0f,
261 });
262
263 std::vector<float> outputExpected = std::vector<float>(
264 {
265 1.0f, 2.0f, 3.0f, 4.0f,
266 });
267
268 const std::string expectedStringOutput =
Nattapat Chaimanowong964e9552019-03-26 11:03:26 +0000269 "{ \"layerGuid\": 1,"
270 " \"layerName\": \"TestOutput\","
Nattapat Chaimanowongcfdcadf2018-12-06 11:54:33 +0000271 " \"outputSlot\": 0,"
272 " \"shape\": [4],"
273 " \"min\": 1, \"max\": 4,"
274 " \"data\": [1, 2, 3, 4] }\n";
275
276 return DebugTestImpl<T, 1>(workloadFactory,
277 memoryManager,
278 inputTensorInfo,
279 outputTensorInfo,
280 input,
281 outputExpected,
282 desc,
283 expectedStringOutput);
284}
285
286} // anonymous namespace
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100287
288LayerTestResult<float, 4> Debug4dFloat32Test(
289 armnn::IWorkloadFactory& workloadFactory,
290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
291{
292 return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
293}
294
295LayerTestResult<float, 3> Debug3dFloat32Test(
296 armnn::IWorkloadFactory& workloadFactory,
297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
298{
299 return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
300}
301
302LayerTestResult<float, 2> Debug2dFloat32Test(
303 armnn::IWorkloadFactory& workloadFactory,
304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
305{
306 return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
307}
308
309LayerTestResult<float, 1> Debug1dFloat32Test(
310 armnn::IWorkloadFactory& workloadFactory,
311 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
312{
313 return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
314}
315
Narumol Prangnawarat403a1852020-03-12 14:24:13 +0000316LayerTestResult<armnn::BFloat16, 4> Debug4dBFloat16Test(
317 armnn::IWorkloadFactory& workloadFactory,
318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
319{
320 return Debug4dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
321}
322
323LayerTestResult<armnn::BFloat16, 3> Debug3dBFloat16Test(
324 armnn::IWorkloadFactory& workloadFactory,
325 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
326{
327 return Debug3dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
328}
329
330LayerTestResult<armnn::BFloat16, 2> Debug2dBFloat16Test(
331 armnn::IWorkloadFactory& workloadFactory,
332 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
333{
334 return Debug2dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
335}
336
337LayerTestResult<armnn::BFloat16, 1> Debug1dBFloat16Test(
338 armnn::IWorkloadFactory& workloadFactory,
339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
340{
341 return Debug1dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
342}
343
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100344LayerTestResult<uint8_t, 4> Debug4dUint8Test(
345 armnn::IWorkloadFactory& workloadFactory,
346 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
347{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000348 return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100349}
350
351LayerTestResult<uint8_t, 3> Debug3dUint8Test(
352 armnn::IWorkloadFactory& workloadFactory,
353 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
354{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000355 return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100356}
357
358LayerTestResult<uint8_t, 2> Debug2dUint8Test(
359 armnn::IWorkloadFactory& workloadFactory,
360 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
361{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000362 return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100363}
364
365LayerTestResult<uint8_t, 1> Debug1dUint8Test(
366 armnn::IWorkloadFactory& workloadFactory,
367 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
368{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000369 return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100370}
371
372LayerTestResult<int16_t, 4> Debug4dInt16Test(
373 armnn::IWorkloadFactory& workloadFactory,
374 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
375{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000376 return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100377}
378
379LayerTestResult<int16_t, 3> Debug3dInt16Test(
380 armnn::IWorkloadFactory& workloadFactory,
381 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
382{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000383 return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100384}
385
386LayerTestResult<int16_t, 2> Debug2dInt16Test(
387 armnn::IWorkloadFactory& workloadFactory,
388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
389{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000390 return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100391}
392
393LayerTestResult<int16_t, 1> Debug1dInt16Test(
394 armnn::IWorkloadFactory& workloadFactory,
395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
396{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000397 return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100398}