blob: 8b024e5a3522bf15a4470a67351f9f31247acce8 [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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/QuantizeHelper.hpp>
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01009
Sadik Armagana097d2a2021-11-24 15:47:28 +000010#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000011#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010012
Colm Donelanc42a9872022-02-02 16:35:09 +000013#include <armnnTestUtils/TensorHelpers.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010014
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
Teresa Charlin611c7fb2022-01-07 09:47:29 +000075 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad,
76 descriptor,
77 info);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010078
79 inputHandle->Allocate();
80 outputHandle->Allocate();
81
Sadik Armagan483c8112021-06-01 09:24:52 +010082 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010083
84 workload->PostAllocationConfigure();
85 workload->Execute();
86
Sadik Armagan483c8112021-06-01 09:24:52 +010087 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010088
Sadik Armagan483c8112021-06-01 09:24:52 +010089 return LayerTestResult<T, 2>(actualOutput,
90 expectedOutputValues,
91 outputHandle->GetShape(),
92 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010093}
94
95template<armnn::DataType ArmnnType, typename T>
96LayerTestResult<T, 3> Pad3dTestCommon(
97 armnn::IWorkloadFactory& workloadFactory,
98 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010099 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100100 float qScale,
101 int32_t qOffset)
102{
Jan Eilers8eb25602020-03-09 12:13:48 +0000103 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100104 const armnn::TensorShape inputShape{ 2, 2, 2 };
105 const armnn::TensorShape outputShape{ 3, 5, 6 };
106
107 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
108 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
109
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100110 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
111 {
112 // Channel 0, Height (2) x Width (2)
113 0, 4,
114 2, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100115
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100116 // Channel 1, Height (2) x Width (2)
117 6, 1,
118 5, 2
119 },
120 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100121
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100122 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
123 {
124 0, 0, 0, 0, 0, 0,
125 0, 0, 0, 0, 0, 0,
126 0, 0, 0, 4, 0, 0,
127 0, 0, 2, 5, 0, 0,
128 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100129
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100130 0, 0, 0, 0, 0, 0,
131 0, 0, 0, 0, 0, 0,
132 0, 0, 6, 1, 0, 0,
133 0, 0, 5, 2, 0, 0,
134 0, 0, 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100135
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100136 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 0, 0, 0, 0, 0, 0
141 },
142 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100143
Sadik Armagan483c8112021-06-01 09:24:52 +0100144 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100145
Finn Williams826a5432020-08-27 16:15:20 +0100146 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
147 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
148
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100149 armnn::PadQueueDescriptor descriptor;
150
151 std::vector<std::pair<unsigned int, unsigned int>> PadList;
152 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
153 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
154 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
155
156 descriptor.m_Parameters.m_PadList = PadList;
157 armnn::WorkloadInfo info;
158
159 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
160 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
161
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000162 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad,
163 descriptor,
164 info);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100165
166 inputHandle->Allocate();
167 outputHandle->Allocate();
168
Sadik Armagan483c8112021-06-01 09:24:52 +0100169 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100170
171 workload->PostAllocationConfigure();
172 workload->Execute();
173
Sadik Armagan483c8112021-06-01 09:24:52 +0100174 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100175
Sadik Armagan483c8112021-06-01 09:24:52 +0100176 return LayerTestResult<T, 3>(actualOutput,
177 expectedOutputValues,
178 outputHandle->GetShape(),
179 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100180}
181
182template<armnn::DataType ArmnnType, typename T>
183LayerTestResult<T, 4> Pad4dTestCommon(
184 armnn::IWorkloadFactory& workloadFactory,
185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100186 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100187 float qScale,
188 int32_t qOffset)
189{
Jan Eilers8eb25602020-03-09 12:13:48 +0000190 IgnoreUnused(memoryManager);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100191 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
192 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
193
194 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
195 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
196
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100197 std::vector<T> inputValues = armnnUtils::QuantizedVector<T>(
198 {
199 // Batch 0, Channel 0, Height (3) x Width (2)
200 0, 1,
201 2, 3,
202 4, 5,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100203
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100204 // Batch 0, Channel 1, Height (3) x Width (2)
205 6, 7,
206 8, 9,
207 10, 11,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100208
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100209 // Batch 1, Channel 0, Height (3) x Width (2)
210 12, 13,
211 14, 15,
212 16, 17,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100213
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100214 // Batch 1, Channel 1, Height (3) x Width (2)
215 18, 19,
216 20, 21,
217 22, 23
218 },
219 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100220
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100221 std::vector<T> expectedOutputValues = armnnUtils::QuantizedVector<T>(
222 {
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,
228 0, 0, 0, 0,
229 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100230
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100231 0, 0, 0, 0,
232 0, 0, 0, 0,
233 0, 0, 0, 0,
234 0, 0, 0, 0,
235 0, 0, 0, 0,
236 0, 0, 0, 0,
237 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100238
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100239 0, 0, 0, 0,
240 0, 0, 0, 0,
241 0, 0, 0, 0,
242 0, 0, 0, 0,
243 0, 0, 0, 0,
244 0, 0, 0, 0,
245 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100246
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100247 0, 0, 0, 0,
248 0, 0, 0, 0,
249 0, 0, 0, 0,
250 0, 0, 0, 0,
251 0, 0, 0, 0,
252 0, 0, 0, 0,
253 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100254
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100255 0, 0, 0, 0,
256 0, 0, 0, 0,
257 0, 0, 0, 0,
258 0, 0, 0, 0,
259 0, 0, 0, 0,
260 0, 0, 0, 0,
261 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100262
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100263 0, 0, 0, 0,
264 0, 0, 0, 0,
265 0, 0, 0, 0,
266 0, 0, 0, 0,
267 0, 0, 0, 0,
268 0, 0, 0, 0,
269 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100270
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100271 0, 0, 0, 0,
272 0, 0, 0, 0,
273 0, 0, 0, 0,
274 0, 0, 0, 0,
275 0, 0, 0, 0,
276 0, 0, 0, 0,
277 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100278
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100279 0, 0, 0, 0,
280 0, 0, 0, 0,
281 0, 0, 0, 0,
282 0, 0, 1, 0,
283 0, 2, 3, 0,
284 0, 4, 5, 0,
285 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100286
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100287 0, 0, 0, 0,
288 0, 0, 0, 0,
289 0, 0, 0, 0,
290 0, 6, 7, 0,
291 0, 8, 9, 0,
292 0, 10, 11, 0,
293 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100294
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100295 0, 0, 0, 0,
296 0, 0, 0, 0,
297 0, 0, 0, 0,
298 0, 0, 0, 0,
299 0, 0, 0, 0,
300 0, 0, 0, 0,
301 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100302
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100303 0, 0, 0, 0,
304 0, 0, 0, 0,
305 0, 0, 0, 0,
306 0, 0, 0, 0,
307 0, 0, 0, 0,
308 0, 0, 0, 0,
309 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100310
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100311 0, 0, 0, 0,
312 0, 0, 0, 0,
313 0, 0, 0, 0,
314 0, 0, 0, 0,
315 0, 0, 0, 0,
316 0, 0, 0, 0,
317 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100318
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100319 0, 0, 0, 0,
320 0, 0, 0, 0,
321 0, 0, 0, 0,
322 0, 12, 13, 0,
323 0, 14, 15, 0,
324 0, 16, 17, 0,
325 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100326
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100327 0, 0, 0, 0,
328 0, 0, 0, 0,
329 0, 0, 0, 0,
330 0, 18, 19, 0,
331 0, 20, 21, 0,
332 0, 22, 23, 0,
333 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100334
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100335 0, 0, 0, 0,
336 0, 0, 0, 0,
337 0, 0, 0, 0,
338 0, 0, 0, 0,
339 0, 0, 0, 0,
340 0, 0, 0, 0,
341 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100342
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100343 0, 0, 0, 0,
344 0, 0, 0, 0,
345 0, 0, 0, 0,
346 0, 0, 0, 0,
347 0, 0, 0, 0,
348 0, 0, 0, 0,
349 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100350
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100351 0, 0, 0, 0,
352 0, 0, 0, 0,
353 0, 0, 0, 0,
354 0, 0, 0, 0,
355 0, 0, 0, 0,
356 0, 0, 0, 0,
357 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100358
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100359 0, 0, 0, 0,
360 0, 0, 0, 0,
361 0, 0, 0, 0,
362 0, 0, 0, 0,
363 0, 0, 0, 0,
364 0, 0, 0, 0,
365 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100366
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100367 0, 0, 0, 0,
368 0, 0, 0, 0,
369 0, 0, 0, 0,
370 0, 0, 0, 0,
371 0, 0, 0, 0,
372 0, 0, 0, 0,
373 0, 0, 0, 0,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100374
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100375 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 0, 0, 0, 0,
381 0, 0, 0, 0
382 },
383 qScale, qOffset);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100384
Sadik Armagan483c8112021-06-01 09:24:52 +0100385 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100386
Finn Williams826a5432020-08-27 16:15:20 +0100387 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
388 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100389
390 armnn::PadQueueDescriptor descriptor;
391
392 std::vector<std::pair<unsigned int, unsigned int>> PadList;
393 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
394 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
395 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
396 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
397
398 descriptor.m_Parameters.m_PadList = PadList;
399 armnn::WorkloadInfo info;
400
401 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
402 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
403
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000404 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad,
405 descriptor,
406 info);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100407
408 inputHandle->Allocate();
409 outputHandle->Allocate();
410
Sadik Armagan483c8112021-06-01 09:24:52 +0100411 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100412
413 workload->PostAllocationConfigure();
414 workload->Execute();
415
Sadik Armagan483c8112021-06-01 09:24:52 +0100416 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100417
Sadik Armagan483c8112021-06-01 09:24:52 +0100418 return LayerTestResult<T, 4>(actualOutput,
419 expectedOutputValues,
420 outputHandle->GetShape(),
421 outputTensorInfo.GetShape());
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100422}
423
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000424template<armnn::DataType ArmnnType, typename T>
425LayerTestResult<T, 2> PadQAsymmTestCommon(
426 armnn::IWorkloadFactory& workloadFactory,
427 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
428 const armnn::ITensorHandleFactory& tensorHandleFactory,
429 float qScale,
430 int32_t qOffset,
431 const float customPaddingValue)
432{
433 IgnoreUnused(memoryManager);
434 const armnn::TensorShape inputShape{ 3, 3 };
435 const armnn::TensorShape outputShape{ 7, 7 };
436
437 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
438 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
439
440 std::vector<T> inputValues =
441 {
442 // Height (3) x Width (3)
443 4, 8, 6,
444 7, 4, 4,
445 3, 2, 4
446 };
447
448 T p = static_cast<T>(customPaddingValue);
449 std::vector<T> expectedOutputValues =
450 {
451 p, p, p, p, p, p, p,
452 p, p, p, p, p, p, p,
453 p, p, 4, 8, 6, p, p,
454 p, p, 7, 4, 4, p, p,
455 p, p, 3, 2, 4, p, p,
456 p, p, p, p, p, p, p,
457 p, p, p, p, p, p, p
458 };
459
Sadik Armagan483c8112021-06-01 09:24:52 +0100460 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000461
462 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
463 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
464
465
466 armnn::PadQueueDescriptor descriptor;
467
468 std::vector<std::pair<unsigned int, unsigned int>> padList;
469 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
470 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
471
472 descriptor.m_Parameters.m_PadList = padList;
473 descriptor.m_Parameters.m_PadValue = customPaddingValue;
474 armnn::WorkloadInfo info;
475
476 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
477 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
478
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000479 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pad,
480 descriptor,
481 info);
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000482
483 inputHandle->Allocate();
484 outputHandle->Allocate();
485
Sadik Armagan483c8112021-06-01 09:24:52 +0100486 CopyDataToITensorHandle(inputHandle.get(), inputValues.data());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000487
488 workload->PostAllocationConfigure();
489 workload->Execute();
490
Sadik Armagan483c8112021-06-01 09:24:52 +0100491 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000492
Sadik Armagan483c8112021-06-01 09:24:52 +0100493 return LayerTestResult<T, 2>(actualOutput,
494 expectedOutputValues,
495 outputHandle->GetShape(),
496 outputTensorInfo.GetShape());
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000497}
498
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100499//
500// Explicit template specializations
501//
502
Derek Lambertif90c56d2020-01-10 17:14:08 +0000503template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 2>
504Pad2dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100505 armnn::IWorkloadFactory& workloadFactory,
506 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100507 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100508 float qScale,
509 int32_t qOffset,
510 const float customPaddingValue);
511
Derek Lambertif90c56d2020-01-10 17:14:08 +0000512template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 3>
513Pad3dTestCommon<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
Derek Lambertif90c56d2020-01-10 17:14:08 +0000520template LayerTestResult<armnn::ResolveType<armnn::DataType::QSymmS16>, 4>
521Pad4dTestCommon<armnn::DataType::QSymmS16>(
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100522 armnn::IWorkloadFactory& workloadFactory,
523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100524 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100525 float qScale,
526 int32_t qOffset);
527
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000528template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmS8>, 2>
529PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
530 armnn::IWorkloadFactory& workloadFactory,
531 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
532 const armnn::ITensorHandleFactory& tensorHandleFactory,
533 float qScale,
534 int32_t qOffset,
535 const float customPaddingValue);
536
537template LayerTestResult<armnn::ResolveType<armnn::DataType::QAsymmU8>, 2>
538PadQAsymmTestCommon<armnn::DataType::QAsymmU8>(
539 armnn::IWorkloadFactory& workloadFactory,
540 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
541 const armnn::ITensorHandleFactory& tensorHandleFactory,
542 float qScale,
543 int32_t qOffset,
544 const float customPaddingValue);
545
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100546//
547// Implementation functions
548//
549
550LayerTestResult<uint8_t, 2> PadUint82dTest(
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>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100556}
557
558LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
559 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100560 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
561 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100562{
Finn Williams826a5432020-08-27 16:15:20 +0100563 return Pad2dTestCommon<armnn::DataType::QAsymmU8>(
564 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100565}
566
567LayerTestResult<uint8_t, 3> PadUint83dTest(
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 Pad3dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100573}
574
575LayerTestResult<uint8_t, 4> PadUint84dTest(
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 Pad4dTestCommon<armnn::DataType::QAsymmU8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100581}
582
583LayerTestResult<float, 2> PadFloat322dTest(
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>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100589}
590
591LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
592 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
594 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100595{
Finn Williams826a5432020-08-27 16:15:20 +0100596 return Pad2dTestCommon<armnn::DataType::Float32>(
597 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100598}
599
600LayerTestResult<float, 3> PadFloat323dTest(
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 Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100606}
607
608LayerTestResult<float, 4> PadFloat324dTest(
609 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
611 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100612{
Finn Williams826a5432020-08-27 16:15:20 +0100613 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +0100614}
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000615
616LayerTestResult<armnn::BFloat16, 2> PadBFloat162dTest(
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>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000622}
623
624LayerTestResult<armnn::BFloat16, 2> PadBFloat162dCustomPaddingTest(
625 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100626 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
627 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000628{
Finn Williams826a5432020-08-27 16:15:20 +0100629 return Pad2dTestCommon<armnn::DataType::BFloat16>(
630 workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0, 1.0f);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000631}
632
633LayerTestResult<armnn::BFloat16, 3> PadBFloat163dTest(
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 Pad3dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000639}
640
641LayerTestResult<armnn::BFloat16, 4> PadBFloat164dTest(
642 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100643 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
644 const armnn::ITensorHandleFactory& tensorHandleFactory)
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000645{
Finn Williams826a5432020-08-27 16:15:20 +0100646 return Pad4dTestCommon<armnn::DataType::BFloat16>(workloadFactory, memoryManager, tensorHandleFactory, 0.0f, 0);
Narumol Prangnawarat44179c32020-03-11 14:51:27 +0000647}
Sadik Armagan041b3c02020-06-04 10:32:18 +0100648
649LayerTestResult<int8_t, 2> PadInt82dTest(
650 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100651 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
652 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100653{
Finn Williams826a5432020-08-27 16:15:20 +0100654 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
655 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100656}
657
658LayerTestResult<int8_t, 2> PadInt82dCustomPaddingTest(
659 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100660 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
661 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100662{
Finn Williams826a5432020-08-27 16:15:20 +0100663 return Pad2dTestCommon<armnn::DataType::QSymmS8>(
664 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0, 1.0f);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100665}
666
667LayerTestResult<int8_t, 3> PadInt83dTest(
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 Pad3dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100673}
674
675LayerTestResult<int8_t, 4> PadInt84dTest(
676 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100677 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
678 const armnn::ITensorHandleFactory& tensorHandleFactory)
Sadik Armagan041b3c02020-06-04 10:32:18 +0100679{
Finn Williams826a5432020-08-27 16:15:20 +0100680 return Pad4dTestCommon<armnn::DataType::QSymmS8>(workloadFactory, memoryManager, tensorHandleFactory, 1.0f, 0);
Sadik Armagan041b3c02020-06-04 10:32:18 +0100681}
Narumol Prangnawarat8719d222020-11-27 16:57:56 +0000682
683LayerTestResult<int8_t, 2> PadInt8AsymmTest(
684 armnn::IWorkloadFactory& workloadFactory,
685 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
686 const armnn::ITensorHandleFactory& tensorHandleFactory)
687{
688 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
689 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 2);
690}
691
692LayerTestResult<int8_t, 2> PadInt8CustomPaddingAsymmTest(
693 armnn::IWorkloadFactory& workloadFactory,
694 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
695 const armnn::ITensorHandleFactory& tensorHandleFactory)
696{
697 return PadQAsymmTestCommon<armnn::DataType::QAsymmS8>(
698 workloadFactory, memoryManager, tensorHandleFactory, 2.0f, 3, 1.0f);
699}