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