blob: c0a2ca8faf32a65820d382e78b27b24b6c771613 [file] [log] [blame]
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "AdditionTestImpl.hpp"
7
8#include "ElementwiseTestImpl.hpp"
9
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010010#include <QuantizeHelper.hpp>
11
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +010012template<>
13std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::AdditionQueueDescriptor>(
14 const armnn::IWorkloadFactory& workloadFactory,
15 const armnn::WorkloadInfo& info,
16 const armnn::AdditionQueueDescriptor& descriptor)
17{
18 return workloadFactory.CreateAddition(descriptor, info);
19}
20
21LayerTestResult<float,4> AdditionTest(
22 armnn::IWorkloadFactory& workloadFactory,
23 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
24{
25 unsigned int batchSize = 2u;
26 unsigned int channels = 2u;
27 unsigned int height = 2u;
28 unsigned int width = 3u;
29
30 unsigned int shape[] = { batchSize, channels, height, width };
31
32 std::vector<float> input1 =
33 {
34 0.0f, 2.0f, 1.0f,
35 0.2f, 1.0f, 2.0f,
36
37 1.0f, 2.0f, 1.0f,
38 0.2f, 1.0f, 2.0f,
39
40 0.0f, 2.0f, 1.0f,
41 4.2f, 1.0f, 2.0f,
42
43 0.0f, 0.0f, 1.0f,
44 0.2f, 1.0f, 2.0f,
45 };
46
47 std::vector<float> input2 =
48 {
49 1.0f, 2.0f, 1.0f,
50 0.0f, 1.0f, 2.0f,
51
52 1.0f, 2.0f, -2.0f,
53 0.2f, 1.0f, 2.0f,
54
55 0.0f, 2.0f, 1.0f,
56 4.2f, 0.0f, -3.0f,
57
58 0.0f, 0.0f, 1.0f,
59 0.7f, 1.0f, 5.0f,
60 };
61
62
63 std::vector<float> output
64 {
65 1.0f, 4.0f, 2.0f,
66 0.2f, 2.0f, 4.0f,
67
68 2.0f, 4.0f, -1.0f,
69 0.4f, 2.0f, 4.0f,
70
71 0.0f, 4.0f, 2.0f,
72 8.4f, 1.0f, -1.0f,
73
74 0.0f, 0.0f, 2.0f,
75 0.9f, 2.0f, 7.0f,
76 };
77
78 return ElementwiseTestHelper<4, armnn::AdditionQueueDescriptor, armnn::DataType::Float32>(
79 workloadFactory,
80 memoryManager,
81 shape,
82 input1,
83 shape,
84 input2,
85 shape,
86 output);
87}
88
89LayerTestResult<float, 5> Addition5dTest(
90 armnn::IWorkloadFactory& workloadFactory,
91 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
92{
93 unsigned int depth = 2u;
94 unsigned int batchSize = 2u;
95 unsigned int channels = 2u;
96 unsigned int height = 2u;
97 unsigned int width = 3u;
98
99 unsigned int shape[] = { depth, batchSize, channels, height, width };
100
101 std::vector<float> input1 =
102 {
103 2.6f, 4.0f, 4.4f, 2.7f, 4.6f, 2.8f,
104 2.3f, 1.9f, 3.4f, 2.9f, 2.2f, 4.5f,
105
106 2.8f, 1.9f, 2.3f, 2.6f, 4.7f, 3.5f,
107 0.4f, 1.5f, 2.1f, 0.7f, 5.0f, 1.1f,
108
109
110 1.0f, 2.7f, 0.0f, 0.6f, 0.8f, 0.9f,
111 1.0f, 2.6f, 0.4f, 3.8f, 0.4f, 0.8f,
112
113 0.5f, 4.3f, 3.1f, 4.4f, 0.7f, 1.4f,
114 0.4f, 4.4f, 0.7f, 0.6f, 4.7f, 1.2f,
115
116 };
117
118 std::vector<float> input2 =
119 {
120 4.4f, 3.0f, 1.0f, 0.0f, 3.9f, 3.1f,
121 1.7f, 2.9f, 1.3f, 0.4f, 0.4f, 4.3f,
122
123 4.5f, 0.2f, 2.2f, 4.1f, 3.9f, 3.0f,
124 0.1f, 2.5f, 4.1f, 4.6f, 1.5f, 0.0f,
125
126
127 0.5f, 4.9f, 2.5f, 1.5f, 3.4f, 4.5f,
128 2.0f, 3.0f, 4.9f, 1.6f, 2.4f, 3.4f,
129
130 3.6f, 1.8f, 1.3f, 2.6f, 2.1f, 4.8f,
131 2.0f, 4.3f, 4.0f, 0.2f, 0.6f, 4.4f,
132 };
133
134 std::vector<float> output =
135 {
136 7.0f, 7.0f, 5.4f, 2.7f, 8.5f, 5.9f,
137 4.0f, 4.8f, 4.7f, 3.3f, 2.6f, 8.8f,
138
139 7.3f, 2.1f, 4.5f, 6.7f, 8.6f, 6.5f,
140 0.5f, 4.0f, 6.2f, 5.3f, 6.5f, 1.1f,
141
142
143 1.5f, 7.6f, 2.5f, 2.1f, 4.2f, 5.4f,
144 3.0f, 5.6f, 5.3f, 5.4f, 2.8f, 4.2f,
145
146 4.1f, 6.1f, 4.4f, 7.0f, 2.8f, 6.2f,
147 2.4f, 8.7f, 4.7f, 0.8f, 5.3f, 5.6f,
148 };
149
150 return ElementwiseTestHelper<5, armnn::AdditionQueueDescriptor, armnn::DataType::Float32>(
151 workloadFactory,
152 memoryManager,
153 shape,
154 input1,
155 shape,
156 input2,
157 shape,
158 output);
159}
160
161template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
162LayerTestResult<T, 4> AdditionBroadcastTestImpl(
163 armnn::IWorkloadFactory& workloadFactory,
164 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
165 float qScale,
166 int32_t qOffset)
167{
Jan Eilers8eb25602020-03-09 12:13:48 +0000168 IgnoreUnused(memoryManager);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100169 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 1}, ArmnnType);
170 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 2, 3}, ArmnnType);
171 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
172
173 if (armnn::IsQuantizedType<T>())
174 {
175 inputTensorInfo1.SetQuantizationScale(qScale);
176 inputTensorInfo1.SetQuantizationOffset(qOffset);
177 inputTensorInfo2.SetQuantizationScale(qScale);
178 inputTensorInfo2.SetQuantizationOffset(qOffset);
179 outputTensorInfo.SetQuantizationScale(qScale);
180 outputTensorInfo.SetQuantizationOffset(qOffset);
181 }
182
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100183 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100184 {
185 0.0f,
186 1.0f,
187
188 2.0f,
189 3.0f,
190
191 4.0f,
192 5.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100193 },
194 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100195
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100196 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100197 {
198 0.5f, 1.5f, 2.5f,
199 3.5f, 4.5f, 5.5f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100200 },
201 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100202
203 LayerTestResult<T,4> ret(outputTensorInfo);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100204 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100205 {
206 0.5f, 1.5f, 2.5f,
207 4.5f, 5.5f, 6.5f,
208
209 2.5f, 3.5f, 4.5f,
210 6.5f, 7.5f, 8.5f,
211
212 4.5f, 5.5f, 6.5f,
213 8.5f, 9.5f, 10.5f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100214 },
215 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100216
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100217 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100218 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
219 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
220 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100221 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100222
223 armnn::AdditionQueueDescriptor data;
224 armnn::WorkloadInfo info;
225 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
226 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
227 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
228
229 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
230
231 inputHandle1->Allocate();
232 inputHandle2->Allocate();
233 outputHandle->Allocate();
234
235 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
236 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
237
238 workload->PostAllocationConfigure();
239 workload->Execute();
240
241 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
242
243 return ret;
244}
245
246template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
247LayerTestResult<T, 4> AdditionBroadcast1ElementTestImpl(
248 armnn::IWorkloadFactory& workloadFactory,
249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
250 float qScale,
251 int32_t qOffset)
252{
Jan Eilers8eb25602020-03-09 12:13:48 +0000253 IgnoreUnused(memoryManager);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100254 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
255 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 1, 1}, ArmnnType);
256 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
257
258 if (armnn::IsQuantizedType<T>())
259 {
260 inputTensorInfo1.SetQuantizationScale(qScale);
261 inputTensorInfo1.SetQuantizationOffset(qOffset);
262 inputTensorInfo2.SetQuantizationScale(qScale);
263 inputTensorInfo2.SetQuantizationOffset(qOffset);
264 outputTensorInfo.SetQuantizationScale(qScale);
265 outputTensorInfo.SetQuantizationOffset(qOffset);
266 }
267
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100268 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100269 {
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100270 0.0f, 1.0f, 2.0f,
271 3.0f, 4.0f, 5.0f,
272 6.0f, 7.0f, 8.0f,
273 9.0f, 10.0f, 11.0f,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100274 12.0f, 13.0f, 14.0f,
275 15.0f, 16.0f, 17.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100276 },
277 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100278
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100279 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100280 {
281 0.5f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100282 },
283 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100284
285 LayerTestResult<T,4> ret(outputTensorInfo);
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100286 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, armnnUtils::QuantizedVector<T>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100287 {
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100288 0.5f, 1.5f, 2.5f,
289 3.5f, 4.5f, 5.5f,
290 6.5f, 7.5f, 8.5f,
291 9.5f, 10.5f, 11.5f,
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100292 12.5f, 13.5f, 14.5f,
293 15.5f, 16.5f, 17.5f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100294 },
295 qScale, qOffset));
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100296
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100297 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100298 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
299 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
300 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100301 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100302
303 armnn::AdditionQueueDescriptor data;
304 armnn::WorkloadInfo info;
305 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
306 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
307 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
308
309 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
310
311 inputHandle1->Allocate();
312 inputHandle2->Allocate();
313 outputHandle->Allocate();
314
315 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
316 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
317
318 workload->PostAllocationConfigure();
319 workload->Execute();
320
321 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
322
323 return ret;
324}
325
326LayerTestResult<float, 4> AdditionBroadcastTest(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
329{
330 return AdditionBroadcastTestImpl<armnn::DataType::Float32>(
331 workloadFactory, memoryManager, 0.0f, 0);
332}
333
334LayerTestResult<uint8_t, 4> AdditionBroadcastUint8Test(
335 armnn::IWorkloadFactory& workloadFactory,
336 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
337{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000338 return AdditionBroadcastTestImpl<armnn::DataType::QAsymmU8>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100339 workloadFactory, memoryManager, 2.f, 0);
340}
341
342LayerTestResult<int16_t, 4> AdditionBroadcastInt16Test(
343 armnn::IWorkloadFactory& workloadFactory,
344 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
345{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000346 return AdditionBroadcastTestImpl<armnn::DataType::QSymmS16>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100347 workloadFactory, memoryManager, 2.f, 0);
348}
349
Teresa Charlinecb6b8e2020-05-22 18:08:23 +0100350LayerTestResult<int32_t, 4> AdditionBroadcastInt32Test(
351 armnn::IWorkloadFactory& workloadFactory,
352 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
353{
354 return AdditionBroadcastTestImpl<armnn::DataType::Signed32>(
355 workloadFactory, memoryManager, 1.f, 0);
356}
357
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100358LayerTestResult<float, 4> AdditionBroadcast1ElementTest(
359 armnn::IWorkloadFactory& workloadFactory,
360 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
361{
362 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Float32>(
363 workloadFactory, memoryManager, 0.0f, 0);
364}
365
366LayerTestResult<uint8_t, 4> AdditionBroadcast1ElementUint8Test(
367 armnn::IWorkloadFactory& workloadFactory,
368 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
369{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000370 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QAsymmU8>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100371 workloadFactory, memoryManager, 0.1333333f, 128);
372}
373
374LayerTestResult<int16_t, 4> AdditionBroadcast1ElementInt16Test(
375 armnn::IWorkloadFactory& workloadFactory,
376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
377{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000378 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QSymmS16>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100379 workloadFactory, memoryManager, 0.1333333f, 0);
380}
381
Teresa Charlinecb6b8e2020-05-22 18:08:23 +0100382LayerTestResult<int32_t, 4> AdditionBroadcast1ElementInt32Test(
383 armnn::IWorkloadFactory& workloadFactory,
384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
385{
386 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Signed32>(
387 workloadFactory, memoryManager, 1.f, 0);
388}
389
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100390LayerTestResult<uint8_t, 4> AdditionUint8Test(
391 armnn::IWorkloadFactory& workloadFactory,
392 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
393{
394 const unsigned int shape0[] = { 1, 2, 2, 3 };
395 const unsigned int shape1[] = { 1, 2, 2, 3 };
396
397 std::vector<uint8_t> input0(
398 {
399 63, 35, 77, 70, 56, 112, // 420, 224, 518, 469, 371, 763
400 203, 28, 252, 168, 245, 91 // 1400, 175, 1743, 1155, 1694, 616
401 });
402
403 std::vector<uint8_t> input1(
404 {
405 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
406 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
407 });
408
409 std::vector<uint8_t> output(
410 {
411 81, 39, 249, 255, 228, 255, // 546, 252, 1722, 2065(clamped), 1575, 2212(clamped)
412 255, 186, 255, 186, 255, 214, // 2261(clamped), 1281, 2163(clamped), 1281, 2408(clamped), 1477
413 });
414
Derek Lambertif90c56d2020-01-10 17:14:08 +0000415 return ElementwiseTestHelper<4, armnn::AdditionQueueDescriptor, armnn::DataType::QAsymmU8>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100416 workloadFactory,
417 memoryManager,
418 shape0,
419 input0,
420 7.0f,
421 3,
422 shape1,
423 input1,
424 7.0f,
425 3,
426 shape0,
427 output,
428 7.0f,
429 3);
430}
431
432LayerTestResult<int16_t, 4> AdditionInt16Test(
433 armnn::IWorkloadFactory& workloadFactory,
434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
435{
436 const unsigned int shape0[] = { 1, 2, 2, 3 };
437 const unsigned int shape1[] = { 1, 2, 2, 3 };
438
439 std::vector<int16_t> input0 =
440 {
441 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
442 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
443 };
444
445 std::vector<int16_t> input1 =
446 {
447 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
448 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
449 };
450
451 std::vector<int16_t> output =
452 {
453 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
454 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
455 };
456
Derek Lambertif90c56d2020-01-10 17:14:08 +0000457 return ElementwiseTestHelper<4, armnn::AdditionQueueDescriptor, armnn::DataType::QSymmS16>(
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100458 workloadFactory,
459 memoryManager,
460 shape0,
461 input0,
462 7.0f,
463 0,
464 shape1,
465 input1,
466 7.0f,
467 0,
468 shape0,
469 output,
470 7.0f,
471 0);
472}
473
Teresa Charlinecb6b8e2020-05-22 18:08:23 +0100474LayerTestResult<int32_t, 4> AdditionInt32Test(
475 armnn::IWorkloadFactory& workloadFactory,
476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
477{
478 const unsigned int shape0[] = { 1, 2, 2, 3 };
479 const unsigned int shape1[] = { 1, 2, 2, 3 };
480
481 std::vector<int32_t> input0 =
482 {
483 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
484 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
485 };
486
487 std::vector<int32_t> input1 =
488 {
489 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
490 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
491 };
492
493 std::vector<int32_t> output =
494 {
495 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
496 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
497 };
498
499 return ElementwiseTestHelper<4, armnn::AdditionQueueDescriptor, armnn::DataType::Signed32>(
500 workloadFactory,
501 memoryManager,
502 shape0,
503 input0,
504 1.0f,
505 0,
506 shape1,
507 input1,
508 1.0f,
509 0,
510 shape0,
511 output,
512 1.0f,
513 0);
514}
515
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100516LayerTestResult<float, 4> AdditionAfterMaxPoolTest(
517 armnn::IWorkloadFactory& workloadFactory,
518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
519{
Jan Eilers8eb25602020-03-09 12:13:48 +0000520 IgnoreUnused(memoryManager);
Derek Lambertic374ff02019-12-10 21:57:35 +0000521
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100522 // Create Initial Tensor
523 // 1, 2, 3
524 // 4, 5, 6
525 // 7, 8, 9
526
527 armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::DataType::Float32);
528 armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::DataType::Float32);
529
530 boost::multi_array<float, 4> poolingInput = MakeTensor<float,4>(poolingInputTensorInfo,
531 {1, 2, 3,
532 4, 5, 6,
533 7, 8, 9
534 });
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100535 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100536 std::unique_ptr<armnn::ITensorHandle> poolingInputHandle =
537 workloadFactory.CreateTensorHandle(poolingInputTensorInfo);
538 std::unique_ptr<armnn::ITensorHandle> poolingOutputHandle =
539 workloadFactory.CreateTensorHandle(poolingOutputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100540 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100541
542 // Apply MaxPool poolSize = 1x1, stride=2x2
543 // Result =
544 // 1, 3
545 // 7, 9
546 armnn::Pooling2dDescriptor descriptor;
547 descriptor.m_PoolHeight = 1;
548 descriptor.m_PoolWidth = 1;
549 descriptor.m_StrideX = 2;
550 descriptor.m_StrideY = 2;
551 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
552
553 armnn::Pooling2dQueueDescriptor queueDescriptor;
554 queueDescriptor.m_Parameters = descriptor;
555 armnn::WorkloadInfo workloadInfo;
556 AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get());
557 AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get());
558
559 // Create the MaxPool
560 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
561
562 //LayerTestResult<float, 4> result(poolingOutputTensorInfo);
563 auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo));
564 boost::multi_array<float, 4> resultMaxPool;
565 resultMaxPool.resize(shape);
566
567
568 // Create addition with another tensor the same size
569 // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1
570 // with the initial tensor.
571 // 12, 16
572 // 24, 28
573
574 armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
575 armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
576
577 boost::multi_array<float, 4> addInput = MakeTensor<float,4>(addInputTensorInfo,
578 {12, 16,
579 24, 28,
580 });
581
582 // Expected output tensor after MaxPool and Addition.
583 LayerTestResult<float,4> addRet(addOutputTensorInfo);
584 addRet.outputExpected = MakeTensor<float, 4>(addOutputTensorInfo, std::vector<float>(
585 {
586 13, 19,
587 31, 37
588 }));
589
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100590 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100591 std::unique_ptr<armnn::ITensorHandle> addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo);
592 std::unique_ptr<armnn::ITensorHandle> addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100593 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100594
595 armnn::AdditionQueueDescriptor data;
596 armnn::WorkloadInfo info;
597
598 // Add the output of the MaxPool and the new tensor
599 AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get());
600 AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get());
601 AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get());
602
603 std::unique_ptr<armnn::IWorkload> addWorkload = workloadFactory.CreateAddition(data, info);
604
605 poolingInputHandle->Allocate();
606 poolingOutputHandle->Allocate();
607 addInputHandle->Allocate();
608 addOutputHandle->Allocate();
609
610 CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]);
611 CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get());
612
613 CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]);
614 CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]);
615
616 workload->PostAllocationConfigure();
617 workload->Execute();
618 addWorkload->PostAllocationConfigure();
619 addWorkload->Execute();
620
621 CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
622
623 return addRet;
624}
625
626LayerTestResult<float,4> CompareAdditionTest(
627 armnn::IWorkloadFactory& workloadFactory,
628 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
629 armnn::IWorkloadFactory& refWorkloadFactory)
630{
Jan Eilers8eb25602020-03-09 12:13:48 +0000631 IgnoreUnused(memoryManager);
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100632 unsigned int batchSize = 4;
633 unsigned int channels = 1;
634 unsigned int height = 2;
635 unsigned int width = 3;
636
637 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
638 armnn::TensorInfo outputTensorInfo;
639
640 unsigned int shape[] = {batchSize, channels, height, width};
641
642 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
643 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
644 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
645
646 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 1232);
647 auto input2 = MakeRandomTensor<float, 4>(inputTensorInfo2, 456);
648
649 LayerTestResult<float,4> ret(outputTensorInfo);
650
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100651 ARMNN_NO_DEPRECATE_WARN_BEGIN
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100652 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
653 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
654 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
655
656 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
657 std::unique_ptr<armnn::ITensorHandle> inputHandle2Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo2);
658 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +0100659 ARMNN_NO_DEPRECATE_WARN_END
Aron Virginas-Tare89ebad2019-08-27 18:14:26 +0100660
661 armnn::AdditionQueueDescriptor data;
662 armnn::WorkloadInfo info;
663 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
664 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
665 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
666
667 armnn::AdditionQueueDescriptor refData = data;
668 armnn::WorkloadInfo refInfo = info;
669 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo1, inputHandle1Ref.get());
670 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo2, inputHandle2Ref.get());
671 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
672
673 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
674 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateAddition(refData, refInfo);
675
676 inputHandle1->Allocate();
677 inputHandle2->Allocate();
678 outputHandle->Allocate();
679 inputHandle1Ref->Allocate();
680 inputHandle2Ref->Allocate();
681 outputHandleRef->Allocate();
682
683 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
684 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
685 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
686 CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
687
688 workload->PostAllocationConfigure();
689 workload->Execute();
690 workloadRef->PostAllocationConfigure();
691 workloadRef->Execute();
692
693 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
694 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
695
696 return ret;
Teresa Charlinecb6b8e2020-05-22 18:08:23 +0100697}