blob: a241aea3f3f287f92c36f56d28e4c5134d4ad39c [file] [log] [blame]
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001//
2// Copyright © 2021 Arm Ltd and Contributors. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6
7#include "Pooling3dTestImpl.hpp"
8
Colm Donelanc42a9872022-02-02 16:35:09 +00009#include <armnnUtils/QuantizeHelper.hpp>
Tamás Nyíri7b885b32021-10-26 14:47:57 +010010#include <ResolveType.hpp>
11
12#include <armnnUtils/TensorUtils.hpp>
13#include <armnnUtils/DataLayoutIndexed.hpp>
14#include <armnnUtils/Permute.hpp>
15
16#include <armnn/utility/IgnoreUnused.hpp>
17#include <armnn/utility/NumericCast.hpp>
18
19#include <armnn/BackendHelper.hpp>
20#include <backendsCommon/WorkloadInfo.hpp>
21
Sadik Armagana097d2a2021-11-24 15:47:28 +000022#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000023#include <armnnTestUtils/WorkloadTestUtils.hpp>
Tamás Nyíri7b885b32021-10-26 14:47:57 +010024
Colm Donelanc42a9872022-02-02 16:35:09 +000025#include <armnnTestUtils/TensorHelpers.hpp>
Tamás Nyíri7b885b32021-10-26 14:47:57 +010026
27namespace
28{
29
30using namespace armnnUtils;
31
Ryan OSheabab8fa92022-03-09 10:29:02 +000032template<typename T>
33void PermuteNCDHWToNDHWC(std::vector<T> &src, armnn::TensorInfo &srcInfo)
34{
35 const armnn::PermutationVector NCDHWToNDHWC = { 0, 4, 1, 2, 3 };
36 std::vector<T> tmp(src.size());
37 armnnUtils::Permute(srcInfo.GetShape(), NCDHWToNDHWC, src.data(), tmp.data(), sizeof(T));
38 src = tmp;
39}
40
Tamás Nyíri7b885b32021-10-26 14:47:57 +010041template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
42LayerTestResult<T, 5> SimplePooling3dTestImpl(
43 armnn::IWorkloadFactory& workloadFactory,
44 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
45 const armnn::ITensorHandleFactory& tensorHandleFactory,
46 armnn::Pooling3dDescriptor descriptor,
47 float qScale,
48 int32_t qOffset,
49 const std::vector<T>& input,
50 const std::vector<T>& outputExpected,
51 const armnn::TensorShape& inputShape,
52 const armnn::TensorShape& outputShape)
53{
54 IgnoreUnused(memoryManager);
55 const armnn::DataLayout dataLayout = descriptor.m_DataLayout;
56 const armnnUtils::DataLayoutIndexed dimensionIndices = dataLayout;
57 auto heightIndex = dimensionIndices.GetHeightIndex();
58 auto widthIndex = dimensionIndices.GetWidthIndex();
59 auto depthIndex = dimensionIndices.GetDepthIndex();
60 auto channelsIndex = dimensionIndices.GetChannelsIndex();
61
62 unsigned int inputDepth = armnn::numeric_cast<unsigned int>(inputShape[depthIndex]);
63 unsigned int inputHeight = armnn::numeric_cast<unsigned int>(inputShape[heightIndex]);
64 unsigned int inputWidth = armnn::numeric_cast<unsigned int>(inputShape[widthIndex]);
65 unsigned int inputChannels = armnn::numeric_cast<unsigned int>(inputShape[channelsIndex]);
66 unsigned int inputBatchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
67
68 unsigned int outputDepth = armnn::numeric_cast<unsigned int>(outputShape[depthIndex]);
69 unsigned int outputHeight = armnn::numeric_cast<unsigned int>(outputShape[heightIndex]);
70 unsigned int outputWidth = armnn::numeric_cast<unsigned int>(outputShape[widthIndex]);
71 unsigned int outputChannels = armnn::numeric_cast<unsigned int>(outputShape[channelsIndex]);
72 unsigned int outputBatchSize = armnn::numeric_cast<unsigned int>(outputShape[0]);
73
74 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(
75 inputBatchSize, inputChannels, inputDepth, inputHeight, inputWidth, dataLayout, ArmnnType);
76
77 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(
78 outputBatchSize, outputChannels, outputDepth, outputHeight, outputWidth, dataLayout, ArmnnType);
79
80 // Set quantization parameters if the requested type is a quantized type.
81 if (armnn::IsQuantizedType<T>())
82 {
83 inputTensorInfo.SetQuantizationScale(qScale);
84 inputTensorInfo.SetQuantizationOffset(qOffset);
85 outputTensorInfo.SetQuantizationScale(qScale);
86 outputTensorInfo.SetQuantizationOffset(qOffset);
87 }
88
89 LayerTestResult<T, 5> result(outputTensorInfo);
90 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
91
92 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
93 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
94
95 armnn::Pooling3dQueueDescriptor queueDescriptor;
96 queueDescriptor.m_Parameters = descriptor;
97 queueDescriptor.m_Parameters.m_DataLayout = dataLayout;
98
99 armnn::WorkloadInfo workloadInfo;
100 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
101 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
102
103 // Don't execute if Pooling is not supported, as an exception will be raised.
104 armnn::BackendId backend = workloadFactory.GetBackendId();
105 std::string reasonIfUnsupported;
106 armnn::LayerSupportHandle handle = armnn::GetILayerSupportByBackendId(backend);
107 result.m_Supported = handle.IsPooling3dSupported(inputTensorInfo,
108 outputTensorInfo,
109 queueDescriptor.m_Parameters,
110 reasonIfUnsupported);
111 if (!result.m_Supported)
112 {
113 return result;
114 }
115
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000116 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pooling3d,
117 queueDescriptor,
118 workloadInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100119
120 inputHandle->Allocate();
121 outputHandle->Allocate();
122
123 CopyDataToITensorHandle(inputHandle.get(), input.data());
124
125 workload->Execute();
126
127 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
128
129 result.m_ActualData = actualOutput;
130 result.m_ExpectedData = outputExpected;
131
132 return result;
133}
134
135//
136// Tests max pooling with the following parameters:
137//
138// Pooling size: 2x2x2
139// Stride: (1,1,1)
140// input size: 3x3x3
141// channels: 2
142// batch size: 2
143//
144template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
145LayerTestResult<T, 5> SimpleMaxPooling3dSize2x2x2Stride1x1x1TestCommon(
146 armnn::IWorkloadFactory& workloadFactory,
147 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
148 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000149 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100150 float qScale = 1.0f,
151 int32_t qOffset = 0)
152{
153 armnn::Pooling3dDescriptor descriptor;
154 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
155 descriptor.m_PoolWidth = 2;
156 descriptor.m_PoolHeight = 2;
157 descriptor.m_PoolDepth = 2;
158 descriptor.m_StrideX = 1;
159 descriptor.m_StrideY = 1;
160 descriptor.m_StrideZ = 1;
161 descriptor.m_PadLeft = descriptor.m_PadRight = 0;
162 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
163 descriptor.m_PadFront = descriptor.m_PadBack = 0;
164 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
165 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000166 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100167
168 unsigned int inputWidth = 3;
169 unsigned int inputHeight = 3;
170 unsigned int inputDepth = 3;
171 unsigned int outputWidth =
172 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
173 descriptor.m_StrideX;
174 unsigned int outputHeight =
175 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
176 descriptor.m_StrideY;
177 unsigned int outputDepth =
178 (inputDepth + descriptor.m_PadFront + descriptor.m_PadBack + descriptor.m_StrideZ - descriptor.m_PoolDepth) /
179 descriptor.m_StrideZ;
180 unsigned int channels = 2;
181 unsigned int batchSize = 2;
182
Ryan OSheabab8fa92022-03-09 10:29:02 +0000183 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( batchSize, channels, inputDepth, inputHeight,
184 inputWidth, dataLayout, ArmnnType);
185 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( batchSize, channels, outputDepth, outputHeight,
186 outputWidth, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100187
188 // Set quantization parameters if the requested type is a quantized type.
189 if(armnn::IsQuantizedType<T>())
190 {
191 inputTensorInfo.SetQuantizationScale(qScale);
192 inputTensorInfo.SetQuantizationOffset(qOffset);
193 outputTensorInfo.SetQuantizationScale(qScale);
194 outputTensorInfo.SetQuantizationOffset(qOffset);
195 }
196
197 std::vector<float> singleChannelData({
198 1.0f, 1.0f, 1.0f,
199 1.0f, 1.0f, 1.0f,
200 1.0f, 1.0f, 1.0f,
201
202 1.0f, 1.0f, 1.0f,
203 1.0f, 1.0f, 1.0f,
204 1.0f, 1.0f, 1.0f,
205
206 1.0f, 1.0f, 1.0f,
207 1.0f, 1.0f, 1.0f,
208 1.0f, 1.0f, 1.0f,
209 });
210
211 // Constructs input data.
212 std::vector<float> inputData;
213 auto negator = [](float f) { return -f; };
214
215 // First image (two channels where the second channel is the negative of the first one).
216 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
217 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
218
219 // Second image (same as first image).
220 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
221 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
222
223 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
224
225 // These were calculated manually.
226 std::vector<T> outputExpected = QuantizedVector<T>(
227 {
228 1.0f, 1.0f,
229 1.0f, 1.0f,
230
231 1.0f, 1.0f,
232 1.0f, 1.0f,
233
234 -1.0f, -1.0f,
235 -1.0f, -1.0f,
236
237 -1.0f, -1.0f,
238 -1.0f, -1.0f,
239
240
241 1.0f, 1.0f,
242 1.0f, 1.0f,
243
244 1.0f, 1.0f,
245 1.0f, 1.0f,
246
247 -1.0f, -1.0f,
248 -1.0f, -1.0f,
249
250 -1.0f, -1.0f,
251 -1.0f, -1.0f,
252 },
253 qScale, qOffset);
254
Ryan OSheabab8fa92022-03-09 10:29:02 +0000255 if (dataLayout == armnn::DataLayout::NDHWC)
256 {
257 PermuteNCDHWToNDHWC(input, inputTensorInfo);
258 PermuteNCDHWToNDHWC(outputExpected, outputTensorInfo);
259 }
260
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100261 return SimplePooling3dTestImpl<ArmnnType>(
262 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
263 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
264}
265
266template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
267LayerTestResult<T, 5> SimpleMaxPooling3dTestCommon(
268 armnn::IWorkloadFactory& workloadFactory,
269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
270 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000271 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100272 float qScale = 1.0f,
273 int32_t qOffset = 0)
274{
275 armnn::Pooling3dDescriptor descriptor;
276 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
277 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
278 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
279 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
280 descriptor.m_DataLayout = dataLayout;
281
282 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 4, 4, 4, dataLayout, ArmnnType);
283 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 2, 2, 2, dataLayout, ArmnnType);
284
285 // Set quantization parameters if the requested type is a quantized type.
286 if(armnn::IsQuantizedType<T>())
287 {
288 inputTensorInfo.SetQuantizationScale(qScale);
289 inputTensorInfo.SetQuantizationOffset(qOffset);
290 outputTensorInfo.SetQuantizationScale(qScale);
291 outputTensorInfo.SetQuantizationOffset(qOffset);
292 }
293
294 std::vector<T> inputData(
295 QuantizedVector<T>({
296 1.0f, 2.0f, 5.0f, 6.0f,
297 3.0f, 4.0f, 7.0f, 8.0f,
298 9.0f, 10.0f, 13.0f, 14.0f,
299 11.0f, 12.0f, 15.0f, 16.0f,
300
301 17.0f, 18.0f, 21.0f, 22.0f,
302 19.0f, 20.0f, 23.0f, 24.0f,
303 25.0f, 26.0f, 29.0f, 30.0f,
304 27.0f, 28.0f, 31.0f, 32.0f,
305
306 33.0f, 34.0f, 37.0f, 38.0f,
307 35.0f, 36.0f, 39.0f, 40.0f,
308 41.0f, 42.0f, 45.0f, 46.0f,
309 43.0f, 44.0f, 47.0f, 48.0f,
310
311 49.0f, 50.0f, 53.0f, 54.0f,
312 51.0f, 52.0f, 55.0f, 56.0f,
313 57.0f, 58.0f, 61.0f, 62.0f,
314 59.0f, 60.0f, 63.0f, 64.0f,
315 },
316 qScale, qOffset));
317
318 std::vector<T> outputData(
319 QuantizedVector<T>({
320 20.0f, 24.0f,
321 28.0f, 32.0f,
322
323 52.0f, 56.0f,
324 60.0f, 64.0f,
325 },
326 qScale, qOffset));
327
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100328 if (dataLayout == armnn::DataLayout::NDHWC)
329 {
Ryan OSheabab8fa92022-03-09 10:29:02 +0000330 PermuteNCDHWToNDHWC(inputData, inputTensorInfo);
331 PermuteNCDHWToNDHWC(outputData, outputTensorInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100332 }
333
334 return SimplePooling3dTestImpl<ArmnnType>(
335 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
336 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
337}
338
339template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
340LayerTestResult<T, 5> IgnorePaddingSimpleMaxPooling3dTestCommon(
341 armnn::IWorkloadFactory& workloadFactory,
342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
343 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000344 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100345 float qScale = 1.0f,
346 int32_t qOffset = 0)
347{
348 armnn::Pooling3dDescriptor descriptor;
349 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
350 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
351 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
352 descriptor.m_PadLeft = 1;
353 descriptor.m_PadRight = 1;
354 descriptor.m_PadTop = 1;
355 descriptor.m_PadBottom = 1;
356 descriptor.m_PadFront = 1;
357 descriptor.m_PadBack = 1;
358 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000359 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100360
Ryan OSheabab8fa92022-03-09 10:29:02 +0000361 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 4, 4, 4 , dataLayout, ArmnnType);
362 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 3, 3, 3 , dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100363
364 // Set quantization parameters if the requested type is a quantized type.
365 if(armnn::IsQuantizedType<T>())
366 {
367 inputTensorInfo.SetQuantizationScale(qScale);
368 inputTensorInfo.SetQuantizationOffset(qOffset);
369 outputTensorInfo.SetQuantizationScale(qScale);
370 outputTensorInfo.SetQuantizationOffset(qOffset);
371 }
372
373 auto input = QuantizedVector<T>(
374 {
375 -1.0f, -2.0f, 3.0f, 4.0f,
376 -1.0f, -2.0f, 3.0f, 4.0f,
377 1.0f, 2.0f, -3.0f, -4.0f,
378 1.0f, 2.0f, -3.0f, -4.0f,
379
380 -1.0f, -2.0f, 3.0f, 4.0f,
381 -1.0f, -2.0f, 3.0f, 4.0f,
382 1.0f, 2.0f, -3.0f, -4.0f,
383 1.0f, 2.0f, -3.0f, -4.0f,
384
385 -1.0f, -2.0f, 3.0f, 4.0f,
386 -1.0f, -2.0f, 3.0f, 4.0f,
387 1.0f, 2.0f, -3.0f, -4.0f,
388 1.0f, 2.0f, -3.0f, -4.0f,
389
390 -1.0f, -2.0f, 3.0f, 4.0f,
391 -1.0f, -2.0f, 3.0f, 4.0f,
392 1.0f, 2.0f, -3.0f, -4.0f,
393 1.0f, 2.0f, -3.0f, -4.0f,
394 },
395 qScale, qOffset);
396
397 auto outputExpected = QuantizedVector<T>(
398 {
399 -1.0f, 3.0f, 4.0f,
400 1.0f, 3.0f, 4.0f,
401 1.0f, 2.0f, -4.0f,
402
403 -1.0f, 3.0f, 4.0f,
404 1.0f, 3.0f, 4.0f,
405 1.0f, 2.0f, -4.0f,
406
407 -1.0f, 3.0f, 4.0f,
408 1.0f, 3.0f, 4.0f,
409 1.0f, 2.0f, -4.0f,
410 },
411 qScale, qOffset);
412
Ryan OSheabab8fa92022-03-09 10:29:02 +0000413 if (dataLayout == armnn::DataLayout::NDHWC)
414 {
415 PermuteNCDHWToNDHWC(input, inputTensorInfo);
416 PermuteNCDHWToNDHWC(outputExpected, outputTensorInfo);
417 }
418
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100419 return SimplePooling3dTestImpl<ArmnnType>(
420 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
421 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
422}
423
424template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
425LayerTestResult<T, 5> SimpleAveragePooling3dTestCommon(
426 armnn::IWorkloadFactory& workloadFactory,
427 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
428 const armnn::ITensorHandleFactory& tensorHandleFactory,
429 armnn::DataLayout dataLayout = armnn::DataLayout::NCDHW,
430 float qScale = 1.0f,
431 int32_t qOffset = 0)
432{
433 armnn::Pooling3dDescriptor descriptor;
434 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
435 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
436 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
437 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
438 descriptor.m_DataLayout = dataLayout;
439
440 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 4, 4, 4, dataLayout, ArmnnType);
441 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 2, 2, 2, dataLayout, ArmnnType);
442
443 // Set quantization parameters if the requested type is a quantized type.
444 if(armnn::IsQuantizedType<T>())
445 {
446 inputTensorInfo.SetQuantizationScale(qScale);
447 inputTensorInfo.SetQuantizationOffset(qOffset);
448 outputTensorInfo.SetQuantizationScale(qScale);
449 outputTensorInfo.SetQuantizationOffset(qOffset);
450 }
451
452 std::vector<T> inputData(
453 QuantizedVector<T>({
454 1.0f, 2.0f, 5.0f, 6.0f,
455 3.0f, 4.0f, 7.0f, 8.0f,
456 9.0f, 10.0f, 13.0f, 14.0f,
457 11.0f, 12.0f, 15.0f, 16.0f,
458
459 17.0f, 18.0f, 21.0f, 22.0f,
460 19.0f, 20.0f, 23.0f, 24.0f,
461 25.0f, 26.0f, 29.0f, 30.0f,
462 27.0f, 28.0f, 31.0f, 32.0f,
463
464 33.0f, 34.0f, 37.0f, 38.0f,
465 35.0f, 36.0f, 39.0f, 40.0f,
466 41.0f, 42.0f, 45.0f, 46.0f,
467 43.0f, 44.0f, 47.0f, 48.0f,
468
469 49.0f, 50.0f, 53.0f, 54.0f,
470 51.0f, 52.0f, 55.0f, 56.0f,
471 57.0f, 58.0f, 61.0f, 62.0f,
472 59.0f, 60.0f, 63.0f, 64.0f,
473 },
474 qScale, qOffset));
475
476 std::vector<T> outputData(
477 QuantizedVector<T>({
478 10.5f, 14.5f,
479 18.5f, 22.5f,
480
481 42.5f, 46.5f,
482 50.5f, 54.5f,
483 },
484 qScale, qOffset));
485
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100486 if (dataLayout == armnn::DataLayout::NDHWC)
487 {
Ryan OSheabab8fa92022-03-09 10:29:02 +0000488 PermuteNCDHWToNDHWC(inputData, inputTensorInfo);
489 PermuteNCDHWToNDHWC(outputData, outputTensorInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100490 }
491
492 return SimplePooling3dTestImpl<ArmnnType>(
493 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
494 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
495}
496
497template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
498LayerTestResult<T, 5> LargeTensorsAveragePooling3dTestCommon(
499 armnn::IWorkloadFactory& workloadFactory,
500 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
501 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000502 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100503 float qScale = 1.0f,
504 int32_t qOffset = 0)
505{
506 armnn::Pooling3dDescriptor descriptor;
507 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
508 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 100;
509 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 5;
510 descriptor.m_PadLeft = 50;
511 descriptor.m_PadRight = 50;
512 descriptor.m_PadTop = 50;
513 descriptor.m_PadBottom = 50;
514 descriptor.m_PadFront = 50;
515 descriptor.m_PadBack = 50;
516 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000517 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100518
Ryan OSheabab8fa92022-03-09 10:29:02 +0000519 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 5, 3, 52, 60, 68, dataLayout, ArmnnType);
520 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 5, 3, 11, 13, 14, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100521
Ryan OSheabab8fa92022-03-09 10:29:02 +0000522 // Set quantization parameters if the requested type is a quantized type.armnnUtils::GetTensorInfo(
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100523 if(armnn::IsQuantizedType<T>())
524 {
525 inputTensorInfo.SetQuantizationScale(qScale);
526 inputTensorInfo.SetQuantizationOffset(qOffset);
527 outputTensorInfo.SetQuantizationScale(qScale);
528 outputTensorInfo.SetQuantizationOffset(qOffset);
529 }
530
531 std::vector<T> input;
532
533 for (unsigned int i = 0 ; i < inputTensorInfo.GetShape().GetNumElements(); ++i)
534 {
535 input.push_back(1);
536 }
537
538 std::vector<T> outputExpected;
539
540 for (unsigned int i = 0 ; i < outputTensorInfo.GetShape().GetNumElements(); ++i)
541 {
542 outputExpected.push_back(1);
543 }
544
545 return SimplePooling3dTestImpl<ArmnnType>(
546 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
547 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
548}
549
550template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
551LayerTestResult<T, 5> IgnorePaddingSimpleAveragePooling3dTestCommon(
552 armnn::IWorkloadFactory& workloadFactory,
553 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
554 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000555 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100556 float qScale = 1.0f,
557 int32_t qOffset = 0)
558{
559 armnn::Pooling3dDescriptor descriptor;
560 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
561 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
562 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
563 descriptor.m_PadLeft = 1;
564 descriptor.m_PadRight = 1;
565 descriptor.m_PadTop = 1;
566 descriptor.m_PadBottom = 1;
567 descriptor.m_PadFront = 1;
568 descriptor.m_PadBack = 1;
569 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000570 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100571
Ryan OSheabab8fa92022-03-09 10:29:02 +0000572
573 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo ( 1, 1, 4, 4, 4, dataLayout, ArmnnType);
574 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 3, 3, 3, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100575
576 // Set quantization parameters if the requested type is a quantized type.
577 if(armnn::IsQuantizedType<T>())
578 {
579 inputTensorInfo.SetQuantizationScale(qScale);
580 inputTensorInfo.SetQuantizationOffset(qOffset);
581 outputTensorInfo.SetQuantizationScale(qScale);
582 outputTensorInfo.SetQuantizationOffset(qOffset);
583 }
584
585 auto input = QuantizedVector<T>(
586 {
587 12.0f, 20.0f, 32.0f, 40.0f,
588 12.0f, 20.0f, 32.0f, 40.0f,
589 12.0f, 20.0f, 32.0f, 40.0f,
590 12.0f, 20.0f, 32.0f, 40.0f,
591
592 24.0f, 40.0f, 64.0f, 80.0f,
593 24.0f, 40.0f, 64.0f, 80.0f,
594 24.0f, 40.0f, 64.0f, 80.0f,
595 24.0f, 40.0f, 64.0f, 80.0f,
596
597 36.0f, 60.0f, 96.0f, 120.0f,
598 36.0f, 60.0f, 96.0f, 120.0f,
599 36.0f, 60.0f, 96.0f, 120.0f,
600 36.0f, 60.0f, 96.0f, 120.0f,
601
602 48.0f, 80.0f, 128.0f, 160.0f,
603 48.0f, 80.0f, 128.0f, 160.0f,
604 48.0f, 80.0f, 128.0f, 160.0f,
605 48.0f, 80.0f, 128.0f, 160.0f,
606 },
607 qScale, qOffset);
608
609 auto outputExpected = QuantizedVector<T>(
610 {
611 1.5f, 6.5f, 5.0f,
612 3.0f, 13.0f, 10.0f,
613 1.5f, 6.5f, 5.0f,
614
615 7.5f, 32.5f, 25.0f,
616 15.0f, 65.0f, 50.0f,
617 7.5f, 32.5f, 25.0f,
618
619 6.0f, 26.0f, 20.0f,
620 12.0f, 52.0f, 40.0f,
621 6.0f, 26.0f, 20.0f,
622 },
623 qScale, qOffset);
624
Ryan OSheabab8fa92022-03-09 10:29:02 +0000625 if (dataLayout == armnn::DataLayout::NDHWC)
626 {
627 PermuteNCDHWToNDHWC(input, inputTensorInfo);
628 PermuteNCDHWToNDHWC(outputExpected, outputTensorInfo);
629 }
630
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100631 return SimplePooling3dTestImpl<ArmnnType>(
632 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
633 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
634}
635
636template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
637LayerTestResult<T, 5> SimpleL2Pooling3dTestCommon(
638 armnn::IWorkloadFactory& workloadFactory,
639 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
640 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000641 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100642 float qScale = 1.0f,
643 int32_t qOffset = 0)
644{
645 armnn::Pooling3dDescriptor descriptor;
646 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
647 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
648 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
649 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
650 descriptor.m_DataLayout = dataLayout;
651
652 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 4, 4, 4, dataLayout, ArmnnType);
653 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 1, 2, 2, 2, dataLayout, ArmnnType);
654
655 // Set quantization parameters if the requested type is a quantized type.
656 if(armnn::IsQuantizedType<T>())
657 {
658 inputTensorInfo.SetQuantizationScale(qScale);
659 inputTensorInfo.SetQuantizationOffset(qOffset);
660 outputTensorInfo.SetQuantizationScale(qScale);
661 outputTensorInfo.SetQuantizationOffset(qOffset);
662 }
663
664 std::vector<T> inputData(
665 QuantizedVector<T>({
666 1.0f, 2.0f, 5.0f, 6.0f,
667 3.0f, 4.0f, 7.0f, 8.0f,
668 9.0f, 10.0f, 13.0f, 14.0f,
669 11.0f, 12.0f, 15.0f, 16.0f,
670
671 17.0f, 18.0f, 21.0f, 22.0f,
672 19.0f, 20.0f, 23.0f, 24.0f,
673 25.0f, 26.0f, 29.0f, 30.0f,
674 27.0f, 28.0f, 31.0f, 32.0f,
675
676 33.0f, 34.0f, 37.0f, 38.0f,
677 35.0f, 36.0f, 39.0f, 40.0f,
678 41.0f, 42.0f, 45.0f, 46.0f,
679 43.0f, 44.0f, 47.0f, 48.0f,
680
681 49.0f, 50.0f, 53.0f, 54.0f,
682 51.0f, 52.0f, 55.0f, 56.0f,
683 57.0f, 58.0f, 61.0f, 62.0f,
684 59.0f, 60.0f, 63.0f, 64.0f,
685 },
686 qScale, qOffset));
687
688 std::vector<T> outputData(
689 QuantizedVector<T>({
690 13.2476412995f, 16.5981926727f,
691 20.1866292382f, 23.9060661758f,
692
693 43.2608367926f, 47.1963981677f,
694 51.1419592898f, 55.0953718564f,
695 },
696 qScale, qOffset));
697
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100698 if (dataLayout == armnn::DataLayout::NDHWC)
699 {
Ryan OSheabab8fa92022-03-09 10:29:02 +0000700 PermuteNCDHWToNDHWC(inputData, inputTensorInfo);
701 PermuteNCDHWToNDHWC(outputData, outputTensorInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100702 }
703
704 return SimplePooling3dTestImpl<ArmnnType>(
705 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
706 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
707}
708
709template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
710LayerTestResult<T, 5> IgnorePaddingSimpleL2Pooling3dTestCommon(
711 armnn::IWorkloadFactory& workloadFactory,
712 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
713 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000714 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100715 float qScale = 1.0f,
716 int32_t qOffset = 0)
717{
718 armnn::Pooling3dDescriptor descriptor;
719 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
720 descriptor.m_PoolWidth = descriptor.m_PoolHeight = descriptor.m_PoolDepth = 2;
721 descriptor.m_StrideX = descriptor.m_StrideY = descriptor.m_StrideZ = 2;
722 descriptor.m_PadLeft = 1;
723 descriptor.m_PadRight = 1;
724 descriptor.m_PadTop = 1;
725 descriptor.m_PadBottom = 1;
726 descriptor.m_PadFront = 1;
727 descriptor.m_PadBack = 1;
728 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000729 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100730
Ryan OSheabab8fa92022-03-09 10:29:02 +0000731 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 4, 4, 4, dataLayout, ArmnnType);
732 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 3, 3, 3, dataLayout,ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100733
734 // Set quantization parameters if the requested type is a quantized type.
735 if(armnn::IsQuantizedType<T>())
736 {
737 inputTensorInfo.SetQuantizationScale(qScale);
738 inputTensorInfo.SetQuantizationOffset(qOffset);
739 outputTensorInfo.SetQuantizationScale(qScale);
740 outputTensorInfo.SetQuantizationOffset(qOffset);
741 }
742
743 auto input = QuantizedVector<T>(
744 {
745 1.0f, 2.0f, 3.0f, 4.0f,
746 1.0f, 2.0f, 3.0f, 4.0f,
747 1.0f, 2.0f, 3.0f, 4.0f,
748 1.0f, 2.0f, 3.0f, 4.0f,
749
750 2.0f, 3.0f, 4.0f, 5.0f,
751 2.0f, 3.0f, 4.0f, 5.0f,
752 2.0f, 3.0f, 4.0f, 5.0f,
753 2.0f, 3.0f, 4.0f, 5.0f,
754
755 3.0f, 4.0f, 5.0f, 6.0f,
756 3.0f, 4.0f, 5.0f, 6.0f,
757 3.0f, 4.0f, 5.0f, 6.0f,
758 3.0f, 4.0f, 5.0f, 6.0f,
759
760 4.0f, 5.0f, 6.0f, 7.0f,
761 4.0f, 5.0f, 6.0f, 7.0f,
762 4.0f, 5.0f, 6.0f, 7.0f,
763 4.0f, 5.0f, 6.0f, 7.0f,
764 },
765 qScale, qOffset);
766
767 float v111 = float(sqrt(pow(1,2)/8.0f));
768 float v112 = float(sqrt((pow(2,2)+pow(3,2))/8.0f));
769 float v113 = float(sqrt(pow(4,2)/8));
770
771 float v121 = float(sqrt((2*pow(1,2))/8.0f));
772 float v122 = float(sqrt((2*pow(2,2)+2*pow(3,2))/8.0f));
773 float v123 = float(sqrt((2*pow(4,2))/8.0f));
774
775 float v131 = v111;
776 float v132 = v112;
777 float v133 = v113;
778
779 float v211 = float(sqrt((pow(2,2)+pow(3,2))/8.0f));
780 float v212 = float(sqrt((pow(3,2)+2*pow(4,2)+pow(5,2))/8.0f));
781 float v213 = float(sqrt((pow(5,2)+pow(6,2))/8.0f));
782
783 float v221 = float(sqrt((2*pow(2,2)+2*pow(3,2))/8.0f));
784 float v222 = float(sqrt((2*pow(3,2)+4*pow(4,2)+2*pow(5,2))/8.0f));
785 float v223 = float(sqrt((2*pow(5,2)+2*pow(6,2))/8.0f));
786
787 float v231 = v211;
788 float v232 = v212;
789 float v233 = v213;
790
791 float v311 = float(sqrt(pow(4,2)/8.0f));
792 float v312 = float(sqrt((pow(5,2)+pow(6,2))/8.0f));
793 float v313 = float(sqrt(pow(7,2)/8));
794
795 float v321 = float(sqrt((2*pow(4,2))/8.0f));
796 float v322 = float(sqrt((2*pow(5,2)+2*pow(6,2))/8.0f));
797 float v323 = float(sqrt((2*pow(7,2))/8.0f));
798
799 float v331 = v311;
800 float v332 = v312;
801 float v333 = v313;
802
803 auto outputExpected = QuantizedVector<T>(
804 {
805 v111, v112, v113,
806 v121, v122, v123,
807 v131, v132, v133,
808
809 v211, v212, v213,
810 v221, v222, v223,
811 v231, v232, v233,
812
813 v311, v312, v313,
814 v321, v322, v323,
815 v331, v332, v333,
816 },
817 qScale, qOffset);
818
Ryan OSheabab8fa92022-03-09 10:29:02 +0000819 if (dataLayout == armnn::DataLayout::NDHWC)
820 {
821 PermuteNCDHWToNDHWC(input, inputTensorInfo);
822 PermuteNCDHWToNDHWC(outputExpected, outputTensorInfo);
823 }
824
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100825 return SimplePooling3dTestImpl<ArmnnType>(
826 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
827 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
828}
829
830template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Ryan OSheabab8fa92022-03-09 10:29:02 +0000831LayerTestResult<T, 5> AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTestCommon(
832 armnn::IWorkloadFactory& workloadFactory,
833 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
834 const armnn::ITensorHandleFactory& tensorHandleFactory,
835 const armnn::DataLayout dataLayout,
836 float qScale = 1.0f,
837 int32_t qOffset = 0)
838{
839 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
840 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
841
842 armnn::Pooling3dDescriptor descriptor;
843 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
844 descriptor.m_PoolWidth = 1;
845 descriptor.m_PoolHeight = 2;
846 descriptor.m_PoolDepth = 3;
847 descriptor.m_StrideX = 1;
848 descriptor.m_StrideY = 2;
849 descriptor.m_StrideZ = 1;
850 descriptor.m_PadLeft = 0;
851 descriptor.m_PadRight = 0;
852 descriptor.m_PadTop = 2;
853 descriptor.m_PadBottom = 0;
854 descriptor.m_PadFront = 1;
855 descriptor.m_PadBack = 2;
856 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
857 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
858 descriptor.m_DataLayout = dataLayout;
859
860 // Construct input data.
861 auto input = QuantizedVector<T>( { 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
862
863 // These were calculated manually.
864 auto outputExpected = QuantizedVector<T>( { 0.0f, 3.0f, 0.0f, 3.0f, }, qScale, qOffset);
865
866 if (dataLayout == armnn::DataLayout::NDHWC)
867 {
868 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
869 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
870 }
871
872 return SimplePooling3dTestImpl<ArmnnType>(
873 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
874 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
875}
876
877template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100878LayerTestResult<T, 5> AsymmetricNonSquareMaxPooling3dTestCommon(
879 armnn::IWorkloadFactory& workloadFactory,
880 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
881 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +0000882 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100883 float qScale = 1.0f,
884 int32_t qOffset = 0)
885{
Ryan OSheabab8fa92022-03-09 10:29:02 +0000886 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
887 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100888
889 armnn::Pooling3dDescriptor descriptor;
890 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
891 descriptor.m_PoolWidth = 1;
892 descriptor.m_PoolHeight = 2;
893 descriptor.m_PoolDepth = 3;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000894 descriptor.m_StrideX = 1;
895 descriptor.m_StrideY = 2;
896 descriptor.m_StrideZ = 1;
897 descriptor.m_PadLeft = 0;
898 descriptor.m_PadRight = 0;
899 descriptor.m_PadTop = 1;
900 descriptor.m_PadBottom = 0;
901 descriptor.m_PadFront = 1;
902 descriptor.m_PadBack = 2;
903 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
904 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
905 descriptor.m_DataLayout = dataLayout;
906
907 // Construct input data.
908 auto input = QuantizedVector<T>( { 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
909
910 // These were calculated manually.
911 auto outputExpected = QuantizedVector<T>( { 1.0f, 4.0f, 1.0f, 4.0f, }, qScale, qOffset);
912
913 if (dataLayout == armnn::DataLayout::NDHWC)
914 {
915 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
916 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
917 }
918
919 return SimplePooling3dTestImpl<ArmnnType>(
920 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
921 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
922}
923
924template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
925LayerTestResult<T, 5> AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTestCommon(
926 armnn::IWorkloadFactory& workloadFactory,
927 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
928 const armnn::ITensorHandleFactory& tensorHandleFactory,
929 const armnn::DataLayout dataLayout,
930 float qScale = 1.0f,
931 int32_t qOffset = 0)
932{
933 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
934 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
935
936 armnn::Pooling3dDescriptor descriptor;
937 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
938 descriptor.m_PoolWidth = 1;
939 descriptor.m_PoolHeight = 2;
940 descriptor.m_PoolDepth = 3;
941 descriptor.m_StrideX = 1;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100942 descriptor.m_StrideY = 2;
943 descriptor.m_StrideZ = 1;
944 descriptor.m_PadLeft = 0;
945 descriptor.m_PadRight = 0;
946 descriptor.m_PadTop = 2;
947 descriptor.m_PadBottom = 0;
948 descriptor.m_PadFront = 1;
949 descriptor.m_PadBack = 2;
950 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
951 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000952 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100953
954 // Construct input data.
Ryan OSheabab8fa92022-03-09 10:29:02 +0000955 auto input = QuantizedVector<T>({ 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100956
957 // These were calculated manually.
Ryan OSheabab8fa92022-03-09 10:29:02 +0000958 auto outputExpected = QuantizedVector<T>( { 0.0f, 2.0f, 0.0f, 2.0f, }, qScale, qOffset);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100959
Ryan OSheabab8fa92022-03-09 10:29:02 +0000960 if (dataLayout == armnn::DataLayout::NDHWC)
961 {
962 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
963 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
964 }
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100965 return SimplePooling3dTestImpl<ArmnnType>(
966 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
967 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
968}
969
970template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
971LayerTestResult<T, 5> AsymmetricNonSquareAveragePooling3dTestCommon(
Ryan OSheabab8fa92022-03-09 10:29:02 +0000972 armnn::IWorkloadFactory& workloadFactory,
973 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
974 const armnn::ITensorHandleFactory& tensorHandleFactory,
975 const armnn::DataLayout dataLayout,
976 float qScale = 1.0f,
977 int32_t qOffset = 0)
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100978{
Ryan OSheabab8fa92022-03-09 10:29:02 +0000979 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
980 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100981
982 armnn::Pooling3dDescriptor descriptor;
983 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
984 descriptor.m_PoolWidth = 1;
985 descriptor.m_PoolHeight = 2;
986 descriptor.m_PoolDepth = 3;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000987 descriptor.m_StrideX = 1;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100988 descriptor.m_StrideY = 2;
989 descriptor.m_StrideZ = 1;
990 descriptor.m_PadLeft = 0;
991 descriptor.m_PadRight = 0;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000992 descriptor.m_PadTop = 1;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100993 descriptor.m_PadBottom = 0;
994 descriptor.m_PadFront = 1;
995 descriptor.m_PadBack = 2;
996 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
997 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
Ryan OSheabab8fa92022-03-09 10:29:02 +0000998 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +0100999
1000 // Construct input data.
Ryan OSheabab8fa92022-03-09 10:29:02 +00001001 auto input = QuantizedVector<T>( { 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001002
1003 // These were calculated manually.
Ryan OSheabab8fa92022-03-09 10:29:02 +00001004 auto outputExpected = QuantizedVector<T>( { 1.0f, 3.5f, 1.0f, 3.5f, }, qScale, qOffset);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001005
Ryan OSheabab8fa92022-03-09 10:29:02 +00001006 if (dataLayout == armnn::DataLayout::NDHWC)
1007 {
1008 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
1009 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
1010 }
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001011 return SimplePooling3dTestImpl<ArmnnType>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001012 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1013 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001014}
1015
1016template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Ryan OSheabab8fa92022-03-09 10:29:02 +00001017LayerTestResult<T, 5> AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTestCommon(
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001018 armnn::IWorkloadFactory& workloadFactory,
1019 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1020 const armnn::ITensorHandleFactory& tensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001021 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001022 float qScale = 1.0f,
1023 int32_t qOffset = 0)
1024{
Ryan OSheabab8fa92022-03-09 10:29:02 +00001025 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
1026 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001027
1028 armnn::Pooling3dDescriptor descriptor;
1029 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1030 descriptor.m_PoolWidth = 1;
1031 descriptor.m_PoolHeight = 2;
1032 descriptor.m_PoolDepth = 3;
1033 descriptor.m_StrideX = 0;
1034 descriptor.m_StrideY = 2;
1035 descriptor.m_StrideZ = 1;
1036 descriptor.m_PadLeft = 0;
1037 descriptor.m_PadRight = 0;
1038 descriptor.m_PadTop = 2;
1039 descriptor.m_PadBottom = 0;
1040 descriptor.m_PadFront = 1;
1041 descriptor.m_PadBack = 2;
1042 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1043 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
Ryan OSheabab8fa92022-03-09 10:29:02 +00001044 descriptor.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001045
1046 // Construct input data.
Ryan OSheabab8fa92022-03-09 10:29:02 +00001047 auto input = QuantizedVector<T>( { 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001048
1049 // These were calculated manually.
Ryan OSheabab8fa92022-03-09 10:29:02 +00001050 auto outputExpected = QuantizedVector<T>( { 0.0f, 2.2360679775f, 0.0f, 2.2360679775f, }, qScale, qOffset);
1051
1052 if (dataLayout == armnn::DataLayout::NDHWC)
1053 {
1054 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
1055 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
1056 }
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001057
1058 return SimplePooling3dTestImpl<ArmnnType>(
1059 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1060 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1061}
1062
1063template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Ryan OSheabab8fa92022-03-09 10:29:02 +00001064LayerTestResult<T, 5> AsymmetricNonSquareL2Pooling3dTestCommon(
1065 armnn::IWorkloadFactory& workloadFactory,
1066 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1067 const armnn::ITensorHandleFactory& tensorHandleFactory,
1068 const armnn::DataLayout dataLayout,
1069 float qScale = 1.0f,
1070 int32_t qOffset = 0)
1071{
1072 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 1, 3, 1, dataLayout, ArmnnType);
1073 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo( 1, 1, 2, 2, 1, dataLayout, ArmnnType);
1074
1075 armnn::Pooling3dDescriptor descriptor;
1076 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1077 descriptor.m_PoolWidth = 1;
1078 descriptor.m_PoolHeight = 2;
1079 descriptor.m_PoolDepth = 3;
1080 descriptor.m_StrideX = 1;
1081 descriptor.m_StrideY = 2;
1082 descriptor.m_StrideZ = 1;
1083 descriptor.m_PadLeft = 0;
1084 descriptor.m_PadRight = 0;
1085 descriptor.m_PadTop = 1;
1086 descriptor.m_PadBottom = 0;
1087 descriptor.m_PadFront = 1;
1088 descriptor.m_PadBack = 2;
1089 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
1090 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
1091 descriptor.m_DataLayout = dataLayout;
1092
1093 // Construct input data.
1094 auto input = QuantizedVector<T>( { 1.0f, 3.0f, 4.0f, }, qScale, qOffset);
1095
1096 // These were calculated manually.
1097 auto outputExpected = QuantizedVector<T>( { 1.0f, 3.53553390593f, 1.0f, 3.53553390593f, }, qScale, qOffset);
1098
1099 if (dataLayout == armnn::DataLayout::NDHWC)
1100 {
1101 PermuteNCDHWToNDHWC<T>(input, inputTensorInfo);
1102 PermuteNCDHWToNDHWC<T>(outputExpected, outputTensorInfo);
1103 }
1104
1105 return SimplePooling3dTestImpl<ArmnnType>(
1106 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1107 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1108}
1109
1110template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001111LayerTestResult<T, 5> ComparePooling3dTestCommon(
1112 armnn::IWorkloadFactory& workloadFactory,
1113 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1114 armnn::IWorkloadFactory& refWorkloadFactory,
1115 const armnn::ITensorHandleFactory& tensorHandleFactory,
1116 const armnn::ITensorHandleFactory& refTensorHandleFactory,
1117 armnn::PoolingAlgorithm poolingType,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001118 const armnn::DataLayout dataLayout,
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001119 float qScale = 1.0f,
1120 int32_t qOffset = 0)
1121{
1122 IgnoreUnused(memoryManager);
1123 const unsigned int inputWidth = 16;
1124 const unsigned int inputHeight = 32;
1125 const unsigned int inputDepth = 48;
1126 const unsigned int channelCount = 2;
1127 const unsigned int batchSize = 5;
1128
1129 const unsigned int poolSize = 3;
1130 const unsigned int strideX = 2;
1131 const unsigned int strideY = 4;
1132 const unsigned int strideZ = 6;
1133 const unsigned int padX = 0;
1134 const unsigned int padY = 0;
1135 const unsigned int padZ = 0;
1136
1137 const unsigned int outputWidth = (inputWidth + 2 * padX + strideX - poolSize) / strideX;
1138 const unsigned int outputHeight = (inputHeight + 2 * padY + strideY - poolSize) / strideY;
1139 const unsigned int outputDepth = (inputDepth + 2 * padZ + strideZ - poolSize) / strideZ;
1140
Ryan OSheabab8fa92022-03-09 10:29:02 +00001141 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(batchSize, channelCount, inputDepth, inputHeight,
1142 inputWidth, dataLayout, ArmnnType);
1143 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(batchSize, channelCount, outputDepth, outputHeight,
1144 outputWidth, dataLayout, ArmnnType);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001145
1146 // Set quantization parameters if the requested type is a quantized type.
1147 if(armnn::IsQuantizedType<T>())
1148 {
1149 inputTensorInfo.SetQuantizationScale(qScale);
1150 inputTensorInfo.SetQuantizationOffset(qOffset);
1151 outputTensorInfo.SetQuantizationScale(qScale);
1152 outputTensorInfo.SetQuantizationOffset(qOffset);
1153 }
1154
1155 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 81715);
1156 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
1157 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001158 LayerTestResult<T, 5> comparisonResult(outputTensorInfo);
1159
1160 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1161 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
1162
1163 armnn::Pooling3dQueueDescriptor data;
1164 armnn::WorkloadInfo info;
1165 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
1166 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1167 data.m_Parameters.m_PoolType = poolingType;
1168 data.m_Parameters.m_PoolWidth = poolSize;
1169 data.m_Parameters.m_PoolHeight = poolSize;
1170 data.m_Parameters.m_PoolDepth = poolSize;
1171 data.m_Parameters.m_StrideX = strideX;
1172 data.m_Parameters.m_StrideY = strideY;
1173 data.m_Parameters.m_StrideZ = strideZ;
1174 data.m_Parameters.m_PadLeft = padX;
1175 data.m_Parameters.m_PadRight = padX;
1176 data.m_Parameters.m_PadTop = padY;
1177 data.m_Parameters.m_PadBottom = padY;
1178 data.m_Parameters.m_PadFront = padZ;
1179 data.m_Parameters.m_PadBack = padZ;
1180 data.m_Parameters.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
Ryan OSheabab8fa92022-03-09 10:29:02 +00001181 data.m_Parameters.m_DataLayout = dataLayout;
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001182
Ryan OSheabab8fa92022-03-09 10:29:02 +00001183 std::unique_ptr<armnn::ITensorHandle> outputHandleRef =
1184 refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001185 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
1186
1187 // Don't execute if Pooling is not supported, as an exception will be raised.
1188 armnn::BackendId backend = workloadFactory.GetBackendId();
1189 std::string reasonIfUnsupported;
1190 armnn::LayerSupportHandle handle = armnn::GetILayerSupportByBackendId(backend);
1191 comparisonResult.m_Supported = handle.IsPooling3dSupported(inputTensorInfo,
1192 outputTensorInfo,
1193 data.m_Parameters,
1194 reasonIfUnsupported);
1195 if (!comparisonResult.m_Supported)
1196 {
1197 return comparisonResult;
1198 }
1199
1200 armnn::Pooling3dQueueDescriptor refData = data;
1201 armnn::WorkloadInfo refInfo = info;
1202 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
1203 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1204
Teresa Charlin611c7fb2022-01-07 09:47:29 +00001205 std::unique_ptr<armnn::IWorkload> workload
1206 = workloadFactory.CreateWorkload(armnn::LayerType::Pooling3d, data, info);
1207 std::unique_ptr<armnn::IWorkload> workloadRef
1208 = refWorkloadFactory.CreateWorkload(armnn::LayerType::Pooling3d, refData, refInfo);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001209
1210 outputHandleRef->Allocate();
1211 inputHandleRef->Allocate();
1212 inputHandle->Allocate();
1213 outputHandle->Allocate();
1214
1215 CopyDataToITensorHandle(inputHandle.get(), input.data());
1216 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
1217
1218 workload->Execute();
1219 workloadRef->Execute();
1220
1221 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
1222 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
1223
1224 comparisonResult.m_ActualData = actualOutput;
1225 comparisonResult.m_ExpectedData = expectedOutput;
1226
1227 return comparisonResult;
1228}
1229
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001230} // anonymous namespace
1231
1232LayerTestResult<float, 5> SimpleMaxPooling3dSize2x2x2Stride1x1x1Test(
1233 armnn::IWorkloadFactory& workloadFactory,
1234 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001235 const armnn::ITensorHandleFactory& tensorHandleFactory,
1236 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001237{
1238 return SimpleMaxPooling3dSize2x2x2Stride1x1x1TestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001239 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001240}
1241
1242LayerTestResult<uint8_t, 5> SimpleMaxPooling3dSize2x2x2Stride1x1x1Uint8Test(
1243 armnn::IWorkloadFactory& workloadFactory,
1244 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001245 const armnn::ITensorHandleFactory& tensorHandleFactory,
1246 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001247{
1248 return SimpleMaxPooling3dSize2x2x2Stride1x1x1TestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001249 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 0.1f, 128);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001250}
1251
1252LayerTestResult<int16_t, 5> SimpleMaxPooling3dSize2x2x2Stride1x1x1Int16Test(
1253 armnn::IWorkloadFactory& workloadFactory,
1254 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001255 const armnn::ITensorHandleFactory& tensorHandleFactory,
1256 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001257{
1258 return SimpleMaxPooling3dSize2x2x2Stride1x1x1TestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001259 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001260}
1261
1262LayerTestResult<float, 5> SimpleMaxPooling3dTest(
1263 armnn::IWorkloadFactory& workloadFactory,
1264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1265 const armnn::ITensorHandleFactory& tensorHandleFactory,
1266 const armnn::DataLayout dataLayout)
1267{
1268 return SimpleMaxPooling3dTestCommon<armnn::DataType::Float32>(
1269 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1270}
1271
1272LayerTestResult<uint8_t, 5> SimpleMaxPooling3dUint8Test(
1273 armnn::IWorkloadFactory& workloadFactory,
1274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1275 const armnn::ITensorHandleFactory& tensorHandleFactory,
1276 const armnn::DataLayout dataLayout)
1277{
1278 return SimpleMaxPooling3dTestCommon<armnn::DataType::QAsymmU8>(
1279 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1280}
1281
1282LayerTestResult<int16_t, 5> SimpleMaxPooling3dInt16Test(
1283 armnn::IWorkloadFactory& workloadFactory,
1284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1285 const armnn::ITensorHandleFactory& tensorHandleFactory,
1286 const armnn::DataLayout dataLayout)
1287{
1288 return SimpleMaxPooling3dTestCommon<armnn::DataType::QSymmS16>(
1289 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1290}
1291
1292LayerTestResult<float, 5> IgnorePaddingSimpleMaxPooling3dTest(
1293 armnn::IWorkloadFactory& workloadFactory,
1294 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001295 const armnn::ITensorHandleFactory& tensorHandleFactory,
1296 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001297{
1298 return IgnorePaddingSimpleMaxPooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001299 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001300}
1301
1302LayerTestResult<uint8_t, 5> IgnorePaddingSimpleMaxPooling3dUint8Test(
1303 armnn::IWorkloadFactory& workloadFactory,
1304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001305 const armnn::ITensorHandleFactory& tensorHandleFactory,
1306 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001307{
1308 return IgnorePaddingSimpleMaxPooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001309 workloadFactory, memoryManager, tensorHandleFactory,dataLayout, 1.0f, -5);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001310}
1311
1312LayerTestResult<int16_t, 5> IgnorePaddingSimpleMaxPooling3dInt16Test(
1313 armnn::IWorkloadFactory& workloadFactory,
1314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001315 const armnn::ITensorHandleFactory& tensorHandleFactory,
1316 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001317{
1318 return IgnorePaddingSimpleMaxPooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001319 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001320}
1321
1322LayerTestResult<float, 5> SimpleAveragePooling3dTest(
1323 armnn::IWorkloadFactory& workloadFactory,
1324 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1325 const armnn::ITensorHandleFactory& tensorHandleFactory,
1326 const armnn::DataLayout dataLayout)
1327{
1328 return SimpleAveragePooling3dTestCommon<armnn::DataType::Float32>(
1329 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1330}
1331
1332LayerTestResult<uint8_t, 5> SimpleAveragePooling3dUint8Test(
1333 armnn::IWorkloadFactory& workloadFactory,
1334 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1335 const armnn::ITensorHandleFactory& tensorHandleFactory,
1336 const armnn::DataLayout dataLayout)
1337{
1338 return SimpleAveragePooling3dTestCommon<armnn::DataType::QAsymmU8>(
1339 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1340}
1341
1342LayerTestResult<int16_t, 5> SimpleAveragePooling3dInt16Test(
1343 armnn::IWorkloadFactory& workloadFactory,
1344 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1345 const armnn::ITensorHandleFactory& tensorHandleFactory,
1346 const armnn::DataLayout dataLayout)
1347{
1348 return SimpleAveragePooling3dTestCommon<armnn::DataType::QSymmS16>(
1349 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1350}
1351
1352LayerTestResult<float, 5> SimpleL2Pooling3dTest(
1353 armnn::IWorkloadFactory& workloadFactory,
1354 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1355 const armnn::ITensorHandleFactory& tensorHandleFactory,
1356 const armnn::DataLayout dataLayout)
1357{
1358 return SimpleL2Pooling3dTestCommon<armnn::DataType::Float32>(
1359 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1360}
1361
1362LayerTestResult<uint8_t, 5> SimpleL2Pooling3dUint8Test(
1363 armnn::IWorkloadFactory& workloadFactory,
1364 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1365 const armnn::ITensorHandleFactory& tensorHandleFactory,
1366 const armnn::DataLayout dataLayout)
1367{
1368 return SimpleL2Pooling3dTestCommon<armnn::DataType::QAsymmU8>(
1369 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1370}
1371
1372LayerTestResult<int16_t, 5> SimpleL2Pooling3dInt16Test(
1373 armnn::IWorkloadFactory& workloadFactory,
1374 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1375 const armnn::ITensorHandleFactory& tensorHandleFactory,
1376 const armnn::DataLayout dataLayout)
1377{
1378 return SimpleL2Pooling3dTestCommon<armnn::DataType::QSymmS16>(
1379 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1380}
1381
1382LayerTestResult<float, 5> LargeTensorsAveragePooling3dTest(
1383 armnn::IWorkloadFactory& workloadFactory,
1384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001385 const armnn::ITensorHandleFactory& tensorHandleFactory,
1386 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001387{
1388 return LargeTensorsAveragePooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001389 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001390}
1391
1392LayerTestResult<uint8_t, 5> LargeTensorsAveragePooling3dUint8Test(
1393 armnn::IWorkloadFactory& workloadFactory,
1394 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001395 const armnn::ITensorHandleFactory& tensorHandleFactory,
1396 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001397{
1398 return LargeTensorsAveragePooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001399 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 0.5, -1);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001400}
1401
1402LayerTestResult<int16_t, 5> LargeTensorsAveragePooling3dInt16Test(
1403 armnn::IWorkloadFactory& workloadFactory,
1404 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001405 const armnn::ITensorHandleFactory& tensorHandleFactory,
1406 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001407{
1408 return LargeTensorsAveragePooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001409 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001410}
1411
1412LayerTestResult<float, 5> IgnorePaddingSimpleAveragePooling3dTest(
1413 armnn::IWorkloadFactory& workloadFactory,
1414 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001415 const armnn::ITensorHandleFactory& tensorHandleFactory,
1416 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001417{
1418 return IgnorePaddingSimpleAveragePooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001419 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001420}
1421
1422LayerTestResult<uint8_t, 5> IgnorePaddingSimpleAveragePooling3dUint8Test(
1423 armnn::IWorkloadFactory& workloadFactory,
1424 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001425 const armnn::ITensorHandleFactory& tensorHandleFactory,
1426 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001427{
1428 return IgnorePaddingSimpleAveragePooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001429 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 1.0f, -5);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001430}
1431
1432LayerTestResult<int16_t, 5> IgnorePaddingSimpleAveragePooling3dInt16Test(
1433 armnn::IWorkloadFactory& workloadFactory,
1434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001435 const armnn::ITensorHandleFactory& tensorHandleFactory,
1436 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001437{
1438 return IgnorePaddingSimpleAveragePooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001439 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001440}
1441
1442LayerTestResult<float, 5> IgnorePaddingSimpleL2Pooling3dTest(
1443 armnn::IWorkloadFactory& workloadFactory,
1444 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001445 const armnn::ITensorHandleFactory& tensorHandleFactory,
1446 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001447{
1448 return IgnorePaddingSimpleL2Pooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001449 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001450}
1451
1452LayerTestResult<uint8_t, 5> IgnorePaddingSimpleL2Pooling3dUint8Test(
1453 armnn::IWorkloadFactory& workloadFactory,
1454 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001455 const armnn::ITensorHandleFactory& tensorHandleFactory,
1456 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001457{
1458 return IgnorePaddingSimpleL2Pooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001459 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 1.0f, -5);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001460}
1461
1462LayerTestResult<int16_t, 5> IgnorePaddingSimpleL2Pooling3dInt16Test(
1463 armnn::IWorkloadFactory& workloadFactory,
1464 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001465 const armnn::ITensorHandleFactory& tensorHandleFactory,
1466 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001467{
1468 return IgnorePaddingSimpleL2Pooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001469 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001470}
1471
1472LayerTestResult<float, 5> AsymmetricNonSquareMaxPooling3dTest(
1473 armnn::IWorkloadFactory& workloadFactory,
1474 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001475 const armnn::ITensorHandleFactory& tensorHandleFactory,
1476 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001477{
1478 return AsymmetricNonSquareMaxPooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001479 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001480}
1481
1482LayerTestResult<uint8_t, 5> AsymmetricNonSquareMaxPooling3dUint8Test(
1483 armnn::IWorkloadFactory& workloadFactory,
1484 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001485 const armnn::ITensorHandleFactory& tensorHandleFactory,
1486 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001487{
1488 return AsymmetricNonSquareMaxPooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001489 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001490}
1491
1492LayerTestResult<int16_t, 5> AsymmetricNonSquareMaxPooling3dInt16Test(
1493 armnn::IWorkloadFactory& workloadFactory,
1494 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001495 const armnn::ITensorHandleFactory& tensorHandleFactory,
1496 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001497{
1498 return AsymmetricNonSquareMaxPooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001499 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1500}
1501
1502LayerTestResult<float, 5> AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTest(
1503 armnn::IWorkloadFactory& workloadFactory,
1504 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1505 const armnn::ITensorHandleFactory& tensorHandleFactory,
1506 const armnn::DataLayout dataLayout)
1507{
1508 return AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::Float32>(
1509 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1510}
1511
1512LayerTestResult<uint8_t, 5> AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolUint8Test(
1513 armnn::IWorkloadFactory& workloadFactory,
1514 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1515 const armnn::ITensorHandleFactory& tensorHandleFactory,
1516 const armnn::DataLayout dataLayout)
1517{
1518 return AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QAsymmU8>(
1519 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1520}
1521
1522LayerTestResult<int16_t, 5> AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolInt16Test(
1523 armnn::IWorkloadFactory& workloadFactory,
1524 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1525 const armnn::ITensorHandleFactory& tensorHandleFactory,
1526 const armnn::DataLayout dataLayout)
1527{
1528 return AsymmetricNonSquareMaxPooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QSymmS16>(
1529 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001530}
1531
1532LayerTestResult<float, 5> AsymmetricNonSquareAveragePooling3dTest(
1533 armnn::IWorkloadFactory& workloadFactory,
1534 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001535 const armnn::ITensorHandleFactory& tensorHandleFactory,
1536 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001537{
1538 return AsymmetricNonSquareAveragePooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001539 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001540}
1541
1542LayerTestResult<uint8_t, 5> AsymmetricNonSquareAveragePooling3dUint8Test(
1543 armnn::IWorkloadFactory& workloadFactory,
1544 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001545 const armnn::ITensorHandleFactory& tensorHandleFactory,
1546 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001547{
1548 return AsymmetricNonSquareAveragePooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001549 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001550}
1551
1552LayerTestResult<int16_t, 5> AsymmetricNonSquareAveragePooling3dInt16Test(
1553 armnn::IWorkloadFactory& workloadFactory,
1554 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001555 const armnn::ITensorHandleFactory& tensorHandleFactory,
1556 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001557{
1558 return AsymmetricNonSquareAveragePooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001559 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1560}
1561
1562LayerTestResult<float, 5> AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTest(
1563 armnn::IWorkloadFactory& workloadFactory,
1564 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1565 const armnn::ITensorHandleFactory& tensorHandleFactory,
1566 const armnn::DataLayout dataLayout)
1567{
1568 return AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::Float32>(
1569 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1570}
1571
1572LayerTestResult<uint8_t, 5> AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolUint8Test(
1573 armnn::IWorkloadFactory& workloadFactory,
1574 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1575 const armnn::ITensorHandleFactory& tensorHandleFactory,
1576 const armnn::DataLayout dataLayout)
1577{
1578 return AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QAsymmU8>(
1579 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1580}
1581
1582LayerTestResult<int16_t, 5> AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolInt16Test(
1583 armnn::IWorkloadFactory& workloadFactory,
1584 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1585 const armnn::ITensorHandleFactory& tensorHandleFactory,
1586 const armnn::DataLayout dataLayout)
1587{
1588 return AsymmetricNonSquareAveragePooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QSymmS16>(
1589 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001590}
1591
1592LayerTestResult<float, 5> AsymmetricNonSquareL2Pooling3dTest(
1593 armnn::IWorkloadFactory& workloadFactory,
1594 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001595 const armnn::ITensorHandleFactory& tensorHandleFactory,
1596 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001597{
1598 return AsymmetricNonSquareL2Pooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001599 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001600}
1601
1602LayerTestResult<uint8_t, 5> AsymmetricNonSquareL2Pooling3dUint8Test(
1603 armnn::IWorkloadFactory& workloadFactory,
1604 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001605 const armnn::ITensorHandleFactory& tensorHandleFactory,
1606 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001607{
1608 return AsymmetricNonSquareL2Pooling3dTestCommon<armnn::DataType::QAsymmU8>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001609 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001610}
1611
1612LayerTestResult<int16_t, 5> AsymmetricNonSquareL2Pooling3dInt16Test(
1613 armnn::IWorkloadFactory& workloadFactory,
1614 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001615 const armnn::ITensorHandleFactory& tensorHandleFactory,
1616 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001617{
1618 return AsymmetricNonSquareL2Pooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001619 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1620}
1621
1622LayerTestResult<float, 5> AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTest(
1623 armnn::IWorkloadFactory& workloadFactory,
1624 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1625 const armnn::ITensorHandleFactory& tensorHandleFactory,
1626 const armnn::DataLayout dataLayout)
1627{
1628 return AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::Float32>(
1629 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1630}
1631
1632LayerTestResult<uint8_t, 5> AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolUint8Test(
1633 armnn::IWorkloadFactory& workloadFactory,
1634 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1635 const armnn::ITensorHandleFactory& tensorHandleFactory,
1636 const armnn::DataLayout dataLayout)
1637{
1638 return AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QAsymmU8>(
1639 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1640}
1641
1642LayerTestResult<int16_t, 5> AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolInt16Test(
1643 armnn::IWorkloadFactory& workloadFactory,
1644 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1645 const armnn::ITensorHandleFactory& tensorHandleFactory,
1646 const armnn::DataLayout dataLayout)
1647{
1648 return AsymmetricNonSquareL2Pooling3dWithPaddingOnlyPoolTestCommon<armnn::DataType::QSymmS16>(
1649 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001650}
1651
1652LayerTestResult<float, 5> ComparePooling3dTest(
1653 armnn::IWorkloadFactory& workloadFactory,
1654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1655 armnn::IWorkloadFactory& refWorkloadFactory,
1656 const armnn::ITensorHandleFactory& tensorHandleFactory,
1657 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001658 armnn::PoolingAlgorithm poolingType,
1659 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001660{
1661 return ComparePooling3dTestCommon<armnn::DataType::Float32>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001662 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
1663 poolingType, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001664}
1665
1666LayerTestResult<uint8_t, 5> ComparePooling3dUint8Test(
1667 armnn::IWorkloadFactory& workloadFactory,
1668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1669 armnn::IWorkloadFactory& refWorkloadFactory,
1670 const armnn::ITensorHandleFactory& tensorHandleFactory,
1671 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001672 armnn::PoolingAlgorithm poolingType,
1673 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001674{
1675 return ComparePooling3dTestCommon<armnn::DataType::QAsymmU8>(
1676 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001677 poolingType, dataLayout, 0.1f, 128);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001678}
1679
1680LayerTestResult<int16_t, 5> ComparePooling3dInt16Test(
1681 armnn::IWorkloadFactory& workloadFactory,
1682 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1683 armnn::IWorkloadFactory& refWorkloadFactory,
1684 const armnn::ITensorHandleFactory& tensorHandleFactory,
1685 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Ryan OSheabab8fa92022-03-09 10:29:02 +00001686 armnn::PoolingAlgorithm poolingType,
1687 const armnn::DataLayout dataLayout)
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001688{
1689 return ComparePooling3dTestCommon<armnn::DataType::QSymmS16>(
Ryan OSheabab8fa92022-03-09 10:29:02 +00001690 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
1691 poolingType, dataLayout);
Tamás Nyíri7b885b32021-10-26 14:47:57 +01001692}