• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SpaceToDepthTestImpl.hpp"
7 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
12 #include <armnnUtils/Permute.hpp>
13 
14 #include <backendsCommon/test/TensorCopyUtils.hpp>
15 #include <backendsCommon/test/WorkloadTestUtils.hpp>
16 
17 #include <test/TensorHelpers.hpp>
18 
19 namespace
20 {
21 
22 template<typename T>
SpaceToDepthTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::TensorInfo & inputTensorInfo,armnn::TensorInfo & outputTensorInfo,std::vector<float> & inputData,std::vector<float> & outputExpectedData,armnn::SpaceToDepthQueueDescriptor descriptor,const float qScale=1.0f,const int32_t qOffset=0)23 LayerTestResult<T, 4> SpaceToDepthTestImpl(
24     armnn::IWorkloadFactory& workloadFactory,
25     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
26     const armnn::ITensorHandleFactory& tensorHandleFactory,
27     armnn::TensorInfo& inputTensorInfo,
28     armnn::TensorInfo& outputTensorInfo,
29     std::vector<float>& inputData,
30     std::vector<float>& outputExpectedData,
31     armnn::SpaceToDepthQueueDescriptor descriptor,
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 
38     if (descriptor.m_Parameters.m_DataLayout == armnn::DataLayout::NCHW)
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 
72     armnn::WorkloadInfo info;
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>>
SpaceToDepthSimpleTest1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)91 LayerTestResult<T, 4> SpaceToDepthSimpleTest1(
92     armnn::IWorkloadFactory& workloadFactory,
93     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
94     const armnn::ITensorHandleFactory& tensorHandleFactory,
95     armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
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 
113     armnn::SpaceToDepthQueueDescriptor desc;
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>>
SpaceToDepthSimpleTest2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NHWC)126 LayerTestResult<T, 4> SpaceToDepthSimpleTest2(
127     armnn::IWorkloadFactory& workloadFactory,
128     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
129     const armnn::ITensorHandleFactory& tensorHandleFactory,
130     armnn::DataLayout dataLayout = armnn::DataLayout::NHWC)
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 
148     armnn::SpaceToDepthQueueDescriptor desc;
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 
SpaceToDepthNhwcAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)162 LayerTestResult<uint8_t, 4> SpaceToDepthNhwcAsymmQ8Test(
163     armnn::IWorkloadFactory& workloadFactory,
164     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
165     const armnn::ITensorHandleFactory& tensorHandleFactory)
166 {
167     return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
168         workloadFactory,
169         memoryManager,
170         tensorHandleFactory);
171 }
172 
SpaceToDepthNchwAsymmQ8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)173 LayerTestResult<uint8_t, 4> SpaceToDepthNchwAsymmQ8Test(
174     armnn::IWorkloadFactory& workloadFactory,
175     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
176     const armnn::ITensorHandleFactory& tensorHandleFactory)
177 {
178     return SpaceToDepthSimpleTest1<armnn::DataType::QAsymmU8>(
179         workloadFactory,
180         memoryManager,
181         tensorHandleFactory,
182         armnn::DataLayout::NCHW);
183 }
184 
SpaceToDepthNhwcFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)185 LayerTestResult<armnn::Half, 4> SpaceToDepthNhwcFloat16Test(
186     armnn::IWorkloadFactory& workloadFactory,
187     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188     const armnn::ITensorHandleFactory& tensorHandleFactory)
189 {
190     return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
191         workloadFactory,
192         memoryManager,
193         tensorHandleFactory);
194 }
195 
SpaceToDepthNchwFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)196 LayerTestResult<armnn::Half, 4> SpaceToDepthNchwFloat16Test(
197     armnn::IWorkloadFactory& workloadFactory,
198     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
199     const armnn::ITensorHandleFactory& tensorHandleFactory)
200 {
201     return SpaceToDepthSimpleTest1<armnn::DataType::Float16>(
202         workloadFactory,
203         memoryManager,
204         tensorHandleFactory,
205         armnn::DataLayout::NCHW);
206 }
207 
SpaceToDepthNhwcFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)208 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test1(
209     armnn::IWorkloadFactory& workloadFactory,
210     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
211     const armnn::ITensorHandleFactory& tensorHandleFactory)
212 {
213     return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
214         workloadFactory,
215         memoryManager,
216         tensorHandleFactory);
217 }
218 
SpaceToDepthNchwFloat32Test1(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)219 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test1(
220     armnn::IWorkloadFactory& workloadFactory,
221     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
222     const armnn::ITensorHandleFactory& tensorHandleFactory)
223 {
224     return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
225         workloadFactory,
226         memoryManager,
227         tensorHandleFactory,
228         armnn::DataLayout::NCHW);
229 }
230 
SpaceToDepthNhwcFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)231 LayerTestResult<float, 4> SpaceToDepthNhwcFloat32Test2(
232     armnn::IWorkloadFactory& workloadFactory,
233     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
234     const armnn::ITensorHandleFactory& tensorHandleFactory)
235 {
236     return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
237         workloadFactory,
238         memoryManager,
239         tensorHandleFactory);
240 }
241 
SpaceToDepthNchwFloat32Test2(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)242 LayerTestResult<float, 4> SpaceToDepthNchwFloat32Test2(
243     armnn::IWorkloadFactory& workloadFactory,
244     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
245     const armnn::ITensorHandleFactory& tensorHandleFactory)
246 {
247     return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
248         workloadFactory,
249         memoryManager,
250         tensorHandleFactory,
251         armnn::DataLayout::NCHW);
252 }
253 
SpaceToDepthNhwcQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)254 LayerTestResult<int16_t, 4> SpaceToDepthNhwcQSymm16Test(
255     armnn::IWorkloadFactory& workloadFactory,
256     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
257     const armnn::ITensorHandleFactory& tensorHandleFactory)
258 {
259     return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
260         workloadFactory,
261         memoryManager,
262         tensorHandleFactory);
263 }
264 
SpaceToDepthNchwQSymm16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)265 LayerTestResult<int16_t, 4> SpaceToDepthNchwQSymm16Test(
266     armnn::IWorkloadFactory& workloadFactory,
267     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268     const armnn::ITensorHandleFactory& tensorHandleFactory)
269 {
270     return SpaceToDepthSimpleTest2<armnn::DataType::QSymmS16>(
271         workloadFactory,
272         memoryManager,
273         tensorHandleFactory,
274         armnn::DataLayout::NCHW);
275 }
276