1 //
2 // Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "Pooling2dTestImpl.hpp"
7
8 #include <armnnUtils/QuantizeHelper.hpp>
9 #include <ResolveType.hpp>
10
11 #include <armnnUtils/TensorUtils.hpp>
12 #include <armnnUtils/DataLayoutIndexed.hpp>
13 #include <armnnUtils/Permute.hpp>
14
15 #include <armnn/utility/IgnoreUnused.hpp>
16 #include <armnn/utility/NumericCast.hpp>
17
18 #include <armnn/BackendHelper.hpp>
19 #include <backendsCommon/WorkloadInfo.hpp>
20
21 #include <armnnTestUtils/TensorCopyUtils.hpp>
22 #include <armnnTestUtils/WorkloadTestUtils.hpp>
23
24 #include <armnnTestUtils/TensorHelpers.hpp>
25
26 namespace
27 {
28
29 using namespace armnnUtils;
30
31 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimplePooling2dTestImpl(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::Pooling2dDescriptor descriptor,float qScale,int32_t qOffset,const std::vector<T> & input,const std::vector<T> & outputExpected,const armnn::TensorShape & inputShape,const armnn::TensorShape & outputShape)32 LayerTestResult<T, 4> SimplePooling2dTestImpl(
33 armnn::IWorkloadFactory& workloadFactory,
34 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
35 const armnn::ITensorHandleFactory& tensorHandleFactory,
36 armnn::Pooling2dDescriptor descriptor,
37 float qScale,
38 int32_t qOffset,
39 const std::vector<T>& input,
40 const std::vector<T>& outputExpected,
41 const armnn::TensorShape& inputShape,
42 const armnn::TensorShape& outputShape)
43 {
44 IgnoreUnused(memoryManager);
45 const armnn::DataLayout dataLayout = descriptor.m_DataLayout;
46 const armnnUtils::DataLayoutIndexed dimensionIndices = dataLayout;
47 auto heightIndex = dimensionIndices.GetHeightIndex();
48 auto widthIndex = dimensionIndices.GetWidthIndex();
49 auto channelsIndex = dimensionIndices.GetChannelsIndex();
50
51 unsigned int inputHeight = armnn::numeric_cast<unsigned int>(inputShape[heightIndex]);
52 unsigned int inputWidth = armnn::numeric_cast<unsigned int>(inputShape[widthIndex]);
53 unsigned int inputChannels = armnn::numeric_cast<unsigned int>(inputShape[channelsIndex]);
54 unsigned int inputBatchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
55
56 unsigned int outputHeight = armnn::numeric_cast<unsigned int>(outputShape[heightIndex]);
57 unsigned int outputWidth = armnn::numeric_cast<unsigned int>(outputShape[widthIndex]);
58 unsigned int outputChannels = armnn::numeric_cast<unsigned int>(outputShape[channelsIndex]);
59 unsigned int outputBatchSize = armnn::numeric_cast<unsigned int>(outputShape[0]);
60
61 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(
62 inputBatchSize, inputChannels, inputHeight, inputWidth, dataLayout, ArmnnType);
63
64 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(
65 outputBatchSize, outputChannels, outputHeight, outputWidth, dataLayout, ArmnnType);
66
67 // Set quantization parameters if the requested type is a quantized type.
68 if(armnn::IsQuantizedType<T>())
69 {
70 inputTensorInfo.SetQuantizationScale(qScale);
71 inputTensorInfo.SetQuantizationOffset(qOffset);
72 outputTensorInfo.SetQuantizationScale(qScale);
73 outputTensorInfo.SetQuantizationOffset(qOffset);
74 }
75
76 LayerTestResult<T, 4> result(outputTensorInfo);
77 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
78
79 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
80 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
81
82 armnn::Pooling2dQueueDescriptor queueDescriptor;
83 queueDescriptor.m_Parameters = descriptor;
84 queueDescriptor.m_Parameters.m_DataLayout = dataLayout;
85
86 armnn::WorkloadInfo workloadInfo;
87 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
88 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
89
90 // Don't execute if Pooling is not supported, as an exception will be raised.
91 armnn::BackendId backend = workloadFactory.GetBackendId();
92
93 auto handle = armnn::GetILayerSupportByBackendId(backend);
94 result.m_Supported = handle.IsPooling2dSupported(inputTensorInfo,
95 outputTensorInfo,
96 queueDescriptor.m_Parameters);
97 if (!result.m_Supported)
98 {
99 return result;
100 }
101
102 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pooling2d,
103 queueDescriptor,
104 workloadInfo);
105
106 inputHandle->Allocate();
107 outputHandle->Allocate();
108
109 CopyDataToITensorHandle(inputHandle.get(), input.data());
110
111 workload->Execute();
112
113 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
114
115 result.m_ActualData = actualOutput;
116 result.m_ExpectedData = outputExpected;
117
118 return result;
119 }
120
121 //
122 // Tests max pooling with the following parameters:
123 //
124 // Pooling size: 3x3
125 // Stride: (2,4)
126 // input size: 8x13
127 // channels: 2
128 // batch size: 2
129 //
130 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimpleMaxPooling2dSize3x3Stride2x4TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding,float qScale=1.0f,int32_t qOffset=0)131 LayerTestResult<T, 4> SimpleMaxPooling2dSize3x3Stride2x4TestCommon(
132 armnn::IWorkloadFactory& workloadFactory,
133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
134 const armnn::ITensorHandleFactory& tensorHandleFactory,
135 bool forceNoPadding,
136 float qScale = 1.0f,
137 int32_t qOffset = 0)
138 {
139 armnn::Pooling2dDescriptor descriptor;
140 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
141 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
142 descriptor.m_StrideX = 2;
143 descriptor.m_StrideY = 4;
144 // forceNoPadding is mainly used for compatibility with ARM Compute.
145 // As of 16/05/2017, it errors if padX or padY are equal to or greater than the pool size.
146 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
147 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
148 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
149 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
150
151 unsigned int inputWidth = 8;
152 unsigned int inputHeight = 13;
153 unsigned int outputWidth =
154 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
155 descriptor.m_StrideX;
156 unsigned int outputHeight =
157 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
158 descriptor.m_StrideY;
159 unsigned int channels = 2;
160 unsigned int batchSize = 2;
161
162 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
163 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
164
165 // Set quantization parameters if the requested type is a quantized type.
166 if(armnn::IsQuantizedType<T>())
167 {
168 inputTensorInfo.SetQuantizationScale(qScale);
169 inputTensorInfo.SetQuantizationOffset(qOffset);
170 outputTensorInfo.SetQuantizationScale(qScale);
171 outputTensorInfo.SetQuantizationOffset(qOffset);
172 }
173
174 std::vector<float> singleChannelData({
175 0.0f, 4.0f, 8.0f, 1.0f, 6.0f, 4.0f, 5.0f, 8.0f,
176 1.0f, 1.0f, 6.0f, 0.0f, 3.0f, 7.0f, 4.0f, 7.0f,
177 8.0f, 5.0f, 0.0f, 0.0f, 8.0f, 3.0f, 4.0f, 3.0f,
178 8.0f, 2.0f, 5.0f, 4.0f, 1.0f, 9.0f, 2.0f, 0.0f,
179 5.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 7.0f, 2.0f,
180 1.0f, 2.0f, 6.0f, 2.0f, 7.0f, 9.0f, 5.0f, 2.0f,
181 9.0f, 7.0f, 3.0f, 1.0f, 3.0f, 4.0f, 8.0f, 3.0f,
182 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, 4.0f, 2.0f, 0.0f,
183 6.0f, 4.0f, 3.0f, 6.0f, 9.0f, 5.0f, 5.0f, 6.0f,
184 8.0f, 7.0f, 9.0f, 6.0f, 1.0f, 4.0f, 1.0f, 9.0f,
185 7.0f, 1.0f, 9.0f, 2.0f, 9.0f, 9.0f, 8.0f, 1.0f,
186 4.0f, 4.0f, 5.0f, 9.0f, 2.0f, 6.0f, 6.0f, 4.0f,
187 3.0f, 5.0f, 4.0f, 0.0f, 1.0f, 5.0f, 9.0f, 7.0f,
188 });
189
190 // Constructs input data.
191 std::vector<float> inputData;
192 auto negator = [](float f) { return -f; };
193
194 // First image (two channels where the second channel is the negative of the first one).
195 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
196 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
197
198 // Second image (same as first image).
199 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
200 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
201
202 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
203
204 // These were calculated manually.
205 std::vector<T> outputExpected;
206 if (forceNoPadding)
207 {
208 outputExpected = QuantizedVector<T>(
209 {
210 8.0f, 8.0f, 8.0f,
211 9.0f, 7.0f, 9.0f,
212 9.0f, 9.0f, 9.0f,
213
214 0.0f, 0.0f, -3.0f,
215 -1.0f, 0.0f, 0.0f,
216 -1.0f, -1.0f, -1.0f,
217
218 8.0f, 8.0f, 8.0f,
219 9.0f, 7.0f, 9.0f,
220 9.0f, 9.0f, 9.0f,
221
222 0.0f, 0.0f, -3.0f,
223 -1.0f, 0.0f, 0.0f,
224 -1.0f, -1.0f, -1.0f
225 },
226 qScale, qOffset);
227 }
228 else
229 {
230 outputExpected = QuantizedVector<T>(
231 {
232 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
233 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
234 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
235
236 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
237 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
238 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,
239
240 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
241 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
242 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
243
244 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
245 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
246 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f
247 },
248 qScale, qOffset);
249 }
250
251 return SimplePooling2dTestImpl<ArmnnType>(
252 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
253 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
254 }
255
256 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimpleMaxPooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout=armnn::DataLayout::NCHW,float qScale=1.0f,int32_t qOffset=0)257 LayerTestResult<T, 4> SimpleMaxPooling2dTestCommon(
258 armnn::IWorkloadFactory& workloadFactory,
259 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
260 const armnn::ITensorHandleFactory& tensorHandleFactory,
261 const armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
262 float qScale = 1.0f,
263 int32_t qOffset = 0)
264 {
265 armnn::Pooling2dDescriptor descriptor;
266 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
267 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
268 descriptor.m_StrideX = descriptor.m_StrideY = 2;
269 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
270 descriptor.m_DataLayout = dataLayout;
271
272 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
273 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
274
275 // Set quantization parameters if the requested type is a quantized type.
276 if(armnn::IsQuantizedType<T>())
277 {
278 inputTensorInfo.SetQuantizationScale(qScale);
279 inputTensorInfo.SetQuantizationOffset(qOffset);
280 outputTensorInfo.SetQuantizationScale(qScale);
281 outputTensorInfo.SetQuantizationOffset(qOffset);
282 }
283
284 std::vector<T> inputData(
285 QuantizedVector<T>({
286 1.0f, 2.0f, 5.0f, 6.0f,
287 3.0f, 4.0f, 7.0f, 8.0f,
288 9.0f, 10.0f, 13.0f, 14.0f,
289 11.0f, 12.0f, 15.0f, 16.0f,
290
291 17.0f, 18.0f, 21.0f, 22.0f,
292 19.0f, 20.0f, 23.0f, 24.0f,
293 25.0f, 26.0f, 29.0f, 30.0f,
294 27.0f, 28.0f, 31.0f, 32.0f,
295 },
296 qScale, qOffset));
297
298 std::vector<T> outputData(
299 QuantizedVector<T>({
300 4.0f, 8.0f,
301 12.0f, 16.0f,
302
303 20.0f, 24.0f,
304 28.0f, 32.0f,
305 },
306 qScale, qOffset));
307
308 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
309 if (dataLayout == armnn::DataLayout::NHWC)
310 {
311 std::vector<T> tmp(inputData.size());
312 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
313 inputData = tmp;
314
315 std::vector<T> tmp1(outputData.size());
316 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
317 outputData = tmp1;
318 }
319
320 return SimplePooling2dTestImpl<ArmnnType>(
321 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
322 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
323 }
324
325 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimpleAveragePooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NCHW,float qScale=1.0f,int32_t qOffset=0)326 LayerTestResult<T, 4> SimpleAveragePooling2dTestCommon(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
329 const armnn::ITensorHandleFactory& tensorHandleFactory,
330 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
331 float qScale = 1.0f,
332 int32_t qOffset = 0)
333 {
334 armnn::Pooling2dDescriptor descriptor;
335 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
336 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
337 descriptor.m_StrideX = descriptor.m_StrideY = 2;
338 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
339 descriptor.m_DataLayout = dataLayout;
340
341 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
342 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
343
344 // Set quantization parameters if the requested type is a quantized type.
345 if(armnn::IsQuantizedType<T>())
346 {
347 inputTensorInfo.SetQuantizationScale(qScale);
348 inputTensorInfo.SetQuantizationOffset(qOffset);
349 outputTensorInfo.SetQuantizationScale(qScale);
350 outputTensorInfo.SetQuantizationOffset(qOffset);
351 }
352
353 std::vector<T> inputData(
354 QuantizedVector<T>({
355 2.0f, 2.0f, 6.0f, 6.0f,
356 4.0f, 4.0f, 8.0f, 8.0f,
357 10.0f, 12.0f, 14.0f, 16.0f,
358 10.0f, 12.0f, 16.0f, 14.0f,
359
360 18.0f, 20.0f, 24.0f, 22.0f,
361 20.0f, 18.0f, 22.0f, 24.0f,
362 26.0f, 28.0f, 0.0f, 0.0f,
363 26.0f, 28.0f, 0.0f, 0.0f,
364 },
365 qScale, qOffset));
366
367 std::vector<T> outputData(
368 QuantizedVector<T>({
369 3.0f, 7.0f,
370 11.0f, 15.0f,
371
372 19.0f, 23.0f,
373 27.0f, 0.0f,
374 },
375 qScale, qOffset));
376
377 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
378 if (dataLayout == armnn::DataLayout::NHWC)
379 {
380 std::vector<T> tmp(inputData.size());
381 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
382 inputData = tmp;
383
384 std::vector<T> tmp1(outputData.size());
385 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
386 outputData = tmp1;
387 }
388
389 return SimplePooling2dTestImpl<ArmnnType>(
390 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
391 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
392 }
393
394 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
LargeTensorsAveragePooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)395 LayerTestResult<T, 4> LargeTensorsAveragePooling2dTestCommon(
396 armnn::IWorkloadFactory& workloadFactory,
397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
398 const armnn::ITensorHandleFactory& tensorHandleFactory,
399 float qScale = 1.0f,
400 int32_t qOffset = 0)
401 {
402 armnn::Pooling2dDescriptor descriptor;
403 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
404 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 100;
405 descriptor.m_StrideX = descriptor.m_StrideY = 5;
406 descriptor.m_PadLeft = 50;
407 descriptor.m_PadRight = 50;
408 descriptor.m_PadTop = 50;
409 descriptor.m_PadBottom = 50;
410 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
411
412 armnn::TensorInfo inputTensorInfo({ 5, 3, 52, 60 }, ArmnnType);
413 armnn::TensorInfo outputTensorInfo({ 5, 3, 11, 13 }, ArmnnType);
414
415 // Set quantization parameters if the requested type is a quantized type.
416 if(armnn::IsQuantizedType<T>())
417 {
418 inputTensorInfo.SetQuantizationScale(qScale);
419 inputTensorInfo.SetQuantizationOffset(qOffset);
420 outputTensorInfo.SetQuantizationScale(qScale);
421 outputTensorInfo.SetQuantizationOffset(qOffset);
422 }
423
424 std::vector<T> input;
425
426 for (unsigned int i = 0 ; i < inputTensorInfo.GetShape().GetNumElements(); ++i)
427 {
428 input.push_back(1);
429 }
430
431 std::vector<T> outputExpected;
432
433 for (unsigned int i = 0 ; i < outputTensorInfo.GetShape().GetNumElements(); ++i)
434 {
435 outputExpected.push_back(1);
436 }
437
438 return SimplePooling2dTestImpl<ArmnnType>(
439 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
440 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
441 }
442
443 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimpleL2Pooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,armnn::DataLayout dataLayout=armnn::DataLayout::NCHW,float qScale=1.0f,int32_t qOffset=0)444 LayerTestResult<T, 4> SimpleL2Pooling2dTestCommon(
445 armnn::IWorkloadFactory& workloadFactory,
446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
447 const armnn::ITensorHandleFactory& tensorHandleFactory,
448 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
449 float qScale = 1.0f,
450 int32_t qOffset = 0)
451 {
452 armnn::Pooling2dDescriptor descriptor;
453 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
454 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
455 descriptor.m_StrideX = descriptor.m_StrideY = 2;
456 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
457 descriptor.m_DataLayout = dataLayout;
458
459 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
460 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
461
462 std::vector<T> inputData(
463 QuantizedVector<T>({
464 1.0f, 7.0f, 5.0f, 5.0f,
465 1.0f, 7.0f, 5.0f, 5.0f,
466 3.0f, 3.0f, 1.0f, 1.0f,
467 3.0f, 3.0f, 1.0f, 1.0f,
468
469 1.0f, 7.0f, 0.0f, 0.0f,
470 1.0f, 7.0f, 2.0f, 0.0f,
471 0.0f, 2.0f, 1.0f, 1.0f,
472 0.0f, 0.0f, 1.0f, 1.0f,
473 },
474 qScale, qOffset));
475
476 std::vector<T> outputData(
477 QuantizedVector<T>({
478 5.0f, 5.0f,
479 3.0f, 1.0f,
480
481 5.0f, 1.0f,
482 1.0f, 1.0f,
483 },
484 qScale, qOffset));
485
486 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
487 if (dataLayout == armnn::DataLayout::NHWC)
488 {
489 std::vector<T> tmp(inputData.size());
490 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
491 inputData = tmp;
492
493 std::vector<T> tmp1(outputData.size());
494 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
495 outputData = tmp1;
496 }
497
498 return SimplePooling2dTestImpl<ArmnnType>(
499 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
500 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
501 }
502
503 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
L2Pooling2dSize3Stride1TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)504 LayerTestResult<T, 4> L2Pooling2dSize3Stride1TestCommon(
505 armnn::IWorkloadFactory& workloadFactory,
506 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
507 const armnn::ITensorHandleFactory& tensorHandleFactory,
508 float qScale = 1.0f,
509 int32_t qOffset = 0)
510 {
511 armnn::Pooling2dDescriptor descriptor;
512 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
513 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
514 descriptor.m_StrideX = descriptor.m_StrideY = 1;
515 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
516
517 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
518 auto input = QuantizedVector<T>(
519 {
520 2.0f, 1.0f, 5.0f, 2.0f,
521 1.0f, 2.0f, 2.0f, 1.0f,
522 5.0f, 4.0f, 1.0f, 5.0f,
523 2.0f, 1.0f, 5.0f, 2.0f,
524 },
525 qScale, qOffset);
526
527 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
528 auto outputExpected = QuantizedVector<T>(
529 {
530 3.0f, 3.0f,
531 3.0f, 3.0f,
532 },
533 qScale, qOffset);
534
535 return SimplePooling2dTestImpl<ArmnnType>(
536 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
537 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
538 }
539
540 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
L2Pooling2dSize3Stride3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)541 LayerTestResult<T, 4> L2Pooling2dSize3Stride3TestCommon(
542 armnn::IWorkloadFactory& workloadFactory,
543 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
544 const armnn::ITensorHandleFactory& tensorHandleFactory,
545 float qScale = 1.0f,
546 int32_t qOffset = 0)
547 {
548 armnn::Pooling2dDescriptor descriptor;
549 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
550 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
551 descriptor.m_StrideX = descriptor.m_StrideY = 3;
552 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
553
554 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
555 auto input = QuantizedVector<T>(
556 {
557 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
558 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
559 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
560 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
561 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
562 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
563 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
564 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
565 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
566 },
567 qScale, qOffset);
568
569 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
570 auto outputExpected = QuantizedVector<T>(
571 {
572 3.0f, 3.0f, 3.0f,
573 3.0f, 3.0f, 3.0f,
574 3.0f, 3.0f, 3.0f,
575 },
576 qScale, qOffset);
577
578 return SimplePooling2dTestImpl<ArmnnType>(
579 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
580 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
581 }
582
583 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
L2Pooling2dSize3Stride4TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)584 LayerTestResult<T, 4> L2Pooling2dSize3Stride4TestCommon(
585 armnn::IWorkloadFactory& workloadFactory,
586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
587 const armnn::ITensorHandleFactory& tensorHandleFactory,
588 float qScale = 1.0f,
589 int32_t qOffset = 0)
590 {
591 armnn::Pooling2dDescriptor descriptor;
592 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
593 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
594 descriptor.m_StrideX = descriptor.m_StrideY = 4;
595 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
596
597 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
598 auto input = QuantizedVector<T>(
599 {
600 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
601 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
602 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
603 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
604 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
605 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
606 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
607 },
608 qScale, qOffset);
609
610 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
611 auto outputExpected = QuantizedVector<T>(
612 {
613 3.0f, 3.0f,
614 3.0f, 3.0f,
615 },
616 qScale, qOffset);
617
618 return SimplePooling2dTestImpl<ArmnnType>(
619 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
620 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
621 }
622
623 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
L2Pooling2dSize7TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)624 LayerTestResult<T, 4> L2Pooling2dSize7TestCommon(
625 armnn::IWorkloadFactory& workloadFactory,
626 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
627 const armnn::ITensorHandleFactory& tensorHandleFactory,
628 float qScale = 1.0f,
629 int32_t qOffset = 0)
630 {
631 armnn::Pooling2dDescriptor descriptor;
632 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
633 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 7;
634 descriptor.m_StrideX = descriptor.m_StrideY = 7;
635 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
636
637 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
638 auto input = QuantizedVector<T>(
639 {
640 1.0f, 0.0f, 2.0f, 0.0f, 3.0f, 0.0f, 4.0f,
641 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
642 0.0f, 5.0f, 0.0f, 6.0f, 0.0f, 7.0f, 0.0f,
643 8.0f, 0.0f, 9.0f, 0.0f, 10.0f, 0.0f, 5.0f,
644 0.0f, 5.0f, 0.0f, 2.0f, 0.0f, 1.0f, 1.0f,
645 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
646 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
647 },
648 qScale, qOffset);
649
650 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
651 auto outputExpected = QuantizedVector<T>(
652 {
653 3.0f,
654 },
655 qScale, qOffset);
656
657 return SimplePooling2dTestImpl<ArmnnType>(
658 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
659 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
660 }
661
662 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
L2Pooling2dSize9TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)663 LayerTestResult<T, 4> L2Pooling2dSize9TestCommon(
664 armnn::IWorkloadFactory& workloadFactory,
665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
666 const armnn::ITensorHandleFactory& tensorHandleFactory,
667 float qScale = 1.0f,
668 int32_t qOffset = 0)
669 {
670 armnn::Pooling2dDescriptor descriptor;
671 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
672 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 9;
673 descriptor.m_StrideX = descriptor.m_StrideY = 9;
674 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
675
676 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
677 auto input = QuantizedVector<T>(
678 {
679 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
680 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
681 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
682 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
683 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
684 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
685 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
686 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
687 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
688 },
689 qScale, qOffset);
690
691 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
692 auto outputExpected = QuantizedVector<T>(
693 {
694 3.0f,
695 },
696 qScale, qOffset);
697
698 return SimplePooling2dTestImpl<ArmnnType>(
699 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
700 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
701 }
702
703 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
AsymmetricNonSquarePooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)704 LayerTestResult<T, 4> AsymmetricNonSquarePooling2dTestCommon(
705 armnn::IWorkloadFactory& workloadFactory,
706 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
707 const armnn::ITensorHandleFactory& tensorHandleFactory,
708 float qScale = 1.0f,
709 int32_t qOffset = 0)
710 {
711 armnn::TensorInfo inputTensorInfo({ 1, 1, 1, 3 }, ArmnnType);
712 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
713
714 armnn::Pooling2dDescriptor descriptor;
715 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
716 descriptor.m_PoolWidth = 2;
717 descriptor.m_PoolHeight = 3;
718 descriptor.m_StrideX = 2;
719 descriptor.m_StrideY = 1;
720 descriptor.m_PadLeft = 2;
721 descriptor.m_PadRight = 0;
722 descriptor.m_PadTop = 1;
723 descriptor.m_PadBottom = 2;
724 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
725 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
726
727 // Construct input data.
728 auto input = QuantizedVector<T>(
729 {
730 1.0f, 3.0f, 4.0f,
731 },
732 qScale, qOffset);
733
734 // These were calculated manually.
735 auto outputExpected = QuantizedVector<T>(
736 {
737 0.0f, 3.0f, 0.0f, 3.0f,
738 },
739 qScale, qOffset);
740
741 return SimplePooling2dTestImpl<ArmnnType>(
742 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
743 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
744 }
745
746 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
ComparePooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::IWorkloadFactory & refWorkloadFactory,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::ITensorHandleFactory & refTensorHandleFactory,armnn::PoolingAlgorithm poolingType,float qScale=1.0f,int32_t qOffset=0)747 LayerTestResult<T, 4> ComparePooling2dTestCommon(
748 armnn::IWorkloadFactory& workloadFactory,
749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
750 armnn::IWorkloadFactory& refWorkloadFactory,
751 const armnn::ITensorHandleFactory& tensorHandleFactory,
752 const armnn::ITensorHandleFactory& refTensorHandleFactory,
753 armnn::PoolingAlgorithm poolingType,
754 float qScale = 1.0f,
755 int32_t qOffset = 0)
756 {
757 IgnoreUnused(memoryManager);
758 const unsigned int inputWidth = 16;
759 const unsigned int inputHeight = 32;
760 const unsigned int channelCount = 2;
761 const unsigned int batchSize = 5;
762
763 const unsigned int poolSize = 3;
764 const unsigned int strideX = 2;
765 const unsigned int strideY = 4;
766 const unsigned int padX = 0;
767 const unsigned int padY = 0;
768
769 const unsigned int outputWidth = (inputWidth + 2 * padX + strideX - poolSize) / strideX;
770 const unsigned int outputHeight = (inputHeight + 2 * padY + strideY - poolSize) / strideY;
771
772 armnn::TensorInfo inputTensorInfo;
773 armnn::TensorInfo outputTensorInfo;
774
775 unsigned int inputShape[] = { batchSize, channelCount, inputHeight, inputWidth };
776 unsigned int outputShape[] = { batchSize, channelCount, outputHeight, outputWidth };
777
778 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
779 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
780
781 // Set quantization parameters if the requested type is a quantized type.
782 if(armnn::IsQuantizedType<T>())
783 {
784 inputTensorInfo.SetQuantizationScale(qScale);
785 inputTensorInfo.SetQuantizationOffset(qOffset);
786 outputTensorInfo.SetQuantizationScale(qScale);
787 outputTensorInfo.SetQuantizationOffset(qOffset);
788 }
789
790 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 81715);
791 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
792 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
793
794 LayerTestResult<T, 4> comparisonResult(outputTensorInfo);
795
796 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
797 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
798
799 armnn::Pooling2dQueueDescriptor data;
800 armnn::WorkloadInfo info;
801 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
802 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
803 data.m_Parameters.m_PoolType = poolingType;
804 data.m_Parameters.m_PoolWidth = poolSize;
805 data.m_Parameters.m_PoolHeight = poolSize;
806 data.m_Parameters.m_StrideX = strideX;
807 data.m_Parameters.m_StrideY = strideY;
808 data.m_Parameters.m_PadLeft = padX;
809 data.m_Parameters.m_PadRight = padX;
810 data.m_Parameters.m_PadTop = padY;
811 data.m_Parameters.m_PadBottom = padY;
812 data.m_Parameters.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
813
814 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
815 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
816
817 // Don't execute if Pooling is not supported, as an exception will be raised.
818 armnn::BackendId backend = workloadFactory.GetBackendId();
819
820 auto handle = armnn::GetILayerSupportByBackendId(backend);
821 comparisonResult.m_Supported = handle.IsPooling2dSupported(inputTensorInfo,
822 outputTensorInfo,
823 data.m_Parameters);
824 if (!comparisonResult.m_Supported)
825 {
826 return comparisonResult;
827 }
828
829 armnn::Pooling2dQueueDescriptor refData = data;
830 armnn::WorkloadInfo refInfo = info;
831 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
832 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
833
834 std::unique_ptr<armnn::IWorkload> workload
835 = workloadFactory.CreateWorkload(armnn::LayerType::Pooling2d, data, info);
836 std::unique_ptr<armnn::IWorkload> workloadRef
837 = refWorkloadFactory.CreateWorkload(armnn::LayerType::Pooling2d, refData, refInfo);
838
839 outputHandleRef->Allocate();
840 inputHandleRef->Allocate();
841 inputHandle->Allocate();
842 outputHandle->Allocate();
843
844 CopyDataToITensorHandle(inputHandle.get(), input.data());
845 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
846
847 workload->Execute();
848 workloadRef->Execute();
849
850 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
851 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
852
853 comparisonResult.m_ActualData = actualOutput;
854 comparisonResult.m_ExpectedData = expectedOutput;
855
856 return comparisonResult;
857 }
858
859 //
860 // Tests max pooling with the following parameters:
861 //
862 // Pooling size: 2x2
863 // Stride: (2,2)
864 // input size: 4x4
865 // channels: 1
866 // batch size: 1
867 //
868 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
SimpleMaxPooling2dSize2x2Stride2x2TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding,float qScale=1.0f,int32_t qOffset=0)869 LayerTestResult<T, 4> SimpleMaxPooling2dSize2x2Stride2x2TestCommon(
870 armnn::IWorkloadFactory& workloadFactory,
871 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
872 const armnn::ITensorHandleFactory& tensorHandleFactory,
873 bool forceNoPadding,
874 float qScale = 1.0f,
875 int32_t qOffset = 0)
876 {
877 armnn::Pooling2dDescriptor descriptor;
878 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
879 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
880 descriptor.m_StrideX = 2;
881 descriptor.m_StrideY = 2;
882 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
883 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
884 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
885 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
886
887
888 unsigned int inputWidth = 4;
889
890 unsigned int inputHeight = 4;
891
892 unsigned int outputWidth =
893 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
894 descriptor.m_StrideX;
895 unsigned int outputHeight =
896 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
897 descriptor.m_StrideY;
898 unsigned int channels = 1;
899 unsigned int batchSize = 1;
900
901 std::vector<float> inputData = {
902 510.0f, 222.0f, 780.0f, 654.0f,
903 141.0f, 276.0f, 15.0f, 546.0f,
904 303.0f, 618.0f, 582.0f, 339.0f,
905 438.0f, 564.0f, 573.0f, 402.0f
906 };
907
908 // Note that left and right edges will be 0.f, due to the 2x2 max pooling only accessing zeros here.
909 std::vector<float> expectedOutputDataWithPadding = {
910 0.0f, 510.0f, 780.0f, 654.0f, 0.0f,
911 0.0f, 438.0f, 618.0f, 402.0f, 0.0f
912 };
913
914 std::vector<float> expectedOutputDataNoPadding = {
915 510.0f, 780.0f,
916 618.0f, 582.0f
917 };
918
919 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
920
921 // Scale and offset should match input - we're just calculating maximum values.
922 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
923
924 // Set quantization parameters if the requested type is a quantized type.
925 if(armnn::IsQuantizedType<T>())
926 {
927 inputTensorInfo.SetQuantizationScale(qScale);
928 inputTensorInfo.SetQuantizationOffset(qOffset);
929 outputTensorInfo.SetQuantizationScale(qScale);
930 outputTensorInfo.SetQuantizationOffset(qOffset);
931 }
932
933 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
934
935 auto outputExpected =
936 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
937 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
938
939 return SimplePooling2dTestImpl<ArmnnType>(
940 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
941 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
942 }
943
944 //
945 // Tests max pooling with the following parameters:
946 //
947 // Pooling size: 3x2
948 // Stride: (2,2)
949 // input size: 3x2
950 // channels: 1
951 // batch size: 1
952 //
953 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding,float qScale=1.0f,int32_t qOffset=0)954 LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon(
955 armnn::IWorkloadFactory& workloadFactory,
956 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
957 const armnn::ITensorHandleFactory& tensorHandleFactory,
958 bool forceNoPadding,
959 float qScale = 1.0f,
960 int32_t qOffset = 0)
961 {
962 armnn::Pooling2dDescriptor descriptor;
963 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
964 descriptor.m_PoolWidth = 3;
965 descriptor.m_PoolHeight = 2;
966 descriptor.m_StrideX = 2;
967 descriptor.m_StrideY = 2;
968 descriptor.m_PadLeft = (forceNoPadding) ? 0 : 1;
969 descriptor.m_PadRight = descriptor.m_PadLeft;
970 descriptor.m_PadTop = 0;
971 descriptor.m_PadBottom = 0;
972 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
973 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
974
975 unsigned int inputWidth = 3;
976 unsigned int inputHeight = 2;
977 unsigned int outputWidth =
978 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
979 descriptor.m_StrideX;
980 unsigned int outputHeight =
981 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
982 descriptor.m_StrideY;
983 unsigned int channels = 1;
984 unsigned int batchSize = 1;
985
986 std::vector<float> inputData = {
987 3.0f, 6.0f, 9.0f,
988 12.0f, 15.0f, 18.0f,
989 };
990
991 std::vector<float> expectedOutputDataWithPadding = {
992 6.0f, 8.0f,
993 };
994
995 std::vector<float> expectedOutputDataNoPadding = {
996 10.5f,
997 };
998
999 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
1000
1001 // Scale and offset should match input - we're just calculating average values.
1002 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
1003
1004 // Set quantization parameters if the requested type is a quantized type.
1005 if(armnn::IsQuantizedType<T>())
1006 {
1007 inputTensorInfo.SetQuantizationScale(qScale);
1008 inputTensorInfo.SetQuantizationOffset(qOffset);
1009 outputTensorInfo.SetQuantizationScale(qScale);
1010 outputTensorInfo.SetQuantizationOffset(qOffset);
1011 }
1012
1013 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
1014
1015 auto outputExpected =
1016 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
1017 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
1018
1019 return SimplePooling2dTestImpl<ArmnnType>(
1020 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1021 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1022 }
1023
1024
1025 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingSimpleMaxPooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1026 LayerTestResult<T, 4> IgnorePaddingSimpleMaxPooling2dTestCommon(
1027 armnn::IWorkloadFactory& workloadFactory,
1028 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1029 const armnn::ITensorHandleFactory& tensorHandleFactory,
1030 float qScale = 1.0f,
1031 int32_t qOffset = 0)
1032 {
1033 armnn::Pooling2dDescriptor descriptor;
1034 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1035 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1036 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1037 descriptor.m_PadLeft = 1;
1038 descriptor.m_PadRight = 1;
1039 descriptor.m_PadTop = 1;
1040 descriptor.m_PadBottom = 1;
1041 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1042
1043 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1044 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
1045
1046 // Set quantization parameters if the requested type is a quantized type.
1047 if(armnn::IsQuantizedType<T>())
1048 {
1049 inputTensorInfo.SetQuantizationScale(qScale);
1050 inputTensorInfo.SetQuantizationOffset(qOffset);
1051 outputTensorInfo.SetQuantizationScale(qScale);
1052 outputTensorInfo.SetQuantizationOffset(qOffset);
1053 }
1054
1055 auto input = QuantizedVector<T>(
1056 {
1057 -1.0f, -2.0f, 3.0f, 4.0f,
1058 -1.0f, -2.0f, 3.0f, 4.0f,
1059 1.0f, 2.0f, -3.0f, -4.0f,
1060 1.0f, 2.0f, -3.0f, -4.0f,
1061 },
1062 qScale, qOffset);
1063
1064 auto outputExpected = QuantizedVector<T>(
1065 {
1066 -1.0f, 3.0f, 4.0f,
1067 1.0f, 3.0f, 4.0f,
1068 1.0f, 2.0f, -4.0f,
1069 },
1070 qScale, qOffset);
1071
1072 return SimplePooling2dTestImpl<ArmnnType>(
1073 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1074 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1075 }
1076
1077 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingMaxPooling2dSize3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1078 LayerTestResult<T, 4> IgnorePaddingMaxPooling2dSize3TestCommon(
1079 armnn::IWorkloadFactory& workloadFactory,
1080 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1081 const armnn::ITensorHandleFactory& tensorHandleFactory,
1082 float qScale = 1.0f,
1083 int32_t qOffset = 0)
1084 {
1085 armnn::Pooling2dDescriptor descriptor;
1086 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1087 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1088 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1089 descriptor.m_PadLeft = 1;
1090 descriptor.m_PadRight = 1;
1091 descriptor.m_PadTop = 1;
1092 descriptor.m_PadBottom = 1;
1093 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1094
1095 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1096 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1097
1098 // Set quantization parameters if the requested type is a quantized type.
1099 if(armnn::IsQuantizedType<T>())
1100 {
1101 inputTensorInfo.SetQuantizationScale(qScale);
1102 inputTensorInfo.SetQuantizationOffset(qOffset);
1103 outputTensorInfo.SetQuantizationScale(qScale);
1104 outputTensorInfo.SetQuantizationOffset(qOffset);
1105 }
1106
1107 auto input = QuantizedVector<T>(
1108 {
1109 -1.0f, -2.0f, 3.0f, 4.0f,
1110 -1.0f, -2.0f, 3.0f, 4.0f,
1111 1.0f, 2.0f, -3.0f, -4.0f,
1112 1.0f, 2.0f, -3.0f, -4.0f,
1113 },
1114 qScale, qOffset);
1115
1116 auto outputExpected = QuantizedVector<T>(
1117 {
1118 -1.0f, 3.0f, 4.0f, 4.0f,
1119 2.0f, 3.0f, 4.0f, 4.0f,
1120 2.0f, 3.0f, 4.0f, 4.0f,
1121 2.0f, 2.0f, 2.0f, -3.0f,
1122 },
1123 qScale, qOffset);
1124
1125 return SimplePooling2dTestImpl<ArmnnType>(
1126 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1127 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1128 }
1129
1130 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingSimpleAveragePooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1131 LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dTestCommon(
1132 armnn::IWorkloadFactory& workloadFactory,
1133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1134 const armnn::ITensorHandleFactory& tensorHandleFactory,
1135 float qScale = 1.0f,
1136 int32_t qOffset = 0)
1137 {
1138 armnn::Pooling2dDescriptor descriptor;
1139 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1140 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1141 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1142 descriptor.m_PadLeft = 1;
1143 descriptor.m_PadRight = 1;
1144 descriptor.m_PadTop = 1;
1145 descriptor.m_PadBottom = 1;
1146 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1147
1148 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1149 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
1150
1151 // Set quantization parameters if the requested type is a quantized type.
1152 if(armnn::IsQuantizedType<T>())
1153 {
1154 inputTensorInfo.SetQuantizationScale(qScale);
1155 inputTensorInfo.SetQuantizationOffset(qOffset);
1156 outputTensorInfo.SetQuantizationScale(qScale);
1157 outputTensorInfo.SetQuantizationOffset(qOffset);
1158 }
1159
1160 auto input = QuantizedVector<T>(
1161 {
1162 12.0f, 20.0f, 32.0f, 40.0f,
1163 12.0f, 20.0f, 32.0f, 40.0f,
1164 12.0f, 20.0f, 32.0f, 40.0f,
1165 12.0f, 20.0f, 32.0f, 40.0f,
1166 },
1167 qScale, qOffset);
1168
1169 auto outputExpected = QuantizedVector<T>(
1170 {
1171 3.0f, 13.0f, 10.0f,
1172 6.0f, 26.0f, 20.0f,
1173 3.0f, 13.0f, 10.0f,
1174 },
1175 qScale, qOffset);
1176
1177 return SimplePooling2dTestImpl<ArmnnType>(
1178 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1179 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1180 }
1181
1182 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1183 LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon(
1184 armnn::IWorkloadFactory& workloadFactory,
1185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1186 const armnn::ITensorHandleFactory& tensorHandleFactory,
1187 float qScale = 1.0f,
1188 int32_t qOffset = 0)
1189 {
1190 armnn::Pooling2dDescriptor descriptor;
1191 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1192 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1193 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1194 descriptor.m_PadLeft = 0;
1195 descriptor.m_PadRight = 0;
1196 descriptor.m_PadTop = 0;
1197 descriptor.m_PadBottom = 0;
1198 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1199 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Ceiling;
1200
1201 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1202 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
1203
1204 // Set quantization parameters if the requested type is a quantized type.
1205 if(armnn::IsQuantizedType<T>())
1206 {
1207 inputTensorInfo.SetQuantizationScale(qScale);
1208 inputTensorInfo.SetQuantizationOffset(qOffset);
1209 outputTensorInfo.SetQuantizationScale(qScale);
1210 outputTensorInfo.SetQuantizationOffset(qOffset);
1211 }
1212
1213 auto input = QuantizedVector<T>(
1214 {
1215 1.0f, 2.0f, 3.0f, 4.0f,
1216 1.0f, 2.0f, 3.0f, 4.0f,
1217 1.0f, 2.0f, 3.0f, 4.0f,
1218 1.0f, 2.0f, 3.0f, 4.0f,
1219 },
1220 qScale, qOffset);
1221
1222 auto outputExpected = QuantizedVector<T>(
1223 {
1224 2.0f, 3.5f,
1225 2.0f, 3.5f
1226 },
1227 qScale, qOffset);
1228
1229 return SimplePooling2dTestImpl<ArmnnType>(
1230 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1231 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1232 }
1233
1234 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingAveragePooling2dSize3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1235 LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3TestCommon(
1236 armnn::IWorkloadFactory& workloadFactory,
1237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1238 const armnn::ITensorHandleFactory& tensorHandleFactory,
1239 float qScale = 1.0f,
1240 int32_t qOffset = 0)
1241 {
1242 armnn::Pooling2dDescriptor descriptor;
1243 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1244 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1245 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1246 descriptor.m_PadLeft = 1;
1247 descriptor.m_PadRight = 1;
1248 descriptor.m_PadTop = 1;
1249 descriptor.m_PadBottom = 1;
1250 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1251
1252 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1253 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1254
1255 // Set quantization parameters if the requested type is a quantized type.
1256 if(armnn::IsQuantizedType<T>())
1257 {
1258 inputTensorInfo.SetQuantizationScale(qScale);
1259 inputTensorInfo.SetQuantizationOffset(qOffset);
1260 outputTensorInfo.SetQuantizationScale(qScale);
1261 outputTensorInfo.SetQuantizationOffset(qOffset);
1262 }
1263
1264 auto input = QuantizedVector<T>(
1265 {
1266 9.0f, 27.0f, 18.0f, 36.0f,
1267 18.0f, 9.0f, 18.0f, 9.0f,
1268 27.0f, 18.0f, 9.0f, 27.0f,
1269 9.0f, 27.0f, 9.0f, 18.0f,
1270 },
1271 qScale, qOffset);
1272
1273 auto outputExpected = QuantizedVector<T>(
1274 {
1275 7.0f, 11.0f, 13.0f, 9.0f,
1276 12.0f, 17.0f, 19.0f, 13.0f,
1277 12.0f, 16.0f, 16.0f, 10.0f,
1278 9.0f, 11.0f, 12.0f, 7.0f,
1279 },
1280 qScale, qOffset);
1281
1282 return SimplePooling2dTestImpl<ArmnnType>(
1283 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1284 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1285 }
1286
1287 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingSimpleL2Pooling2dTestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1288 LayerTestResult<T, 4> IgnorePaddingSimpleL2Pooling2dTestCommon(
1289 armnn::IWorkloadFactory& workloadFactory,
1290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1291 const armnn::ITensorHandleFactory& tensorHandleFactory,
1292 float qScale = 1.0f,
1293 int32_t qOffset = 0)
1294 {
1295 armnn::Pooling2dDescriptor descriptor;
1296 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1297 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1298 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1299 descriptor.m_PadLeft = 1;
1300 descriptor.m_PadRight = 1;
1301 descriptor.m_PadTop = 1;
1302 descriptor.m_PadBottom = 1;
1303 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1304
1305 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1306 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
1307
1308 // Set quantization parameters if the requested type is a quantized type.
1309 if(armnn::IsQuantizedType<T>())
1310 {
1311 inputTensorInfo.SetQuantizationScale(qScale);
1312 inputTensorInfo.SetQuantizationOffset(qOffset);
1313 outputTensorInfo.SetQuantizationScale(qScale);
1314 outputTensorInfo.SetQuantizationOffset(qOffset);
1315 }
1316
1317 auto input = QuantizedVector<T>(
1318 {
1319 2.0f, 4.0f, 8.0f, 16.0f,
1320 4.0f, 2.0f, 2.0f, 4.0f,
1321 8.0f, 2.0f, 4.0f, 2.0f,
1322 16.0f, 2.0f, 2.0f, 8.0f,
1323 },
1324 qScale, qOffset);
1325
1326 auto outputExpected = QuantizedVector<T>(
1327 {
1328 1.0f, 4.4721f, 8.0f,
1329 4.4721f, 2.6457f, 2.236f,
1330 8.0f, 1.4142f, 4.0f,
1331 },
1332 qScale, qOffset);
1333
1334 return SimplePooling2dTestImpl<ArmnnType>(
1335 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1336 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1337 }
1338
1339 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
IgnorePaddingL2Pooling2dSize3TestCommon(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,float qScale=1.0f,int32_t qOffset=0)1340 LayerTestResult<T, 4> IgnorePaddingL2Pooling2dSize3TestCommon(
1341 armnn::IWorkloadFactory& workloadFactory,
1342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1343 const armnn::ITensorHandleFactory& tensorHandleFactory,
1344 float qScale = 1.0f,
1345 int32_t qOffset = 0)
1346 {
1347 armnn::Pooling2dDescriptor descriptor;
1348 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1349 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1350 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1351 descriptor.m_PadLeft = 1;
1352 descriptor.m_PadRight = 1;
1353 descriptor.m_PadTop = 1;
1354 descriptor.m_PadBottom = 1;
1355 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1356
1357 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1358 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1359
1360 // Set quantization parameters if the requested type is a quantized type.
1361 if(armnn::IsQuantizedType<T>())
1362 {
1363 inputTensorInfo.SetQuantizationScale(qScale);
1364 inputTensorInfo.SetQuantizationOffset(qOffset);
1365 outputTensorInfo.SetQuantizationScale(qScale);
1366 outputTensorInfo.SetQuantizationOffset(qOffset);
1367 }
1368
1369 auto input = QuantizedVector<T>(
1370 {
1371 1.0f, 2.0f, 3.0f, 4.0f,
1372 1.0f, 2.0f, 3.0f, 4.0f,
1373 1.0f, 2.0f, 3.0f, 4.0f,
1374 1.0f, 2.0f, 3.0f, 4.0f,
1375 },
1376 qScale, qOffset);
1377
1378 auto outputExpected = QuantizedVector<T>(
1379 {
1380 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1381 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1382 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1383 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1384 },
1385 qScale, qOffset);
1386
1387 return SimplePooling2dTestImpl<ArmnnType>(
1388 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1389 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
1390 }
1391
1392 } // anonymous namespace
1393
SimpleMaxPooling2dSize2x2Stride2x2Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1394 LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
1395 armnn::IWorkloadFactory& workloadFactory,
1396 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1397 const armnn::ITensorHandleFactory& tensorHandleFactory,
1398 bool forceNoPadding)
1399 {
1400 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
1401 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
1402 }
1403
SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1404 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
1405 armnn::IWorkloadFactory& workloadFactory,
1406 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1407 const armnn::ITensorHandleFactory& tensorHandleFactory,
1408 bool forceNoPadding)
1409 {
1410 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QAsymmU8>(
1411 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 3.0f, -5);
1412 }
1413
SimpleMaxPooling2dSize2x2Stride2x2Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1414 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
1415 armnn::IWorkloadFactory& workloadFactory,
1416 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1417 const armnn::ITensorHandleFactory& tensorHandleFactory,
1418 bool forceNoPadding)
1419 {
1420 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QSymmS16>(
1421 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
1422 }
1423
SimpleMaxPooling2dSize3x3Stride2x4Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1424 LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
1425 armnn::IWorkloadFactory& workloadFactory,
1426 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1427 const armnn::ITensorHandleFactory& tensorHandleFactory,
1428 bool forceNoPadding)
1429 {
1430 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
1431 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
1432 }
1433
SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1434 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
1435 armnn::IWorkloadFactory& workloadFactory,
1436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1437 const armnn::ITensorHandleFactory& tensorHandleFactory,
1438 bool forceNoPadding)
1439 {
1440 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QAsymmU8>(
1441 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 0.1f, 128);
1442 }
1443
SimpleMaxPooling2dSize3x3Stride2x4Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1444 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
1445 armnn::IWorkloadFactory& workloadFactory,
1446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1447 const armnn::ITensorHandleFactory& tensorHandleFactory,
1448 bool forceNoPadding)
1449 {
1450 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QSymmS16>(
1451 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
1452 }
1453
SimpleMaxPooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1454 LayerTestResult<float, 4> SimpleMaxPooling2dTest(
1455 armnn::IWorkloadFactory& workloadFactory,
1456 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1457 const armnn::ITensorHandleFactory& tensorHandleFactory,
1458 const armnn::DataLayout dataLayout)
1459 {
1460 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1461 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1462 }
1463
SimpleMaxPooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1464 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
1465 armnn::IWorkloadFactory& workloadFactory,
1466 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1467 const armnn::ITensorHandleFactory& tensorHandleFactory,
1468 const armnn::DataLayout dataLayout)
1469 {
1470 return SimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
1471 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1472 }
1473
SimpleMaxPooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1474 LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
1475 armnn::IWorkloadFactory& workloadFactory,
1476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1477 const armnn::ITensorHandleFactory& tensorHandleFactory,
1478 const armnn::DataLayout dataLayout)
1479 {
1480 return SimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
1481 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1482 }
IgnorePaddingSimpleMaxPooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1483 LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
1484 armnn::IWorkloadFactory& workloadFactory,
1485 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1486 const armnn::ITensorHandleFactory& tensorHandleFactory)
1487 {
1488 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1489 workloadFactory, memoryManager, tensorHandleFactory);
1490 }
1491
IgnorePaddingSimpleMaxPooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1492 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
1493 armnn::IWorkloadFactory& workloadFactory,
1494 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1495 const armnn::ITensorHandleFactory& tensorHandleFactory)
1496 {
1497 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
1498 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
1499 }
1500
IgnorePaddingSimpleMaxPooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1501 LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
1502 armnn::IWorkloadFactory& workloadFactory,
1503 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1504 const armnn::ITensorHandleFactory& tensorHandleFactory)
1505 {
1506 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
1507 workloadFactory, memoryManager, tensorHandleFactory);
1508 }
1509
IgnorePaddingMaxPooling2dSize3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1510 LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
1511 armnn::IWorkloadFactory& workloadFactory,
1512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1513 const armnn::ITensorHandleFactory& tensorHandleFactory)
1514 {
1515 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(
1516 workloadFactory, memoryManager, tensorHandleFactory);
1517 }
1518
IgnorePaddingMaxPooling2dSize3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1519 LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
1520 armnn::IWorkloadFactory& workloadFactory,
1521 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1522 const armnn::ITensorHandleFactory& tensorHandleFactory)
1523 {
1524 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
1525 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
1526 }
1527
IgnorePaddingMaxPooling2dSize3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1528 LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
1529 armnn::IWorkloadFactory& workloadFactory,
1530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1531 const armnn::ITensorHandleFactory& tensorHandleFactory)
1532 {
1533 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
1534 workloadFactory, memoryManager, tensorHandleFactory);
1535 }
1536
SimpleAveragePooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1537 LayerTestResult<float, 4> SimpleAveragePooling2dTest(
1538 armnn::IWorkloadFactory& workloadFactory,
1539 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1540 const armnn::ITensorHandleFactory& tensorHandleFactory,
1541 const armnn::DataLayout dataLayout)
1542 {
1543 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1544 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1545 }
1546
SimpleAveragePooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1547 LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
1548 armnn::IWorkloadFactory& workloadFactory,
1549 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1550 const armnn::ITensorHandleFactory& tensorHandleFactory,
1551 const armnn::DataLayout dataLayout)
1552 {
1553 return SimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1554 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 0.5, -1);
1555 }
1556
SimpleAveragePooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1557 LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
1558 armnn::IWorkloadFactory& workloadFactory,
1559 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1560 const armnn::ITensorHandleFactory& tensorHandleFactory,
1561 const armnn::DataLayout dataLayout)
1562 {
1563 return SimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
1564 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1565 }
1566
IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,bool forceNoPadding)1567 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
1568 armnn::IWorkloadFactory& workloadFactory,
1569 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1570 const armnn::ITensorHandleFactory& tensorHandleFactory,
1571 bool forceNoPadding)
1572 {
1573 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
1574 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
1575 }
1576
LargeTensorsAveragePooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1577 LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
1578 armnn::IWorkloadFactory& workloadFactory,
1579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1580 const armnn::ITensorHandleFactory& tensorHandleFactory)
1581 {
1582 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(
1583 workloadFactory, memoryManager, tensorHandleFactory);
1584 }
1585
LargeTensorsAveragePooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1586 LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
1587 armnn::IWorkloadFactory& workloadFactory,
1588 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1589 const armnn::ITensorHandleFactory& tensorHandleFactory)
1590 {
1591 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1592 workloadFactory, memoryManager, tensorHandleFactory, 0.5, -1);
1593 }
1594
LargeTensorsAveragePooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1595 LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
1596 armnn::IWorkloadFactory& workloadFactory,
1597 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1598 const armnn::ITensorHandleFactory& tensorHandleFactory)
1599 {
1600 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
1601 workloadFactory, memoryManager, tensorHandleFactory);
1602 }
IgnorePaddingSimpleAveragePooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1603 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
1604 armnn::IWorkloadFactory& workloadFactory,
1605 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1606 const armnn::ITensorHandleFactory& tensorHandleFactory)
1607 {
1608 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1609 workloadFactory, memoryManager, tensorHandleFactory);
1610 }
1611
IgnorePaddingSimpleAveragePooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1612 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
1613 armnn::IWorkloadFactory& workloadFactory,
1614 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1615 const armnn::ITensorHandleFactory& tensorHandleFactory)
1616 {
1617 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1618 workloadFactory, memoryManager, tensorHandleFactory);
1619 }
1620
IgnorePaddingSimpleAveragePooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1621 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
1622 armnn::IWorkloadFactory& workloadFactory,
1623 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1624 const armnn::ITensorHandleFactory& tensorHandleFactory)
1625 {
1626 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
1627 workloadFactory, memoryManager, tensorHandleFactory);
1628 }
1629
IgnorePaddingSimpleAveragePooling2dNoPaddingTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1630 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
1631 armnn::IWorkloadFactory& workloadFactory,
1632 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1633 const armnn::ITensorHandleFactory& tensorHandleFactory)
1634 {
1635 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
1636 workloadFactory, memoryManager, tensorHandleFactory);
1637 }
1638
IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1639 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
1640 armnn::IWorkloadFactory& workloadFactory,
1641 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1642 const armnn::ITensorHandleFactory& tensorHandleFactory)
1643 {
1644 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QAsymmU8>(
1645 workloadFactory, memoryManager, tensorHandleFactory);
1646 }
1647
IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1648 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
1649 armnn::IWorkloadFactory& workloadFactory,
1650 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1651 const armnn::ITensorHandleFactory& tensorHandleFactory)
1652 {
1653 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QSymmS16>(
1654 workloadFactory, memoryManager, tensorHandleFactory);
1655 }
1656
IgnorePaddingAveragePooling2dSize3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1657 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
1658 armnn::IWorkloadFactory& workloadFactory,
1659 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1660 const armnn::ITensorHandleFactory& tensorHandleFactory)
1661 {
1662 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(
1663 workloadFactory, memoryManager, tensorHandleFactory);
1664 }
1665
IgnorePaddingAveragePooling2dSize3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1666 LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
1667 armnn::IWorkloadFactory& workloadFactory,
1668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1669 const armnn::ITensorHandleFactory& tensorHandleFactory)
1670 {
1671 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
1672 workloadFactory, memoryManager, tensorHandleFactory);
1673 }
1674
IgnorePaddingAveragePooling2dSize3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1675 LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
1676 armnn::IWorkloadFactory& workloadFactory,
1677 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1678 const armnn::ITensorHandleFactory& tensorHandleFactory)
1679 {
1680 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
1681 workloadFactory, memoryManager, tensorHandleFactory);
1682 }
1683
SimpleL2Pooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1684 LayerTestResult<float, 4> SimpleL2Pooling2dTest(
1685 armnn::IWorkloadFactory& workloadFactory,
1686 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1687 const armnn::ITensorHandleFactory& tensorHandleFactory,
1688 const armnn::DataLayout dataLayout)
1689 {
1690 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1691 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1692 }
1693
SimpleL2Pooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1694 LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
1695 armnn::IWorkloadFactory& workloadFactory,
1696 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1697 const armnn::ITensorHandleFactory& tensorHandleFactory,
1698 const armnn::DataLayout dataLayout)
1699 {
1700 return SimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1701 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1702 }
1703
SimpleL2Pooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::DataLayout dataLayout)1704 LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
1705 armnn::IWorkloadFactory& workloadFactory,
1706 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1707 const armnn::ITensorHandleFactory& tensorHandleFactory,
1708 const armnn::DataLayout dataLayout)
1709 {
1710 return SimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1711 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
1712 }
1713
L2Pooling2dSize3Stride1Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1714 LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
1715 armnn::IWorkloadFactory& workloadFactory,
1716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1717 const armnn::ITensorHandleFactory& tensorHandleFactory)
1718 {
1719 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(
1720 workloadFactory, memoryManager, tensorHandleFactory);
1721 }
1722
L2Pooling2dSize3Stride1Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1723 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
1724 armnn::IWorkloadFactory& workloadFactory,
1725 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1726 const armnn::ITensorHandleFactory& tensorHandleFactory)
1727 {
1728 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QAsymmU8>(
1729 workloadFactory, memoryManager, tensorHandleFactory);
1730 }
1731
L2Pooling2dSize3Stride1Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1732 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
1733 armnn::IWorkloadFactory& workloadFactory,
1734 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1735 const armnn::ITensorHandleFactory& tensorHandleFactory)
1736 {
1737 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QSymmS16>(
1738 workloadFactory, memoryManager, tensorHandleFactory);
1739 }
1740
L2Pooling2dSize3Stride3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1741 LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
1742 armnn::IWorkloadFactory& workloadFactory,
1743 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1744 const armnn::ITensorHandleFactory& tensorHandleFactory)
1745 {
1746 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(
1747 workloadFactory, memoryManager, tensorHandleFactory);
1748 }
1749
L2Pooling2dSize3Stride3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1750 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
1751 armnn::IWorkloadFactory& workloadFactory,
1752 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1753 const armnn::ITensorHandleFactory& tensorHandleFactory)
1754 {
1755 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QAsymmU8>(
1756 workloadFactory, memoryManager, tensorHandleFactory);
1757 }
1758
L2Pooling2dSize3Stride3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1759 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
1760 armnn::IWorkloadFactory& workloadFactory,
1761 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1762 const armnn::ITensorHandleFactory& tensorHandleFactory)
1763 {
1764 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QSymmS16>(
1765 workloadFactory, memoryManager, tensorHandleFactory);
1766 }
L2Pooling2dSize3Stride4Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1767 LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
1768 armnn::IWorkloadFactory& workloadFactory,
1769 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1770 const armnn::ITensorHandleFactory& tensorHandleFactory)
1771 {
1772 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(
1773 workloadFactory, memoryManager, tensorHandleFactory);
1774 }
1775
L2Pooling2dSize3Stride4Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1776 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
1777 armnn::IWorkloadFactory& workloadFactory,
1778 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1779 const armnn::ITensorHandleFactory& tensorHandleFactory)
1780 {
1781 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QAsymmU8>(
1782 workloadFactory, memoryManager, tensorHandleFactory);
1783 }
1784
L2Pooling2dSize3Stride4Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1785 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
1786 armnn::IWorkloadFactory& workloadFactory,
1787 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1788 const armnn::ITensorHandleFactory& tensorHandleFactory)
1789 {
1790 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QSymmS16>(
1791 workloadFactory, memoryManager, tensorHandleFactory);
1792 }
1793
L2Pooling2dSize7Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1794 LayerTestResult<float, 4> L2Pooling2dSize7Test(
1795 armnn::IWorkloadFactory& workloadFactory,
1796 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1797 const armnn::ITensorHandleFactory& tensorHandleFactory)
1798 {
1799 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(
1800 workloadFactory, memoryManager, tensorHandleFactory);
1801 }
1802
L2Pooling2dSize7Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1803 LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
1804 armnn::IWorkloadFactory& workloadFactory,
1805 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1806 const armnn::ITensorHandleFactory& tensorHandleFactory)
1807 {
1808 return L2Pooling2dSize7TestCommon<armnn::DataType::QAsymmU8>(
1809 workloadFactory, memoryManager, tensorHandleFactory);
1810 }
1811
L2Pooling2dSize7Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1812 LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
1813 armnn::IWorkloadFactory& workloadFactory,
1814 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1815 const armnn::ITensorHandleFactory& tensorHandleFactory)
1816 {
1817 return L2Pooling2dSize7TestCommon<armnn::DataType::QSymmS16>(
1818 workloadFactory, memoryManager, tensorHandleFactory);
1819 }
1820
L2Pooling2dSize9Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1821 LayerTestResult<float, 4> L2Pooling2dSize9Test(
1822 armnn::IWorkloadFactory& workloadFactory,
1823 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1824 const armnn::ITensorHandleFactory& tensorHandleFactory)
1825 {
1826 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(
1827 workloadFactory, memoryManager, tensorHandleFactory);
1828 }
1829
L2Pooling2dSize9Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1830 LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
1831 armnn::IWorkloadFactory& workloadFactory,
1832 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1833 const armnn::ITensorHandleFactory& tensorHandleFactory)
1834 {
1835 return L2Pooling2dSize9TestCommon<armnn::DataType::QAsymmU8>(
1836 workloadFactory, memoryManager, tensorHandleFactory);
1837 }
1838
L2Pooling2dSize9Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1839 LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
1840 armnn::IWorkloadFactory& workloadFactory,
1841 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1842 const armnn::ITensorHandleFactory& tensorHandleFactory)
1843 {
1844 return L2Pooling2dSize9TestCommon<armnn::DataType::QSymmS16>(
1845 workloadFactory, memoryManager, tensorHandleFactory);
1846 }
IgnorePaddingSimpleL2Pooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1847 LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
1848 armnn::IWorkloadFactory& workloadFactory,
1849 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1850 const armnn::ITensorHandleFactory& tensorHandleFactory)
1851 {
1852 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1853 workloadFactory, memoryManager, tensorHandleFactory);
1854 }
1855
IgnorePaddingSimpleL2Pooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1856 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
1857 armnn::IWorkloadFactory& workloadFactory,
1858 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1859 const armnn::ITensorHandleFactory& tensorHandleFactory)
1860 {
1861 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1862 workloadFactory, memoryManager, tensorHandleFactory);
1863 }
1864
IgnorePaddingSimpleL2Pooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1865 LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
1866 armnn::IWorkloadFactory& workloadFactory,
1867 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1868 const armnn::ITensorHandleFactory& tensorHandleFactory)
1869 {
1870 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1871 workloadFactory, memoryManager, tensorHandleFactory);
1872 }
1873
IgnorePaddingL2Pooling2dSize3Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1874 LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
1875 armnn::IWorkloadFactory& workloadFactory,
1876 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1877 const armnn::ITensorHandleFactory& tensorHandleFactory)
1878 {
1879 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(
1880 workloadFactory, memoryManager, tensorHandleFactory);
1881 }
1882
IgnorePaddingL2Pooling2dSize3Uint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1883 LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
1884 armnn::IWorkloadFactory& workloadFactory,
1885 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1886 const armnn::ITensorHandleFactory& tensorHandleFactory)
1887 {
1888 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
1889 workloadFactory, memoryManager, tensorHandleFactory);
1890 }
1891
IgnorePaddingL2Pooling2dSize3Int16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1892 LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
1893 armnn::IWorkloadFactory& workloadFactory,
1894 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1895 const armnn::ITensorHandleFactory& tensorHandleFactory)
1896 {
1897 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
1898 workloadFactory, memoryManager, tensorHandleFactory);
1899 }
1900
AsymmetricNonSquarePooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1901 LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
1902 armnn::IWorkloadFactory& workloadFactory,
1903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1904 const armnn::ITensorHandleFactory& tensorHandleFactory)
1905 {
1906 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(
1907 workloadFactory, memoryManager, tensorHandleFactory);
1908 }
1909
AsymmetricNonSquarePooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1910 LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
1911 armnn::IWorkloadFactory& workloadFactory,
1912 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1913 const armnn::ITensorHandleFactory& tensorHandleFactory)
1914 {
1915 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1916 workloadFactory, memoryManager, tensorHandleFactory);
1917 }
1918
AsymmetricNonSquarePooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,const armnn::ITensorHandleFactory & tensorHandleFactory)1919 LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
1920 armnn::IWorkloadFactory& workloadFactory,
1921 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1922 const armnn::ITensorHandleFactory& tensorHandleFactory)
1923 {
1924 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QSymmS16>(
1925 workloadFactory, memoryManager, tensorHandleFactory);
1926 }
1927
ComparePooling2dTest(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::IWorkloadFactory & refWorkloadFactory,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::ITensorHandleFactory & refTensorHandleFactory,armnn::PoolingAlgorithm poolingType)1928 LayerTestResult<float, 4> ComparePooling2dTest(
1929 armnn::IWorkloadFactory& workloadFactory,
1930 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1931 armnn::IWorkloadFactory& refWorkloadFactory,
1932 const armnn::ITensorHandleFactory& tensorHandleFactory,
1933 const armnn::ITensorHandleFactory& refTensorHandleFactory,
1934 armnn::PoolingAlgorithm poolingType)
1935 {
1936 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
1937 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
1938 }
1939
ComparePooling2dUint8Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::IWorkloadFactory & refWorkloadFactory,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::ITensorHandleFactory & refTensorHandleFactory,armnn::PoolingAlgorithm poolingType)1940 LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
1941 armnn::IWorkloadFactory& workloadFactory,
1942 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1943 armnn::IWorkloadFactory& refWorkloadFactory,
1944 const armnn::ITensorHandleFactory& tensorHandleFactory,
1945 const armnn::ITensorHandleFactory& refTensorHandleFactory,
1946 armnn::PoolingAlgorithm poolingType)
1947 {
1948 return ComparePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1949 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
1950 poolingType, 0.1f, 128);
1951 }
1952
ComparePooling2dInt16Test(armnn::IWorkloadFactory & workloadFactory,const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,armnn::IWorkloadFactory & refWorkloadFactory,const armnn::ITensorHandleFactory & tensorHandleFactory,const armnn::ITensorHandleFactory & refTensorHandleFactory,armnn::PoolingAlgorithm poolingType)1953 LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
1954 armnn::IWorkloadFactory& workloadFactory,
1955 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1956 armnn::IWorkloadFactory& refWorkloadFactory,
1957 const armnn::ITensorHandleFactory& tensorHandleFactory,
1958 const armnn::ITensorHandleFactory& refTensorHandleFactory,
1959 armnn::PoolingAlgorithm poolingType)
1960 {
1961 return ComparePooling2dTestCommon<armnn::DataType::QSymmS16>(
1962 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
1963 }
1964