blob: 11605f0b28ba779c6d9b3fb3c8d40d35a497259c [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
Colm Donelanc42a9872022-02-02 16:35:09 +00008#include <armnnUtils/QuantizeHelper.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01009#include <ResolveType.hpp>
Matteo Martincighe011d202019-11-28 11:35:47 +000010
Matteo Martincighe011d202019-11-28 11:35:47 +000011#include <armnnUtils/TensorUtils.hpp>
12#include <armnnUtils/DataLayoutIndexed.hpp>
13#include <armnnUtils/Permute.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014
Jan Eilers8eb25602020-03-09 12:13:48 +000015#include <armnn/utility/IgnoreUnused.hpp>
Matthew Sloyan171214c2020-09-09 09:07:37 +010016#include <armnn/utility/NumericCast.hpp>
Jan Eilers8eb25602020-03-09 12:13:48 +000017
Francis Murtaghb28e5252022-02-09 14:36:04 +000018#include <armnn/BackendHelper.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000019#include <backendsCommon/WorkloadInfo.hpp>
20
Sadik Armagana097d2a2021-11-24 15:47:28 +000021#include <armnnTestUtils/TensorCopyUtils.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000022#include <armnnTestUtils/WorkloadTestUtils.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010023
Colm Donelanc42a9872022-02-02 16:35:09 +000024#include <armnnTestUtils/TensorHelpers.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000025
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010026namespace
27{
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000028
Aron Virginas-Tar48623a02019-10-22 10:00:28 +010029using namespace armnnUtils;
30
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000031template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000032LayerTestResult<T, 4> SimplePooling2dTestImpl(
33 armnn::IWorkloadFactory& workloadFactory,
34 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +010035 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000036 armnn::Pooling2dDescriptor descriptor,
37 float qScale,
38 int32_t qOffset,
Sadik Armagan483c8112021-06-01 09:24:52 +010039 const std::vector<T>& input,
40 const std::vector<T>& outputExpected,
41 const armnn::TensorShape& inputShape,
42 const armnn::TensorShape& outputShape)
telsoa014fcda012018-03-09 14:13:49 +000043{
Jan Eilers8eb25602020-03-09 12:13:48 +000044 IgnoreUnused(memoryManager);
Matthew Bentham8800c002018-11-19 13:19:28 +000045 const armnn::DataLayout dataLayout = descriptor.m_DataLayout;
Matteo Martincigh21350152018-11-28 16:22:22 +000046 const armnnUtils::DataLayoutIndexed dimensionIndices = dataLayout;
Matthew Bentham8800c002018-11-19 13:19:28 +000047 auto heightIndex = dimensionIndices.GetHeightIndex();
48 auto widthIndex = dimensionIndices.GetWidthIndex();
49 auto channelsIndex = dimensionIndices.GetChannelsIndex();
telsoa014fcda012018-03-09 14:13:49 +000050
Sadik Armagan483c8112021-06-01 09:24:52 +010051 unsigned int inputHeight = armnn::numeric_cast<unsigned int>(inputShape[heightIndex]);
52 unsigned int inputWidth = armnn::numeric_cast<unsigned int>(inputShape[widthIndex]);
53 unsigned int inputChannels = armnn::numeric_cast<unsigned int>(inputShape[channelsIndex]);
54 unsigned int inputBatchSize = armnn::numeric_cast<unsigned int>(inputShape[0]);
James Conroy69482272018-10-19 10:41:35 +010055
Sadik Armagan483c8112021-06-01 09:24:52 +010056 unsigned int outputHeight = armnn::numeric_cast<unsigned int>(outputShape[heightIndex]);
57 unsigned int outputWidth = armnn::numeric_cast<unsigned int>(outputShape[widthIndex]);
58 unsigned int outputChannels = armnn::numeric_cast<unsigned int>(outputShape[channelsIndex]);
59 unsigned int outputBatchSize = armnn::numeric_cast<unsigned int>(outputShape[0]);
telsoa014fcda012018-03-09 14:13:49 +000060
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000061 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(
62 inputBatchSize, inputChannels, inputHeight, inputWidth, dataLayout, ArmnnType);
63
64 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(
65 outputBatchSize, outputChannels, outputHeight, outputWidth, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000066
67 // Set quantization parameters if the requested type is a quantized type.
68 if(armnn::IsQuantizedType<T>())
69 {
70 inputTensorInfo.SetQuantizationScale(qScale);
71 inputTensorInfo.SetQuantizationOffset(qOffset);
72 outputTensorInfo.SetQuantizationScale(qScale);
73 outputTensorInfo.SetQuantizationOffset(qOffset);
74 }
75
76 LayerTestResult<T, 4> result(outputTensorInfo);
Sadik Armagan483c8112021-06-01 09:24:52 +010077 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +000078
Finn Williams826a5432020-08-27 16:15:20 +010079 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
80 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +000081
82 armnn::Pooling2dQueueDescriptor queueDescriptor;
83 queueDescriptor.m_Parameters = descriptor;
James Conroy45a9b772018-10-31 11:47:53 +000084 queueDescriptor.m_Parameters.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +010085
86 armnn::WorkloadInfo workloadInfo;
87 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
88 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
89
90 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +010091 armnn::BackendId backend = workloadFactory.GetBackendId();
Francis Murtaghb28e5252022-02-09 14:36:04 +000092
93 auto handle = armnn::GetILayerSupportByBackendId(backend);
94 result.m_Supported = handle.IsPooling2dSupported(inputTensorInfo,
95 outputTensorInfo,
96 queueDescriptor.m_Parameters);
Sadik Armagan483c8112021-06-01 09:24:52 +010097 if (!result.m_Supported)
Francis Murtagh043d0d02018-10-05 14:08:48 +010098 {
99 return result;
100 }
101
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000102 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateWorkload(armnn::LayerType::Pooling2d,
103 queueDescriptor,
104 workloadInfo);
Francis Murtagh043d0d02018-10-05 14:08:48 +0100105
106 inputHandle->Allocate();
107 outputHandle->Allocate();
108
Sadik Armagan483c8112021-06-01 09:24:52 +0100109 CopyDataToITensorHandle(inputHandle.get(), input.data());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100110
111 workload->Execute();
112
Sadik Armagan483c8112021-06-01 09:24:52 +0100113 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100114
Sadik Armagan483c8112021-06-01 09:24:52 +0100115 result.m_ActualData = actualOutput;
116 result.m_ExpectedData = outputExpected;
Francis Murtagh043d0d02018-10-05 14:08:48 +0100117
118 return result;
119}
120
telsoa014fcda012018-03-09 14:13:49 +0000121//
122// Tests max pooling with the following parameters:
123//
124// Pooling size: 3x3
125// Stride: (2,4)
126// input size: 8x13
127// channels: 2
128// batch size: 2
129//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000130template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000131LayerTestResult<T, 4> SimpleMaxPooling2dSize3x3Stride2x4TestCommon(
132 armnn::IWorkloadFactory& workloadFactory,
133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100134 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000135 bool forceNoPadding,
136 float qScale = 1.0f,
137 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000138{
139 armnn::Pooling2dDescriptor descriptor;
140 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
141 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
142 descriptor.m_StrideX = 2;
143 descriptor.m_StrideY = 4;
144 // forceNoPadding is mainly used for compatibility with ARM Compute.
145 // As of 16/05/2017, it errors if padX or padY are equal to or greater than the pool size.
146 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
147 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
148 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
149 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
150
151 unsigned int inputWidth = 8;
152 unsigned int inputHeight = 13;
153 unsigned int outputWidth =
154 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
155 descriptor.m_StrideX;
156 unsigned int outputHeight =
157 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
158 descriptor.m_StrideY;
159 unsigned int channels = 2;
160 unsigned int batchSize = 2;
161
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000162 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
163 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000164
165 // Set quantization parameters if the requested type is a quantized type.
166 if(armnn::IsQuantizedType<T>())
167 {
168 inputTensorInfo.SetQuantizationScale(qScale);
169 inputTensorInfo.SetQuantizationOffset(qOffset);
170 outputTensorInfo.SetQuantizationScale(qScale);
171 outputTensorInfo.SetQuantizationOffset(qOffset);
172 }
173
174 std::vector<float> singleChannelData({
175 0.0f, 4.0f, 8.0f, 1.0f, 6.0f, 4.0f, 5.0f, 8.0f,
176 1.0f, 1.0f, 6.0f, 0.0f, 3.0f, 7.0f, 4.0f, 7.0f,
177 8.0f, 5.0f, 0.0f, 0.0f, 8.0f, 3.0f, 4.0f, 3.0f,
178 8.0f, 2.0f, 5.0f, 4.0f, 1.0f, 9.0f, 2.0f, 0.0f,
179 5.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 7.0f, 2.0f,
180 1.0f, 2.0f, 6.0f, 2.0f, 7.0f, 9.0f, 5.0f, 2.0f,
181 9.0f, 7.0f, 3.0f, 1.0f, 3.0f, 4.0f, 8.0f, 3.0f,
182 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, 4.0f, 2.0f, 0.0f,
183 6.0f, 4.0f, 3.0f, 6.0f, 9.0f, 5.0f, 5.0f, 6.0f,
184 8.0f, 7.0f, 9.0f, 6.0f, 1.0f, 4.0f, 1.0f, 9.0f,
185 7.0f, 1.0f, 9.0f, 2.0f, 9.0f, 9.0f, 8.0f, 1.0f,
186 4.0f, 4.0f, 5.0f, 9.0f, 2.0f, 6.0f, 6.0f, 4.0f,
187 3.0f, 5.0f, 4.0f, 0.0f, 1.0f, 5.0f, 9.0f, 7.0f,
188 });
189
telsoa01c577f2c2018-08-31 09:22:23 +0100190 // Constructs input data.
telsoa014fcda012018-03-09 14:13:49 +0000191 std::vector<float> inputData;
192 auto negator = [](float f) { return -f; };
193
telsoa01c577f2c2018-08-31 09:22:23 +0100194 // First image (two channels where the second channel is the negative of the first one).
telsoa014fcda012018-03-09 14:13:49 +0000195 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
196 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
197
telsoa01c577f2c2018-08-31 09:22:23 +0100198 // Second image (same as first image).
telsoa014fcda012018-03-09 14:13:49 +0000199 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
200 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
201
Sadik Armagan483c8112021-06-01 09:24:52 +0100202 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000203
telsoa01c577f2c2018-08-31 09:22:23 +0100204 // These were calculated manually.
Sadik Armagan483c8112021-06-01 09:24:52 +0100205 std::vector<T> outputExpected;
telsoa014fcda012018-03-09 14:13:49 +0000206 if (forceNoPadding)
207 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100208 outputExpected = QuantizedVector<T>(
209 {
telsoa014fcda012018-03-09 14:13:49 +0000210 8.0f, 8.0f, 8.0f,
211 9.0f, 7.0f, 9.0f,
212 9.0f, 9.0f, 9.0f,
213
214 0.0f, 0.0f, -3.0f,
215 -1.0f, 0.0f, 0.0f,
216 -1.0f, -1.0f, -1.0f,
217
218 8.0f, 8.0f, 8.0f,
219 9.0f, 7.0f, 9.0f,
220 9.0f, 9.0f, 9.0f,
221
222 0.0f, 0.0f, -3.0f,
223 -1.0f, 0.0f, 0.0f,
224 -1.0f, -1.0f, -1.0f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100225 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100226 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000227 }
228 else
229 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100230 outputExpected = QuantizedVector<T>(
231 {
telsoa014fcda012018-03-09 14:13:49 +0000232 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
233 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
234 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
235
Finn Williams70f609b2019-11-06 16:54:53 +0000236 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
237 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
238 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f,
telsoa014fcda012018-03-09 14:13:49 +0000239
240 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
241 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
242 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
243
Finn Williams70f609b2019-11-06 16:54:53 +0000244 0.0f, 0.0f, 0.0f, 0.0f,-3.0f,-3.0f,
245 0.0f,-1.0f, 0.0f, 0.0f, 0.0f,-2.0f,
246 0.0f,-1.0f,-1.0f,-1.0f,-1.0f,-1.0f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100247 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100248 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000249 }
250
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000251 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100252 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
253 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000254}
255
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000256template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000257LayerTestResult<T, 4> SimpleMaxPooling2dTestCommon(
258 armnn::IWorkloadFactory& workloadFactory,
259 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100260 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000261 const armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000262 float qScale = 1.0f,
263 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000264{
265 armnn::Pooling2dDescriptor descriptor;
James Conroy45a9b772018-10-31 11:47:53 +0000266 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
telsoa014fcda012018-03-09 14:13:49 +0000267 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
268 descriptor.m_StrideX = descriptor.m_StrideY = 2;
telsoa014fcda012018-03-09 14:13:49 +0000269 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy69482272018-10-19 10:41:35 +0100270 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000271
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000272 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
273 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000274
275 // Set quantization parameters if the requested type is a quantized type.
276 if(armnn::IsQuantizedType<T>())
277 {
278 inputTensorInfo.SetQuantizationScale(qScale);
279 inputTensorInfo.SetQuantizationOffset(qOffset);
280 outputTensorInfo.SetQuantizationScale(qScale);
281 outputTensorInfo.SetQuantizationOffset(qOffset);
282 }
283
James Conroy45a9b772018-10-31 11:47:53 +0000284 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100285 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000286 1.0f, 2.0f, 5.0f, 6.0f,
287 3.0f, 4.0f, 7.0f, 8.0f,
288 9.0f, 10.0f, 13.0f, 14.0f,
289 11.0f, 12.0f, 15.0f, 16.0f,
290
291 17.0f, 18.0f, 21.0f, 22.0f,
292 19.0f, 20.0f, 23.0f, 24.0f,
293 25.0f, 26.0f, 29.0f, 30.0f,
294 27.0f, 28.0f, 31.0f, 32.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100295 },
296 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000297
James Conroy45a9b772018-10-31 11:47:53 +0000298 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100299 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000300 4.0f, 8.0f,
301 12.0f, 16.0f,
302
303 20.0f, 24.0f,
304 28.0f, 32.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100305 },
306 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000307
James Conroy45a9b772018-10-31 11:47:53 +0000308 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000309 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000310 {
311 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000312 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000313 inputData = tmp;
314
315 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000316 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000317 outputData = tmp1;
318 }
319
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000320 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100321 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
322 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000323}
324
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000325template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000326LayerTestResult<T, 4> SimpleAveragePooling2dTestCommon(
327 armnn::IWorkloadFactory& workloadFactory,
328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100329 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000330 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000331 float qScale = 1.0f,
332 int32_t qOffset = 0)
Francis Murtagh043d0d02018-10-05 14:08:48 +0100333{
James Conroy45a9b772018-10-31 11:47:53 +0000334 armnn::Pooling2dDescriptor descriptor;
335 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
336 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
337 descriptor.m_StrideX = descriptor.m_StrideY = 2;
338 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
339 descriptor.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +0100340
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000341 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
342 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
Francis Murtagh043d0d02018-10-05 14:08:48 +0100343
James Conroy45a9b772018-10-31 11:47:53 +0000344 // Set quantization parameters if the requested type is a quantized type.
345 if(armnn::IsQuantizedType<T>())
346 {
347 inputTensorInfo.SetQuantizationScale(qScale);
348 inputTensorInfo.SetQuantizationOffset(qOffset);
349 outputTensorInfo.SetQuantizationScale(qScale);
350 outputTensorInfo.SetQuantizationOffset(qOffset);
351 }
Francis Murtagh043d0d02018-10-05 14:08:48 +0100352
James Conroy45a9b772018-10-31 11:47:53 +0000353 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100354 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000355 2.0f, 2.0f, 6.0f, 6.0f,
356 4.0f, 4.0f, 8.0f, 8.0f,
357 10.0f, 12.0f, 14.0f, 16.0f,
358 10.0f, 12.0f, 16.0f, 14.0f,
359
360 18.0f, 20.0f, 24.0f, 22.0f,
361 20.0f, 18.0f, 22.0f, 24.0f,
362 26.0f, 28.0f, 0.0f, 0.0f,
363 26.0f, 28.0f, 0.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100364 },
365 qScale, qOffset));
James Conroy45a9b772018-10-31 11:47:53 +0000366
367 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100368 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000369 3.0f, 7.0f,
370 11.0f, 15.0f,
371
372 19.0f, 23.0f,
373 27.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100374 },
375 qScale, qOffset));
James Conroy45a9b772018-10-31 11:47:53 +0000376
377 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000378 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000379 {
380 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000381 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000382 inputData = tmp;
383
384 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000385 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000386 outputData = tmp1;
387 }
388
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000389 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100390 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
391 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
Francis Murtagh043d0d02018-10-05 14:08:48 +0100392}
393
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000394template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000395LayerTestResult<T, 4> LargeTensorsAveragePooling2dTestCommon(
396 armnn::IWorkloadFactory& workloadFactory,
397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100398 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000399 float qScale = 1.0f,
400 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000401{
402 armnn::Pooling2dDescriptor descriptor;
403 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
404 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 100;
405 descriptor.m_StrideX = descriptor.m_StrideY = 5;
406 descriptor.m_PadLeft = 50;
407 descriptor.m_PadRight = 50;
408 descriptor.m_PadTop = 50;
409 descriptor.m_PadBottom = 50;
410 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
411
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000412 armnn::TensorInfo inputTensorInfo({ 5, 3, 52, 60 }, ArmnnType);
413 armnn::TensorInfo outputTensorInfo({ 5, 3, 11, 13 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000414
415 // Set quantization parameters if the requested type is a quantized type.
416 if(armnn::IsQuantizedType<T>())
417 {
418 inputTensorInfo.SetQuantizationScale(qScale);
419 inputTensorInfo.SetQuantizationOffset(qOffset);
420 outputTensorInfo.SetQuantizationScale(qScale);
421 outputTensorInfo.SetQuantizationOffset(qOffset);
422 }
423
Sadik Armagan483c8112021-06-01 09:24:52 +0100424 std::vector<T> input;
telsoa014fcda012018-03-09 14:13:49 +0000425
426 for (unsigned int i = 0 ; i < inputTensorInfo.GetShape().GetNumElements(); ++i)
427 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100428 input.push_back(1);
telsoa014fcda012018-03-09 14:13:49 +0000429 }
430
Sadik Armagan483c8112021-06-01 09:24:52 +0100431 std::vector<T> outputExpected;
telsoa014fcda012018-03-09 14:13:49 +0000432
433 for (unsigned int i = 0 ; i < outputTensorInfo.GetShape().GetNumElements(); ++i)
434 {
Sadik Armagan483c8112021-06-01 09:24:52 +0100435 outputExpected.push_back(1);
telsoa014fcda012018-03-09 14:13:49 +0000436 }
437
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000438 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100439 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
440 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000441}
442
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000443template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000444LayerTestResult<T, 4> SimpleL2Pooling2dTestCommon(
445 armnn::IWorkloadFactory& workloadFactory,
446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100447 const armnn::ITensorHandleFactory& tensorHandleFactory,
Matthew Bentham8800c002018-11-19 13:19:28 +0000448 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000449 float qScale = 1.0f,
450 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000451{
452 armnn::Pooling2dDescriptor descriptor;
453 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
454 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
455 descriptor.m_StrideX = descriptor.m_StrideY = 2;
456 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy45a9b772018-10-31 11:47:53 +0000457 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000458
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000459 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
460 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
James Conroy45a9b772018-10-31 11:47:53 +0000461
462 std::vector<T> inputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100463 QuantizedVector<T>({
James Conroy45a9b772018-10-31 11:47:53 +0000464 1.0f, 7.0f, 5.0f, 5.0f,
465 1.0f, 7.0f, 5.0f, 5.0f,
466 3.0f, 3.0f, 1.0f, 1.0f,
467 3.0f, 3.0f, 1.0f, 1.0f,
468
469 1.0f, 7.0f, 0.0f, 0.0f,
470 1.0f, 7.0f, 2.0f, 0.0f,
471 0.0f, 2.0f, 1.0f, 1.0f,
472 0.0f, 0.0f, 1.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100473 },
474 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000475
James Conroy45a9b772018-10-31 11:47:53 +0000476 std::vector<T> outputData(
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100477 QuantizedVector<T>({
telsoa014fcda012018-03-09 14:13:49 +0000478 5.0f, 5.0f,
James Conroy45a9b772018-10-31 11:47:53 +0000479 3.0f, 1.0f,
480
481 5.0f, 1.0f,
482 1.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100483 },
484 qScale, qOffset));
telsoa014fcda012018-03-09 14:13:49 +0000485
James Conroy45a9b772018-10-31 11:47:53 +0000486 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000487 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000488 {
489 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000490 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000491 inputData = tmp;
492
493 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000494 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000495 outputData = tmp1;
496 }
497
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000498 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100499 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
500 inputData, outputData, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000501}
502
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000503template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000504LayerTestResult<T, 4> L2Pooling2dSize3Stride1TestCommon(
505 armnn::IWorkloadFactory& workloadFactory,
506 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100507 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000508 float qScale = 1.0f,
509 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000510{
511 armnn::Pooling2dDescriptor descriptor;
512 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
513 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
514 descriptor.m_StrideX = descriptor.m_StrideY = 1;
515 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
516
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000517 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100518 auto input = QuantizedVector<T>(
519 {
telsoa014fcda012018-03-09 14:13:49 +0000520 2.0f, 1.0f, 5.0f, 2.0f,
521 1.0f, 2.0f, 2.0f, 1.0f,
522 5.0f, 4.0f, 1.0f, 5.0f,
523 2.0f, 1.0f, 5.0f, 2.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100524 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100525 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000526
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000527 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100528 auto outputExpected = QuantizedVector<T>(
529 {
telsoa014fcda012018-03-09 14:13:49 +0000530 3.0f, 3.0f,
531 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100532 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100533 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000534
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000535 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100536 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
537 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000538}
539
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000540template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000541LayerTestResult<T, 4> L2Pooling2dSize3Stride3TestCommon(
542 armnn::IWorkloadFactory& workloadFactory,
543 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100544 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000545 float qScale = 1.0f,
546 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000547{
548 armnn::Pooling2dDescriptor descriptor;
549 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
550 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
551 descriptor.m_StrideX = descriptor.m_StrideY = 3;
552 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
553
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000554 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100555 auto input = QuantizedVector<T>(
556 {
telsoa014fcda012018-03-09 14:13:49 +0000557 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
558 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
559 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
560 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
561 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
562 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
563 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
564 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
565 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100566 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100567 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000568
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000569 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100570 auto outputExpected = QuantizedVector<T>(
571 {
telsoa014fcda012018-03-09 14:13:49 +0000572 3.0f, 3.0f, 3.0f,
573 3.0f, 3.0f, 3.0f,
574 3.0f, 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100575 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100576 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000577
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000578 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100579 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
580 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000581}
582
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000583template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000584LayerTestResult<T, 4> L2Pooling2dSize3Stride4TestCommon(
585 armnn::IWorkloadFactory& workloadFactory,
586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100587 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000588 float qScale = 1.0f,
589 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000590{
591 armnn::Pooling2dDescriptor descriptor;
592 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
593 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
594 descriptor.m_StrideX = descriptor.m_StrideY = 4;
595 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
596
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000597 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100598 auto input = QuantizedVector<T>(
599 {
telsoa014fcda012018-03-09 14:13:49 +0000600 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
601 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
602 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
603 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
604 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
605 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
606 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100607 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100608 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000609
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000610 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100611 auto outputExpected = QuantizedVector<T>(
612 {
telsoa014fcda012018-03-09 14:13:49 +0000613 3.0f, 3.0f,
614 3.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100615 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100616 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000617
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000618 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100619 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
620 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000621}
622
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000623template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000624LayerTestResult<T, 4> L2Pooling2dSize7TestCommon(
625 armnn::IWorkloadFactory& workloadFactory,
626 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100627 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000628 float qScale = 1.0f,
629 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000630{
631 armnn::Pooling2dDescriptor descriptor;
632 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
633 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 7;
634 descriptor.m_StrideX = descriptor.m_StrideY = 7;
635 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
636
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000637 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100638 auto input = QuantizedVector<T>(
639 {
telsoa014fcda012018-03-09 14:13:49 +0000640 1.0f, 0.0f, 2.0f, 0.0f, 3.0f, 0.0f, 4.0f,
641 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
642 0.0f, 5.0f, 0.0f, 6.0f, 0.0f, 7.0f, 0.0f,
643 8.0f, 0.0f, 9.0f, 0.0f, 10.0f, 0.0f, 5.0f,
644 0.0f, 5.0f, 0.0f, 2.0f, 0.0f, 1.0f, 1.0f,
645 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
646 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100647 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100648 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000649
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000650 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100651 auto outputExpected = QuantizedVector<T>(
652 {
telsoa014fcda012018-03-09 14:13:49 +0000653 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100654 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100655 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000656
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000657 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100658 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
659 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000660}
661
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000662template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000663LayerTestResult<T, 4> L2Pooling2dSize9TestCommon(
664 armnn::IWorkloadFactory& workloadFactory,
665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100666 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000667 float qScale = 1.0f,
668 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000669{
670 armnn::Pooling2dDescriptor descriptor;
671 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
672 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 9;
673 descriptor.m_StrideX = descriptor.m_StrideY = 9;
674 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
675
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000676 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100677 auto input = QuantizedVector<T>(
678 {
telsoa014fcda012018-03-09 14:13:49 +0000679 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
680 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
681 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
682 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
683 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
684 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
685 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
686 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
687 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100688 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100689 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000690
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000691 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
Sadik Armagan483c8112021-06-01 09:24:52 +0100692 auto outputExpected = QuantizedVector<T>(
693 {
telsoa014fcda012018-03-09 14:13:49 +0000694 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100695 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100696 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000697
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000698 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100699 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
700 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000701}
702
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000703template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000704LayerTestResult<T, 4> AsymmetricNonSquarePooling2dTestCommon(
705 armnn::IWorkloadFactory& workloadFactory,
706 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100707 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000708 float qScale = 1.0f,
709 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000710{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000711 armnn::TensorInfo inputTensorInfo({ 1, 1, 1, 3 }, ArmnnType);
712 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000713
714 armnn::Pooling2dDescriptor descriptor;
715 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
716 descriptor.m_PoolWidth = 2;
717 descriptor.m_PoolHeight = 3;
718 descriptor.m_StrideX = 2;
719 descriptor.m_StrideY = 1;
720 descriptor.m_PadLeft = 2;
721 descriptor.m_PadRight = 0;
722 descriptor.m_PadTop = 1;
723 descriptor.m_PadBottom = 2;
724 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
725 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
726
telsoa01c577f2c2018-08-31 09:22:23 +0100727 // Construct input data.
Sadik Armagan483c8112021-06-01 09:24:52 +0100728 auto input = QuantizedVector<T>(
729 {
telsoa014fcda012018-03-09 14:13:49 +0000730 1.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100731 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100732 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000733
telsoa01c577f2c2018-08-31 09:22:23 +0100734 // These were calculated manually.
Sadik Armagan483c8112021-06-01 09:24:52 +0100735 auto outputExpected = QuantizedVector<T>(
736 {
telsoa014fcda012018-03-09 14:13:49 +0000737 0.0f, 3.0f, 0.0f, 3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100738 },
Sadik Armagan483c8112021-06-01 09:24:52 +0100739 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000740
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000741 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100742 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
743 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000744}
745
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000746template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000747LayerTestResult<T, 4> ComparePooling2dTestCommon(
748 armnn::IWorkloadFactory& workloadFactory,
749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
750 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +0100751 const armnn::ITensorHandleFactory& tensorHandleFactory,
752 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000753 armnn::PoolingAlgorithm poolingType,
754 float qScale = 1.0f,
755 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000756{
Jan Eilers8eb25602020-03-09 12:13:48 +0000757 IgnoreUnused(memoryManager);
telsoa014fcda012018-03-09 14:13:49 +0000758 const unsigned int inputWidth = 16;
759 const unsigned int inputHeight = 32;
760 const unsigned int channelCount = 2;
761 const unsigned int batchSize = 5;
762
763 const unsigned int poolSize = 3;
764 const unsigned int strideX = 2;
765 const unsigned int strideY = 4;
766 const unsigned int padX = 0;
767 const unsigned int padY = 0;
768
769 const unsigned int outputWidth = (inputWidth + 2 * padX + strideX - poolSize) / strideX;
770 const unsigned int outputHeight = (inputHeight + 2 * padY + strideY - poolSize) / strideY;
771
772 armnn::TensorInfo inputTensorInfo;
773 armnn::TensorInfo outputTensorInfo;
774
775 unsigned int inputShape[] = { batchSize, channelCount, inputHeight, inputWidth };
776 unsigned int outputShape[] = { batchSize, channelCount, outputHeight, outputWidth };
777
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000778 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
779 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000780
781 // Set quantization parameters if the requested type is a quantized type.
782 if(armnn::IsQuantizedType<T>())
783 {
784 inputTensorInfo.SetQuantizationScale(qScale);
785 inputTensorInfo.SetQuantizationOffset(qOffset);
786 outputTensorInfo.SetQuantizationScale(qScale);
787 outputTensorInfo.SetQuantizationOffset(qOffset);
788 }
789
Sadik Armagan483c8112021-06-01 09:24:52 +0100790 std::vector<T> input = MakeRandomTensor<T>(inputTensorInfo, 81715);
791 std::vector<T> actualOutput(outputTensorInfo.GetNumElements());
792 std::vector<T> expectedOutput(outputTensorInfo.GetNumElements());
telsoa014fcda012018-03-09 14:13:49 +0000793
794 LayerTestResult<T, 4> comparisonResult(outputTensorInfo);
795
Finn Williams826a5432020-08-27 16:15:20 +0100796 std::unique_ptr<armnn::ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputTensorInfo);
797 std::unique_ptr<armnn::ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000798
799 armnn::Pooling2dQueueDescriptor data;
800 armnn::WorkloadInfo info;
801 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
802 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
803 data.m_Parameters.m_PoolType = poolingType;
804 data.m_Parameters.m_PoolWidth = poolSize;
805 data.m_Parameters.m_PoolHeight = poolSize;
806 data.m_Parameters.m_StrideX = strideX;
807 data.m_Parameters.m_StrideY = strideY;
808 data.m_Parameters.m_PadLeft = padX;
809 data.m_Parameters.m_PadRight = padX;
810 data.m_Parameters.m_PadTop = padY;
811 data.m_Parameters.m_PadBottom = padY;
812 data.m_Parameters.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
813
Finn Williams826a5432020-08-27 16:15:20 +0100814 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refTensorHandleFactory.CreateTensorHandle(outputTensorInfo);
815 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refTensorHandleFactory.CreateTensorHandle(inputTensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000816
817 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +0100818 armnn::BackendId backend = workloadFactory.GetBackendId();
Francis Murtaghb28e5252022-02-09 14:36:04 +0000819
820 auto handle = armnn::GetILayerSupportByBackendId(backend);
821 comparisonResult.m_Supported = handle.IsPooling2dSupported(inputTensorInfo,
822 outputTensorInfo,
823 data.m_Parameters);
Sadik Armagan483c8112021-06-01 09:24:52 +0100824 if (!comparisonResult.m_Supported)
telsoa014fcda012018-03-09 14:13:49 +0000825 {
826 return comparisonResult;
827 }
828
829 armnn::Pooling2dQueueDescriptor refData = data;
830 armnn::WorkloadInfo refInfo = info;
831 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
832 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
833
Teresa Charlin611c7fb2022-01-07 09:47:29 +0000834 std::unique_ptr<armnn::IWorkload> workload
835 = workloadFactory.CreateWorkload(armnn::LayerType::Pooling2d, data, info);
836 std::unique_ptr<armnn::IWorkload> workloadRef
837 = refWorkloadFactory.CreateWorkload(armnn::LayerType::Pooling2d, refData, refInfo);
telsoa014fcda012018-03-09 14:13:49 +0000838
839 outputHandleRef->Allocate();
840 inputHandleRef->Allocate();
841 inputHandle->Allocate();
842 outputHandle->Allocate();
843
Sadik Armagan483c8112021-06-01 09:24:52 +0100844 CopyDataToITensorHandle(inputHandle.get(), input.data());
845 CopyDataToITensorHandle(inputHandleRef.get(), input.data());
telsoa014fcda012018-03-09 14:13:49 +0000846
847 workload->Execute();
848 workloadRef->Execute();
849
Sadik Armagan483c8112021-06-01 09:24:52 +0100850 CopyDataFromITensorHandle(actualOutput.data(), outputHandle.get());
851 CopyDataFromITensorHandle(expectedOutput.data(), outputHandleRef.get());
852
853 comparisonResult.m_ActualData = actualOutput;
854 comparisonResult.m_ExpectedData = expectedOutput;
telsoa014fcda012018-03-09 14:13:49 +0000855
856 return comparisonResult;
857}
858
859//
860// Tests max pooling with the following parameters:
861//
862// Pooling size: 2x2
863// Stride: (2,2)
864// input size: 4x4
865// channels: 1
866// batch size: 1
867//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000868template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000869LayerTestResult<T, 4> SimpleMaxPooling2dSize2x2Stride2x2TestCommon(
870 armnn::IWorkloadFactory& workloadFactory,
871 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100872 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000873 bool forceNoPadding,
874 float qScale = 1.0f,
875 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000876{
877 armnn::Pooling2dDescriptor descriptor;
878 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
879 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
880 descriptor.m_StrideX = 2;
881 descriptor.m_StrideY = 2;
882 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
883 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
884 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
885 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
886
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000887
telsoa014fcda012018-03-09 14:13:49 +0000888 unsigned int inputWidth = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000889
telsoa014fcda012018-03-09 14:13:49 +0000890 unsigned int inputHeight = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000891
telsoa014fcda012018-03-09 14:13:49 +0000892 unsigned int outputWidth =
893 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
894 descriptor.m_StrideX;
895 unsigned int outputHeight =
896 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
897 descriptor.m_StrideY;
898 unsigned int channels = 1;
899 unsigned int batchSize = 1;
900
901 std::vector<float> inputData = {
902 510.0f, 222.0f, 780.0f, 654.0f,
903 141.0f, 276.0f, 15.0f, 546.0f,
904 303.0f, 618.0f, 582.0f, 339.0f,
905 438.0f, 564.0f, 573.0f, 402.0f
906 };
907
telsoa01c577f2c2018-08-31 09:22:23 +0100908 // 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 +0000909 std::vector<float> expectedOutputDataWithPadding = {
910 0.0f, 510.0f, 780.0f, 654.0f, 0.0f,
911 0.0f, 438.0f, 618.0f, 402.0f, 0.0f
912 };
913
914 std::vector<float> expectedOutputDataNoPadding = {
915 510.0f, 780.0f,
916 618.0f, 582.0f
917 };
918
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000919 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000920
921 // Scale and offset should match input - we're just calculating maximum values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000922 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000923
924 // Set quantization parameters if the requested type is a quantized type.
925 if(armnn::IsQuantizedType<T>())
926 {
927 inputTensorInfo.SetQuantizationScale(qScale);
928 inputTensorInfo.SetQuantizationOffset(qOffset);
929 outputTensorInfo.SetQuantizationScale(qScale);
930 outputTensorInfo.SetQuantizationOffset(qOffset);
931 }
932
Sadik Armagan483c8112021-06-01 09:24:52 +0100933 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000934
Sadik Armagan483c8112021-06-01 09:24:52 +0100935 auto outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +0100936 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
Sadik Armagan483c8112021-06-01 09:24:52 +0100937 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +0000938
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000939 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +0100940 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
941 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +0000942}
943
surmeh01bceff2f2018-03-29 16:29:27 +0100944//
945// Tests max pooling with the following parameters:
946//
947// Pooling size: 3x2
948// Stride: (2,2)
949// input size: 3x2
950// channels: 1
951// batch size: 1
952//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000953template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
surmeh01bceff2f2018-03-29 16:29:27 +0100954LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon(
955 armnn::IWorkloadFactory& workloadFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000956 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +0100957 const armnn::ITensorHandleFactory& tensorHandleFactory,
surmeh01bceff2f2018-03-29 16:29:27 +0100958 bool forceNoPadding,
959 float qScale = 1.0f,
960 int32_t qOffset = 0)
961{
962 armnn::Pooling2dDescriptor descriptor;
963 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
964 descriptor.m_PoolWidth = 3;
965 descriptor.m_PoolHeight = 2;
966 descriptor.m_StrideX = 2;
967 descriptor.m_StrideY = 2;
968 descriptor.m_PadLeft = (forceNoPadding) ? 0 : 1;
969 descriptor.m_PadRight = descriptor.m_PadLeft;
970 descriptor.m_PadTop = 0;
971 descriptor.m_PadBottom = 0;
972 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
973 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
974
975 unsigned int inputWidth = 3;
976 unsigned int inputHeight = 2;
977 unsigned int outputWidth =
978 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
979 descriptor.m_StrideX;
980 unsigned int outputHeight =
981 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
982 descriptor.m_StrideY;
983 unsigned int channels = 1;
984 unsigned int batchSize = 1;
985
986 std::vector<float> inputData = {
987 3.0f, 6.0f, 9.0f,
988 12.0f, 15.0f, 18.0f,
989 };
990
991 std::vector<float> expectedOutputDataWithPadding = {
992 6.0f, 8.0f,
993 };
994
995 std::vector<float> expectedOutputDataNoPadding = {
996 10.5f,
997 };
998
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000999 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +01001000
1001 // Scale and offset should match input - we're just calculating average values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001002 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +01001003
1004 // Set quantization parameters if the requested type is a quantized type.
1005 if(armnn::IsQuantizedType<T>())
1006 {
1007 inputTensorInfo.SetQuantizationScale(qScale);
1008 inputTensorInfo.SetQuantizationOffset(qOffset);
1009 outputTensorInfo.SetQuantizationScale(qScale);
1010 outputTensorInfo.SetQuantizationOffset(qOffset);
1011 }
1012
Sadik Armagan483c8112021-06-01 09:24:52 +01001013 auto input = QuantizedVector<T>(inputData, qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +01001014
Sadik Armagan483c8112021-06-01 09:24:52 +01001015 auto outputExpected =
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001016 forceNoPadding ? QuantizedVector<T>(expectedOutputDataNoPadding, qScale, qOffset) :
Sadik Armagan483c8112021-06-01 09:24:52 +01001017 QuantizedVector<T>(expectedOutputDataWithPadding, qScale, qOffset);
surmeh01bceff2f2018-03-29 16:29:27 +01001018
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001019 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001020 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1021 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
surmeh01bceff2f2018-03-29 16:29:27 +01001022}
1023
1024
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001025template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001026LayerTestResult<T, 4> IgnorePaddingSimpleMaxPooling2dTestCommon(
1027 armnn::IWorkloadFactory& workloadFactory,
1028 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001029 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001030 float qScale = 1.0f,
1031 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001032{
1033 armnn::Pooling2dDescriptor descriptor;
1034 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1035 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1036 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1037 descriptor.m_PadLeft = 1;
1038 descriptor.m_PadRight = 1;
1039 descriptor.m_PadTop = 1;
1040 descriptor.m_PadBottom = 1;
1041 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1042
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001043 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1044 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001045
1046 // Set quantization parameters if the requested type is a quantized type.
1047 if(armnn::IsQuantizedType<T>())
1048 {
1049 inputTensorInfo.SetQuantizationScale(qScale);
1050 inputTensorInfo.SetQuantizationOffset(qOffset);
1051 outputTensorInfo.SetQuantizationScale(qScale);
1052 outputTensorInfo.SetQuantizationOffset(qOffset);
1053 }
1054
Sadik Armagan483c8112021-06-01 09:24:52 +01001055 auto input = QuantizedVector<T>(
1056 {
telsoa014fcda012018-03-09 14:13:49 +00001057 -1.0f, -2.0f, 3.0f, 4.0f,
1058 -1.0f, -2.0f, 3.0f, 4.0f,
1059 1.0f, 2.0f, -3.0f, -4.0f,
1060 1.0f, 2.0f, -3.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001061 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001062 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001063
Sadik Armagan483c8112021-06-01 09:24:52 +01001064 auto outputExpected = QuantizedVector<T>(
1065 {
telsoa014fcda012018-03-09 14:13:49 +00001066 -1.0f, 3.0f, 4.0f,
1067 1.0f, 3.0f, 4.0f,
1068 1.0f, 2.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001069 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001070 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001071
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001072 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001073 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1074 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001075}
1076
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001077template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001078LayerTestResult<T, 4> IgnorePaddingMaxPooling2dSize3TestCommon(
1079 armnn::IWorkloadFactory& workloadFactory,
1080 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001081 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001082 float qScale = 1.0f,
1083 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001084{
1085 armnn::Pooling2dDescriptor descriptor;
1086 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1087 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1088 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1089 descriptor.m_PadLeft = 1;
1090 descriptor.m_PadRight = 1;
1091 descriptor.m_PadTop = 1;
1092 descriptor.m_PadBottom = 1;
1093 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1094
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001095 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1096 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001097
1098 // Set quantization parameters if the requested type is a quantized type.
1099 if(armnn::IsQuantizedType<T>())
1100 {
1101 inputTensorInfo.SetQuantizationScale(qScale);
1102 inputTensorInfo.SetQuantizationOffset(qOffset);
1103 outputTensorInfo.SetQuantizationScale(qScale);
1104 outputTensorInfo.SetQuantizationOffset(qOffset);
1105 }
1106
Sadik Armagan483c8112021-06-01 09:24:52 +01001107 auto input = QuantizedVector<T>(
1108 {
telsoa014fcda012018-03-09 14:13:49 +00001109 -1.0f, -2.0f, 3.0f, 4.0f,
1110 -1.0f, -2.0f, 3.0f, 4.0f,
1111 1.0f, 2.0f, -3.0f, -4.0f,
1112 1.0f, 2.0f, -3.0f, -4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001113 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001114 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001115
Sadik Armagan483c8112021-06-01 09:24:52 +01001116 auto outputExpected = QuantizedVector<T>(
1117 {
telsoa014fcda012018-03-09 14:13:49 +00001118 -1.0f, 3.0f, 4.0f, 4.0f,
1119 2.0f, 3.0f, 4.0f, 4.0f,
1120 2.0f, 3.0f, 4.0f, 4.0f,
1121 2.0f, 2.0f, 2.0f, -3.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001122 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001123 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001124
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001125 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001126 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1127 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001128}
1129
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001130template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001131LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dTestCommon(
1132 armnn::IWorkloadFactory& workloadFactory,
1133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001134 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001135 float qScale = 1.0f,
1136 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001137{
1138 armnn::Pooling2dDescriptor descriptor;
1139 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1140 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1141 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1142 descriptor.m_PadLeft = 1;
1143 descriptor.m_PadRight = 1;
1144 descriptor.m_PadTop = 1;
1145 descriptor.m_PadBottom = 1;
1146 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1147
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001148 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1149 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001150
1151 // Set quantization parameters if the requested type is a quantized type.
1152 if(armnn::IsQuantizedType<T>())
1153 {
1154 inputTensorInfo.SetQuantizationScale(qScale);
1155 inputTensorInfo.SetQuantizationOffset(qOffset);
1156 outputTensorInfo.SetQuantizationScale(qScale);
1157 outputTensorInfo.SetQuantizationOffset(qOffset);
1158 }
1159
Sadik Armagan483c8112021-06-01 09:24:52 +01001160 auto input = QuantizedVector<T>(
1161 {
telsoa014fcda012018-03-09 14:13:49 +00001162 12.0f, 20.0f, 32.0f, 40.0f,
1163 12.0f, 20.0f, 32.0f, 40.0f,
1164 12.0f, 20.0f, 32.0f, 40.0f,
1165 12.0f, 20.0f, 32.0f, 40.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001166 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001167 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001168
Sadik Armagan483c8112021-06-01 09:24:52 +01001169 auto outputExpected = QuantizedVector<T>(
1170 {
telsoa014fcda012018-03-09 14:13:49 +00001171 3.0f, 13.0f, 10.0f,
1172 6.0f, 26.0f, 20.0f,
1173 3.0f, 13.0f, 10.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001174 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001175 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001176
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001177 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001178 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1179 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001180}
1181
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001182template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001183LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon(
1184 armnn::IWorkloadFactory& workloadFactory,
1185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001186 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001187 float qScale = 1.0f,
1188 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001189{
1190 armnn::Pooling2dDescriptor descriptor;
1191 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1192 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1193 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1194 descriptor.m_PadLeft = 0;
1195 descriptor.m_PadRight = 0;
1196 descriptor.m_PadTop = 0;
1197 descriptor.m_PadBottom = 0;
1198 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1199 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Ceiling;
1200
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001201 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1202 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001203
1204 // Set quantization parameters if the requested type is a quantized type.
1205 if(armnn::IsQuantizedType<T>())
1206 {
1207 inputTensorInfo.SetQuantizationScale(qScale);
1208 inputTensorInfo.SetQuantizationOffset(qOffset);
1209 outputTensorInfo.SetQuantizationScale(qScale);
1210 outputTensorInfo.SetQuantizationOffset(qOffset);
1211 }
1212
Sadik Armagan483c8112021-06-01 09:24:52 +01001213 auto input = QuantizedVector<T>(
1214 {
telsoa014fcda012018-03-09 14:13:49 +00001215 1.0f, 2.0f, 3.0f, 4.0f,
1216 1.0f, 2.0f, 3.0f, 4.0f,
1217 1.0f, 2.0f, 3.0f, 4.0f,
1218 1.0f, 2.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001219 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001220 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001221
Sadik Armagan483c8112021-06-01 09:24:52 +01001222 auto outputExpected = QuantizedVector<T>(
1223 {
telsoa014fcda012018-03-09 14:13:49 +00001224 2.0f, 3.5f,
1225 2.0f, 3.5f
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001226 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001227 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001228
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001229 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001230 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1231 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001232}
1233
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001234template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001235LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3TestCommon(
1236 armnn::IWorkloadFactory& workloadFactory,
1237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001238 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001239 float qScale = 1.0f,
1240 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001241{
1242 armnn::Pooling2dDescriptor descriptor;
1243 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1244 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1245 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1246 descriptor.m_PadLeft = 1;
1247 descriptor.m_PadRight = 1;
1248 descriptor.m_PadTop = 1;
1249 descriptor.m_PadBottom = 1;
1250 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1251
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001252 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1253 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001254
1255 // Set quantization parameters if the requested type is a quantized type.
1256 if(armnn::IsQuantizedType<T>())
1257 {
1258 inputTensorInfo.SetQuantizationScale(qScale);
1259 inputTensorInfo.SetQuantizationOffset(qOffset);
1260 outputTensorInfo.SetQuantizationScale(qScale);
1261 outputTensorInfo.SetQuantizationOffset(qOffset);
1262 }
1263
Sadik Armagan483c8112021-06-01 09:24:52 +01001264 auto input = QuantizedVector<T>(
1265 {
telsoa014fcda012018-03-09 14:13:49 +00001266 9.0f, 27.0f, 18.0f, 36.0f,
1267 18.0f, 9.0f, 18.0f, 9.0f,
1268 27.0f, 18.0f, 9.0f, 27.0f,
1269 9.0f, 27.0f, 9.0f, 18.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001270 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001271 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001272
Sadik Armagan483c8112021-06-01 09:24:52 +01001273 auto outputExpected = QuantizedVector<T>(
1274 {
telsoa014fcda012018-03-09 14:13:49 +00001275 7.0f, 11.0f, 13.0f, 9.0f,
1276 12.0f, 17.0f, 19.0f, 13.0f,
1277 12.0f, 16.0f, 16.0f, 10.0f,
1278 9.0f, 11.0f, 12.0f, 7.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001279 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001280 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001281
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001282 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001283 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1284 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001285}
1286
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001287template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001288LayerTestResult<T, 4> IgnorePaddingSimpleL2Pooling2dTestCommon(
1289 armnn::IWorkloadFactory& workloadFactory,
1290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001291 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001292 float qScale = 1.0f,
1293 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001294{
1295 armnn::Pooling2dDescriptor descriptor;
1296 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1297 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1298 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1299 descriptor.m_PadLeft = 1;
1300 descriptor.m_PadRight = 1;
1301 descriptor.m_PadTop = 1;
1302 descriptor.m_PadBottom = 1;
1303 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1304
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001305 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1306 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001307
1308 // Set quantization parameters if the requested type is a quantized type.
1309 if(armnn::IsQuantizedType<T>())
1310 {
1311 inputTensorInfo.SetQuantizationScale(qScale);
1312 inputTensorInfo.SetQuantizationOffset(qOffset);
1313 outputTensorInfo.SetQuantizationScale(qScale);
1314 outputTensorInfo.SetQuantizationOffset(qOffset);
1315 }
1316
Sadik Armagan483c8112021-06-01 09:24:52 +01001317 auto input = QuantizedVector<T>(
1318 {
telsoa014fcda012018-03-09 14:13:49 +00001319 2.0f, 4.0f, 8.0f, 16.0f,
1320 4.0f, 2.0f, 2.0f, 4.0f,
1321 8.0f, 2.0f, 4.0f, 2.0f,
1322 16.0f, 2.0f, 2.0f, 8.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001323 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001324 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001325
Sadik Armagan483c8112021-06-01 09:24:52 +01001326 auto outputExpected = QuantizedVector<T>(
1327 {
telsoa014fcda012018-03-09 14:13:49 +00001328 1.0f, 4.4721f, 8.0f,
1329 4.4721f, 2.6457f, 2.236f,
1330 8.0f, 1.4142f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001331 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001332 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001333
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001334 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001335 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1336 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001337}
1338
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001339template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001340LayerTestResult<T, 4> IgnorePaddingL2Pooling2dSize3TestCommon(
1341 armnn::IWorkloadFactory& workloadFactory,
1342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001343 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001344 float qScale = 1.0f,
1345 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001346{
1347 armnn::Pooling2dDescriptor descriptor;
1348 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1349 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1350 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1351 descriptor.m_PadLeft = 1;
1352 descriptor.m_PadRight = 1;
1353 descriptor.m_PadTop = 1;
1354 descriptor.m_PadBottom = 1;
1355 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1356
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001357 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1358 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001359
1360 // Set quantization parameters if the requested type is a quantized type.
1361 if(armnn::IsQuantizedType<T>())
1362 {
1363 inputTensorInfo.SetQuantizationScale(qScale);
1364 inputTensorInfo.SetQuantizationOffset(qOffset);
1365 outputTensorInfo.SetQuantizationScale(qScale);
1366 outputTensorInfo.SetQuantizationOffset(qOffset);
1367 }
1368
Sadik Armagan483c8112021-06-01 09:24:52 +01001369 auto input = QuantizedVector<T>(
1370 {
telsoa014fcda012018-03-09 14:13:49 +00001371 1.0f, 2.0f, 3.0f, 4.0f,
1372 1.0f, 2.0f, 3.0f, 4.0f,
1373 1.0f, 2.0f, 3.0f, 4.0f,
1374 1.0f, 2.0f, 3.0f, 4.0f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001375 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001376 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001377
Sadik Armagan483c8112021-06-01 09:24:52 +01001378 auto outputExpected = QuantizedVector<T>(
1379 {
telsoa014fcda012018-03-09 14:13:49 +00001380 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1381 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1382 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1383 1.0540f, 1.7638f, 2.5385f, 2.3570f,
Aron Virginas-Tar48623a02019-10-22 10:00:28 +01001384 },
Sadik Armagan483c8112021-06-01 09:24:52 +01001385 qScale, qOffset);
telsoa014fcda012018-03-09 14:13:49 +00001386
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001387 return SimplePooling2dTestImpl<ArmnnType>(
Sadik Armagan483c8112021-06-01 09:24:52 +01001388 workloadFactory, memoryManager, tensorHandleFactory, descriptor, qScale, qOffset,
1389 input, outputExpected, inputTensorInfo.GetShape(), outputTensorInfo.GetShape());
telsoa014fcda012018-03-09 14:13:49 +00001390}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001391
1392} // anonymous namespace
1393
1394LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
1395 armnn::IWorkloadFactory& workloadFactory,
1396 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001397 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001398 bool forceNoPadding)
1399{
1400 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001401 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001402}
1403
1404LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
1405 armnn::IWorkloadFactory& workloadFactory,
1406 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001407 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001408 bool forceNoPadding)
1409{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001410 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001411 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 3.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001412}
1413
1414LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
1415 armnn::IWorkloadFactory& workloadFactory,
1416 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001417 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001418 bool forceNoPadding)
1419{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001420 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001421 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001422}
1423
1424LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
1425 armnn::IWorkloadFactory& workloadFactory,
1426 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001427 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001428 bool forceNoPadding)
1429{
1430 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001431 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001432}
1433
1434LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
1435 armnn::IWorkloadFactory& workloadFactory,
1436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001437 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001438 bool forceNoPadding)
1439{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001440 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001441 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding, 0.1f, 128);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001442}
1443
1444LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
1445 armnn::IWorkloadFactory& workloadFactory,
1446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001447 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001448 bool forceNoPadding)
1449{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001450 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001451 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001452}
1453
1454LayerTestResult<float, 4> SimpleMaxPooling2dTest(
1455 armnn::IWorkloadFactory& workloadFactory,
1456 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001457 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001458 const armnn::DataLayout dataLayout)
1459{
Finn Williams826a5432020-08-27 16:15:20 +01001460 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1461 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001462}
1463
1464LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
1465 armnn::IWorkloadFactory& workloadFactory,
1466 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001467 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001468 const armnn::DataLayout dataLayout)
1469{
Finn Williams826a5432020-08-27 16:15:20 +01001470 return SimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
1471 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001472}
1473
1474LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
1475 armnn::IWorkloadFactory& workloadFactory,
1476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001477 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001478 const armnn::DataLayout dataLayout)
1479{
Finn Williams826a5432020-08-27 16:15:20 +01001480 return SimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
1481 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001482}
1483LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
1484 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001485 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1486 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001487{
Finn Williams826a5432020-08-27 16:15:20 +01001488 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(
1489 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001490}
1491
1492LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
1493 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001494 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1495 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001496{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001497 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001498 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001499}
1500
1501LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
1502 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001503 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1504 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001505{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001506 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001507 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001508}
1509
1510LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
1511 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1513 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001514{
Finn Williams826a5432020-08-27 16:15:20 +01001515 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(
1516 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001517}
1518
1519LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
1520 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001521 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1522 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001523{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001524 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001525 workloadFactory, memoryManager, tensorHandleFactory, 1.0f, -5);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001526}
1527
1528LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
1529 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1531 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001532{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001533 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001534 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001535}
1536
1537LayerTestResult<float, 4> SimpleAveragePooling2dTest(
1538 armnn::IWorkloadFactory& workloadFactory,
1539 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001540 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001541 const armnn::DataLayout dataLayout)
1542{
Finn Williams826a5432020-08-27 16:15:20 +01001543 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1544 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001545}
1546
1547LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
1548 armnn::IWorkloadFactory& workloadFactory,
1549 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001550 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001551 const armnn::DataLayout dataLayout)
1552{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001553 return SimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001554 workloadFactory, memoryManager, tensorHandleFactory, dataLayout, 0.5, -1);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001555}
1556
1557LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
1558 armnn::IWorkloadFactory& workloadFactory,
1559 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001560 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001561 const armnn::DataLayout dataLayout)
1562{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001563 return SimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001564 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001565}
1566
1567LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
1568 armnn::IWorkloadFactory& workloadFactory,
1569 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001570 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001571 bool forceNoPadding)
1572{
1573 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001574 workloadFactory, memoryManager, tensorHandleFactory, forceNoPadding);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001575}
1576
1577LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
1578 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1580 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001581{
Finn Williams826a5432020-08-27 16:15:20 +01001582 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(
1583 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001584}
1585
1586LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
1587 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001588 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1589 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001590{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001591 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001592 workloadFactory, memoryManager, tensorHandleFactory, 0.5, -1);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001593}
1594
1595LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
1596 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001597 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1598 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001599{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001600 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001601 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001602}
1603LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
1604 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001605 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1606 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001607{
Finn Williams826a5432020-08-27 16:15:20 +01001608 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(
1609 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001610}
1611
1612LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
1613 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001614 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1615 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001616{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001617 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001618 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001619}
1620
1621LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
1622 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001623 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1624 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001625{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001626 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001627 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001628}
1629
1630LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
1631 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001632 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1633 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001634{
1635 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001636 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001637}
1638
1639LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
1640 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001641 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1642 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001643{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001644 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001645 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001646}
1647
1648LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
1649 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001650 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1651 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001652{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001653 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001654 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001655}
1656
1657LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
1658 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001659 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1660 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001661{
Finn Williams826a5432020-08-27 16:15:20 +01001662 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(
1663 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001664}
1665
1666LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
1667 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1669 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001670{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001671 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001672 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001673}
1674
1675LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
1676 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001677 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1678 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001679{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001680 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001681 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001682}
1683
1684LayerTestResult<float, 4> SimpleL2Pooling2dTest(
1685 armnn::IWorkloadFactory& workloadFactory,
1686 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001687 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001688 const armnn::DataLayout dataLayout)
1689{
Finn Williams826a5432020-08-27 16:15:20 +01001690 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1691 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001692}
1693
1694LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
1695 armnn::IWorkloadFactory& workloadFactory,
1696 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001697 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001698 const armnn::DataLayout dataLayout)
1699{
Finn Williams826a5432020-08-27 16:15:20 +01001700 return SimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1701 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001702}
1703
1704LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
1705 armnn::IWorkloadFactory& workloadFactory,
1706 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Finn Williams826a5432020-08-27 16:15:20 +01001707 const armnn::ITensorHandleFactory& tensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001708 const armnn::DataLayout dataLayout)
1709{
Finn Williams826a5432020-08-27 16:15:20 +01001710 return SimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1711 workloadFactory, memoryManager, tensorHandleFactory, dataLayout);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001712}
1713
1714LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
1715 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1717 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001718{
Finn Williams826a5432020-08-27 16:15:20 +01001719 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(
1720 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001721}
1722
1723LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
1724 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001725 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1726 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001727{
Finn Williams826a5432020-08-27 16:15:20 +01001728 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QAsymmU8>(
1729 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001730}
1731
1732LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
1733 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001734 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1735 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001736{
Finn Williams826a5432020-08-27 16:15:20 +01001737 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QSymmS16>(
1738 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001739}
1740
1741LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
1742 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001743 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1744 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001745{
Finn Williams826a5432020-08-27 16:15:20 +01001746 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(
1747 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001748}
1749
1750LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
1751 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001752 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1753 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001754{
Finn Williams826a5432020-08-27 16:15:20 +01001755 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QAsymmU8>(
1756 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001757}
1758
1759LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
1760 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001761 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1762 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001763{
Finn Williams826a5432020-08-27 16:15:20 +01001764 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QSymmS16>(
1765 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001766}
1767LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
1768 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001769 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1770 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001771{
Finn Williams826a5432020-08-27 16:15:20 +01001772 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(
1773 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001774}
1775
1776LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
1777 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001778 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1779 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001780{
Finn Williams826a5432020-08-27 16:15:20 +01001781 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QAsymmU8>(
1782 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001783}
1784
1785LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
1786 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001787 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1788 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001789{
Finn Williams826a5432020-08-27 16:15:20 +01001790 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QSymmS16>(
1791 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001792}
1793
1794LayerTestResult<float, 4> L2Pooling2dSize7Test(
1795 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001796 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1797 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001798{
Finn Williams826a5432020-08-27 16:15:20 +01001799 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(
1800 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001801}
1802
1803LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
1804 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001805 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1806 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001807{
Finn Williams826a5432020-08-27 16:15:20 +01001808 return L2Pooling2dSize7TestCommon<armnn::DataType::QAsymmU8>(
1809 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001810}
1811
1812LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
1813 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001814 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1815 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001816{
Finn Williams826a5432020-08-27 16:15:20 +01001817 return L2Pooling2dSize7TestCommon<armnn::DataType::QSymmS16>(
1818 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001819}
1820
1821LayerTestResult<float, 4> L2Pooling2dSize9Test(
1822 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001823 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1824 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001825{
Finn Williams826a5432020-08-27 16:15:20 +01001826 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(
1827 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001828}
1829
1830LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
1831 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001832 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1833 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001834{
Finn Williams826a5432020-08-27 16:15:20 +01001835 return L2Pooling2dSize9TestCommon<armnn::DataType::QAsymmU8>(
1836 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001837}
1838
1839LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
1840 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001841 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1842 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001843{
Finn Williams826a5432020-08-27 16:15:20 +01001844 return L2Pooling2dSize9TestCommon<armnn::DataType::QSymmS16>(
1845 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001846}
1847LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
1848 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001849 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1850 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001851{
Finn Williams826a5432020-08-27 16:15:20 +01001852 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(
1853 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001854}
1855
1856LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
1857 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001858 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1859 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001860{
Finn Williams826a5432020-08-27 16:15:20 +01001861 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QAsymmU8>(
1862 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001863}
1864
1865LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
1866 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001867 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1868 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001869{
Finn Williams826a5432020-08-27 16:15:20 +01001870 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QSymmS16>(
1871 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001872}
1873
1874LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
1875 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001876 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1877 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001878{
Finn Williams826a5432020-08-27 16:15:20 +01001879 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(
1880 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001881}
1882
1883LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
1884 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001885 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1886 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001887{
Finn Williams826a5432020-08-27 16:15:20 +01001888 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QAsymmU8>(
1889 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001890}
1891
1892LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
1893 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001894 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1895 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001896{
Finn Williams826a5432020-08-27 16:15:20 +01001897 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QSymmS16>(
1898 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001899}
1900
1901LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
1902 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1904 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001905{
Finn Williams826a5432020-08-27 16:15:20 +01001906 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(
1907 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001908}
1909
1910LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
1911 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001912 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1913 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001914{
Finn Williams826a5432020-08-27 16:15:20 +01001915 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QAsymmU8>(
1916 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001917}
1918
1919LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
1920 armnn::IWorkloadFactory& workloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001921 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1922 const armnn::ITensorHandleFactory& tensorHandleFactory)
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001923{
Finn Williams826a5432020-08-27 16:15:20 +01001924 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QSymmS16>(
1925 workloadFactory, memoryManager, tensorHandleFactory);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001926}
1927
1928LayerTestResult<float, 4> ComparePooling2dTest(
1929 armnn::IWorkloadFactory& workloadFactory,
1930 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1931 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001932 const armnn::ITensorHandleFactory& tensorHandleFactory,
1933 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001934 armnn::PoolingAlgorithm poolingType)
1935{
1936 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
Finn Williams826a5432020-08-27 16:15:20 +01001937 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001938}
1939
1940LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
1941 armnn::IWorkloadFactory& workloadFactory,
1942 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1943 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001944 const armnn::ITensorHandleFactory& tensorHandleFactory,
1945 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001946 armnn::PoolingAlgorithm poolingType)
1947{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001948 return ComparePooling2dTestCommon<armnn::DataType::QAsymmU8>(
Finn Williams826a5432020-08-27 16:15:20 +01001949 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory,
1950 poolingType, 0.1f, 128);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001951}
1952
1953LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
1954 armnn::IWorkloadFactory& workloadFactory,
1955 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1956 armnn::IWorkloadFactory& refWorkloadFactory,
Finn Williams826a5432020-08-27 16:15:20 +01001957 const armnn::ITensorHandleFactory& tensorHandleFactory,
1958 const armnn::ITensorHandleFactory& refTensorHandleFactory,
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001959 armnn::PoolingAlgorithm poolingType)
1960{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001961 return ComparePooling2dTestCommon<armnn::DataType::QSymmS16>(
Finn Williams826a5432020-08-27 16:15:20 +01001962 workloadFactory, memoryManager, refWorkloadFactory, tensorHandleFactory, refTensorHandleFactory, poolingType);
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001963}