ArmNN
 22.05.01
GatherTestImpl.cpp
Go to the documentation of this file.
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "GatherTestImpl.hpp"
7 
8 #include <ResolveType.hpp>
9 
10 
13 
15 
16 namespace
17 {
18 
19 template <armnn::DataType ArmnnType,
20  typename T = armnn::ResolveType<ArmnnType>,
21  size_t ParamsDim,
22  size_t IndicesDim,
23  size_t OutputDim>
24 LayerTestResult<T, OutputDim> GatherTestImpl(
25  armnn::IWorkloadFactory& workloadFactory,
27  const armnn::ITensorHandleFactory& tensorHandleFactory,
28  const armnn::TensorInfo& paramsInfo,
29  const armnn::TensorInfo& indicesInfo,
30  const armnn::TensorInfo& outputInfo,
31  const std::vector<T>& paramsData,
32  const std::vector<int32_t>& indicesData,
33  const std::vector<T>& outputData)
34 {
35  IgnoreUnused(memoryManager);
36 
37  std::vector<T> actualOutput(outputInfo.GetNumElements());
38 
39  std::unique_ptr<armnn::ITensorHandle> paramsHandle = tensorHandleFactory.CreateTensorHandle(paramsInfo);
40  std::unique_ptr<armnn::ITensorHandle> indicesHandle = tensorHandleFactory.CreateTensorHandle(indicesInfo);
41  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
42 
45  AddInputToWorkload(data, info, paramsInfo, paramsHandle.get());
46  AddInputToWorkload(data, info, indicesInfo, indicesHandle.get());
47  AddOutputToWorkload(data, info, outputInfo, outputHandle.get());
48 
49  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Gather, data, info);
50 
51  paramsHandle->Allocate();
52  indicesHandle->Allocate();
53  outputHandle->Allocate();
54 
55  CopyDataToITensorHandle(paramsHandle.get(), paramsData.data());
56  CopyDataToITensorHandle(indicesHandle.get(), indicesData.data());
57 
58  workload->Execute();
59 
60  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
61 
62  return LayerTestResult<T, OutputDim>(actualOutput,
63  outputData,
64  outputHandle->GetShape(),
65  outputInfo.GetShape());
66 }
67 
68 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
69 struct GatherTestHelper
70 {
71  static LayerTestResult<T, 1> Gather1dParamsTestImpl(
72  armnn::IWorkloadFactory& workloadFactory,
74  const armnn::ITensorHandleFactory& tensorHandleFactory)
75  {
76  armnn::TensorInfo paramsInfo({ 8 }, ArmnnType);
77  armnn::TensorInfo indicesInfo({ 4 }, armnn::DataType::Signed32);
78  armnn::TensorInfo outputInfo({ 4 }, ArmnnType);
79 
80  if (armnn::IsQuantizedType<T>())
81  {
82  paramsInfo.SetQuantizationScale(1.0f);
83  paramsInfo.SetQuantizationOffset(1);
84  outputInfo.SetQuantizationScale(1.0f);
85  outputInfo.SetQuantizationOffset(1);
86  }
87  const std::vector<T> params = std::vector<T>({ 1, 2, 3, 4, 5, 6, 7, 8 });
88  const std::vector<int32_t> indices = std::vector<int32_t>({ 0, 2, 1, 5 });
89  const std::vector<T> expectedOutput = std::vector<T>({ 1, 3, 2, 6 });
90 
91  return GatherTestImpl<ArmnnType, T, 1, 1, 1>(
92  workloadFactory,
93  memoryManager,
94  tensorHandleFactory,
95  paramsInfo,
96  indicesInfo,
97  outputInfo,
98  params,
99  indices,
100  expectedOutput);
101  }
102 
103  static LayerTestResult<T, 2> GatherMultiDimParamsTestImpl(
104  armnn::IWorkloadFactory& workloadFactory,
106  const armnn::ITensorHandleFactory& tensorHandleFactory)
107  {
108  armnn::TensorInfo paramsInfo({ 5, 2 }, ArmnnType);
109  armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32);
110  armnn::TensorInfo outputInfo({ 3, 2 }, ArmnnType);
111 
112  if (armnn::IsQuantizedType<T>())
113  {
114  paramsInfo.SetQuantizationScale(1.0f);
115  paramsInfo.SetQuantizationOffset(1);
116  outputInfo.SetQuantizationScale(1.0f);
117  outputInfo.SetQuantizationOffset(1);
118  }
119 
120  const std::vector<T> params = std::vector<T>({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 });
121  const std::vector<int32_t> indices = std::vector<int32_t>({ 1, 3, 4 });
122  const std::vector<T> expectedOutput = std::vector<T>({ 3, 4, 7, 8, 9, 10 });
123 
124  return GatherTestImpl<ArmnnType, T, 2, 1, 2>(
125  workloadFactory,
126  memoryManager,
127  tensorHandleFactory,
128  paramsInfo,
129  indicesInfo,
130  outputInfo,
131  params,
132  indices,
133  expectedOutput);
134  }
135 
136  static LayerTestResult<T, 4> GatherMultiDimParamsMultiDimIndicesTestImpl(
137  armnn::IWorkloadFactory& workloadFactory,
139  const armnn::ITensorHandleFactory& tensorHandleFactory)
140  {
141  armnn::TensorInfo paramsInfo({ 3, 2, 3}, ArmnnType);
142  armnn::TensorInfo indicesInfo({ 2, 3 }, armnn::DataType::Signed32);
143  armnn::TensorInfo outputInfo({ 2, 3, 2, 3 }, ArmnnType);
144 
145  if (armnn::IsQuantizedType<T>())
146  {
147  paramsInfo.SetQuantizationScale(1.0f);
148  paramsInfo.SetQuantizationOffset(1);
149  outputInfo.SetQuantizationScale(1.0f);
150  outputInfo.SetQuantizationOffset(1);
151  }
152 
153  const std::vector<T> params =
154  {
155  1, 2, 3,
156  4, 5, 6,
157 
158  7, 8, 9,
159  10, 11, 12,
160 
161  13, 14, 15,
162  16, 17, 18
163  };
164 
165  const std::vector<int32_t> indices = { 1, 2, 1, 2, 1, 0 };
166 
167  const std::vector<T> expectedOutput =
168  {
169  7, 8, 9,
170  10, 11, 12,
171  13, 14, 15,
172  16, 17, 18,
173  7, 8, 9,
174  10, 11, 12,
175 
176  13, 14, 15,
177  16, 17, 18,
178  7, 8, 9,
179  10, 11, 12,
180  1, 2, 3,
181  4, 5, 6
182  };
183 
184  return GatherTestImpl<ArmnnType, T, 3, 2, 4>(
185  workloadFactory,
186  memoryManager,
187  tensorHandleFactory,
188  paramsInfo,
189  indicesInfo,
190  outputInfo,
191  params,
192  indices,
193  expectedOutput);
194  }
195 };
196 
197 template<typename T>
198 struct GatherTestHelper<armnn::DataType::Float16, T>
199 {
200  static LayerTestResult<T, 1> Gather1dParamsTestImpl(
201  armnn::IWorkloadFactory& workloadFactory,
203  const armnn::ITensorHandleFactory& tensorHandleFactory)
204  {
205  using namespace half_float::literal;
206 
207  armnn::TensorInfo paramsInfo({ 8 }, armnn::DataType::Float16);
208  armnn::TensorInfo indicesInfo({ 4 }, armnn::DataType::Signed32);
209  armnn::TensorInfo outputInfo({ 4 }, armnn::DataType::Float16);
210 
211  const std::vector<T> params = std::vector<T>({ 1._h, 2._h, 3._h, 4._h, 5._h, 6._h, 7._h, 8._h });
212  const std::vector<int32_t> indices = std::vector<int32_t>({ 0, 2, 1, 5 });
213  const std::vector<T> expectedOutput = std::vector<T>({ 1._h, 3._h, 2._h, 6._h });
214 
215  return GatherTestImpl<armnn::DataType::Float16, T, 1, 1, 1>(
216  workloadFactory,
217  memoryManager,
218  tensorHandleFactory,
219  paramsInfo,
220  indicesInfo,
221  outputInfo,
222  params,
223  indices,
224  expectedOutput);
225  }
226 
227  static LayerTestResult<T, 2> GatherMultiDimParamsTestImpl(
228  armnn::IWorkloadFactory& workloadFactory,
230  const armnn::ITensorHandleFactory& tensorHandleFactory)
231  {
232  using namespace half_float::literal;
233 
234  armnn::TensorInfo paramsInfo({ 5, 2 }, armnn::DataType::Float16);
235  armnn::TensorInfo indicesInfo({ 3 }, armnn::DataType::Signed32);
236  armnn::TensorInfo outputInfo({ 3, 2 }, armnn::DataType::Float16);
237 
238  const std::vector<T> params = std::vector<T>({ 1._h, 2._h, 3._h, 4._h, 5._h, 6._h, 7._h, 8._h, 9._h, 10._h });
239 
240  const std::vector<int32_t> indices = std::vector<int32_t>({ 1, 3, 4 });
241  const std::vector<T> expectedOutput = std::vector<T>({ 3._h, 4._h, 7._h, 8._h, 9._h, 10._h });
242 
243  return GatherTestImpl<armnn::DataType::Float16, T, 2, 1, 2>(
244  workloadFactory,
245  memoryManager,
246  tensorHandleFactory,
247  paramsInfo,
248  indicesInfo,
249  outputInfo,
250  params,
251  indices,
252  expectedOutput);
253  }
254 
255  static LayerTestResult<T, 4> GatherMultiDimParamsMultiDimIndicesTestImpl(
256  armnn::IWorkloadFactory& workloadFactory,
258  const armnn::ITensorHandleFactory& tensorHandleFactory)
259  {
260  using namespace half_float::literal;
261 
262  armnn::TensorInfo paramsInfo({ 3, 2, 3 }, armnn::DataType::Float16);
263  armnn::TensorInfo indicesInfo({ 2, 3 }, armnn::DataType::Signed32);
264  armnn::TensorInfo outputInfo({ 2, 3, 2, 3 }, armnn::DataType::Float16);
265 
266  const std::vector<T> params =
267  {
268  1._h, 2._h, 3._h,
269  4._h, 5._h, 6._h,
270 
271  7._h, 8._h, 9._h,
272  10._h, 11._h, 12._h,
273 
274  13._h, 14._h, 15._h,
275  16._h, 17._h, 18._h
276  };
277 
278  const std::vector<int32_t> indices = { 1, 2, 1, 2, 1, 0 };
279 
280  const std::vector<T> expectedOutput =
281  {
282  7._h, 8._h, 9._h,
283  10._h, 11._h, 12._h,
284  13._h, 14._h, 15._h,
285  16._h, 17._h, 18._h,
286  7._h, 8._h, 9._h,
287  10._h, 11._h, 12._h,
288 
289  13._h, 14._h, 15._h,
290  16._h, 17._h, 18._h,
291  7._h, 8._h, 9._h,
292  10._h, 11._h, 12._h,
293  1._h, 2._h, 3._h,
294  4._h, 5._h, 6._h
295  };
296 
297  return GatherTestImpl<armnn::DataType::Float16, T, 3, 2, 4>(
298  workloadFactory,
299  memoryManager,
300  tensorHandleFactory,
301  paramsInfo,
302  indicesInfo,
303  outputInfo,
304  params,
305  indices,
306  expectedOutput);
307  }
308 };
309 
310 } // anonymous namespace
311 
313  armnn::IWorkloadFactory& workloadFactory,
315  const armnn::ITensorHandleFactory& tensorHandleFactory)
316 {
317  return GatherTestHelper<armnn::DataType::Float32>::Gather1dParamsTestImpl(
318  workloadFactory, memoryManager, tensorHandleFactory);
319 }
320 
322  armnn::IWorkloadFactory& workloadFactory,
324  const armnn::ITensorHandleFactory& tensorHandleFactory)
325 {
326  return GatherTestHelper<armnn::DataType::Float16>::Gather1dParamsTestImpl(
327  workloadFactory, memoryManager, tensorHandleFactory);
328 }
329 
331  armnn::IWorkloadFactory& workloadFactory,
333  const armnn::ITensorHandleFactory& tensorHandleFactory)
334 {
335  return GatherTestHelper<armnn::DataType::QAsymmU8>::Gather1dParamsTestImpl(
336  workloadFactory, memoryManager, tensorHandleFactory);
337 }
338 
340  armnn::IWorkloadFactory& workloadFactory,
342  const armnn::ITensorHandleFactory& tensorHandleFactory)
343 {
344  return GatherTestHelper<armnn::DataType::QSymmS16>::Gather1dParamsTestImpl(
345  workloadFactory, memoryManager, tensorHandleFactory);
346 }
347 
349  armnn::IWorkloadFactory& workloadFactory,
351  const armnn::ITensorHandleFactory& tensorHandleFactory)
352 {
353  return GatherTestHelper<armnn::DataType::Signed32>::Gather1dParamsTestImpl(
354  workloadFactory, memoryManager, tensorHandleFactory);
355 }
356 
358  armnn::IWorkloadFactory& workloadFactory,
360  const armnn::ITensorHandleFactory& tensorHandleFactory)
361 {
362  return GatherTestHelper<armnn::DataType::Float32>::GatherMultiDimParamsTestImpl(
363  workloadFactory, memoryManager, tensorHandleFactory);
364 }
365 
367  armnn::IWorkloadFactory& workloadFactory,
369  const armnn::ITensorHandleFactory& tensorHandleFactory)
370 {
371  return GatherTestHelper<armnn::DataType::Float16>::GatherMultiDimParamsTestImpl(
372  workloadFactory, memoryManager, tensorHandleFactory);
373 }
374 
376  armnn::IWorkloadFactory& workloadFactory,
378  const armnn::ITensorHandleFactory& tensorHandleFactory)
379 {
380  return GatherTestHelper<armnn::DataType::QAsymmU8>::GatherMultiDimParamsTestImpl(
381  workloadFactory, memoryManager, tensorHandleFactory);
382 }
383 
385  armnn::IWorkloadFactory& workloadFactory,
387  const armnn::ITensorHandleFactory& tensorHandleFactory)
388 {
389  return GatherTestHelper<armnn::DataType::QSymmS16>::GatherMultiDimParamsTestImpl(
390  workloadFactory, memoryManager, tensorHandleFactory);
391 }
392 
394  armnn::IWorkloadFactory& workloadFactory,
396  const armnn::ITensorHandleFactory& tensorHandleFactory)
397 {
398  return GatherTestHelper<armnn::DataType::Signed32>::GatherMultiDimParamsTestImpl(
399  workloadFactory, memoryManager, tensorHandleFactory);
400 }
401 
403  armnn::IWorkloadFactory& workloadFactory,
405  const armnn::ITensorHandleFactory& tensorHandleFactory)
406 {
407  return GatherTestHelper<armnn::DataType::Float32>::GatherMultiDimParamsMultiDimIndicesTestImpl(
408  workloadFactory, memoryManager, tensorHandleFactory);
409 }
410 
412  armnn::IWorkloadFactory& workloadFactory,
414  const armnn::ITensorHandleFactory& tensorHandleFactory)
415 {
416  return GatherTestHelper<armnn::DataType::Float16>::GatherMultiDimParamsMultiDimIndicesTestImpl(
417  workloadFactory, memoryManager, tensorHandleFactory);
418 }
419 
421  armnn::IWorkloadFactory& workloadFactory,
423  const armnn::ITensorHandleFactory& tensorHandleFactory)
424 {
425  return GatherTestHelper<armnn::DataType::QAsymmU8>::GatherMultiDimParamsMultiDimIndicesTestImpl(
426  workloadFactory, memoryManager, tensorHandleFactory);
427 }
428 
430  armnn::IWorkloadFactory& workloadFactory,
432  const armnn::ITensorHandleFactory& tensorHandleFactory)
433 {
434  return GatherTestHelper<armnn::DataType::QSymmS16>::GatherMultiDimParamsMultiDimIndicesTestImpl(
435  workloadFactory, memoryManager, tensorHandleFactory);
436 }
437 
439  armnn::IWorkloadFactory& workloadFactory,
441  const armnn::ITensorHandleFactory& tensorHandleFactory)
442 {
443  return GatherTestHelper<armnn::DataType::Signed32>::GatherMultiDimParamsMultiDimIndicesTestImpl(
444  workloadFactory, memoryManager, tensorHandleFactory);
445 }
LayerTestResult< armnn::Half, 4 > GatherMultiDimParamsMultiDimIndicesFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< int32_t, 4 > GatherMultiDimParamsMultiDimIndicesInt32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
LayerTestResult< float, 1 > Gather1dParamsFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< int16_t, 2 > GatherMultiDimParamsInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
typename ResolveTypeImpl< DT >::Type ResolveType
Definition: ResolveType.hpp:79
LayerTestResult< uint8_t, 1 > Gather1dParamsUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
Copyright (c) 2021 ARM Limited and Contributors.
void IgnoreUnused(Ts &&...)
LayerTestResult< float, 4 > GatherMultiDimParamsMultiDimIndicesFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
DataType
Definition: Types.hpp:48
LayerTestResult< armnn::Half, 1 > Gather1dParamsFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
std::shared_ptr< IMemoryManager > IMemoryManagerSharedPtr
void CopyDataFromITensorHandle(void *mem, const armnn::ITensorHandle *tensorHandle)
void SetQuantizationScale(float scale)
Definition: Tensor.cpp:473
LayerTestResult< int32_t, 2 > GatherMultiDimParamsInt32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< armnn::Half, 2 > GatherMultiDimParamsFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 2 > GatherMultiDimParamsFloat32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
LayerTestResult< int16_t, 4 > GatherMultiDimParamsMultiDimIndicesInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
Contains information about TensorInfos of a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:489
LayerTestResult< uint8_t, 2 > GatherMultiDimParamsUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< int32_t, 1 > Gather1dParamsInt32Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< int16_t, 1 > Gather1dParamsInt16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
virtual std::unique_ptr< IWorkload > CreateWorkload(LayerType type, const QueueDescriptor &descriptor, const WorkloadInfo &info) const
LayerTestResult< uint8_t, 4 > GatherMultiDimParamsMultiDimIndicesUint8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
unsigned int GetNumElements() const
Definition: Tensor.hpp:196