blob: a09e387b0e59e3d52fce6b1328e164c03d2dfbf5 [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
Sadik Armagan483c8112021-06-01 09:24:52 +010057 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010058
Finn Williams826a5432020-08-27 16:15:20 +010059 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
60 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
61
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010062 armnn::PadQueueDescriptor descriptor;
63
64 std::vector<std::pair<unsigned int, unsigned int>> padList;
65 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
66 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
67
68 descriptor.m_Parameters.m_PadList = padList;
69 descriptor.m_Parameters.m_PadValue = customPaddingValue;
70 armnn::WorkloadInfo info;
71
72 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
73 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
74
75 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
76
77 inputHandle->Allocate();
78 outputHandle->Allocate();
79
Sadik Armagan483c8112021-06-01 09:24:52 +010080 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010081
82 workload->PostAllocationConfigure();
83 workload->Execute();
84
Sadik Armagan483c8112021-06-01 09:24:52 +010085 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010086
Sadik Armagan483c8112021-06-01 09:24:52 +010087 return LayerTestResult<T, 2>(actualOutput,
88 expectedOutputValues,
89 outputHandle->GetShape(),
90 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010091}
92
93template<armnn::DataType ArmnnType, typename T>
94LayerTestResult<T, 3> Pad3dTestCommon(
95 armnn::IWorkloadFactory& workloadFactory,
96 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010097 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010098 float qScale,
99 int32_t qOffset)
100{
Jan Eilers8eb25602020-03-09 12:13:48 +0000101 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100102 const armnn::TensorShape inputShape{ 2, 2, 2 };
103 const armnn::TensorShape outputShape{ 3, 5, 6 };
104
105 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
106 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
107
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100108 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
109 {
110 // Channel 0, Height (2) x Width (2)
111 0, 4,
112 2, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100113
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100114 // Channel 1, Height (2) x Width (2)
115 6, 1,
116 5, 2
117 },
118 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100119
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100120 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
121 {
122 0, 0, 0, 0, 0, 0,
123 0, 0, 0, 0, 0, 0,
124 0, 0, 0, 4, 0, 0,
125 0, 0, 2, 5, 0, 0,
126 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100127
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100128 0, 0, 0, 0, 0, 0,
129 0, 0, 0, 0, 0, 0,
130 0, 0, 6, 1, 0, 0,
131 0, 0, 5, 2, 0, 0,
132 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100133
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100134 0, 0, 0, 0, 0, 0,
135 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 },
140 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100141
Sadik Armagan483c8112021-06-01 09:24:52 +0100142 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100143
Finn Williams826a5432020-08-27 16:15:20 +0100144 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
145 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
146
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100147 armnn::PadQueueDescriptor descriptor;
148
149 std::vector<std::pair<unsigned int, unsigned int>> PadList;
150 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
151 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
152 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
153
154 descriptor.m_Parameters.m_PadList = PadList;
155 armnn::WorkloadInfo info;
156
157 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
158 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
159
160 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
161
162 inputHandle->Allocate();
163 outputHandle->Allocate();
164
Sadik Armagan483c8112021-06-01 09:24:52 +0100165 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100166
167 workload->PostAllocationConfigure();
168 workload->Execute();
169
Sadik Armagan483c8112021-06-01 09:24:52 +0100170 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100171
Sadik Armagan483c8112021-06-01 09:24:52 +0100172 return LayerTestResult<T, 3>(actualOutput,
173 expectedOutputValues,
174 outputHandle->GetShape(),
175 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100176}
177
178template<armnn::DataType ArmnnType, typename T>
179LayerTestResult<T, 4> Pad4dTestCommon(
180 armnn::IWorkloadFactory& workloadFactory,
181 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100182 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100183 float qScale,
184 int32_t qOffset)
185{
Jan Eilers8eb25602020-03-09 12:13:48 +0000186 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100187 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
188 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
189
190 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
191 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
192
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100193 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
194 {
195 // Batch 0, Channel 0, Height (3) x Width (2)
196 0, 1,
197 2, 3,
198 4, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100199
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100200 // Batch 0, Channel 1, Height (3) x Width (2)
201 6, 7,
202 8, 9,
203 10, 11,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100204
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100205 // Batch 1, Channel 0, Height (3) x Width (2)
206 12, 13,
207 14, 15,
208 16, 17,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100209
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100210 // Batch 1, Channel 1, Height (3) x Width (2)
211 18, 19,
212 20, 21,
213 22, 23
214 },
215 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100216
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100217 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
218 {
219 0, 0, 0, 0,
220 0, 0, 0, 0,
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,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100226
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100227 0, 0, 0, 0,
228 0, 0, 0, 0,
229 0, 0, 0, 0,
230 0, 0, 0, 0,
231 0, 0, 0, 0,
232 0, 0, 0, 0,
233 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100234
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100235 0, 0, 0, 0,
236 0, 0, 0, 0,
237 0, 0, 0, 0,
238 0, 0, 0, 0,
239 0, 0, 0, 0,
240 0, 0, 0, 0,
241 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100242
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100243 0, 0, 0, 0,
244 0, 0, 0, 0,
245 0, 0, 0, 0,
246 0, 0, 0, 0,
247 0, 0, 0, 0,
248 0, 0, 0, 0,
249 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100250
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100251 0, 0, 0, 0,
252 0, 0, 0, 0,
253 0, 0, 0, 0,
254 0, 0, 0, 0,
255 0, 0, 0, 0,
256 0, 0, 0, 0,
257 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100258
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100259 0, 0, 0, 0,
260 0, 0, 0, 0,
261 0, 0, 0, 0,
262 0, 0, 0, 0,
263 0, 0, 0, 0,
264 0, 0, 0, 0,
265 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100266
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100267 0, 0, 0, 0,
268 0, 0, 0, 0,
269 0, 0, 0, 0,
270 0, 0, 0, 0,
271 0, 0, 0, 0,
272 0, 0, 0, 0,
273 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100274
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100275 0, 0, 0, 0,
276 0, 0, 0, 0,
277 0, 0, 0, 0,
278 0, 0, 1, 0,
279 0, 2, 3, 0,
280 0, 4, 5, 0,
281 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100282
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100283 0, 0, 0, 0,
284 0, 0, 0, 0,
285 0, 0, 0, 0,
286 0, 6, 7, 0,
287 0, 8, 9, 0,
288 0, 10, 11, 0,
289 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100290
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100291 0, 0, 0, 0,
292 0, 0, 0, 0,
293 0, 0, 0, 0,
294 0, 0, 0, 0,
295 0, 0, 0, 0,
296 0, 0, 0, 0,
297 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100298
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100299 0, 0, 0, 0,
300 0, 0, 0, 0,
301 0, 0, 0, 0,
302 0, 0, 0, 0,
303 0, 0, 0, 0,
304 0, 0, 0, 0,
305 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100306
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100307 0, 0, 0, 0,
308 0, 0, 0, 0,
309 0, 0, 0, 0,
310 0, 0, 0, 0,
311 0, 0, 0, 0,
312 0, 0, 0, 0,
313 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100314
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100315 0, 0, 0, 0,
316 0, 0, 0, 0,
317 0, 0, 0, 0,
318 0, 12, 13, 0,
319 0, 14, 15, 0,
320 0, 16, 17, 0,
321 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100322
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100323 0, 0, 0, 0,
324 0, 0, 0, 0,
325 0, 0, 0, 0,
326 0, 18, 19, 0,
327 0, 20, 21, 0,
328 0, 22, 23, 0,
329 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100330
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100331 0, 0, 0, 0,
332 0, 0, 0, 0,
333 0, 0, 0, 0,
334 0, 0, 0, 0,
335 0, 0, 0, 0,
336 0, 0, 0, 0,
337 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100338
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100339 0, 0, 0, 0,
340 0, 0, 0, 0,
341 0, 0, 0, 0,
342 0, 0, 0, 0,
343 0, 0, 0, 0,
344 0, 0, 0, 0,
345 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100346
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100347 0, 0, 0, 0,
348 0, 0, 0, 0,
349 0, 0, 0, 0,
350 0, 0, 0, 0,
351 0, 0, 0, 0,
352 0, 0, 0, 0,
353 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100354
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100355 0, 0, 0, 0,
356 0, 0, 0, 0,
357 0, 0, 0, 0,
358 0, 0, 0, 0,
359 0, 0, 0, 0,
360 0, 0, 0, 0,
361 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100362
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100363 0, 0, 0, 0,
364 0, 0, 0, 0,
365 0, 0, 0, 0,
366 0, 0, 0, 0,
367 0, 0, 0, 0,
368 0, 0, 0, 0,
369 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100370
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100371 0, 0, 0, 0,
372 0, 0, 0, 0,
373 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 },
379 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100380
Sadik Armagan483c8112021-06-01 09:24:52 +0100381 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100382
Finn Williams826a5432020-08-27 16:15:20 +0100383 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
384 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100385
386 armnn::PadQueueDescriptor descriptor;
387
388 std::vector<std::pair<unsigned int, unsigned int>> PadList;
389 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
390 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
391 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
392 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
393
394 descriptor.m_Parameters.m_PadList = PadList;
395 armnn::WorkloadInfo info;
396
397 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
398 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
399
400 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
401
402 inputHandle->Allocate();
403 outputHandle->Allocate();
404
Sadik Armagan483c8112021-06-01 09:24:52 +0100405 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100406
407 workload->PostAllocationConfigure();
408 workload->Execute();
409
Sadik Armagan483c8112021-06-01 09:24:52 +0100410 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100411
Sadik Armagan483c8112021-06-01 09:24:52 +0100412 return LayerTestResult<T, 4>(actualOutput,
413 expectedOutputValues,
414 outputHandle->GetShape(),
415 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100416}
417
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000418template<armnn::DataType ArmnnType, typename T>
419LayerTestResult<T, 2> PadQAsymmTestCommon(
420 armnn::IWorkloadFactory& workloadFactory,
421 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
422 const armnn::ITensorHandleFactory& tensorHandleFactory,
423 float qScale,
424 int32_t qOffset,
425 const float customPaddingValue)
426{
427 IgnoreUnused(memoryManager);
428 const armnn::TensorShape inputShape{ 3, 3 };
429 const armnn::TensorShape outputShape{ 7, 7 };
430
431 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
432 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
433
434 std::vector<T> inputValues =
435 {
436 // Height (3) x Width (3)
437 4, 8, 6,
438 7, 4, 4,
439 3, 2, 4
440 };
441
442 T p = static_cast<T>(customPaddingValue);
443 std::vector<T> expectedOutputValues =
444 {
445 p, p, p, p, p, p, p,
446 p, p, p, p, p, p, p,
447 p, p, 4, 8, 6, p, p,
448 p, p, 7, 4, 4, p, p,
449 p, p, 3, 2, 4, p, p,
450 p, p, p, p, p, p, p,
451 p, p, p, p, p, p, p
452 };
453
Sadik Armagan483c8112021-06-01 09:24:52 +0100454 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000455
456 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
457 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
458
459
460 armnn::PadQueueDescriptor descriptor;
461
462 std::vector<std::pair<unsigned int, unsigned int>> padList;
463 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
464 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
465
466 descriptor.m_Parameters.m_PadList = padList;
467 descriptor.m_Parameters.m_PadValue = customPaddingValue;
468 armnn::WorkloadInfo info;
469
470 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
471 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
472
473 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
474
475 inputHandle->Allocate();
476 outputHandle->Allocate();
477
Sadik Armagan483c8112021-06-01 09:24:52 +0100478 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000479
480 workload->PostAllocationConfigure();
481 workload->Execute();
482
Sadik Armagan483c8112021-06-01 09:24:52 +0100483 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000484
Sadik Armagan483c8112021-06-01 09:24:52 +0100485 return LayerTestResult<T, 2>(actualOutput,
486 expectedOutputValues,
487 outputHandle->GetShape(),
488 outputTensorInfo.GetShape());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000489}
490
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100491//
492// Explicit template specializations
493//
494
Derek Lambertif90c56d2020-01-10 17:14:08 +0000495template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
496Pad2dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100497 armnn::IWorkloadFactory& workloadFactory,
498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100499 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100500 float qScale,
501 int32_t qOffset,
502 const float customPaddingValue);
503
Derek Lambertif90c56d2020-01-10 17:14:08 +0000504template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
505Pad3dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100506 armnn::IWorkloadFactory& workloadFactory,
507 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100508 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100509 float qScale,
510 int32_t qOffset);
511
Derek Lambertif90c56d2020-01-10 17:14:08 +0000512template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
513Pad4dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100514 armnn::IWorkloadFactory& workloadFactory,
515 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100516 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100517 float qScale,
518 int32_t qOffset);
519
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000520template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
521PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
522 armnn::IWorkloadFactory& workloadFactory,
523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
524 const armnn::ITensorHandleFactory& tensorHandleFactory,
525 float qScale,
526 int32_t qOffset,
527 const float customPaddingValue);
528
529template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
530PadQAsymmTestCommon<armnn::DataType::QAsymmU8>(
531 armnn::IWorkloadFactory& workloadFactory,
532 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
533 const armnn::ITensorHandleFactory& tensorHandleFactory,
534 float qScale,
535 int32_t qOffset,
536 const float customPaddingValue);
537
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100538//
539// Implementation functions
540//
541
542LayerTestResult<uint8_t, 2> PadUint82dTest(
543 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100544 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
545 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100546{
Finn Williams826a5432020-08-27 16:15:20 +0100547 return Pad2dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100548}
549
550LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
551 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100552 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
553 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100554{
Finn Williams826a5432020-08-27 16:15:20 +0100555 return Pad2dTestCommon<armnn::DataType::QAsymmU8>(
556 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100557}
558
559LayerTestResult<uint8_t, 3> PadUint83dTest(
560 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
562 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100563{
Finn Williams826a5432020-08-27 16:15:20 +0100564 return Pad3dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100565}
566
567LayerTestResult<uint8_t, 4> PadUint84dTest(
568 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100569 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
570 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100571{
Finn Williams826a5432020-08-27 16:15:20 +0100572 return Pad4dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100573}
574
575LayerTestResult<float, 2> PadFloat322dTest(
576 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100577 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
578 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100579{
Finn Williams826a5432020-08-27 16:15:20 +0100580 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100581}
582
583LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
584 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
586 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100587{
Finn Williams826a5432020-08-27 16:15:20 +0100588 return Pad2dTestCommon<armnn::DataType::Float32>(
589 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100590}
591
592LayerTestResult<float, 3> PadFloat323dTest(
593 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100594 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
595 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100596{
Finn Williams826a5432020-08-27 16:15:20 +0100597 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100598}
599
600LayerTestResult<float, 4> PadFloat324dTest(
601 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100602 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
603 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100604{
Finn Williams826a5432020-08-27 16:15:20 +0100605 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100606}
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000607
608LayerTestResult<armnn::BFloat16, 2> PadBFloat162dTest(
609 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
611 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000612{
Finn Williams826a5432020-08-27 16:15:20 +0100613 return Pad2dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000614}
615
616LayerTestResult<armnn::BFloat16, 2> PadBFloat162dCustomPaddingTest(
617 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100618 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
619 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000620{
Finn Williams826a5432020-08-27 16:15:20 +0100621 return Pad2dTestCommon<armnn::DataType::BFloat16>(
622 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000623}
624
625LayerTestResult<armnn::BFloat16, 3> PadBFloat163dTest(
626 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
628 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000629{
Finn Williams826a5432020-08-27 16:15:20 +0100630 return Pad3dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000631}
632
633LayerTestResult<armnn::BFloat16, 4> PadBFloat164dTest(
634 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100635 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
636 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000637{
Finn Williams826a5432020-08-27 16:15:20 +0100638 return Pad4dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000639}
Sadik Armagan041b3c02020-06-04 10:32:18 +0100640
641LayerTestResult<int8_t, 2> PadInt82dTest(
642 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100643 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
644 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100645{
Finn Williams826a5432020-08-27 16:15:20 +0100646 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
647 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100648}
649
650LayerTestResult<int8_t, 2> PadInt82dCustomPaddingTest(
651 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100652 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
653 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100654{
Finn Williams826a5432020-08-27 16:15:20 +0100655 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
656 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100657}
658
659LayerTestResult<int8_t, 3> PadInt83dTest(
660 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100661 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
662 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100663{
Finn Williams826a5432020-08-27 16:15:20 +0100664 return Pad3dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100665}
666
667LayerTestResult<int8_t, 4> PadInt84dTest(
668 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100669 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
670 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100671{
Finn Williams826a5432020-08-27 16:15:20 +0100672 return Pad4dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100673}
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000674
675LayerTestResult<int8_t, 2> PadInt8AsymmTest(
676 armnn::IWorkloadFactory& workloadFactory,
677 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
678 const armnn::ITensorHandleFactory& tensorHandleFactory)
679{
680 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
681 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 2);
682}
683
684LayerTestResult<int8_t, 2> PadInt8CustomPaddingAsymmTest(
685 armnn::IWorkloadFactory& workloadFactory,
686 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
687 const armnn::ITensorHandleFactory& tensorHandleFactory)
688{
689 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
690 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 3, 1.0f);
691}