ArmNN
 22.02
SpaceToDepthTestImpl.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 
7 
9 #include <ResolveType.hpp>
10 
11 
12 #include <armnnUtils/Permute.hpp>
13 
16 
18 
19 namespace
20 {
21 
22 template<typename T>
23 LayerTestResult<T, 4> SpaceToDepthTestImpl(
24  armnn::IWorkloadFactory& workloadFactory,
26  const armnn::ITensorHandleFactory& tensorHandleFactory,
27  armnn::TensorInfo& inputTensorInfo,
28  armnn::TensorInfo& outputTensorInfo,
29  std::vector<float>& inputData,
30  std::vector<float>& outputExpectedData,
32  const float qScale = 1.0f,
33  const int32_t qOffset = 0)
34 {
35  IgnoreUnused(memoryManager);
36  const armnn::PermutationVector NHWCToNCHW = {0, 2, 3, 1};
37 
39  {
40  inputTensorInfo = armnnUtils::Permuted(inputTensorInfo, NHWCToNCHW);
41  outputTensorInfo = armnnUtils::Permuted(outputTensorInfo, NHWCToNCHW);
42 
43  std::vector<float> inputTmp(inputData.size());
44  armnnUtils::Permute(inputTensorInfo.GetShape(), NHWCToNCHW,
45  inputData.data(), inputTmp.data(), sizeof(float));
46  inputData = inputTmp;
47 
48  std::vector<float> outputTmp(outputExpectedData.size());
49  armnnUtils::Permute(outputTensorInfo.GetShape(), NHWCToNCHW,
50  outputExpectedData.data(), outputTmp.data(), sizeof(float));
51  outputExpectedData = outputTmp;
52  }
53 
54  if(armnn::IsQuantizedType<T>())
55  {
56  inputTensorInfo.SetQuantizationScale(qScale);
57  inputTensorInfo.SetQuantizationOffset(qOffset);
58  outputTensorInfo.SetQuantizationScale(qScale);
59  outputTensorInfo.SetQuantizationOffset(qOffset);
60  }
61 
62  std::vector<T> input = armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset);
63  std::vector<T> expectedOutput = armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset);
64  std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
65 
66  std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
67  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
68 
70  AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
71  AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
72 
73  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::SpaceToDepth,
74  descriptor,
75  info);
76 
77  inputHandle->Allocate();
78  outputHandle->Allocate();
79 
80  CopyDataToITensorHandle(inputHandle.get(), input.data());
81 
82  workload->Execute();
83 
84  CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
85 
86  return LayerTestResult<T, 4>(actualOutput,
87  expectedOutput,
88  outputHandle->GetShape(),
89  outputTensorInfo.GetShape());
90 }
91 
92 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
93 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
94  armnn::IWorkloadFactory& workloadFactory,
96  const armnn::ITensorHandleFactory& tensorHandleFactory,
98 {
99  unsigned int inputShape[] = {1, 2, 2, 1};
100  unsigned int outputShape[] = {1, 1, 1, 4};
101 
102  std::vector<float> input = std::vector<float>(
103  {
104  1.0f, 2.0f, 3.0f, 4.0f
105  });
106 
107  std::vector<float> outputExpected = std::vector<float>(
108  {
109  1.0f, 2.0f, 3.0f, 4.0f
110  });
111 
112  armnn::TensorInfo inputTensorInfo;
113  armnn::TensorInfo outputTensorInfo;
114 
116  desc.m_Parameters.m_DataLayout = dataLayout;
117  desc.m_Parameters.m_BlockSize = 2;
118 
119  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
120  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
121 
122  return SpaceToDepthTestImpl<T>(
123  workloadFactory, memoryManager, tensorHandleFactory,
124  inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
125 }
126 
127 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
128 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
129  armnn::IWorkloadFactory& workloadFactory,
131  const armnn::ITensorHandleFactory& tensorHandleFactory,
133 {
134  unsigned int inputShape[] = {1, 2, 2, 2};
135  unsigned int outputShape[] = {1, 1, 1, 8};
136 
137  std::vector<float> input = std::vector<float>(
138  {
139  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
140  });
141 
142  std::vector<float> outputExpected = std::vector<float>(
143  {
144  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
145  });
146 
147  armnn::TensorInfo inputTensorInfo;
148  armnn::TensorInfo outputTensorInfo;
149 
151  desc.m_Parameters.m_DataLayout = dataLayout;
152  desc.m_Parameters.m_BlockSize = 2;
153 
154  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
155  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
156 
157  return SpaceToDepthTestImpl<T>(
158  workloadFactory, memoryManager, tensorHandleFactory,
159  inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
160 }
161 
162 } // anonymous namespace
163 
165  armnn::IWorkloadFactory& workloadFactory,
167  const armnn::ITensorHandleFactory& tensorHandleFactory)
168 {
169  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
170  workloadFactory,
171  memoryManager,
172  tensorHandleFactory);
173 }
174 
176  armnn::IWorkloadFactory& workloadFactory,
178  const armnn::ITensorHandleFactory& tensorHandleFactory)
179 {
180  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
181  workloadFactory,
182  memoryManager,
183  tensorHandleFactory,
185 }
186 
188  armnn::IWorkloadFactory& workloadFactory,
190  const armnn::ITensorHandleFactory& tensorHandleFactory)
191 {
192  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
193  workloadFactory,
194  memoryManager,
195  tensorHandleFactory);
196 }
197 
199  armnn::IWorkloadFactory& workloadFactory,
201  const armnn::ITensorHandleFactory& tensorHandleFactory)
202 {
203  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
204  workloadFactory,
205  memoryManager,
206  tensorHandleFactory,
208 }
209 
211  armnn::IWorkloadFactory& workloadFactory,
213  const armnn::ITensorHandleFactory& tensorHandleFactory)
214 {
215  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
216  workloadFactory,
217  memoryManager,
218  tensorHandleFactory);
219 }
220 
222  armnn::IWorkloadFactory& workloadFactory,
224  const armnn::ITensorHandleFactory& tensorHandleFactory)
225 {
226  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
227  workloadFactory,
228  memoryManager,
229  tensorHandleFactory,
231 }
232 
234  armnn::IWorkloadFactory& workloadFactory,
236  const armnn::ITensorHandleFactory& tensorHandleFactory)
237 {
238  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
239  workloadFactory,
240  memoryManager,
241  tensorHandleFactory);
242 }
243 
245  armnn::IWorkloadFactory& workloadFactory,
247  const armnn::ITensorHandleFactory& tensorHandleFactory)
248 {
249  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
250  workloadFactory,
251  memoryManager,
252  tensorHandleFactory,
254 }
255 
257  armnn::IWorkloadFactory& workloadFactory,
259  const armnn::ITensorHandleFactory& tensorHandleFactory)
260 {
261  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
262  workloadFactory,
263  memoryManager,
264  tensorHandleFactory);
265 }
266 
268  armnn::IWorkloadFactory& workloadFactory,
270  const armnn::ITensorHandleFactory& tensorHandleFactory)
271 {
272  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
273  workloadFactory,
274  memoryManager,
275  tensorHandleFactory,
277 }
LayerTestResult< int16_t, 4 > SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< armnn::Half, 4 > SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
DataLayout
Definition: Types.hpp:49
const TensorShape & GetShape() const
Definition: Tensor.hpp:191
LayerTestResult< int16_t, 4 > SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
void IgnoreUnused(Ts &&...)
void Permute(const armnn::TensorShape &dstShape, const armnn::PermutationVector &mappings, const void *src, void *dst, size_t dataTypeSize)
Definition: Permute.cpp:131
LayerTestResult< uint8_t, 4 > SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test1(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:475
LayerTestResult< armnn::Half, 4 > SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
unsigned int m_BlockSize
Scalar specifying the input block size. It must be >= 1.
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test2(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:491
LayerTestResult< float, 4 > SpaceToDepthNchwFloat32Test1(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< float, 4 > SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
LayerTestResult< uint8_t, 4 > SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
armnn::TensorShape Permuted(const armnn::TensorShape &srcShape, const armnn::PermutationVector &mappings)
Definition: Permute.cpp:98
virtual std::unique_ptr< ITensorHandle > CreateTensorHandle(const TensorInfo &tensorInfo) const =0
unsigned int GetNumElements() const
Definition: Tensor.hpp:196