1 //
2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "RankTestImpl.hpp"
7
8 #include <backendsCommon/test/DataTypeUtils.hpp>
9 #include <backendsCommon/test/TensorCopyUtils.hpp>
10 #include <backendsCommon/test/WorkloadTestUtils.hpp>
11
12 #include <test/TensorHelpers.hpp>
13
14 template<typename T, std::size_t n>
RankTest(armnn::TensorInfo inputTensorInfo,boost::multi_array<T,n> input,armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)15 LayerTestResult<int32_t, 1> RankTest(
16 armnn::TensorInfo inputTensorInfo,
17 boost::multi_array<T, n> input,
18 armnn::IWorkloadFactory& workloadFactory,
19 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
20 const armnn::ITensorHandleFactory& tensorHandleFactory)
21 {
22 IgnoreUnused(memoryManager);
23
24 const armnn::TensorShape outputShape{armnn::Dimensionality::Scalar};
25 armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Signed32);
26
27 LayerTestResult<int32_t , 1> ret(outputTensorInfo);
28 ret.outputExpected = MakeTensor<uint32_t, 1>(outputTensorInfo, { n });
29
30 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
31 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
32
33 armnn::RankQueueDescriptor data;
34 armnn::WorkloadInfo info;
35 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
36 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
37
38 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateRank(data, info);
39
40 inputHandle->Allocate();
41 outputHandle->Allocate();
42
43 CopyDataToITensorHandle(inputHandle.get(), input.origin());
44
45 workload->Execute();
46
47 CopyDataFromITensorHandle(&ret.output[0], outputHandle.get());
48
49 return ret;
50 }
51
52 template<armnn::DataType ArmnnType, typename T>
RankDimSize1Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)53 LayerTestResult<int32_t, 1> RankDimSize1Test(
54 armnn::IWorkloadFactory& workloadFactory,
55 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
56 const armnn::ITensorHandleFactory& tensorHandleFactory)
57 {
58 armnn::TensorInfo inputTensorInfo({6}, ArmnnType, 1.0f, 0);
59 auto input = MakeTensor<T, 1>(inputTensorInfo, ConvertToDataType<ArmnnType>(
60 { -37.5f, -15.2f, -8.76f, -2.0f, -1.3f, -0.5f },
61 inputTensorInfo));
62
63 return RankTest<T, 1>(inputTensorInfo, input, workloadFactory, memoryManager, tensorHandleFactory);
64 }
65
66 template<armnn::DataType ArmnnType, typename T>
RankDimSize2Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)67 LayerTestResult<int32_t, 1> RankDimSize2Test(
68 armnn::IWorkloadFactory& workloadFactory,
69 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
70 const armnn::ITensorHandleFactory& tensorHandleFactory)
71 {
72 armnn::TensorInfo inputTensorInfo({1, 3}, ArmnnType, 1.0f, 0);
73 auto input = MakeTensor<T, 2>(inputTensorInfo, ConvertToDataType<ArmnnType>(
74 { -37.5f, -15.2f, -8.76f },
75 inputTensorInfo));
76
77 return RankTest<T, 2>(inputTensorInfo, input, workloadFactory, memoryManager, tensorHandleFactory);
78 }
79
80 template<armnn::DataType ArmnnType, typename T>
RankDimSize3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)81 LayerTestResult<int32_t, 1> RankDimSize3Test(
82 armnn::IWorkloadFactory& workloadFactory,
83 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
84 const armnn::ITensorHandleFactory& tensorHandleFactory)
85 {
86 armnn::TensorInfo inputTensorInfo({1, 3, 2}, ArmnnType, 1.0f, 0);
87 auto input = MakeTensor<T, 3>(inputTensorInfo, ConvertToDataType<ArmnnType>(
88 { -37.5f, -15.2f, -8.76f, -2.0f, -1.5f, -1.3f},
89 inputTensorInfo));
90
91 return RankTest<T, 3>(inputTensorInfo, input, workloadFactory, memoryManager, tensorHandleFactory);
92 }
93
94 template<armnn::DataType ArmnnType, typename T>
RankDimSize4Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)95 LayerTestResult<int32_t, 1> RankDimSize4Test(
96 armnn::IWorkloadFactory& workloadFactory,
97 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
98 const armnn::ITensorHandleFactory& tensorHandleFactory)
99 {
100 armnn::TensorInfo inputTensorInfo({1, 3, 2, 3}, ArmnnType, 1.0f, 0);
101 auto input = MakeTensor<T, 4>(inputTensorInfo, ConvertToDataType<ArmnnType>(
102 { -37.5f, -15.2f, -8.76f, -2.0f, -1.5f, -1.3f, -0.5f, -0.4f, 0.0f,
103 1.0f, 0.4f, 0.5f, 1.3f, 1.5f, 2.0f, 8.76f, 15.2f, 37.5f },
104 inputTensorInfo));
105
106 return RankTest<T, 4>(inputTensorInfo, input, workloadFactory, memoryManager, tensorHandleFactory);
107 }
108
109 template LayerTestResult<int32_t, 1>
110 RankDimSize4Test<armnn::DataType::Float16>(
111 armnn::IWorkloadFactory& workloadFactory,
112 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
113 const armnn::ITensorHandleFactory& tensorHandleFactory);
114
115 template LayerTestResult<int32_t, 1>
116 RankDimSize4Test<armnn::DataType::Float32>(
117 armnn::IWorkloadFactory& workloadFactory,
118 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
119 const armnn::ITensorHandleFactory& tensorHandleFactory);
120
121 template LayerTestResult<int32_t, 1>
122 RankDimSize4Test<armnn::DataType::QAsymmU8>(
123 armnn::IWorkloadFactory& workloadFactory,
124 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
125 const armnn::ITensorHandleFactory& tensorHandleFactory);
126
127 template LayerTestResult<int32_t, 1>
128 RankDimSize4Test<armnn::DataType::Signed32>(
129 armnn::IWorkloadFactory& workloadFactory,
130 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
131 const armnn::ITensorHandleFactory& tensorHandleFactory);
132
133 template LayerTestResult<int32_t, 1>
134 RankDimSize4Test<armnn::DataType::QSymmS16>(
135 armnn::IWorkloadFactory& workloadFactory,
136 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
137 const armnn::ITensorHandleFactory& tensorHandleFactory);
138
139 template LayerTestResult<int32_t, 1>
140 RankDimSize4Test<armnn::DataType::QSymmS8>(
141 armnn::IWorkloadFactory& workloadFactory,
142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
143 const armnn::ITensorHandleFactory& tensorHandleFactory);
144
145 template LayerTestResult<int32_t, 1>
146 RankDimSize4Test<armnn::DataType::QAsymmS8>(
147 armnn::IWorkloadFactory& workloadFactory,
148 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
149 const armnn::ITensorHandleFactory& tensorHandleFactory);
150
151 template LayerTestResult<int32_t, 1>
152 RankDimSize4Test<armnn::DataType::BFloat16>(
153 armnn::IWorkloadFactory& workloadFactory,
154 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
155 const armnn::ITensorHandleFactory& tensorHandleFactory);
156
157 template LayerTestResult<int32_t, 1>
158 RankDimSize3Test<armnn::DataType::Float16>(
159 armnn::IWorkloadFactory& workloadFactory,
160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
161 const armnn::ITensorHandleFactory& tensorHandleFactory);
162
163 template LayerTestResult<int32_t, 1>
164 RankDimSize3Test<armnn::DataType::Float32>(
165 armnn::IWorkloadFactory& workloadFactory,
166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
167 const armnn::ITensorHandleFactory& tensorHandleFactory);
168
169 template LayerTestResult<int32_t, 1>
170 RankDimSize3Test<armnn::DataType::QAsymmU8>(
171 armnn::IWorkloadFactory& workloadFactory,
172 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
173 const armnn::ITensorHandleFactory& tensorHandleFactory);
174
175 template LayerTestResult<int32_t, 1>
176 RankDimSize3Test<armnn::DataType::Signed32>(
177 armnn::IWorkloadFactory& workloadFactory,
178 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
179 const armnn::ITensorHandleFactory& tensorHandleFactory);
180
181 template LayerTestResult<int32_t, 1>
182 RankDimSize3Test<armnn::DataType::QSymmS16>(
183 armnn::IWorkloadFactory& workloadFactory,
184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
185 const armnn::ITensorHandleFactory& tensorHandleFactory);
186
187 template LayerTestResult<int32_t, 1>
188 RankDimSize3Test<armnn::DataType::QSymmS8>(
189 armnn::IWorkloadFactory& workloadFactory,
190 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
191 const armnn::ITensorHandleFactory& tensorHandleFactory);
192
193 template LayerTestResult<int32_t, 1>
194 RankDimSize3Test<armnn::DataType::QAsymmS8>(
195 armnn::IWorkloadFactory& workloadFactory,
196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
197 const armnn::ITensorHandleFactory& tensorHandleFactory);
198
199 template LayerTestResult<int32_t, 1>
200 RankDimSize3Test<armnn::DataType::BFloat16>(
201 armnn::IWorkloadFactory& workloadFactory,
202 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
203 const armnn::ITensorHandleFactory& tensorHandleFactory);
204
205 template LayerTestResult<int32_t, 1>
206 RankDimSize2Test<armnn::DataType::Float16>(
207 armnn::IWorkloadFactory& workloadFactory,
208 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
209 const armnn::ITensorHandleFactory& tensorHandleFactory);
210
211 template LayerTestResult<int32_t, 1>
212 RankDimSize2Test<armnn::DataType::Float32>(
213 armnn::IWorkloadFactory& workloadFactory,
214 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
215 const armnn::ITensorHandleFactory& tensorHandleFactory);
216
217 template LayerTestResult<int32_t, 1>
218 RankDimSize2Test<armnn::DataType::QAsymmU8>(
219 armnn::IWorkloadFactory& workloadFactory,
220 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
221 const armnn::ITensorHandleFactory& tensorHandleFactory);
222
223 template LayerTestResult<int32_t, 1>
224 RankDimSize2Test<armnn::DataType::Signed32>(
225 armnn::IWorkloadFactory& workloadFactory,
226 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
227 const armnn::ITensorHandleFactory& tensorHandleFactory);
228
229 template LayerTestResult<int32_t, 1>
230 RankDimSize2Test<armnn::DataType::QSymmS16>(
231 armnn::IWorkloadFactory& workloadFactory,
232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
233 const armnn::ITensorHandleFactory& tensorHandleFactory);
234
235 template LayerTestResult<int32_t, 1>
236 RankDimSize2Test<armnn::DataType::QSymmS8>(
237 armnn::IWorkloadFactory& workloadFactory,
238 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
239 const armnn::ITensorHandleFactory& tensorHandleFactory);
240
241 template LayerTestResult<int32_t, 1>
242 RankDimSize2Test<armnn::DataType::QAsymmS8>(
243 armnn::IWorkloadFactory& workloadFactory,
244 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
245 const armnn::ITensorHandleFactory& tensorHandleFactory);
246
247 template LayerTestResult<int32_t, 1>
248 RankDimSize2Test<armnn::DataType::BFloat16>(
249 armnn::IWorkloadFactory& workloadFactory,
250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
251 const armnn::ITensorHandleFactory& tensorHandleFactory);
252
253 template LayerTestResult<int32_t, 1>
254 RankDimSize1Test<armnn::DataType::Float16>(
255 armnn::IWorkloadFactory& workloadFactory,
256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
257 const armnn::ITensorHandleFactory& tensorHandleFactory);
258
259 template LayerTestResult<int32_t, 1>
260 RankDimSize1Test<armnn::DataType::Float32>(
261 armnn::IWorkloadFactory& workloadFactory,
262 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
263 const armnn::ITensorHandleFactory& tensorHandleFactory);
264
265 template LayerTestResult<int32_t, 1>
266 RankDimSize1Test<armnn::DataType::QAsymmU8>(
267 armnn::IWorkloadFactory& workloadFactory,
268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
269 const armnn::ITensorHandleFactory& tensorHandleFactory);
270
271 template LayerTestResult<int32_t, 1>
272 RankDimSize1Test<armnn::DataType::Signed32>(
273 armnn::IWorkloadFactory& workloadFactory,
274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
275 const armnn::ITensorHandleFactory& tensorHandleFactory);
276
277 template LayerTestResult<int32_t, 1>
278 RankDimSize1Test<armnn::DataType::QSymmS16>(
279 armnn::IWorkloadFactory& workloadFactory,
280 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
281 const armnn::ITensorHandleFactory& tensorHandleFactory);
282
283 template LayerTestResult<int32_t, 1>
284 RankDimSize1Test<armnn::DataType::QSymmS8>(
285 armnn::IWorkloadFactory& workloadFactory,
286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
287 const armnn::ITensorHandleFactory& tensorHandleFactory);
288
289 template LayerTestResult<int32_t, 1>
290 RankDimSize1Test<armnn::DataType::QAsymmS8>(
291 armnn::IWorkloadFactory& workloadFactory,
292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
293 const armnn::ITensorHandleFactory& tensorHandleFactory);
294
295 template LayerTestResult<int32_t, 1>
296 RankDimSize1Test<armnn::DataType::BFloat16>(
297 armnn::IWorkloadFactory& workloadFactory,
298 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
299 const armnn::ITensorHandleFactory& tensorHandleFactory);