blob: 086f8757dd6ba1f8b90bd28f7c06935463ad3e16 [file] [log] [blame]
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01003// SPDX-License-Identifier: MIT
4//
5
6#include "PadTestImpl.hpp"
7
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
9
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010010#include <backendsCommon/test/TensorCopyUtils.hpp>
11#include <backendsCommon/test/WorkloadTestUtils.hpp>
12
13#include <test/TensorHelpers.hpp>
14
15//
16// Implementation templates
17//
18
19template<armnn::DataType ArmnnType, typename T>
20LayerTestResult<T, 2> Pad2dTestCommon(
21 armnn::IWorkloadFactory& workloadFactory,
22 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010023 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010024 float qScale,
25 int32_t qOffset,
26 const float customPaddingValue)
27{
Jan Eilers8eb25602020-03-09 12:13:48 +000028 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010029 const armnn::TensorShape inputShape{ 3, 3 };
30 const armnn::TensorShape outputShape{ 7, 7 };
31
32 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
33 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
34
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010035 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
36 {
37 // Height (3) x Width (3)
38 4, 8, 6,
39 7, 4, 4,
40 3, 2, 4
41 },
42 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010043
44 auto p = customPaddingValue;
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010045 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
46 {
47 p, p, p, p, p, p, p,
48 p, p, p, p, p, p, p,
49 p, p, 4, 8, 6, p, p,
50 p, p, 7, 4, 4, p, p,
51 p, p, 3, 2, 4, p, p,
52 p, p, p, p, p, p, p,
53 p, p, p, p, p, p, p
54 },
55 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010056
57 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
58
59 LayerTestResult<T, 2> result(outputTensorInfo);
60 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
61
Finn Williams826a5432020-08-27 16:15:20 +010062 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
63 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
64
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010065
66 armnn::PadQueueDescriptor descriptor;
67
68 std::vector<std::pair<unsigned int, unsigned int>> padList;
69 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
70 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
71
72 descriptor.m_Parameters.m_PadList = padList;
73 descriptor.m_Parameters.m_PadValue = customPaddingValue;
74 armnn::WorkloadInfo info;
75
76 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
77 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
78
79 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
80
81 inputHandle->Allocate();
82 outputHandle->Allocate();
83
84 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
85
86 workload->PostAllocationConfigure();
87 workload->Execute();
88
89 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
90
91 return result;
92}
93
94template<armnn::DataType ArmnnType, typename T>
95LayerTestResult<T, 3> Pad3dTestCommon(
96 armnn::IWorkloadFactory& workloadFactory,
97 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010098 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010099 float qScale,
100 int32_t qOffset)
101{
Jan Eilers8eb25602020-03-09 12:13:48 +0000102 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100103 const armnn::TensorShape inputShape{ 2, 2, 2 };
104 const armnn::TensorShape outputShape{ 3, 5, 6 };
105
106 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
107 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
108
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100109 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
110 {
111 // Channel 0, Height (2) x Width (2)
112 0, 4,
113 2, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100114
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100115 // Channel 1, Height (2) x Width (2)
116 6, 1,
117 5, 2
118 },
119 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100120
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100121 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
122 {
123 0, 0, 0, 0, 0, 0,
124 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 4, 0, 0,
126 0, 0, 2, 5, 0, 0,
127 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100128
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100129 0, 0, 0, 0, 0, 0,
130 0, 0, 0, 0, 0, 0,
131 0, 0, 6, 1, 0, 0,
132 0, 0, 5, 2, 0, 0,
133 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100134
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100135 0, 0, 0, 0, 0, 0,
136 0, 0, 0, 0, 0, 0,
137 0, 0, 0, 0, 0, 0,
138 0, 0, 0, 0, 0, 0,
139 0, 0, 0, 0, 0, 0
140 },
141 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100142
143 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(inputValues));
144
145 LayerTestResult<T, 3> result(outputTensorInfo);
146 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(expectedOutputValues));
147
Finn Williams826a5432020-08-27 16:15:20 +0100148 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
149 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
150
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100151
152 armnn::PadQueueDescriptor descriptor;
153
154 std::vector<std::pair<unsigned int, unsigned int>> PadList;
155 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
156 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
157 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
158
159 descriptor.m_Parameters.m_PadList = PadList;
160 armnn::WorkloadInfo info;
161
162 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
163 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
164
165 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
166
167 inputHandle->Allocate();
168 outputHandle->Allocate();
169
170 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
171
172 workload->PostAllocationConfigure();
173 workload->Execute();
174
175 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
176
177 return result;
178}
179
180template<armnn::DataType ArmnnType, typename T>
181LayerTestResult<T, 4> Pad4dTestCommon(
182 armnn::IWorkloadFactory& workloadFactory,
183 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100184 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100185 float qScale,
186 int32_t qOffset)
187{
Jan Eilers8eb25602020-03-09 12:13:48 +0000188 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100189 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
190 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
191
192 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
193 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
194
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100195 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
196 {
197 // Batch 0, Channel 0, Height (3) x Width (2)
198 0, 1,
199 2, 3,
200 4, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100201
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100202 // Batch 0, Channel 1, Height (3) x Width (2)
203 6, 7,
204 8, 9,
205 10, 11,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100206
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100207 // Batch 1, Channel 0, Height (3) x Width (2)
208 12, 13,
209 14, 15,
210 16, 17,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100211
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100212 // Batch 1, Channel 1, Height (3) x Width (2)
213 18, 19,
214 20, 21,
215 22, 23
216 },
217 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100218
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100219 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
220 {
221 0, 0, 0, 0,
222 0, 0, 0, 0,
223 0, 0, 0, 0,
224 0, 0, 0, 0,
225 0, 0, 0, 0,
226 0, 0, 0, 0,
227 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100228
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100229 0, 0, 0, 0,
230 0, 0, 0, 0,
231 0, 0, 0, 0,
232 0, 0, 0, 0,
233 0, 0, 0, 0,
234 0, 0, 0, 0,
235 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100236
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100237 0, 0, 0, 0,
238 0, 0, 0, 0,
239 0, 0, 0, 0,
240 0, 0, 0, 0,
241 0, 0, 0, 0,
242 0, 0, 0, 0,
243 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100244
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100245 0, 0, 0, 0,
246 0, 0, 0, 0,
247 0, 0, 0, 0,
248 0, 0, 0, 0,
249 0, 0, 0, 0,
250 0, 0, 0, 0,
251 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100252
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100253 0, 0, 0, 0,
254 0, 0, 0, 0,
255 0, 0, 0, 0,
256 0, 0, 0, 0,
257 0, 0, 0, 0,
258 0, 0, 0, 0,
259 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100260
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100261 0, 0, 0, 0,
262 0, 0, 0, 0,
263 0, 0, 0, 0,
264 0, 0, 0, 0,
265 0, 0, 0, 0,
266 0, 0, 0, 0,
267 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100268
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100269 0, 0, 0, 0,
270 0, 0, 0, 0,
271 0, 0, 0, 0,
272 0, 0, 0, 0,
273 0, 0, 0, 0,
274 0, 0, 0, 0,
275 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100276
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100277 0, 0, 0, 0,
278 0, 0, 0, 0,
279 0, 0, 0, 0,
280 0, 0, 1, 0,
281 0, 2, 3, 0,
282 0, 4, 5, 0,
283 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100284
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100285 0, 0, 0, 0,
286 0, 0, 0, 0,
287 0, 0, 0, 0,
288 0, 6, 7, 0,
289 0, 8, 9, 0,
290 0, 10, 11, 0,
291 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100292
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100293 0, 0, 0, 0,
294 0, 0, 0, 0,
295 0, 0, 0, 0,
296 0, 0, 0, 0,
297 0, 0, 0, 0,
298 0, 0, 0, 0,
299 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100300
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100301 0, 0, 0, 0,
302 0, 0, 0, 0,
303 0, 0, 0, 0,
304 0, 0, 0, 0,
305 0, 0, 0, 0,
306 0, 0, 0, 0,
307 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100308
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100309 0, 0, 0, 0,
310 0, 0, 0, 0,
311 0, 0, 0, 0,
312 0, 0, 0, 0,
313 0, 0, 0, 0,
314 0, 0, 0, 0,
315 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100316
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100317 0, 0, 0, 0,
318 0, 0, 0, 0,
319 0, 0, 0, 0,
320 0, 12, 13, 0,
321 0, 14, 15, 0,
322 0, 16, 17, 0,
323 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100324
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100325 0, 0, 0, 0,
326 0, 0, 0, 0,
327 0, 0, 0, 0,
328 0, 18, 19, 0,
329 0, 20, 21, 0,
330 0, 22, 23, 0,
331 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100332
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100333 0, 0, 0, 0,
334 0, 0, 0, 0,
335 0, 0, 0, 0,
336 0, 0, 0, 0,
337 0, 0, 0, 0,
338 0, 0, 0, 0,
339 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100340
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100341 0, 0, 0, 0,
342 0, 0, 0, 0,
343 0, 0, 0, 0,
344 0, 0, 0, 0,
345 0, 0, 0, 0,
346 0, 0, 0, 0,
347 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100348
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100349 0, 0, 0, 0,
350 0, 0, 0, 0,
351 0, 0, 0, 0,
352 0, 0, 0, 0,
353 0, 0, 0, 0,
354 0, 0, 0, 0,
355 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100356
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100357 0, 0, 0, 0,
358 0, 0, 0, 0,
359 0, 0, 0, 0,
360 0, 0, 0, 0,
361 0, 0, 0, 0,
362 0, 0, 0, 0,
363 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100364
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100365 0, 0, 0, 0,
366 0, 0, 0, 0,
367 0, 0, 0, 0,
368 0, 0, 0, 0,
369 0, 0, 0, 0,
370 0, 0, 0, 0,
371 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100372
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100373 0, 0, 0, 0,
374 0, 0, 0, 0,
375 0, 0, 0, 0,
376 0, 0, 0, 0,
377 0, 0, 0, 0,
378 0, 0, 0, 0,
379 0, 0, 0, 0
380 },
381 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100382
383 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(inputValues));
384
385 LayerTestResult<T, 4> result(outputTensorInfo);
386 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(expectedOutputValues));
387
Finn Williams826a5432020-08-27 16:15:20 +0100388 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
389 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100390
391 armnn::PadQueueDescriptor descriptor;
392
393 std::vector<std::pair<unsigned int, unsigned int>> PadList;
394 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
395 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
396 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
397 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
398
399 descriptor.m_Parameters.m_PadList = PadList;
400 armnn::WorkloadInfo info;
401
402 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
403 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
404
405 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
406
407 inputHandle->Allocate();
408 outputHandle->Allocate();
409
410 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
411
412 workload->PostAllocationConfigure();
413 workload->Execute();
414
415 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
416
417 return result;
418}
419
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000420template<armnn::DataType ArmnnType, typename T>
421LayerTestResult<T, 2> PadQAsymmTestCommon(
422 armnn::IWorkloadFactory& workloadFactory,
423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
424 const armnn::ITensorHandleFactory& tensorHandleFactory,
425 float qScale,
426 int32_t qOffset,
427 const float customPaddingValue)
428{
429 IgnoreUnused(memoryManager);
430 const armnn::TensorShape inputShape{ 3, 3 };
431 const armnn::TensorShape outputShape{ 7, 7 };
432
433 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
434 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
435
436 std::vector<T> inputValues =
437 {
438 // Height (3) x Width (3)
439 4, 8, 6,
440 7, 4, 4,
441 3, 2, 4
442 };
443
444 T p = static_cast<T>(customPaddingValue);
445 std::vector<T> expectedOutputValues =
446 {
447 p, p, p, p, p, p, p,
448 p, p, p, p, p, p, p,
449 p, p, 4, 8, 6, p, p,
450 p, p, 7, 4, 4, p, p,
451 p, p, 3, 2, 4, p, p,
452 p, p, p, p, p, p, p,
453 p, p, p, p, p, p, p
454 };
455
456 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
457
458 LayerTestResult<T, 2> result(outputTensorInfo);
459 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
460
461 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
462 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
463
464
465 armnn::PadQueueDescriptor descriptor;
466
467 std::vector<std::pair<unsigned int, unsigned int>> padList;
468 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
469 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
470
471 descriptor.m_Parameters.m_PadList = padList;
472 descriptor.m_Parameters.m_PadValue = customPaddingValue;
473 armnn::WorkloadInfo info;
474
475 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
476 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
477
478 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
479
480 inputHandle->Allocate();
481 outputHandle->Allocate();
482
483 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
484
485 workload->PostAllocationConfigure();
486 workload->Execute();
487
488 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
489
490 return result;
491}
492
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100493//
494// Explicit template specializations
495//
496
Derek Lambertif90c56d2020-01-10 17:14:08 +0000497template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
498Pad2dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100499 armnn::IWorkloadFactory& workloadFactory,
500 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100501 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100502 float qScale,
503 int32_t qOffset,
504 const float customPaddingValue);
505
Derek Lambertif90c56d2020-01-10 17:14:08 +0000506template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
507Pad3dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100508 armnn::IWorkloadFactory& workloadFactory,
509 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100510 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100511 float qScale,
512 int32_t qOffset);
513
Derek Lambertif90c56d2020-01-10 17:14:08 +0000514template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
515Pad4dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100516 armnn::IWorkloadFactory& workloadFactory,
517 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100518 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100519 float qScale,
520 int32_t qOffset);
521
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000522template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
523PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
524 armnn::IWorkloadFactory& workloadFactory,
525 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
526 const armnn::ITensorHandleFactory& tensorHandleFactory,
527 float qScale,
528 int32_t qOffset,
529 const float customPaddingValue);
530
531template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
532PadQAsymmTestCommon<armnn::DataType::QAsymmU8>(
533 armnn::IWorkloadFactory& workloadFactory,
534 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
535 const armnn::ITensorHandleFactory& tensorHandleFactory,
536 float qScale,
537 int32_t qOffset,
538 const float customPaddingValue);
539
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100540//
541// Implementation functions
542//
543
544LayerTestResult<uint8_t, 2> PadUint82dTest(
545 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100546 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
547 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100548{
Finn Williams826a5432020-08-27 16:15:20 +0100549 return Pad2dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100550}
551
552LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
553 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100554 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
555 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100556{
Finn Williams826a5432020-08-27 16:15:20 +0100557 return Pad2dTestCommon<armnn::DataType::QAsymmU8>(
558 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100559}
560
561LayerTestResult<uint8_t, 3> PadUint83dTest(
562 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100563 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
564 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100565{
Finn Williams826a5432020-08-27 16:15:20 +0100566 return Pad3dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100567}
568
569LayerTestResult<uint8_t, 4> PadUint84dTest(
570 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100571 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
572 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100573{
Finn Williams826a5432020-08-27 16:15:20 +0100574 return Pad4dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100575}
576
577LayerTestResult<float, 2> PadFloat322dTest(
578 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
580 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100581{
Finn Williams826a5432020-08-27 16:15:20 +0100582 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100583}
584
585LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
586 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100587 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
588 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100589{
Finn Williams826a5432020-08-27 16:15:20 +0100590 return Pad2dTestCommon<armnn::DataType::Float32>(
591 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100592}
593
594LayerTestResult<float, 3> PadFloat323dTest(
595 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100596 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
597 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100598{
Finn Williams826a5432020-08-27 16:15:20 +0100599 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100600}
601
602LayerTestResult<float, 4> PadFloat324dTest(
603 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100604 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
605 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100606{
Finn Williams826a5432020-08-27 16:15:20 +0100607 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100608}
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000609
610LayerTestResult<armnn::BFloat16, 2> PadBFloat162dTest(
611 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100612 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
613 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000614{
Finn Williams826a5432020-08-27 16:15:20 +0100615 return Pad2dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000616}
617
618LayerTestResult<armnn::BFloat16, 2> PadBFloat162dCustomPaddingTest(
619 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100620 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
621 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000622{
Finn Williams826a5432020-08-27 16:15:20 +0100623 return Pad2dTestCommon<armnn::DataType::BFloat16>(
624 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000625}
626
627LayerTestResult<armnn::BFloat16, 3> PadBFloat163dTest(
628 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
630 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000631{
Finn Williams826a5432020-08-27 16:15:20 +0100632 return Pad3dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000633}
634
635LayerTestResult<armnn::BFloat16, 4> PadBFloat164dTest(
636 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100637 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
638 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000639{
Finn Williams826a5432020-08-27 16:15:20 +0100640 return Pad4dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000641}
Sadik Armagan041b3c02020-06-04 10:32:18 +0100642
643LayerTestResult<int8_t, 2> PadInt82dTest(
644 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
646 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100647{
Finn Williams826a5432020-08-27 16:15:20 +0100648 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
649 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100650}
651
652LayerTestResult<int8_t, 2> PadInt82dCustomPaddingTest(
653 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
655 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100656{
Finn Williams826a5432020-08-27 16:15:20 +0100657 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
658 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100659}
660
661LayerTestResult<int8_t, 3> PadInt83dTest(
662 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100663 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
664 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100665{
Finn Williams826a5432020-08-27 16:15:20 +0100666 return Pad3dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100667}
668
669LayerTestResult<int8_t, 4> PadInt84dTest(
670 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100671 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
672 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100673{
Finn Williams826a5432020-08-27 16:15:20 +0100674 return Pad4dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100675}
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000676
677LayerTestResult<int8_t, 2> PadInt8AsymmTest(
678 armnn::IWorkloadFactory& workloadFactory,
679 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
680 const armnn::ITensorHandleFactory& tensorHandleFactory)
681{
682 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
683 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 2);
684}
685
686LayerTestResult<int8_t, 2> PadInt8CustomPaddingAsymmTest(
687 armnn::IWorkloadFactory& workloadFactory,
688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
689 const armnn::ITensorHandleFactory& tensorHandleFactory)
690{
691 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
692 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 3, 1.0f);
693}