ArmNN
 20.05
DebugTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "DebugTestImpl.hpp"
7 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
14 
15 #include <test/TensorHelpers.hpp>
16 
17 namespace
18 {
19 
20 template<typename T, std::size_t Dim>
21 LayerTestResult<T, Dim> DebugTestImpl(
22  armnn::IWorkloadFactory& workloadFactory,
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  IgnoreUnused(memoryManager);
34  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 =
44  MakeTensor<T, Dim>(inputTensorInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
45 
46  LayerTestResult<T, Dim> ret(outputTensorInfo);
47  ret.outputExpected =
48  MakeTensor<T, Dim>(outputTensorInfo, armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
49 
50  std::unique_ptr<armnn::ITensorHandle> inputHandle =
51  workloadFactory.CreateTensorHandle(inputTensorInfo);
52 
53  std::unique_ptr<armnn::ITensorHandle> outputHandle =
54  workloadFactory.CreateTensorHandle(outputTensorInfo);
55 
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());
66 
67  std::ostringstream oss;
68  std::streambuf* coutStreambuf = std::cout.rdbuf();
69  std::cout.rdbuf(oss.rdbuf());
70 
71  ExecuteWorkload(*workload, memoryManager);
72 
73  std::cout.rdbuf(coutStreambuf);
74 
75  BOOST_TEST(oss.str() == expectedStringOutput);
76 
77  CopyDataFromITensorHandle(ret.output.data(), outputHandle.get());
78 
79  return ret;
80 }
81 
82 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
83 LayerTestResult<T, 4> Debug4dTest(
84  armnn::IWorkloadFactory& workloadFactory,
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 
94  desc.m_Guid = 1;
95  desc.m_LayerName = "TestOutput";
96  desc.m_SlotIndex = 0;
97 
98  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
99  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
100 
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 =
118  "{ \"layerGuid\": 1,"
119  " \"layerName\": \"TestOutput\","
120  " \"outputSlot\": 0,"
121  " \"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 
135 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
136 LayerTestResult<T, 3> Debug3dTest(
137  armnn::IWorkloadFactory& workloadFactory,
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 
147  desc.m_Guid = 1;
148  desc.m_LayerName = "TestOutput";
149  desc.m_SlotIndex = 0;
150 
151  inputTensorInfo = armnn::TensorInfo(3, inputShape, ArmnnType);
152  outputTensorInfo = armnn::TensorInfo(3, outputShape, ArmnnType);
153 
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 =
169  "{ \"layerGuid\": 1,"
170  " \"layerName\": \"TestOutput\","
171  " \"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 
186 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
187 LayerTestResult<T, 2> Debug2dTest(
188  armnn::IWorkloadFactory& workloadFactory,
190 {
191  armnn::TensorInfo inputTensorInfo;
192  armnn::TensorInfo outputTensorInfo;
193 
194  unsigned int inputShape[] = {2, 2};
195  unsigned int outputShape[] = {2, 2};
196 
198  desc.m_Guid = 1;
199  desc.m_LayerName = "TestOutput";
200  desc.m_SlotIndex = 0;
201 
202  inputTensorInfo = armnn::TensorInfo(2, inputShape, ArmnnType);
203  outputTensorInfo = armnn::TensorInfo(2, outputShape, ArmnnType);
204 
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 =
218  "{ \"layerGuid\": 1,"
219  " \"layerName\": \"TestOutput\","
220  " \"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 
235 template <armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
236 LayerTestResult<T, 1> Debug1dTest(
237  armnn::IWorkloadFactory& workloadFactory,
239 {
240  armnn::TensorInfo inputTensorInfo;
241  armnn::TensorInfo outputTensorInfo;
242 
243  unsigned int inputShape[] = {4};
244  unsigned int outputShape[] = {4};
245 
247  desc.m_Guid = 1;
248  desc.m_LayerName = "TestOutput";
249  desc.m_SlotIndex = 0;
250 
251  inputTensorInfo = armnn::TensorInfo(1, inputShape, ArmnnType);
252  outputTensorInfo = armnn::TensorInfo(1, outputShape, ArmnnType);
253 
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 =
265  "{ \"layerGuid\": 1,"
266  " \"layerName\": \"TestOutput\","
267  " \"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
283 
285  armnn::IWorkloadFactory& workloadFactory,
287 {
288  return Debug4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
289 }
290 
292  armnn::IWorkloadFactory& workloadFactory,
294 {
295  return Debug3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
296 }
297 
299  armnn::IWorkloadFactory& workloadFactory,
301 {
302  return Debug2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
303 }
304 
306  armnn::IWorkloadFactory& workloadFactory,
308 {
309  return Debug1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
310 }
311 
313  armnn::IWorkloadFactory& workloadFactory,
315 {
316  return Debug4dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
317 }
318 
320  armnn::IWorkloadFactory& workloadFactory,
322 {
323  return Debug3dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
324 }
325 
327  armnn::IWorkloadFactory& workloadFactory,
329 {
330  return Debug2dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
331 }
332 
334  armnn::IWorkloadFactory& workloadFactory,
336 {
337  return Debug1dTest<armnn::DataType::BFloat16>(workloadFactory, memoryManager);
338 }
339 
341  armnn::IWorkloadFactory& workloadFactory,
343 {
344  return Debug4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
345 }
346 
348  armnn::IWorkloadFactory& workloadFactory,
350 {
351  return Debug3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
352 }
353 
355  armnn::IWorkloadFactory& workloadFactory,
357 {
358  return Debug2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
359 }
360 
362  armnn::IWorkloadFactory& workloadFactory,
364 {
365  return Debug1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
366 }
367 
369  armnn::IWorkloadFactory& workloadFactory,
371 {
372  return Debug4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
373 }
374 
376  armnn::IWorkloadFactory& workloadFactory,
378 {
379  return Debug3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
380 }
381 
383  armnn::IWorkloadFactory& workloadFactory,
385 {
386  return Debug2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
387 }
388 
390  armnn::IWorkloadFactory& workloadFactory,
392 {
393  return Debug1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
394 }
virtual std::unique_ptr< IWorkload > CreateDebug(const DebugQueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerTestResult< int16_t, 3 > Debug3dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 1 > Debug1dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< armnn::BFloat16, 1 > Debug1dBFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< uint8_t, 1 > Debug1dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void IgnoreUnused(Ts &&...)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
LayerTestResult< int16_t, 1 > Debug1dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 2 > Debug2dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:260
LayerTestResult< armnn::BFloat16, 3 > Debug3dBFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo, const bool IsMemoryManaged=true) const =0
LayerTestResult< armnn::BFloat16, 2 > Debug2dBFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< int16_t, 4 > Debug4dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< uint8_t, 3 > Debug3dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< armnn::BFloat16, 4 > Debug4dBFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 4 > Debug4dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< int16_t, 2 > Debug2dInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:276
LayerTestResult< uint8_t, 4 > Debug4dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< uint8_t, 2 > Debug2dUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
LayerTestResult< float, 3 > Debug3dFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)