• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 //
2 // Copyright © 2019 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5 
6 #include "SliceTestImpl.hpp"
7 
8 #include <QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10 
11 
12 #include <backendsCommon/test/TensorCopyUtils.hpp>
13 #include <backendsCommon/test/WorkloadTestUtils.hpp>
14 
15 #include <test/TensorHelpers.hpp>
16 
17 namespace
18 {
19 
20 template<typename T, std::size_t NumDims>
SliceTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::TensorInfo & inputInfo,armnn::TensorInfo & outputInfo,std::vector<float> & inputData,std::vector<float> & expectedOutputData,armnn::SliceQueueDescriptor descriptor,const float qScale=1.0f,const int qOffset=0)21 LayerTestResult<T, NumDims> SliceTestImpl(
22     armnn::IWorkloadFactory& workloadFactory,
23     const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
24     armnn::TensorInfo& inputInfo,
25     armnn::TensorInfo& outputInfo,
26     std::vector<float>& inputData,
27     std::vector<float>& expectedOutputData,
28     armnn::SliceQueueDescriptor descriptor,
29     const float qScale = 1.0f,
30     const int qOffset = 0)
31 {
32     IgnoreUnused(memoryManager);
33     if(armnn::IsQuantizedType<T>())
34     {
35         inputInfo.SetQuantizationScale(qScale);
36         inputInfo.SetQuantizationOffset(qOffset);
37 
38         outputInfo.SetQuantizationScale(qScale);
39         outputInfo.SetQuantizationOffset(qOffset);
40     }
41 
42     boost::multi_array<T, NumDims> input =
43         MakeTensor<T, NumDims>(inputInfo, armnnUtils::QuantizedVector<T>(inputData, qScale, qOffset));
44 
45     LayerTestResult<T, NumDims> result(outputInfo);
46     result.outputExpected =
47         MakeTensor<T, NumDims>(outputInfo, armnnUtils::QuantizedVector<T>(expectedOutputData, qScale, qOffset));
48 
49     ARMNN_NO_DEPRECATE_WARN_BEGIN
50     std::unique_ptr<armnn::ITensorHandle> inputHandle  = workloadFactory.CreateTensorHandle(inputInfo);
51     std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputInfo);
52     ARMNN_NO_DEPRECATE_WARN_END
53 
54     armnn::WorkloadInfo info;
55     AddInputToWorkload(descriptor, info, inputInfo, inputHandle.get());
56     AddOutputToWorkload(descriptor, info, outputInfo, outputHandle.get());
57 
58     std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSlice(descriptor, info);
59 
60     inputHandle->Allocate();
61     outputHandle->Allocate();
62 
63     CopyDataToITensorHandle(inputHandle.get(), input.data());
64 
65     ExecuteWorkload(*workload, memoryManager);
66 
67     CopyDataFromITensorHandle(result.output.data(), outputHandle.get());
68 
69     return result;
70 }
71 
72 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Slice4dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)73 LayerTestResult<T, 4> Slice4dTest(armnn::IWorkloadFactory& workloadFactory,
74                                   const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
75 {
76     armnn::TensorShape inputShape  = { 3, 2, 3, 5 };
77     armnn::TensorShape outputShape = { 2, 1, 2, 3 };
78 
79     armnn::SliceQueueDescriptor desc;
80     desc.m_Parameters.m_Begin  = { 1, 0, 1, 2 };
81     desc.m_Parameters.m_Size   = { 2, 1, 2, 3 };
82 
83     armnn::TensorInfo inputInfo(inputShape, ArmnnType);
84     armnn::TensorInfo outputInfo(outputShape, ArmnnType);
85 
86     std::vector<float> input =
87     {
88          0.f,  1.f,  2.f,  3.f,  4.f,
89          5.f,  6.f,  7.f,  8.f,  9.f,
90         10.f, 11.f, 12.f, 13.f, 14.f,
91 
92         15.f, 16.f, 17.f, 18.f, 19.f,
93         20.f, 21.f, 22.f, 23.f, 24.f,
94         25.f, 26.f, 27.f, 28.f, 29.f,
95 
96 
97         30.f, 31.f, 32.f, 33.f, 34.f,
98         35.f, 36.f, 37.f, 38.f, 39.f,
99         40.f, 41.f, 42.f, 43.f, 44.f,
100 
101         45.f, 46.f, 47.f, 48.f, 49.f,
102         50.f, 51.f, 52.f, 53.f, 54.f,
103         55.f, 56.f, 57.f, 58.f, 59.f,
104 
105 
106         60.f, 61.f, 62.f, 63.f, 64.f,
107         65.f, 66.f, 67.f, 68.f, 69.f,
108         70.f, 71.f, 72.f, 73.f, 74.f,
109 
110         75.f, 76.f, 77.f, 78.f, 79.f,
111         80.f, 81.f, 82.f, 83.f, 84.f,
112         85.f, 86.f, 87.f, 88.f, 89.f
113     };
114 
115     std::vector<float> expectedOutput =
116     {
117         37.f, 38.f, 39.f,
118         42.f, 43.f, 44.f,
119 
120 
121         67.f, 68.f, 69.f,
122         72.f, 73.f, 74.f
123     };
124 
125     return SliceTestImpl<T, 4>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
126 }
127 
128 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Slice3dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)129 LayerTestResult<T, 3> Slice3dTest(armnn::IWorkloadFactory& workloadFactory,
130                                   const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
131 {
132     armnn::TensorShape inputShape  = { 2, 3, 5 };
133     armnn::TensorShape outputShape = { 1, 2, 3 };
134 
135     armnn::SliceQueueDescriptor desc;
136     desc.m_Parameters.m_Begin  = { 0, 1, 2 };
137     desc.m_Parameters.m_Size   = { 1, 2, 3 };
138 
139     armnn::TensorInfo inputInfo(inputShape, ArmnnType);
140     armnn::TensorInfo outputInfo(outputShape, ArmnnType);
141 
142     std::vector<float> input =
143     {
144          0.f,  1.f,  2.f,  3.f,  4.f,
145          5.f,  6.f,  7.f,  8.f,  9.f,
146         10.f, 11.f, 12.f, 13.f, 14.f,
147 
148         15.f, 16.f, 17.f, 18.f, 19.f,
149         20.f, 21.f, 22.f, 23.f, 24.f,
150         25.f, 26.f, 27.f, 28.f, 29.f,
151     };
152 
153     std::vector<float> expectedOutput =
154     {
155          7.f,  8.f,  9.f,
156         12.f, 13.f, 14.f
157     };
158 
159     return SliceTestImpl<T, 3>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
160 }
161 
162 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Slice2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)163 LayerTestResult<T, 2> Slice2dTest(armnn::IWorkloadFactory& workloadFactory,
164                                   const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
165 {
166     armnn::TensorShape inputShape  = { 3, 5 };
167     armnn::TensorShape outputShape = { 2, 3 };
168 
169     armnn::SliceQueueDescriptor desc;
170     desc.m_Parameters.m_Begin  = { 1, 2 };
171     desc.m_Parameters.m_Size   = { 2, 3 };
172 
173     armnn::TensorInfo inputInfo(inputShape, ArmnnType);
174     armnn::TensorInfo outputInfo(outputShape, ArmnnType);
175 
176     std::vector<float> input =
177     {
178          0.f,  1.f,  2.f,  3.f,  4.f,
179          5.f,  6.f,  7.f,  8.f,  9.f,
180         10.f, 11.f, 12.f, 13.f, 14.f
181     };
182 
183     std::vector<float> expectedOutput =
184     {
185          7.f,  8.f,  9.f,
186         12.f, 13.f, 14.f
187     };
188 
189     return SliceTestImpl<T, 2>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
190 }
191 
192 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Slice1dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)193 LayerTestResult<T, 1> Slice1dTest(armnn::IWorkloadFactory& workloadFactory,
194                                   const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
195 {
196     armnn::TensorShape inputShape  = { 5 };
197     armnn::TensorShape outputShape = { 3 };
198 
199     armnn::SliceQueueDescriptor desc;
200     desc.m_Parameters.m_Begin  = { 2 };
201     desc.m_Parameters.m_Size   = { 3 };
202 
203     armnn::TensorInfo inputInfo(inputShape, ArmnnType);
204     armnn::TensorInfo outputInfo(outputShape, ArmnnType);
205 
206     std::vector<float> input =
207     {
208          0.f,  1.f,  2.f,  3.f,  4.f
209     };
210 
211     std::vector<float> expectedOutput =
212     {
213          2.f,  3.f,  4.f
214     };
215 
216     return SliceTestImpl<T, 1>(workloadFactory, memoryManager, inputInfo, outputInfo, input, expectedOutput, desc);
217 }
218 
219 } // anonymous namespace
220 
221 // Float32 tests
Slice4dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)222 LayerTestResult<float, 4> Slice4dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
223                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
224 {
225     return Slice4dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
226 }
227 
Slice3dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)228 LayerTestResult<float, 3> Slice3dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
229                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
230 {
231     return Slice3dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
232 }
233 
Slice2dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)234 LayerTestResult<float, 2> Slice2dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
235                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
236 {
237     return Slice2dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
238 }
239 
Slice1dFloat32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)240 LayerTestResult<float, 1> Slice1dFloat32Test(armnn::IWorkloadFactory& workloadFactory,
241                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
242 {
243     return Slice1dTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
244 }
245 
246 // Uint8 tests
Slice4dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)247 LayerTestResult<uint8_t, 4> Slice4dUint8Test(armnn::IWorkloadFactory& workloadFactory,
248                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
249 {
250     return Slice4dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
251 }
252 
Slice3dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)253 LayerTestResult<uint8_t, 3> Slice3dUint8Test(armnn::IWorkloadFactory& workloadFactory,
254                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
255 {
256     return Slice3dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
257 }
258 
Slice2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)259 LayerTestResult<uint8_t, 2> Slice2dUint8Test(armnn::IWorkloadFactory& workloadFactory,
260                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
261 {
262     return Slice2dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
263 }
264 
Slice1dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)265 LayerTestResult<uint8_t, 1> Slice1dUint8Test(armnn::IWorkloadFactory& workloadFactory,
266                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
267 {
268     return Slice1dTest<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager);
269 }
270 
271 // Int16 tests
Slice4dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)272 LayerTestResult<int16_t, 4> Slice4dInt16Test(armnn::IWorkloadFactory& workloadFactory,
273                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
274 {
275     return Slice4dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
276 }
277 
Slice3dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)278 LayerTestResult<int16_t, 3> Slice3dInt16Test(armnn::IWorkloadFactory& workloadFactory,
279                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
280 {
281     return Slice3dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
282 }
283 
Slice2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)284 LayerTestResult<int16_t, 2> Slice2dInt16Test(armnn::IWorkloadFactory& workloadFactory,
285                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
286 {
287     return Slice2dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
288 }
289 
Slice1dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)290 LayerTestResult<int16_t, 1> Slice1dInt16Test(armnn::IWorkloadFactory& workloadFactory,
291                                              const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
292 {
293     return Slice1dTest<armnn::DataType::QSymmS16>(workloadFactory, memoryManager);
294 }
295