ArmNN
 21.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 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
12 #include <armnnUtils/Permute.hpp>
13 
16 
17 #include <test/TensorHelpers.hpp>
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  boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputTensorInfo,
63  armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
64 
65  LayerTestResult<T, 4> ret(outputTensorInfo);
66  ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo,
67  armnnUtils::QuantizedVector<T>(outputExpectedData, qScale, qOffset));
68 
69  std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
70  std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
71 
73  AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
74  AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
75 
76  std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSpaceToDepth(descriptor, info);
77 
78  inputHandle->Allocate();
79  outputHandle->Allocate();
80 
81  CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
82 
83  workload->Execute();
84 
85  CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
86 
87  return ret;
88 }
89 
90 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
91 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
92  armnn::IWorkloadFactory& workloadFactory,
94  const armnn::ITensorHandleFactory& tensorHandleFactory,
96 {
97  unsigned int inputShape[] = {1, 2, 2, 1};
98  unsigned int outputShape[] = {1, 1, 1, 4};
99 
100  std::vector<float> input = std::vector<float>(
101  {
102  1.0f, 2.0f, 3.0f, 4.0f
103  });
104 
105  std::vector<float> outputExpected = std::vector<float>(
106  {
107  1.0f, 2.0f, 3.0f, 4.0f
108  });
109 
110  armnn::TensorInfo inputTensorInfo;
111  armnn::TensorInfo outputTensorInfo;
112 
114  desc.m_Parameters.m_DataLayout = dataLayout;
115  desc.m_Parameters.m_BlockSize = 2;
116 
117  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
118  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
119 
120  return SpaceToDepthTestImpl<T>(
121  workloadFactory, memoryManager, tensorHandleFactory,
122  inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
123 }
124 
125 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
126 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
127  armnn::IWorkloadFactory& workloadFactory,
129  const armnn::ITensorHandleFactory& tensorHandleFactory,
131 {
132  unsigned int inputShape[] = {1, 2, 2, 2};
133  unsigned int outputShape[] = {1, 1, 1, 8};
134 
135  std::vector<float> input = std::vector<float>(
136  {
137  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
138  });
139 
140  std::vector<float> outputExpected = std::vector<float>(
141  {
142  1.4f, 2.3f, 3.2f, 4.1f, 5.4f, 6.3f, 7.2f, 8.1f
143  });
144 
145  armnn::TensorInfo inputTensorInfo;
146  armnn::TensorInfo outputTensorInfo;
147 
149  desc.m_Parameters.m_DataLayout = dataLayout;
150  desc.m_Parameters.m_BlockSize = 2;
151 
152  inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
153  outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
154 
155  return SpaceToDepthTestImpl<T>(
156  workloadFactory, memoryManager, tensorHandleFactory,
157  inputTensorInfo, outputTensorInfo, input, outputExpected, desc);
158 }
159 
160 } // anonymous namespace
161 
163  armnn::IWorkloadFactory& workloadFactory,
165  const armnn::ITensorHandleFactory& tensorHandleFactory)
166 {
167  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
168  workloadFactory,
169  memoryManager,
170  tensorHandleFactory);
171 }
172 
174  armnn::IWorkloadFactory& workloadFactory,
176  const armnn::ITensorHandleFactory& tensorHandleFactory)
177 {
178  return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
179  workloadFactory,
180  memoryManager,
181  tensorHandleFactory,
183 }
184 
186  armnn::IWorkloadFactory& workloadFactory,
188  const armnn::ITensorHandleFactory& tensorHandleFactory)
189 {
190  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
191  workloadFactory,
192  memoryManager,
193  tensorHandleFactory);
194 }
195 
197  armnn::IWorkloadFactory& workloadFactory,
199  const armnn::ITensorHandleFactory& tensorHandleFactory)
200 {
201  return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
202  workloadFactory,
203  memoryManager,
204  tensorHandleFactory,
206 }
207 
209  armnn::IWorkloadFactory& workloadFactory,
211  const armnn::ITensorHandleFactory& tensorHandleFactory)
212 {
213  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
214  workloadFactory,
215  memoryManager,
216  tensorHandleFactory);
217 }
218 
220  armnn::IWorkloadFactory& workloadFactory,
222  const armnn::ITensorHandleFactory& tensorHandleFactory)
223 {
224  return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
225  workloadFactory,
226  memoryManager,
227  tensorHandleFactory,
229 }
230 
232  armnn::IWorkloadFactory& workloadFactory,
234  const armnn::ITensorHandleFactory& tensorHandleFactory)
235 {
236  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
237  workloadFactory,
238  memoryManager,
239  tensorHandleFactory);
240 }
241 
243  armnn::IWorkloadFactory& workloadFactory,
245  const armnn::ITensorHandleFactory& tensorHandleFactory)
246 {
247  return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
248  workloadFactory,
249  memoryManager,
250  tensorHandleFactory,
252 }
253 
255  armnn::IWorkloadFactory& workloadFactory,
257  const armnn::ITensorHandleFactory& tensorHandleFactory)
258 {
259  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
260  workloadFactory,
261  memoryManager,
262  tensorHandleFactory);
263 }
264 
266  armnn::IWorkloadFactory& workloadFactory,
268  const armnn::ITensorHandleFactory& tensorHandleFactory)
269 {
270  return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
271  workloadFactory,
272  memoryManager,
273  tensorHandleFactory,
275 }
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:50
const TensorShape & GetShape() const
Definition: Tensor.hpp:187
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 SetQuantizationScale(float scale)
Definition: Tensor.cpp:464
void CopyDataFromITensorHandle(void *memory, const armnn::ITensorHandle *tensorHandle)
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.
virtual std::unique_ptr< IWorkload > CreateSpaceToDepth(const SpaceToDepthQueueDescriptor &descriptor, const WorkloadInfo &info) const
DataLayout m_DataLayout
The data layout to be used (NCHW, NHWC).
LayerTestResult< float, 4 > SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
Contains information about inputs and outputs to a layer.
void SetQuantizationOffset(int32_t offset)
Definition: Tensor.cpp:480
LayerTestResult< float, 4 > SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory &workloadFactory, const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager, const armnn::ITensorHandleFactory &tensorHandleFactory)
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
void CopyDataToITensorHandle(armnn::ITensorHandle *tensorHandle, const void *memory)