1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "SubtractionTestImpl.hpp"
7
8 #include "ElementwiseTestImpl.hpp"
9
10 template<>
CreateWorkload(const armnn::IWorkloadFactory & workloadFactory,const armnn::WorkloadInfo & info,const armnn::SubtractionQueueDescriptor & descriptor)11 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::SubtractionQueueDescriptor>(
12 const armnn::IWorkloadFactory& workloadFactory,
13 const armnn::WorkloadInfo& info,
14 const armnn::SubtractionQueueDescriptor& descriptor)
15 {
16 return workloadFactory.CreateWorkload(armnn::LayerType::Subtraction, descriptor, info);
17 }
18
SubtractionUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)19 LayerTestResult<uint8_t, 4> SubtractionUint8Test(
20 armnn::IWorkloadFactory& workloadFactory,
21 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
22 const armnn::ITensorHandleFactory& tensorHandleFactory)
23 {
24 const unsigned int shape0[] = { 1, 1, 2, 2 };
25 const unsigned int shape1[] = { 1, 1, 2, 2 };
26
27 std::vector<uint8_t> input0 = { 10, 12, 14, 16 };
28 std::vector<uint8_t> input1 = { 1, 2, 1, 2 };
29 std::vector<uint8_t> output = { 3, 3, 5, 5 };
30
31 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QAsymmU8>(
32 workloadFactory,
33 memoryManager,
34 shape0,
35 input0,
36 0.5f,
37 2,
38 shape1,
39 input1,
40 1.0f,
41 0,
42 shape0,
43 output,
44 tensorHandleFactory,
45 1.0f,
46 0);
47 }
48
SubtractionBroadcast1ElementUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)49 LayerTestResult<uint8_t, 4> SubtractionBroadcast1ElementUint8Test(
50 armnn::IWorkloadFactory& workloadFactory,
51 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
52 const armnn::ITensorHandleFactory& tensorHandleFactory)
53 {
54 const unsigned int shape0[] = { 1, 1, 2, 2 };
55 const unsigned int shape1[] = { 1, 1, 1, 1 };
56
57 std::vector<uint8_t> input0 = { 10, 12, 14, 16 };
58
59 std::vector<uint8_t> input1 = { 2 };
60
61 std::vector<uint8_t> output = { 5, 6, 7, 8 };
62
63 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QAsymmU8>(
64 workloadFactory,
65 memoryManager,
66 shape0,
67 input0,
68 0.5f,
69 2,
70 shape1,
71 input1,
72 1.0f,
73 0,
74 shape0,
75 output,
76 tensorHandleFactory,
77 1.0f,
78 3);
79 }
80
SubtractionBroadcastUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)81 LayerTestResult<uint8_t, 4> SubtractionBroadcastUint8Test(
82 armnn::IWorkloadFactory& workloadFactory,
83 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
84 const armnn::ITensorHandleFactory& tensorHandleFactory)
85 {
86 const unsigned int shape0[] = { 1, 1, 2, 2 };
87 const unsigned int shape1[] = { 1, 1, 2, 1 };
88
89 std::vector<uint8_t> input0 = { 10, 12, 14, 16 };
90
91 std::vector<uint8_t> input1 = { 2, 1 };
92
93 std::vector<uint8_t> output = { 8, 11, 12, 15 };
94
95 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QAsymmU8>(
96 workloadFactory,
97 memoryManager,
98 shape0,
99 input0,
100 shape1,
101 input1,
102 shape0,
103 output,
104 tensorHandleFactory);
105 }
106
SubtractionTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)107 LayerTestResult<float, 4> SubtractionTest(
108 armnn::IWorkloadFactory& workloadFactory,
109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
110 const armnn::ITensorHandleFactory& tensorHandleFactory)
111 {
112 const unsigned int shape0[] = { 1, 1, 2, 2 };
113 const unsigned int shape1[] = { 1, 1, 2, 2 };
114
115 std::vector<float> input0 = { 1, 2, 3, 4 };
116 std::vector<float> input1 = { 1, -1, 0, 2 };
117 std::vector<float> output = { 0, 3, 3, 2 };
118
119 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float32>(
120 workloadFactory,
121 memoryManager,
122 shape0,
123 input0,
124 shape1,
125 input1,
126 shape0,
127 output,
128 tensorHandleFactory);
129 }
130
SubtractionBroadcast1ElementTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)131 LayerTestResult<float, 4> SubtractionBroadcast1ElementTest(
132 armnn::IWorkloadFactory& workloadFactory,
133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
134 const armnn::ITensorHandleFactory& tensorHandleFactory)
135 {
136 const unsigned int shape0[] = { 1, 1, 2, 2 };
137 const unsigned int shape1[] = { 1, 1, 1, 1 };
138
139 std::vector<float> input0 = { 1, 2, 3, 4 };
140
141 std::vector<float> input1 = { 10 };
142
143 std::vector<float> output = { -9, -8, -7, -6 };
144
145 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float32>(
146 workloadFactory,
147 memoryManager,
148 shape0,
149 input0,
150 shape1,
151 input1,
152 shape0,
153 output,
154 tensorHandleFactory);
155 }
156
SubtractionBroadcastTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)157 LayerTestResult<float, 4> SubtractionBroadcastTest(
158 armnn::IWorkloadFactory& workloadFactory,
159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
160 const armnn::ITensorHandleFactory& tensorHandleFactory)
161 {
162 const unsigned int shape0[] = { 1, 1, 2, 2 };
163 const unsigned int shape1[] = { 1, 1, 1, 2 };
164
165 std::vector<float> input0 = { 1, 2, 3, 4 };
166
167 std::vector<float> input1 = { 10, -5 };
168
169 std::vector<float> output = { -9, 7, -7, 9 };
170
171 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float32>(
172 workloadFactory,
173 memoryManager,
174 shape0,
175 input0,
176 shape1,
177 input1,
178 shape0,
179 output,
180 tensorHandleFactory);
181 }
182
SubtractionFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)183 LayerTestResult<armnn::Half, 4> SubtractionFloat16Test(
184 armnn::IWorkloadFactory& workloadFactory,
185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
186 const armnn::ITensorHandleFactory& tensorHandleFactory)
187 {
188 using namespace half_float::literal;
189
190 const unsigned int shape0[] = { 1, 1, 2, 2 };
191 const unsigned int shape1[] = { 1, 1, 2, 2 };
192
193 std::vector<armnn::Half> input0 = { 1._h, 2._h, 3._h, 4._h };
194 std::vector<armnn::Half> input1 = { 1._h, -1._h, 0._h, 2._h };
195 std::vector<armnn::Half> output = { 0._h, 3._h, 3._h, 2._h };
196
197 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float16>(
198 workloadFactory,
199 memoryManager,
200 shape0,
201 input0,
202 shape1,
203 input1,
204 shape0,
205 output,
206 tensorHandleFactory);
207 }
208
SubtractionBroadcast1ElementFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)209 LayerTestResult<armnn::Half, 4> SubtractionBroadcast1ElementFloat16Test(
210 armnn::IWorkloadFactory& workloadFactory,
211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
212 const armnn::ITensorHandleFactory& tensorHandleFactory)
213 {
214 using namespace half_float::literal;
215
216 const unsigned int shape0[] = { 1, 1, 2, 2 };
217 const unsigned int shape1[] = { 1, 1, 1, 1 };
218
219 std::vector<armnn::Half> input0 = { 1._h, 2._h, 3._h, 4._h };
220
221 std::vector<armnn::Half> input1 = { 10._h };
222
223 std::vector<armnn::Half> output = { -9._h, -8._h, -7._h, -6._h };
224
225 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float16>(
226 workloadFactory,
227 memoryManager,
228 shape0,
229 input0,
230 shape1,
231 input1,
232 shape0,
233 output,
234 tensorHandleFactory);
235 }
236
SubtractionBroadcastFloat16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)237 LayerTestResult<armnn::Half, 4> SubtractionBroadcastFloat16Test(
238 armnn::IWorkloadFactory& workloadFactory,
239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
240 const armnn::ITensorHandleFactory& tensorHandleFactory)
241 {
242 using namespace half_float::literal;
243
244 const unsigned int shape0[] = { 1, 1, 2, 2 };
245 const unsigned int shape1[] = { 1, 1, 1, 2 };
246
247 std::vector<armnn::Half> input0 = { 1._h, 2._h, 3._h, 4._h };
248
249 std::vector<armnn::Half> input1 = { 10._h, -5._h };
250
251 std::vector<armnn::Half> output = { -9._h, 7._h, -7._h, 9._h };
252
253 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Float16>(
254 workloadFactory,
255 memoryManager,
256 shape0,
257 input0,
258 shape1,
259 input1,
260 shape0,
261 output,
262 tensorHandleFactory);
263 }
264
SubtractionInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)265 LayerTestResult<int16_t, 4> SubtractionInt16Test(
266 armnn::IWorkloadFactory& workloadFactory,
267 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
268 const armnn::ITensorHandleFactory& tensorHandleFactory)
269 {
270 const unsigned int shape[] = { 1, 1, 2, 2 };
271
272 std::vector<int16_t> input0 = { 10, 12, 14, 16 };
273 std::vector<int16_t> input1 = { 1, 2, 1, 2 };
274 std::vector<int16_t> output = { 3, 3, 5, 5 };
275
276 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QSymmS16>(
277 workloadFactory,
278 memoryManager,
279 shape,
280 input0,
281 0.5f,
282 0,
283 shape,
284 input1,
285 1.0f,
286 0,
287 shape,
288 output,
289 tensorHandleFactory,
290 1.0f,
291 0);
292 }
293
SubtractionBroadcast1ElementInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)294 LayerTestResult<int16_t, 4> SubtractionBroadcast1ElementInt16Test(
295 armnn::IWorkloadFactory& workloadFactory,
296 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
297 const armnn::ITensorHandleFactory& tensorHandleFactory)
298 {
299 const unsigned int shape0[] = { 1, 1, 2, 2 };
300 const unsigned int shape1[] = { 1, 1, 1, 1 };
301
302 std::vector<int16_t> input0 = { 10, 12, 14, 16 };
303
304 std::vector<int16_t> input1 = { 2 };
305
306 std::vector<int16_t> output = { 3, 4, 5, 6 };
307
308 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QSymmS16>(
309 workloadFactory,
310 memoryManager,
311 shape0,
312 input0,
313 0.5f,
314 0,
315 shape1,
316 input1,
317 1.0f,
318 0,
319 shape0,
320 output,
321 tensorHandleFactory,
322 1.0f,
323 0);
324 }
325
SubtractionBroadcastInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)326 LayerTestResult<int16_t, 4> SubtractionBroadcastInt16Test(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
329 const armnn::ITensorHandleFactory& tensorHandleFactory)
330 {
331 const unsigned int shape0[] = { 1, 1, 2, 2 };
332 const unsigned int shape1[] = { 1, 1, 2, 1 };
333
334 std::vector<int16_t> input0 = { 10, 12, 14, 16 };
335
336 std::vector<int16_t> input1 = { 2, 1 };
337
338 std::vector<int16_t> output = { 8, 11, 12, 15 };
339
340 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::QSymmS16>(
341 workloadFactory,
342 memoryManager,
343 shape0,
344 input0,
345 shape1,
346 input1,
347 shape0,
348 output,
349 tensorHandleFactory);
350 }
351
SubtractionInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)352 LayerTestResult<int32_t, 4> SubtractionInt32Test(
353 armnn::IWorkloadFactory& workloadFactory,
354 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
355 const armnn::ITensorHandleFactory& tensorHandleFactory)
356 {
357 const unsigned int shape[] = { 1, 1, 2, 2 };
358
359 std::vector<int32_t> input0 = { 5, 6, 7, 8 };
360 std::vector<int32_t> input1 = { 1, 2, 1, 2 };
361 std::vector<int32_t> output = { 4, 4, 6, 6 };
362
363 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Signed32>(
364 workloadFactory,
365 memoryManager,
366 shape,
367 input0,
368 1.0f,
369 0,
370 shape,
371 input1,
372 1.0f,
373 0,
374 shape,
375 output,
376 tensorHandleFactory,
377 1.0f,
378 0);
379 }
380
SubtractionBroadcast1ElementInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)381 LayerTestResult<int32_t, 4> SubtractionBroadcast1ElementInt32Test(
382 armnn::IWorkloadFactory& workloadFactory,
383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
384 const armnn::ITensorHandleFactory& tensorHandleFactory)
385 {
386 const unsigned int shape0[] = { 1, 1, 2, 2 };
387 const unsigned int shape1[] = { 1, 1, 1, 1 };
388
389 std::vector<int32_t> input0 = { 5, 6, 7, 8 };
390
391 std::vector<int32_t> input1 = { 2 };
392
393 std::vector<int32_t> output = { 3, 4, 5, 6 };
394
395 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Signed32>(
396 workloadFactory,
397 memoryManager,
398 shape0,
399 input0,
400 1.0f,
401 0,
402 shape1,
403 input1,
404 1.0f,
405 0,
406 shape0,
407 output,
408 tensorHandleFactory,
409 1.0f,
410 0);
411 }
412
SubtractionBroadcastInt32Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)413 LayerTestResult<int32_t, 4> SubtractionBroadcastInt32Test(
414 armnn::IWorkloadFactory& workloadFactory,
415 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
416 const armnn::ITensorHandleFactory& tensorHandleFactory)
417 {
418 const unsigned int shape0[] = { 1, 1, 2, 2 };
419 const unsigned int shape1[] = { 1, 1, 2, 1 };
420
421 std::vector<int32_t> input0 = { 10, 12, 14, 16 };
422
423 std::vector<int32_t> input1 = { 2, 1 };
424
425 std::vector<int32_t> output = { 8, 11, 12, 15 };
426
427 return ElementwiseTestHelper<4, armnn::SubtractionQueueDescriptor, armnn::DataType::Signed32>(
428 workloadFactory,
429 memoryManager,
430 shape0,
431 input0,
432 shape1,
433 input1,
434 shape0,
435 output,
436 tensorHandleFactory);
437 }