blob: 1eaf1f9d667f8b13a494655e2638ea30095798ec [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlinfbf0e5b2020-08-17 01:01:06 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "Pooling2dTestImpl.hpp"
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00007
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01008#include <QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Matteo Martincighe011d202019-11-28 11:35:47 +000010
11#include <armnn/LayerSupport.hpp>
12
13#include <armnnUtils/TensorUtils.hpp>
14#include <armnnUtils/DataLayoutIndexed.hpp>
15#include <armnnUtils/Permute.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016
Jan Eilers8eb25602020-03-09 12:13:48 +000017#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan171214c2020-09-09 09:07:37 +010018#include <armnn/utility/NumericCast.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000019
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000020#include <backendsCommon/WorkloadInfo.hpp>
21
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010022#include <backendsCommon/test/TensorCopyUtils.hpp>
23#include <backendsCommon/test/WorkloadTestUtils.hpp>
24
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000025#include <test/TensorHelpers.hpp>
26
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010027namespace
28{
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000029
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010030using namespace armnnUtils;
31
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000032template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000033LayerTestResult<T, 4> SimplePooling2dTestImpl(
34 armnn::IWorkloadFactory& workloadFactory,
35 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010036 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000037 armnn::Pooling2dDescriptor descriptor,
38 float qScale,
39 int32_t qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +010040 const std::vector<T>& input,
41 const std::vector<T>& outputExpected,
42 const armnn::TensorShape& inputShape,
43 const armnn::TensorShape& outputShape)
telsoa014fcda012018-03-09 14:13:49 +000044{
Jan Eilers8eb25602020-03-09 12:13:48 +000045 IgnoreUnused(memoryManager);
Matthew Bentham8800c002018-11-19 13:19:28 +000046 const armnn::DataLayout dataLayout = descriptor.m_DataLayout;
Matteo Martincigh21350152018-11-28 16:22:22 +000047 const armnnUtils::DataLayoutIndexed dimensionIndices = dataLayout;
Matthew Bentham8800c002018-11-19 13:19:28 +000048 auto heightIndex = dimensionIndices.GetHeightIndex();
49 auto widthIndex = dimensionIndices.GetWidthIndex();
50 auto channelsIndex = dimensionIndices.GetChannelsIndex();
telsoa014fcda012018-03-09 14:13:49 +000051
Sadik Armagan483c8112021-06-01 09:24:52 +010052 unsigned int inputHeight = armnn::numeric_cast<unsigned int>(inputShape[heightIndex]);
53 unsigned int inputWidth = armnn::numeric_cast<unsigned int>(inputShape[widthIndex]);
54 unsigned int inputChannels = armnn::numeric_cast<unsigned int>(inputShape[channelsIndex]);
55 unsigned int inputBatchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
James Conroy69482272018-10-19 10:41:35 +010056
Sadik Armagan483c8112021-06-01 09:24:52 +010057 unsigned int outputHeight = armnn::numeric_cast<unsigned int>(outputShape[heightIndex]);
58 unsigned int outputWidth = armnn::numeric_cast<unsigned int>(outputShape[widthIndex]);
59 unsigned int outputChannels = armnn::numeric_cast<unsigned int>(outputShape[channelsIndex]);
60 unsigned int outputBatchSize = armnn::numeric_cast<unsigned int>(outputShape[0]);
telsoa014fcda012018-03-09 14:13:49 +000061
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000062 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(
63 inputBatchSize, inputChannels, inputHeight, inputWidth, dataLayout, ArmnnType);
64
65 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(
66 outputBatchSize, outputChannels, outputHeight, outputWidth, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000067
68 // Set quantization parameters if the requested type is a quantized type.
69 if(armnn::IsQuantizedType<T>())
70 {
71 inputTensorInfo.SetQuantizationScale(qScale);
72 inputTensorInfo.SetQuantizationOffset(qOffset);
73 outputTensorInfo.SetQuantizationScale(qScale);
74 outputTensorInfo.SetQuantizationOffset(qOffset);
75 }
76
77 LayerTestResult<T, 4> result(outputTensorInfo);
Sadik Armagan483c8112021-06-01 09:24:52 +010078 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +000079
Finn Williams826a5432020-08-27 16:15:20 +010080 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
81 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000082
83 armnn::Pooling2dQueueDescriptor queueDescriptor;
84 queueDescriptor.m_Parameters = descriptor;
James Conroy45a9b772018-10-31 11:47:53 +000085 queueDescriptor.m_Parameters.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +010086
87 armnn::WorkloadInfo workloadInfo;
88 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
89 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
90
91 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +010092 armnn::BackendId backend = workloadFactory.GetBackendId();
Francis Murtagh043d0d02018-10-05 14:08:48 +010093 const size_t reasonIfUnsupportedMaxLen = 255;
94 char reasonIfUnsupported[reasonIfUnsupportedMaxLen+1];
Sadik Armagan483c8112021-06-01 09:24:52 +010095 result.m_Supported = armnn::IsPooling2dSupported(backend, inputTensorInfo, outputTensorInfo,
96 queueDescriptor.m_Parameters,
97 reasonIfUnsupported, reasonIfUnsupportedMaxLen);
98 if (!result.m_Supported)
Francis Murtagh043d0d02018-10-05 14:08:48 +010099 {
100 return result;
101 }
102
103 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
104
105 inputHandle->Allocate();
106 outputHandle->Allocate();
107
Sadik Armagan483c8112021-06-01 09:24:52 +0100108 CopyDataToITensorHandle(inputHandle.get(), input.data());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100109
110 workload->Execute();
111
Sadik Armagan483c8112021-06-01 09:24:52 +0100112 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100113
Sadik Armagan483c8112021-06-01 09:24:52 +0100114 result.m_ActualData = actualOutput;
115 result.m_ExpectedData = outputExpected;
Francis Murtagh043d0d02018-10-05 14:08:48 +0100116
117 return result;
118}
119
telsoa014fcda012018-03-09 14:13:49 +0000120//
121// Tests max pooling with the following parameters:
122//
123// Pooling size: 3x3
124// Stride: (2,4)
125// input size: 8x13
126// channels: 2
127// batch size: 2
128//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000129template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000130LayerTestResult<T, 4> SimpleMaxPooling2dSize3x3Stride2x4TestCommon(
131 armnn::IWorkloadFactory& workloadFactory,
132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100133 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000134 bool forceNoPadding,
135 float qScale = 1.0f,
136 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000137{
138 armnn::Pooling2dDescriptor descriptor;
139 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
140 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
141 descriptor.m_StrideX = 2;
142 descriptor.m_StrideY = 4;
143 // forceNoPadding is mainly used for compatibility with ARM Compute.
144 // As of 16/05/2017, it errors if padX or padY are equal to or greater than the pool size.
145 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
146 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
147 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
148 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
149
150 unsigned int inputWidth = 8;
151 unsigned int inputHeight = 13;
152 unsigned int outputWidth =
153 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
154 descriptor.m_StrideX;
155 unsigned int outputHeight =
156 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
157 descriptor.m_StrideY;
158 unsigned int channels = 2;
159 unsigned int batchSize = 2;
160
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000161 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
162 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000163
164 // Set quantization parameters if the requested type is a quantized type.
165 if(armnn::IsQuantizedType<T>())
166 {
167 inputTensorInfo.SetQuantizationScale(qScale);
168 inputTensorInfo.SetQuantizationOffset(qOffset);
169 outputTensorInfo.SetQuantizationScale(qScale);
170 outputTensorInfo.SetQuantizationOffset(qOffset);
171 }
172
173 std::vector<float> singleChannelData({
174 0.0f, 4.0f, 8.0f, 1.0f, 6.0f, 4.0f, 5.0f, 8.0f,
175 1.0f, 1.0f, 6.0f, 0.0f, 3.0f, 7.0f, 4.0f, 7.0f,
176 8.0f, 5.0f, 0.0f, 0.0f, 8.0f, 3.0f, 4.0f, 3.0f,
177 8.0f, 2.0f, 5.0f, 4.0f, 1.0f, 9.0f, 2.0f, 0.0f,
178 5.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 7.0f, 2.0f,
179 1.0f, 2.0f, 6.0f, 2.0f, 7.0f, 9.0f, 5.0f, 2.0f,
180 9.0f, 7.0f, 3.0f, 1.0f, 3.0f, 4.0f, 8.0f, 3.0f,
181 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, 4.0f, 2.0f, 0.0f,
182 6.0f, 4.0f, 3.0f, 6.0f, 9.0f, 5.0f, 5.0f, 6.0f,
183 8.0f, 7.0f, 9.0f, 6.0f, 1.0f, 4.0f, 1.0f, 9.0f,
184 7.0f, 1.0f, 9.0f, 2.0f, 9.0f, 9.0f, 8.0f, 1.0f,
185 4.0f, 4.0f, 5.0f, 9.0f, 2.0f, 6.0f, 6.0f, 4.0f,
186 3.0f, 5.0f, 4.0f, 0.0f, 1.0f, 5.0f, 9.0f, 7.0f,
187 });
188
telsoa01c577f2c2018-08-31 09:22:23 +0100189 // Constructs input data.
telsoa014fcda012018-03-09 14:13:49 +0000190 std::vector<float> inputData;
191 auto negator = [](float f) { return -f; };
192
telsoa01c577f2c2018-08-31 09:22:23 +0100193 // First image (two channels where the second channel is the negative of the first one).
telsoa014fcda012018-03-09 14:13:49 +0000194 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
195 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
196
telsoa01c577f2c2018-08-31 09:22:23 +0100197 // Second image (same as first image).
telsoa014fcda012018-03-09 14:13:49 +0000198 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
199 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
200
Sadik Armagan483c8112021-06-01 09:24:52 +0100201 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000202
telsoa01c577f2c2018-08-31 09:22:23 +0100203 // These were calculated manually.
Sadik Armagan483c8112021-06-01 09:24:52 +0100204 std::vector<T> outputExpected;
telsoa014fcda012018-03-09 14:13:49 +0000205 if (forceNoPadding)
206 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100207 outputExpected = QuantizedVector<T>(
208 {
telsoa014fcda012018-03-09 14:13:49 +0000209 8.0f, 8.0f, 8.0f,
210 9.0f, 7.0f, 9.0f,
211 9.0f, 9.0f, 9.0f,
212
213 0.0f, 0.0f, -3.0f,
214 -1.0f, 0.0f, 0.0f,
215 -1.0f, -1.0f, -1.0f,
216
217 8.0f, 8.0f, 8.0f,
218 9.0f, 7.0f, 9.0f,
219 9.0f, 9.0f, 9.0f,
220
221 0.0f, 0.0f, -3.0f,
222 -1.0f, 0.0f, 0.0f,
223 -1.0f, -1.0f, -1.0f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100224 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100225 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000226 }
227 else
228 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100229 outputExpected = QuantizedVector<T>(
230 {
telsoa014fcda012018-03-09 14:13:49 +0000231 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
232 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
233 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
234
Finn Williams70f609b2019-11-06 16:54:53 +0000235 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
236 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
237 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,
telsoa014fcda012018-03-09 14:13:49 +0000238
239 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
240 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
241 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
242
Finn Williams70f609b2019-11-06 16:54:53 +0000243 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
244 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
245 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100246 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100247 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000248 }
249
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000250 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100251 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
252 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000253}
254
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000255template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000256LayerTestResult<T, 4> SimpleMaxPooling2dTestCommon(
257 armnn::IWorkloadFactory& workloadFactory,
258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100259 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000260 const armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000261 float qScale = 1.0f,
262 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000263{
264 armnn::Pooling2dDescriptor descriptor;
James Conroy45a9b772018-10-31 11:47:53 +0000265 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
telsoa014fcda012018-03-09 14:13:49 +0000266 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
267 descriptor.m_StrideX = descriptor.m_StrideY = 2;
telsoa014fcda012018-03-09 14:13:49 +0000268 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy69482272018-10-19 10:41:35 +0100269 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000270
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000271 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
272 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000273
274 // Set quantization parameters if the requested type is a quantized type.
275 if(armnn::IsQuantizedType<T>())
276 {
277 inputTensorInfo.SetQuantizationScale(qScale);
278 inputTensorInfo.SetQuantizationOffset(qOffset);
279 outputTensorInfo.SetQuantizationScale(qScale);
280 outputTensorInfo.SetQuantizationOffset(qOffset);
281 }
282
James Conroy45a9b772018-10-31 11:47:53 +0000283 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100284 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000285 1.0f, 2.0f, 5.0f, 6.0f,
286 3.0f, 4.0f, 7.0f, 8.0f,
287 9.0f, 10.0f, 13.0f, 14.0f,
288 11.0f, 12.0f, 15.0f, 16.0f,
289
290 17.0f, 18.0f, 21.0f, 22.0f,
291 19.0f, 20.0f, 23.0f, 24.0f,
292 25.0f, 26.0f, 29.0f, 30.0f,
293 27.0f, 28.0f, 31.0f, 32.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100294 },
295 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000296
James Conroy45a9b772018-10-31 11:47:53 +0000297 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100298 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000299 4.0f, 8.0f,
300 12.0f, 16.0f,
301
302 20.0f, 24.0f,
303 28.0f, 32.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100304 },
305 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000306
James Conroy45a9b772018-10-31 11:47:53 +0000307 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000308 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000309 {
310 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000311 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000312 inputData = tmp;
313
314 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000315 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000316 outputData = tmp1;
317 }
318
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000319 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100320 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
321 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000322}
323
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000324template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000325LayerTestResult<T, 4> SimpleAveragePooling2dTestCommon(
326 armnn::IWorkloadFactory& workloadFactory,
327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100328 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000329 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000330 float qScale = 1.0f,
331 int32_t qOffset = 0)
Francis Murtagh043d0d02018-10-05 14:08:48 +0100332{
James Conroy45a9b772018-10-31 11:47:53 +0000333 armnn::Pooling2dDescriptor descriptor;
334 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
335 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
336 descriptor.m_StrideX = descriptor.m_StrideY = 2;
337 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
338 descriptor.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +0100339
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000340 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
341 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
Francis Murtagh043d0d02018-10-05 14:08:48 +0100342
James Conroy45a9b772018-10-31 11:47:53 +0000343 // Set quantization parameters if the requested type is a quantized type.
344 if(armnn::IsQuantizedType<T>())
345 {
346 inputTensorInfo.SetQuantizationScale(qScale);
347 inputTensorInfo.SetQuantizationOffset(qOffset);
348 outputTensorInfo.SetQuantizationScale(qScale);
349 outputTensorInfo.SetQuantizationOffset(qOffset);
350 }
Francis Murtagh043d0d02018-10-05 14:08:48 +0100351
James Conroy45a9b772018-10-31 11:47:53 +0000352 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100353 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000354 2.0f, 2.0f, 6.0f, 6.0f,
355 4.0f, 4.0f, 8.0f, 8.0f,
356 10.0f, 12.0f, 14.0f, 16.0f,
357 10.0f, 12.0f, 16.0f, 14.0f,
358
359 18.0f, 20.0f, 24.0f, 22.0f,
360 20.0f, 18.0f, 22.0f, 24.0f,
361 26.0f, 28.0f, 0.0f, 0.0f,
362 26.0f, 28.0f, 0.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100363 },
364 qScale, qOffset));
James Conroy45a9b772018-10-31 11:47:53 +0000365
366 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100367 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000368 3.0f, 7.0f,
369 11.0f, 15.0f,
370
371 19.0f, 23.0f,
372 27.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100373 },
374 qScale, qOffset));
James Conroy45a9b772018-10-31 11:47:53 +0000375
376 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000377 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000378 {
379 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000380 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000381 inputData = tmp;
382
383 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000384 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000385 outputData = tmp1;
386 }
387
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000388 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100389 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
390 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100391}
392
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000393template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000394LayerTestResult<T, 4> LargeTensorsAveragePooling2dTestCommon(
395 armnn::IWorkloadFactory& workloadFactory,
396 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100397 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000398 float qScale = 1.0f,
399 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000400{
401 armnn::Pooling2dDescriptor descriptor;
402 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
403 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 100;
404 descriptor.m_StrideX = descriptor.m_StrideY = 5;
405 descriptor.m_PadLeft = 50;
406 descriptor.m_PadRight = 50;
407 descriptor.m_PadTop = 50;
408 descriptor.m_PadBottom = 50;
409 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
410
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000411 armnn::TensorInfo inputTensorInfo({ 5, 3, 52, 60 }, ArmnnType);
412 armnn::TensorInfo outputTensorInfo({ 5, 3, 11, 13 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000413
414 // Set quantization parameters if the requested type is a quantized type.
415 if(armnn::IsQuantizedType<T>())
416 {
417 inputTensorInfo.SetQuantizationScale(qScale);
418 inputTensorInfo.SetQuantizationOffset(qOffset);
419 outputTensorInfo.SetQuantizationScale(qScale);
420 outputTensorInfo.SetQuantizationOffset(qOffset);
421 }
422
Sadik Armagan483c8112021-06-01 09:24:52 +0100423 std::vector<T> input;
telsoa014fcda012018-03-09 14:13:49 +0000424
425 for (unsigned int i = 0 ; i < inputTensorInfo.GetShape().GetNumElements(); ++i)
426 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100427 input.push_back(1);
telsoa014fcda012018-03-09 14:13:49 +0000428 }
429
Sadik Armagan483c8112021-06-01 09:24:52 +0100430 std::vector<T> outputExpected;
telsoa014fcda012018-03-09 14:13:49 +0000431
432 for (unsigned int i = 0 ; i < outputTensorInfo.GetShape().GetNumElements(); ++i)
433 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100434 outputExpected.push_back(1);
telsoa014fcda012018-03-09 14:13:49 +0000435 }
436
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000437 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100438 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
439 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000440}
441
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000442template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000443LayerTestResult<T, 4> SimpleL2Pooling2dTestCommon(
444 armnn::IWorkloadFactory& workloadFactory,
445 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100446 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000447 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000448 float qScale = 1.0f,
449 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000450{
451 armnn::Pooling2dDescriptor descriptor;
452 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
453 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
454 descriptor.m_StrideX = descriptor.m_StrideY = 2;
455 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy45a9b772018-10-31 11:47:53 +0000456 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000457
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000458 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
459 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
James Conroy45a9b772018-10-31 11:47:53 +0000460
461 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100462 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000463 1.0f, 7.0f, 5.0f, 5.0f,
464 1.0f, 7.0f, 5.0f, 5.0f,
465 3.0f, 3.0f, 1.0f, 1.0f,
466 3.0f, 3.0f, 1.0f, 1.0f,
467
468 1.0f, 7.0f, 0.0f, 0.0f,
469 1.0f, 7.0f, 2.0f, 0.0f,
470 0.0f, 2.0f, 1.0f, 1.0f,
471 0.0f, 0.0f, 1.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100472 },
473 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000474
James Conroy45a9b772018-10-31 11:47:53 +0000475 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100476 QuantizedVector<T>({
telsoa014fcda012018-03-09 14:13:49 +0000477 5.0f, 5.0f,
James Conroy45a9b772018-10-31 11:47:53 +0000478 3.0f, 1.0f,
479
480 5.0f, 1.0f,
481 1.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100482 },
483 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000484
James Conroy45a9b772018-10-31 11:47:53 +0000485 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000486 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000487 {
488 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000489 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000490 inputData = tmp;
491
492 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000493 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000494 outputData = tmp1;
495 }
496
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000497 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100498 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
499 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000500}
501
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000502template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000503LayerTestResult<T, 4> L2Pooling2dSize3Stride1TestCommon(
504 armnn::IWorkloadFactory& workloadFactory,
505 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100506 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000507 float qScale = 1.0f,
508 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000509{
510 armnn::Pooling2dDescriptor descriptor;
511 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
512 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
513 descriptor.m_StrideX = descriptor.m_StrideY = 1;
514 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
515
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000516 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100517 auto input = QuantizedVector<T>(
518 {
telsoa014fcda012018-03-09 14:13:49 +0000519 2.0f, 1.0f, 5.0f, 2.0f,
520 1.0f, 2.0f, 2.0f, 1.0f,
521 5.0f, 4.0f, 1.0f, 5.0f,
522 2.0f, 1.0f, 5.0f, 2.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100523 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100524 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000525
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000526 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100527 auto outputExpected = QuantizedVector<T>(
528 {
telsoa014fcda012018-03-09 14:13:49 +0000529 3.0f, 3.0f,
530 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100531 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100532 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000533
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000534 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100535 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
536 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000537}
538
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000539template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000540LayerTestResult<T, 4> L2Pooling2dSize3Stride3TestCommon(
541 armnn::IWorkloadFactory& workloadFactory,
542 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100543 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000544 float qScale = 1.0f,
545 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000546{
547 armnn::Pooling2dDescriptor descriptor;
548 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
549 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
550 descriptor.m_StrideX = descriptor.m_StrideY = 3;
551 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
552
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000553 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100554 auto input = QuantizedVector<T>(
555 {
telsoa014fcda012018-03-09 14:13:49 +0000556 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
557 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
558 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
559 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
560 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
561 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
562 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
563 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
564 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100565 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100566 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000567
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000568 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100569 auto outputExpected = QuantizedVector<T>(
570 {
telsoa014fcda012018-03-09 14:13:49 +0000571 3.0f, 3.0f, 3.0f,
572 3.0f, 3.0f, 3.0f,
573 3.0f, 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100574 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100575 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000576
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000577 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100578 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
579 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000580}
581
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000582template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000583LayerTestResult<T, 4> L2Pooling2dSize3Stride4TestCommon(
584 armnn::IWorkloadFactory& workloadFactory,
585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100586 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000587 float qScale = 1.0f,
588 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000589{
590 armnn::Pooling2dDescriptor descriptor;
591 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
592 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
593 descriptor.m_StrideX = descriptor.m_StrideY = 4;
594 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
595
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000596 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100597 auto input = QuantizedVector<T>(
598 {
telsoa014fcda012018-03-09 14:13:49 +0000599 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
600 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
601 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
602 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
603 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
604 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
605 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100606 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100607 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000608
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000609 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100610 auto outputExpected = QuantizedVector<T>(
611 {
telsoa014fcda012018-03-09 14:13:49 +0000612 3.0f, 3.0f,
613 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100614 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100615 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000616
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000617 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100618 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
619 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000620}
621
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000622template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000623LayerTestResult<T, 4> L2Pooling2dSize7TestCommon(
624 armnn::IWorkloadFactory& workloadFactory,
625 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100626 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000627 float qScale = 1.0f,
628 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000629{
630 armnn::Pooling2dDescriptor descriptor;
631 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
632 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 7;
633 descriptor.m_StrideX = descriptor.m_StrideY = 7;
634 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
635
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000636 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100637 auto input = QuantizedVector<T>(
638 {
telsoa014fcda012018-03-09 14:13:49 +0000639 1.0f, 0.0f, 2.0f, 0.0f, 3.0f, 0.0f, 4.0f,
640 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
641 0.0f, 5.0f, 0.0f, 6.0f, 0.0f, 7.0f, 0.0f,
642 8.0f, 0.0f, 9.0f, 0.0f, 10.0f, 0.0f, 5.0f,
643 0.0f, 5.0f, 0.0f, 2.0f, 0.0f, 1.0f, 1.0f,
644 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
645 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100646 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100647 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000648
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000649 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100650 auto outputExpected = QuantizedVector<T>(
651 {
telsoa014fcda012018-03-09 14:13:49 +0000652 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100653 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100654 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000655
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000656 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100657 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
658 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000659}
660
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000661template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000662LayerTestResult<T, 4> L2Pooling2dSize9TestCommon(
663 armnn::IWorkloadFactory& workloadFactory,
664 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100665 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000666 float qScale = 1.0f,
667 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000668{
669 armnn::Pooling2dDescriptor descriptor;
670 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
671 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 9;
672 descriptor.m_StrideX = descriptor.m_StrideY = 9;
673 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
674
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000675 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100676 auto input = QuantizedVector<T>(
677 {
telsoa014fcda012018-03-09 14:13:49 +0000678 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
679 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
680 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
681 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
682 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
683 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
684 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
685 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
686 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100687 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100688 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000689
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000690 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100691 auto outputExpected = QuantizedVector<T>(
692 {
telsoa014fcda012018-03-09 14:13:49 +0000693 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100694 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100695 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000696
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000697 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100698 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
699 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000700}
701
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000702template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000703LayerTestResult<T, 4> AsymmetricNonSquarePooling2dTestCommon(
704 armnn::IWorkloadFactory& workloadFactory,
705 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100706 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000707 float qScale = 1.0f,
708 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000709{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000710 armnn::TensorInfo inputTensorInfo({ 1, 1, 1, 3 }, ArmnnType);
711 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000712
713 armnn::Pooling2dDescriptor descriptor;
714 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
715 descriptor.m_PoolWidth = 2;
716 descriptor.m_PoolHeight = 3;
717 descriptor.m_StrideX = 2;
718 descriptor.m_StrideY = 1;
719 descriptor.m_PadLeft = 2;
720 descriptor.m_PadRight = 0;
721 descriptor.m_PadTop = 1;
722 descriptor.m_PadBottom = 2;
723 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
724 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
725
telsoa01c577f2c2018-08-31 09:22:23 +0100726 // Construct input data.
Sadik Armagan483c8112021-06-01 09:24:52 +0100727 auto input = QuantizedVector<T>(
728 {
telsoa014fcda012018-03-09 14:13:49 +0000729 1.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100730 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100731 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000732
telsoa01c577f2c2018-08-31 09:22:23 +0100733 // These were calculated manually.
Sadik Armagan483c8112021-06-01 09:24:52 +0100734 auto outputExpected = QuantizedVector<T>(
735 {
telsoa014fcda012018-03-09 14:13:49 +0000736 0.0f, 3.0f, 0.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100737 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100738 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000739
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000740 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100741 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
742 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000743}
744
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000745template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000746LayerTestResult<T, 4> ComparePooling2dTestCommon(
747 armnn::IWorkloadFactory& workloadFactory,
748 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
749 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100750 const armnn::ITensorHandleFactory& tensorHandleFactory,
751 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000752 armnn::PoolingAlgorithm poolingType,
753 float qScale = 1.0f,
754 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000755{
Jan Eilers8eb25602020-03-09 12:13:48 +0000756 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000757 const unsigned int inputWidth = 16;
758 const unsigned int inputHeight = 32;
759 const unsigned int channelCount = 2;
760 const unsigned int batchSize = 5;
761
762 const unsigned int poolSize = 3;
763 const unsigned int strideX = 2;
764 const unsigned int strideY = 4;
765 const unsigned int padX = 0;
766 const unsigned int padY = 0;
767
768 const unsigned int outputWidth = (inputWidth + 2 * padX + strideX - poolSize) / strideX;
769 const unsigned int outputHeight = (inputHeight + 2 * padY + strideY - poolSize) / strideY;
770
771 armnn::TensorInfo inputTensorInfo;
772 armnn::TensorInfo outputTensorInfo;
773
774 unsigned int inputShape[] = { batchSize, channelCount, inputHeight, inputWidth };
775 unsigned int outputShape[] = { batchSize, channelCount, outputHeight, outputWidth };
776
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000777 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
778 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000779
780 // Set quantization parameters if the requested type is a quantized type.
781 if(armnn::IsQuantizedType<T>())
782 {
783 inputTensorInfo.SetQuantizationScale(qScale);
784 inputTensorInfo.SetQuantizationOffset(qOffset);
785 outputTensorInfo.SetQuantizationScale(qScale);
786 outputTensorInfo.SetQuantizationOffset(qOffset);
787 }
788
Sadik Armagan483c8112021-06-01 09:24:52 +0100789 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 81715);
790 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
791 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000792
793 LayerTestResult<T, 4> comparisonResult(outputTensorInfo);
794
Finn Williams826a5432020-08-27 16:15:20 +0100795 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
796 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000797
798 armnn::Pooling2dQueueDescriptor data;
799 armnn::WorkloadInfo info;
800 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
801 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
802 data.m_Parameters.m_PoolType = poolingType;
803 data.m_Parameters.m_PoolWidth = poolSize;
804 data.m_Parameters.m_PoolHeight = poolSize;
805 data.m_Parameters.m_StrideX = strideX;
806 data.m_Parameters.m_StrideY = strideY;
807 data.m_Parameters.m_PadLeft = padX;
808 data.m_Parameters.m_PadRight = padX;
809 data.m_Parameters.m_PadTop = padY;
810 data.m_Parameters.m_PadBottom = padY;
811 data.m_Parameters.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
812
Finn Williams826a5432020-08-27 16:15:20 +0100813 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
814 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000815
816 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +0100817 armnn::BackendId backend = workloadFactory.GetBackendId();
telsoa014fcda012018-03-09 14:13:49 +0000818 const size_t reasonIfUnsupportedMaxLen = 255;
819 char reasonIfUnsupported[reasonIfUnsupportedMaxLen+1];
Sadik Armagan483c8112021-06-01 09:24:52 +0100820 comparisonResult.m_Supported = armnn::IsPooling2dSupported(backend, inputTensorInfo, outputTensorInfo,
821 data.m_Parameters,
822 reasonIfUnsupported, reasonIfUnsupportedMaxLen);
823 if (!comparisonResult.m_Supported)
telsoa014fcda012018-03-09 14:13:49 +0000824 {
825 return comparisonResult;
826 }
827
828 armnn::Pooling2dQueueDescriptor refData = data;
829 armnn::WorkloadInfo refInfo = info;
830 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
831 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
832
833 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(data, info);
834 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreatePooling2d(refData, refInfo);
835
836 outputHandleRef->Allocate();
837 inputHandleRef->Allocate();
838 inputHandle->Allocate();
839 outputHandle->Allocate();
840
Sadik Armagan483c8112021-06-01 09:24:52 +0100841 CopyDataToITensorHandle(inputHandle.get(), input.data());
842 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000843
844 workload->Execute();
845 workloadRef->Execute();
846
Sadik Armagan483c8112021-06-01 09:24:52 +0100847 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
848 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
849
850 comparisonResult.m_ActualData = actualOutput;
851 comparisonResult.m_ExpectedData = expectedOutput;
telsoa014fcda012018-03-09 14:13:49 +0000852
853 return comparisonResult;
854}
855
856//
857// Tests max pooling with the following parameters:
858//
859// Pooling size: 2x2
860// Stride: (2,2)
861// input size: 4x4
862// channels: 1
863// batch size: 1
864//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000865template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000866LayerTestResult<T, 4> SimpleMaxPooling2dSize2x2Stride2x2TestCommon(
867 armnn::IWorkloadFactory& workloadFactory,
868 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100869 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000870 bool forceNoPadding,
871 float qScale = 1.0f,
872 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000873{
874 armnn::Pooling2dDescriptor descriptor;
875 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
876 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
877 descriptor.m_StrideX = 2;
878 descriptor.m_StrideY = 2;
879 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
880 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
881 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
882 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
883
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000884
telsoa014fcda012018-03-09 14:13:49 +0000885 unsigned int inputWidth = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000886
telsoa014fcda012018-03-09 14:13:49 +0000887 unsigned int inputHeight = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000888
telsoa014fcda012018-03-09 14:13:49 +0000889 unsigned int outputWidth =
890 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
891 descriptor.m_StrideX;
892 unsigned int outputHeight =
893 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
894 descriptor.m_StrideY;
895 unsigned int channels = 1;
896 unsigned int batchSize = 1;
897
898 std::vector<float> inputData = {
899 510.0f, 222.0f, 780.0f, 654.0f,
900 141.0f, 276.0f, 15.0f, 546.0f,
901 303.0f, 618.0f, 582.0f, 339.0f,
902 438.0f, 564.0f, 573.0f, 402.0f
903 };
904
telsoa01c577f2c2018-08-31 09:22:23 +0100905 // Note that left and right edges will be 0.f, due to the 2x2 max pooling only accessing zeros here.
telsoa014fcda012018-03-09 14:13:49 +0000906 std::vector<float> expectedOutputDataWithPadding = {
907 0.0f, 510.0f, 780.0f, 654.0f, 0.0f,
908 0.0f, 438.0f, 618.0f, 402.0f, 0.0f
909 };
910
911 std::vector<float> expectedOutputDataNoPadding = {
912 510.0f, 780.0f,
913 618.0f, 582.0f
914 };
915
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000916 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000917
918 // Scale and offset should match input - we're just calculating maximum values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000919 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000920
921 // Set quantization parameters if the requested type is a quantized type.
922 if(armnn::IsQuantizedType<T>())
923 {
924 inputTensorInfo.SetQuantizationScale(qScale);
925 inputTensorInfo.SetQuantizationOffset(qOffset);
926 outputTensorInfo.SetQuantizationScale(qScale);
927 outputTensorInfo.SetQuantizationOffset(qOffset);
928 }
929
Sadik Armagan483c8112021-06-01 09:24:52 +0100930 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000931
Sadik Armagan483c8112021-06-01 09:24:52 +0100932 auto outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100933 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
Sadik Armagan483c8112021-06-01 09:24:52 +0100934 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000935
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000936 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100937 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
938 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000939}
940
surmeh01bceff2f2018-03-29 16:29:27 +0100941//
942// Tests max pooling with the following parameters:
943//
944// Pooling size: 3x2
945// Stride: (2,2)
946// input size: 3x2
947// channels: 1
948// batch size: 1
949//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000950template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
surmeh01bceff2f2018-03-29 16:29:27 +0100951LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon(
952 armnn::IWorkloadFactory& workloadFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000953 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100954 const armnn::ITensorHandleFactory& tensorHandleFactory,
surmeh01bceff2f2018-03-29 16:29:27 +0100955 bool forceNoPadding,
956 float qScale = 1.0f,
957 int32_t qOffset = 0)
958{
959 armnn::Pooling2dDescriptor descriptor;
960 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
961 descriptor.m_PoolWidth = 3;
962 descriptor.m_PoolHeight = 2;
963 descriptor.m_StrideX = 2;
964 descriptor.m_StrideY = 2;
965 descriptor.m_PadLeft = (forceNoPadding) ? 0 : 1;
966 descriptor.m_PadRight = descriptor.m_PadLeft;
967 descriptor.m_PadTop = 0;
968 descriptor.m_PadBottom = 0;
969 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
970 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
971
972 unsigned int inputWidth = 3;
973 unsigned int inputHeight = 2;
974 unsigned int outputWidth =
975 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
976 descriptor.m_StrideX;
977 unsigned int outputHeight =
978 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
979 descriptor.m_StrideY;
980 unsigned int channels = 1;
981 unsigned int batchSize = 1;
982
983 std::vector<float> inputData = {
984 3.0f, 6.0f, 9.0f,
985 12.0f, 15.0f, 18.0f,
986 };
987
988 std::vector<float> expectedOutputDataWithPadding = {
989 6.0f, 8.0f,
990 };
991
992 std::vector<float> expectedOutputDataNoPadding = {
993 10.5f,
994 };
995
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000996 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100997
998 // Scale and offset should match input - we're just calculating average values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000999 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +01001000
1001 // Set quantization parameters if the requested type is a quantized type.
1002 if(armnn::IsQuantizedType<T>())
1003 {
1004 inputTensorInfo.SetQuantizationScale(qScale);
1005 inputTensorInfo.SetQuantizationOffset(qOffset);
1006 outputTensorInfo.SetQuantizationScale(qScale);
1007 outputTensorInfo.SetQuantizationOffset(qOffset);
1008 }
1009
Sadik Armagan483c8112021-06-01 09:24:52 +01001010 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +01001011
Sadik Armagan483c8112021-06-01 09:24:52 +01001012 auto outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001013 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
Sadik Armagan483c8112021-06-01 09:24:52 +01001014 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +01001015
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001016 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001017 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1018 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
surmeh01bceff2f2018-03-29 16:29:27 +01001019}
1020
1021
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001022template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001023LayerTestResult<T, 4> IgnorePaddingSimpleMaxPooling2dTestCommon(
1024 armnn::IWorkloadFactory& workloadFactory,
1025 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001026 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001027 float qScale = 1.0f,
1028 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001029{
1030 armnn::Pooling2dDescriptor descriptor;
1031 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1032 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1033 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1034 descriptor.m_PadLeft = 1;
1035 descriptor.m_PadRight = 1;
1036 descriptor.m_PadTop = 1;
1037 descriptor.m_PadBottom = 1;
1038 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1039
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001040 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1041 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001042
1043 // Set quantization parameters if the requested type is a quantized type.
1044 if(armnn::IsQuantizedType<T>())
1045 {
1046 inputTensorInfo.SetQuantizationScale(qScale);
1047 inputTensorInfo.SetQuantizationOffset(qOffset);
1048 outputTensorInfo.SetQuantizationScale(qScale);
1049 outputTensorInfo.SetQuantizationOffset(qOffset);
1050 }
1051
Sadik Armagan483c8112021-06-01 09:24:52 +01001052 auto input = QuantizedVector<T>(
1053 {
telsoa014fcda012018-03-09 14:13:49 +00001054 -1.0f, -2.0f, 3.0f, 4.0f,
1055 -1.0f, -2.0f, 3.0f, 4.0f,
1056 1.0f, 2.0f, -3.0f, -4.0f,
1057 1.0f, 2.0f, -3.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001058 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001059 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001060
Sadik Armagan483c8112021-06-01 09:24:52 +01001061 auto outputExpected = QuantizedVector<T>(
1062 {
telsoa014fcda012018-03-09 14:13:49 +00001063 -1.0f, 3.0f, 4.0f,
1064 1.0f, 3.0f, 4.0f,
1065 1.0f, 2.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001066 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001067 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001068
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001069 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001070 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1071 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001072}
1073
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001074template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001075LayerTestResult<T, 4> IgnorePaddingMaxPooling2dSize3TestCommon(
1076 armnn::IWorkloadFactory& workloadFactory,
1077 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001078 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001079 float qScale = 1.0f,
1080 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001081{
1082 armnn::Pooling2dDescriptor descriptor;
1083 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1084 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1085 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1086 descriptor.m_PadLeft = 1;
1087 descriptor.m_PadRight = 1;
1088 descriptor.m_PadTop = 1;
1089 descriptor.m_PadBottom = 1;
1090 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1091
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001092 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1093 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001094
1095 // Set quantization parameters if the requested type is a quantized type.
1096 if(armnn::IsQuantizedType<T>())
1097 {
1098 inputTensorInfo.SetQuantizationScale(qScale);
1099 inputTensorInfo.SetQuantizationOffset(qOffset);
1100 outputTensorInfo.SetQuantizationScale(qScale);
1101 outputTensorInfo.SetQuantizationOffset(qOffset);
1102 }
1103
Sadik Armagan483c8112021-06-01 09:24:52 +01001104 auto input = QuantizedVector<T>(
1105 {
telsoa014fcda012018-03-09 14:13:49 +00001106 -1.0f, -2.0f, 3.0f, 4.0f,
1107 -1.0f, -2.0f, 3.0f, 4.0f,
1108 1.0f, 2.0f, -3.0f, -4.0f,
1109 1.0f, 2.0f, -3.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001110 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001111 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001112
Sadik Armagan483c8112021-06-01 09:24:52 +01001113 auto outputExpected = QuantizedVector<T>(
1114 {
telsoa014fcda012018-03-09 14:13:49 +00001115 -1.0f, 3.0f, 4.0f, 4.0f,
1116 2.0f, 3.0f, 4.0f, 4.0f,
1117 2.0f, 3.0f, 4.0f, 4.0f,
1118 2.0f, 2.0f, 2.0f, -3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001119 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001120 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001121
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001122 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001123 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1124 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001125}
1126
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001127template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001128LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dTestCommon(
1129 armnn::IWorkloadFactory& workloadFactory,
1130 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001131 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001132 float qScale = 1.0f,
1133 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001134{
1135 armnn::Pooling2dDescriptor descriptor;
1136 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1137 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1138 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1139 descriptor.m_PadLeft = 1;
1140 descriptor.m_PadRight = 1;
1141 descriptor.m_PadTop = 1;
1142 descriptor.m_PadBottom = 1;
1143 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1144
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001145 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1146 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001147
1148 // Set quantization parameters if the requested type is a quantized type.
1149 if(armnn::IsQuantizedType<T>())
1150 {
1151 inputTensorInfo.SetQuantizationScale(qScale);
1152 inputTensorInfo.SetQuantizationOffset(qOffset);
1153 outputTensorInfo.SetQuantizationScale(qScale);
1154 outputTensorInfo.SetQuantizationOffset(qOffset);
1155 }
1156
Sadik Armagan483c8112021-06-01 09:24:52 +01001157 auto input = QuantizedVector<T>(
1158 {
telsoa014fcda012018-03-09 14:13:49 +00001159 12.0f, 20.0f, 32.0f, 40.0f,
1160 12.0f, 20.0f, 32.0f, 40.0f,
1161 12.0f, 20.0f, 32.0f, 40.0f,
1162 12.0f, 20.0f, 32.0f, 40.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001163 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001164 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001165
Sadik Armagan483c8112021-06-01 09:24:52 +01001166 auto outputExpected = QuantizedVector<T>(
1167 {
telsoa014fcda012018-03-09 14:13:49 +00001168 3.0f, 13.0f, 10.0f,
1169 6.0f, 26.0f, 20.0f,
1170 3.0f, 13.0f, 10.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001171 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001172 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001173
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001174 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001175 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1176 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001177}
1178
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001179template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001180LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon(
1181 armnn::IWorkloadFactory& workloadFactory,
1182 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001183 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001184 float qScale = 1.0f,
1185 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001186{
1187 armnn::Pooling2dDescriptor descriptor;
1188 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1189 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1190 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1191 descriptor.m_PadLeft = 0;
1192 descriptor.m_PadRight = 0;
1193 descriptor.m_PadTop = 0;
1194 descriptor.m_PadBottom = 0;
1195 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1196 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Ceiling;
1197
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001198 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1199 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001200
1201 // Set quantization parameters if the requested type is a quantized type.
1202 if(armnn::IsQuantizedType<T>())
1203 {
1204 inputTensorInfo.SetQuantizationScale(qScale);
1205 inputTensorInfo.SetQuantizationOffset(qOffset);
1206 outputTensorInfo.SetQuantizationScale(qScale);
1207 outputTensorInfo.SetQuantizationOffset(qOffset);
1208 }
1209
Sadik Armagan483c8112021-06-01 09:24:52 +01001210 auto input = QuantizedVector<T>(
1211 {
telsoa014fcda012018-03-09 14:13:49 +00001212 1.0f, 2.0f, 3.0f, 4.0f,
1213 1.0f, 2.0f, 3.0f, 4.0f,
1214 1.0f, 2.0f, 3.0f, 4.0f,
1215 1.0f, 2.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001216 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001217 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001218
Sadik Armagan483c8112021-06-01 09:24:52 +01001219 auto outputExpected = QuantizedVector<T>(
1220 {
telsoa014fcda012018-03-09 14:13:49 +00001221 2.0f, 3.5f,
1222 2.0f, 3.5f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001223 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001224 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001225
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001226 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001227 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1228 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001229}
1230
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001231template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001232LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3TestCommon(
1233 armnn::IWorkloadFactory& workloadFactory,
1234 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001235 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001236 float qScale = 1.0f,
1237 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001238{
1239 armnn::Pooling2dDescriptor descriptor;
1240 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1241 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1242 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1243 descriptor.m_PadLeft = 1;
1244 descriptor.m_PadRight = 1;
1245 descriptor.m_PadTop = 1;
1246 descriptor.m_PadBottom = 1;
1247 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1248
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001249 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1250 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001251
1252 // Set quantization parameters if the requested type is a quantized type.
1253 if(armnn::IsQuantizedType<T>())
1254 {
1255 inputTensorInfo.SetQuantizationScale(qScale);
1256 inputTensorInfo.SetQuantizationOffset(qOffset);
1257 outputTensorInfo.SetQuantizationScale(qScale);
1258 outputTensorInfo.SetQuantizationOffset(qOffset);
1259 }
1260
Sadik Armagan483c8112021-06-01 09:24:52 +01001261 auto input = QuantizedVector<T>(
1262 {
telsoa014fcda012018-03-09 14:13:49 +00001263 9.0f, 27.0f, 18.0f, 36.0f,
1264 18.0f, 9.0f, 18.0f, 9.0f,
1265 27.0f, 18.0f, 9.0f, 27.0f,
1266 9.0f, 27.0f, 9.0f, 18.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001267 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001268 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001269
Sadik Armagan483c8112021-06-01 09:24:52 +01001270 auto outputExpected = QuantizedVector<T>(
1271 {
telsoa014fcda012018-03-09 14:13:49 +00001272 7.0f, 11.0f, 13.0f, 9.0f,
1273 12.0f, 17.0f, 19.0f, 13.0f,
1274 12.0f, 16.0f, 16.0f, 10.0f,
1275 9.0f, 11.0f, 12.0f, 7.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001276 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001277 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001278
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001279 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001280 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1281 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001282}
1283
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001284template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001285LayerTestResult<T, 4> IgnorePaddingSimpleL2Pooling2dTestCommon(
1286 armnn::IWorkloadFactory& workloadFactory,
1287 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001288 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001289 float qScale = 1.0f,
1290 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001291{
1292 armnn::Pooling2dDescriptor descriptor;
1293 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1294 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1295 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1296 descriptor.m_PadLeft = 1;
1297 descriptor.m_PadRight = 1;
1298 descriptor.m_PadTop = 1;
1299 descriptor.m_PadBottom = 1;
1300 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1301
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001302 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1303 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001304
1305 // Set quantization parameters if the requested type is a quantized type.
1306 if(armnn::IsQuantizedType<T>())
1307 {
1308 inputTensorInfo.SetQuantizationScale(qScale);
1309 inputTensorInfo.SetQuantizationOffset(qOffset);
1310 outputTensorInfo.SetQuantizationScale(qScale);
1311 outputTensorInfo.SetQuantizationOffset(qOffset);
1312 }
1313
Sadik Armagan483c8112021-06-01 09:24:52 +01001314 auto input = QuantizedVector<T>(
1315 {
telsoa014fcda012018-03-09 14:13:49 +00001316 2.0f, 4.0f, 8.0f, 16.0f,
1317 4.0f, 2.0f, 2.0f, 4.0f,
1318 8.0f, 2.0f, 4.0f, 2.0f,
1319 16.0f, 2.0f, 2.0f, 8.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001320 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001321 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001322
Sadik Armagan483c8112021-06-01 09:24:52 +01001323 auto outputExpected = QuantizedVector<T>(
1324 {
telsoa014fcda012018-03-09 14:13:49 +00001325 1.0f, 4.4721f, 8.0f,
1326 4.4721f, 2.6457f, 2.236f,
1327 8.0f, 1.4142f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001328 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001329 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001330
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001331 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001332 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1333 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001334}
1335
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001336template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001337LayerTestResult<T, 4> IgnorePaddingL2Pooling2dSize3TestCommon(
1338 armnn::IWorkloadFactory& workloadFactory,
1339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001340 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001341 float qScale = 1.0f,
1342 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001343{
1344 armnn::Pooling2dDescriptor descriptor;
1345 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1346 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1347 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1348 descriptor.m_PadLeft = 1;
1349 descriptor.m_PadRight = 1;
1350 descriptor.m_PadTop = 1;
1351 descriptor.m_PadBottom = 1;
1352 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1353
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001354 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1355 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001356
1357 // Set quantization parameters if the requested type is a quantized type.
1358 if(armnn::IsQuantizedType<T>())
1359 {
1360 inputTensorInfo.SetQuantizationScale(qScale);
1361 inputTensorInfo.SetQuantizationOffset(qOffset);
1362 outputTensorInfo.SetQuantizationScale(qScale);
1363 outputTensorInfo.SetQuantizationOffset(qOffset);
1364 }
1365
Sadik Armagan483c8112021-06-01 09:24:52 +01001366 auto input = QuantizedVector<T>(
1367 {
telsoa014fcda012018-03-09 14:13:49 +00001368 1.0f, 2.0f, 3.0f, 4.0f,
1369 1.0f, 2.0f, 3.0f, 4.0f,
1370 1.0f, 2.0f, 3.0f, 4.0f,
1371 1.0f, 2.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001372 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001373 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001374
Sadik Armagan483c8112021-06-01 09:24:52 +01001375 auto outputExpected = QuantizedVector<T>(
1376 {
telsoa014fcda012018-03-09 14:13:49 +00001377 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1378 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1379 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1380 1.0540f, 1.7638f, 2.5385f, 2.3570f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001381 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001382 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001383
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001384 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001385 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1386 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001387}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001388
1389} // anonymous namespace
1390
1391LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
1392 armnn::IWorkloadFactory& workloadFactory,
1393 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001394 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001395 bool forceNoPadding)
1396{
1397 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001398 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001399}
1400
1401LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
1402 armnn::IWorkloadFactory& workloadFactory,
1403 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001404 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001405 bool forceNoPadding)
1406{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001407 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001408 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 3.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001409}
1410
1411LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
1412 armnn::IWorkloadFactory& workloadFactory,
1413 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001414 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001415 bool forceNoPadding)
1416{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001417 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001418 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001419}
1420
1421LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
1422 armnn::IWorkloadFactory& workloadFactory,
1423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001424 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001425 bool forceNoPadding)
1426{
1427 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001428 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001429}
1430
1431LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
1432 armnn::IWorkloadFactory& workloadFactory,
1433 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001434 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001435 bool forceNoPadding)
1436{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001437 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001438 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 0.1f, 128);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001439}
1440
1441LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
1442 armnn::IWorkloadFactory& workloadFactory,
1443 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001444 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001445 bool forceNoPadding)
1446{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001447 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001448 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001449}
1450
1451LayerTestResult<float, 4> SimpleMaxPooling2dTest(
1452 armnn::IWorkloadFactory& workloadFactory,
1453 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001454 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001455 const armnn::DataLayout dataLayout)
1456{
Finn Williams826a5432020-08-27 16:15:20 +01001457 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1458 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001459}
1460
1461LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
1462 armnn::IWorkloadFactory& workloadFactory,
1463 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001464 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001465 const armnn::DataLayout dataLayout)
1466{
Finn Williams826a5432020-08-27 16:15:20 +01001467 return SimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
1468 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001469}
1470
1471LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
1472 armnn::IWorkloadFactory& workloadFactory,
1473 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001474 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001475 const armnn::DataLayout dataLayout)
1476{
Finn Williams826a5432020-08-27 16:15:20 +01001477 return SimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
1478 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001479}
1480LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
1481 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001482 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1483 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001484{
Finn Williams826a5432020-08-27 16:15:20 +01001485 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1486 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001487}
1488
1489LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
1490 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001491 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1492 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001493{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001494 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001495 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001496}
1497
1498LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
1499 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001500 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1501 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001502{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001503 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001504 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001505}
1506
1507LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
1508 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001509 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1510 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001511{
Finn Williams826a5432020-08-27 16:15:20 +01001512 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(
1513 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001514}
1515
1516LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
1517 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1519 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001520{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001521 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001522 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001523}
1524
1525LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
1526 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001527 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1528 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001529{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001530 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001531 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001532}
1533
1534LayerTestResult<float, 4> SimpleAveragePooling2dTest(
1535 armnn::IWorkloadFactory& workloadFactory,
1536 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001537 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001538 const armnn::DataLayout dataLayout)
1539{
Finn Williams826a5432020-08-27 16:15:20 +01001540 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1541 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001542}
1543
1544LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
1545 armnn::IWorkloadFactory& workloadFactory,
1546 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001547 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001548 const armnn::DataLayout dataLayout)
1549{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001550 return SimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001551 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 0.5, -1);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001552}
1553
1554LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
1555 armnn::IWorkloadFactory& workloadFactory,
1556 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001557 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001558 const armnn::DataLayout dataLayout)
1559{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001560 return SimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001561 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001562}
1563
1564LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
1565 armnn::IWorkloadFactory& workloadFactory,
1566 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001567 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001568 bool forceNoPadding)
1569{
1570 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001571 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001572}
1573
1574LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
1575 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001576 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1577 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001578{
Finn Williams826a5432020-08-27 16:15:20 +01001579 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(
1580 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001581}
1582
1583LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
1584 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1586 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001587{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001588 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001589 workloadFactory, memoryManager, tensorHandleFactory, 0.5, -1);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001590}
1591
1592LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
1593 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001594 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1595 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001596{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001597 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001598 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001599}
1600LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
1601 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001602 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1603 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001604{
Finn Williams826a5432020-08-27 16:15:20 +01001605 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1606 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001607}
1608
1609LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
1610 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001611 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1612 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001613{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001614 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001615 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001616}
1617
1618LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
1619 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001620 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1621 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001622{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001623 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001624 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001625}
1626
1627LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
1628 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1630 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001631{
1632 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001633 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001634}
1635
1636LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
1637 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001638 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1639 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001640{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001641 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001642 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001643}
1644
1645LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
1646 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1648 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001649{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001650 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001651 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001652}
1653
1654LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
1655 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1657 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001658{
Finn Williams826a5432020-08-27 16:15:20 +01001659 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(
1660 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001661}
1662
1663LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
1664 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1666 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001667{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001668 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001669 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001670}
1671
1672LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
1673 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001674 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1675 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001676{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001677 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001678 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001679}
1680
1681LayerTestResult<float, 4> SimpleL2Pooling2dTest(
1682 armnn::IWorkloadFactory& workloadFactory,
1683 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001684 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001685 const armnn::DataLayout dataLayout)
1686{
Finn Williams826a5432020-08-27 16:15:20 +01001687 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1688 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001689}
1690
1691LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
1692 armnn::IWorkloadFactory& workloadFactory,
1693 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001694 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001695 const armnn::DataLayout dataLayout)
1696{
Finn Williams826a5432020-08-27 16:15:20 +01001697 return SimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1698 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001699}
1700
1701LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
1702 armnn::IWorkloadFactory& workloadFactory,
1703 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001704 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001705 const armnn::DataLayout dataLayout)
1706{
Finn Williams826a5432020-08-27 16:15:20 +01001707 return SimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1708 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001709}
1710
1711LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
1712 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001713 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1714 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001715{
Finn Williams826a5432020-08-27 16:15:20 +01001716 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(
1717 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001718}
1719
1720LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
1721 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001722 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1723 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001724{
Finn Williams826a5432020-08-27 16:15:20 +01001725 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QAsymmU8>(
1726 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001727}
1728
1729LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
1730 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001731 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1732 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001733{
Finn Williams826a5432020-08-27 16:15:20 +01001734 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QSymmS16>(
1735 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001736}
1737
1738LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
1739 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001740 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1741 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001742{
Finn Williams826a5432020-08-27 16:15:20 +01001743 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(
1744 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001745}
1746
1747LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
1748 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1750 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001751{
Finn Williams826a5432020-08-27 16:15:20 +01001752 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QAsymmU8>(
1753 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001754}
1755
1756LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
1757 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001758 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1759 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001760{
Finn Williams826a5432020-08-27 16:15:20 +01001761 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QSymmS16>(
1762 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001763}
1764LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
1765 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001766 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1767 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001768{
Finn Williams826a5432020-08-27 16:15:20 +01001769 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(
1770 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001771}
1772
1773LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
1774 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001775 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1776 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001777{
Finn Williams826a5432020-08-27 16:15:20 +01001778 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QAsymmU8>(
1779 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001780}
1781
1782LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
1783 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001784 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1785 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001786{
Finn Williams826a5432020-08-27 16:15:20 +01001787 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QSymmS16>(
1788 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001789}
1790
1791LayerTestResult<float, 4> L2Pooling2dSize7Test(
1792 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001793 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1794 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001795{
Finn Williams826a5432020-08-27 16:15:20 +01001796 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(
1797 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001798}
1799
1800LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
1801 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001802 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1803 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001804{
Finn Williams826a5432020-08-27 16:15:20 +01001805 return L2Pooling2dSize7TestCommon<armnn::DataType::QAsymmU8>(
1806 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001807}
1808
1809LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
1810 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001811 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1812 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001813{
Finn Williams826a5432020-08-27 16:15:20 +01001814 return L2Pooling2dSize7TestCommon<armnn::DataType::QSymmS16>(
1815 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001816}
1817
1818LayerTestResult<float, 4> L2Pooling2dSize9Test(
1819 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001820 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1821 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001822{
Finn Williams826a5432020-08-27 16:15:20 +01001823 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(
1824 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001825}
1826
1827LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
1828 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001829 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1830 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001831{
Finn Williams826a5432020-08-27 16:15:20 +01001832 return L2Pooling2dSize9TestCommon<armnn::DataType::QAsymmU8>(
1833 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001834}
1835
1836LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
1837 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001838 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1839 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001840{
Finn Williams826a5432020-08-27 16:15:20 +01001841 return L2Pooling2dSize9TestCommon<armnn::DataType::QSymmS16>(
1842 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001843}
1844LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
1845 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001846 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1847 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001848{
Finn Williams826a5432020-08-27 16:15:20 +01001849 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1850 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001851}
1852
1853LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
1854 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001855 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1856 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001857{
Finn Williams826a5432020-08-27 16:15:20 +01001858 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1859 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001860}
1861
1862LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
1863 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001864 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1865 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001866{
Finn Williams826a5432020-08-27 16:15:20 +01001867 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1868 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001869}
1870
1871LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
1872 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001873 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1874 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001875{
Finn Williams826a5432020-08-27 16:15:20 +01001876 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(
1877 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001878}
1879
1880LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
1881 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001882 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1883 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001884{
Finn Williams826a5432020-08-27 16:15:20 +01001885 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
1886 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001887}
1888
1889LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
1890 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001891 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1892 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001893{
Finn Williams826a5432020-08-27 16:15:20 +01001894 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
1895 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001896}
1897
1898LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
1899 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001900 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1901 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001902{
Finn Williams826a5432020-08-27 16:15:20 +01001903 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(
1904 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001905}
1906
1907LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
1908 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001909 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1910 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001911{
Finn Williams826a5432020-08-27 16:15:20 +01001912 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1913 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001914}
1915
1916LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
1917 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001918 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1919 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001920{
Finn Williams826a5432020-08-27 16:15:20 +01001921 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QSymmS16>(
1922 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001923}
1924
1925LayerTestResult<float, 4> ComparePooling2dTest(
1926 armnn::IWorkloadFactory& workloadFactory,
1927 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1928 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001929 const armnn::ITensorHandleFactory& tensorHandleFactory,
1930 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001931 armnn::PoolingAlgorithm poolingType)
1932{
1933 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001934 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001935}
1936
1937LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
1938 armnn::IWorkloadFactory& workloadFactory,
1939 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1940 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001941 const armnn::ITensorHandleFactory& tensorHandleFactory,
1942 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001943 armnn::PoolingAlgorithm poolingType)
1944{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001945 return ComparePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001946 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
1947 poolingType, 0.1f, 128);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001948}
1949
1950LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
1951 armnn::IWorkloadFactory& workloadFactory,
1952 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1953 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001954 const armnn::ITensorHandleFactory& tensorHandleFactory,
1955 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001956 armnn::PoolingAlgorithm poolingType)
1957{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001958 return ComparePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001959 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001960}