blob: f250fa5ac06a0375537abcfe9e0365ea58b2a468 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
telsoa014fcda012018-03-09 14:13:49 +00005
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01006#include "Pooling2dTestImpl.hpp"
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00007
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01008#include <armnn/LayerSupport.hpp>
telsoa014fcda012018-03-09 14:13:49 +00009
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010010#include <DataLayoutIndexed.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000011#include <Permute.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010012#include <ResolveType.hpp>
13#include <TensorUtils.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <backendsCommon/WorkloadInfo.hpp>
16
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010017#include <backendsCommon/test/QuantizeHelper.hpp>
18#include <backendsCommon/test/TensorCopyUtils.hpp>
19#include <backendsCommon/test/WorkloadTestUtils.hpp>
20
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000021#include <test/TensorHelpers.hpp>
22
James Conroy45a9b772018-10-31 11:47:53 +000023#include <boost/numeric/conversion/cast.hpp>
telsoa014fcda012018-03-09 14:13:49 +000024
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010025namespace
26{
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000027
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000028template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000029LayerTestResult<T, 4> SimplePooling2dTestImpl(
30 armnn::IWorkloadFactory& workloadFactory,
31 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
32 armnn::Pooling2dDescriptor descriptor,
33 float qScale,
34 int32_t qOffset,
35 const boost::multi_array<T, 4>& input,
36 const boost::multi_array<T, 4>& outputExpected)
telsoa014fcda012018-03-09 14:13:49 +000037{
Matthew Bentham8800c002018-11-19 13:19:28 +000038 const armnn::DataLayout dataLayout = descriptor.m_DataLayout;
Matteo Martincigh21350152018-11-28 16:22:22 +000039 const armnnUtils::DataLayoutIndexed dimensionIndices = dataLayout;
Matthew Bentham8800c002018-11-19 13:19:28 +000040 auto heightIndex = dimensionIndices.GetHeightIndex();
41 auto widthIndex = dimensionIndices.GetWidthIndex();
42 auto channelsIndex = dimensionIndices.GetChannelsIndex();
telsoa014fcda012018-03-09 14:13:49 +000043
James Conroy69482272018-10-19 10:41:35 +010044 unsigned int inputHeight = boost::numeric_cast<unsigned int>(input.shape()[heightIndex]);
45 unsigned int inputWidth = boost::numeric_cast<unsigned int>(input.shape()[widthIndex]);
46 unsigned int inputChannels = boost::numeric_cast<unsigned int>(input.shape()[channelsIndex]);
47 unsigned int inputBatchSize = boost::numeric_cast<unsigned int>(input.shape()[0]);
48
49 unsigned int outputHeight = boost::numeric_cast<unsigned int>(outputExpected.shape()[heightIndex]);
50 unsigned int outputWidth = boost::numeric_cast<unsigned int>(outputExpected.shape()[widthIndex]);
51 unsigned int outputChannels = boost::numeric_cast<unsigned int>(outputExpected.shape()[channelsIndex]);
telsoa014fcda012018-03-09 14:13:49 +000052 unsigned int outputBatchSize = boost::numeric_cast<unsigned int>(outputExpected.shape()[0]);
53
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +000054 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(
55 inputBatchSize, inputChannels, inputHeight, inputWidth, dataLayout, ArmnnType);
56
57 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(
58 outputBatchSize, outputChannels, outputHeight, outputWidth, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +000059
60 // Set quantization parameters if the requested type is a quantized type.
61 if(armnn::IsQuantizedType<T>())
62 {
63 inputTensorInfo.SetQuantizationScale(qScale);
64 inputTensorInfo.SetQuantizationOffset(qOffset);
65 outputTensorInfo.SetQuantizationScale(qScale);
66 outputTensorInfo.SetQuantizationOffset(qOffset);
67 }
68
69 LayerTestResult<T, 4> result(outputTensorInfo);
70
71 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
72 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
73
74 armnn::Pooling2dQueueDescriptor queueDescriptor;
75 queueDescriptor.m_Parameters = descriptor;
James Conroy45a9b772018-10-31 11:47:53 +000076 queueDescriptor.m_Parameters.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +010077
78 armnn::WorkloadInfo workloadInfo;
79 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
80 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
81
82 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +010083 armnn::BackendId backend = workloadFactory.GetBackendId();
Francis Murtagh043d0d02018-10-05 14:08:48 +010084 const size_t reasonIfUnsupportedMaxLen = 255;
85 char reasonIfUnsupported[reasonIfUnsupportedMaxLen+1];
David Beck79141b92018-10-23 16:09:36 +010086 result.supported = armnn::IsPooling2dSupported(backend, inputTensorInfo, outputTensorInfo,
Francis Murtagh043d0d02018-10-05 14:08:48 +010087 queueDescriptor.m_Parameters,
88 reasonIfUnsupported, reasonIfUnsupportedMaxLen);
89 if (!result.supported)
90 {
91 return result;
92 }
93
94 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
95
96 inputHandle->Allocate();
97 outputHandle->Allocate();
98
99 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
100
101 workload->Execute();
102
103 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
104
105 result.outputExpected = outputExpected;
106
107 return result;
108}
109
telsoa014fcda012018-03-09 14:13:49 +0000110//
111// Tests max pooling with the following parameters:
112//
113// Pooling size: 3x3
114// Stride: (2,4)
115// input size: 8x13
116// channels: 2
117// batch size: 2
118//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000119template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000120LayerTestResult<T, 4> SimpleMaxPooling2dSize3x3Stride2x4TestCommon(
121 armnn::IWorkloadFactory& workloadFactory,
122 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
123 bool forceNoPadding,
124 float qScale = 1.0f,
125 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000126{
127 armnn::Pooling2dDescriptor descriptor;
128 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
129 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
130 descriptor.m_StrideX = 2;
131 descriptor.m_StrideY = 4;
132 // forceNoPadding is mainly used for compatibility with ARM Compute.
133 // As of 16/05/2017, it errors if padX or padY are equal to or greater than the pool size.
134 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
135 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
136 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
137 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
138
139 unsigned int inputWidth = 8;
140 unsigned int inputHeight = 13;
141 unsigned int outputWidth =
142 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
143 descriptor.m_StrideX;
144 unsigned int outputHeight =
145 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
146 descriptor.m_StrideY;
147 unsigned int channels = 2;
148 unsigned int batchSize = 2;
149
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000150 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
151 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000152
153 // Set quantization parameters if the requested type is a quantized type.
154 if(armnn::IsQuantizedType<T>())
155 {
156 inputTensorInfo.SetQuantizationScale(qScale);
157 inputTensorInfo.SetQuantizationOffset(qOffset);
158 outputTensorInfo.SetQuantizationScale(qScale);
159 outputTensorInfo.SetQuantizationOffset(qOffset);
160 }
161
162 std::vector<float> singleChannelData({
163 0.0f, 4.0f, 8.0f, 1.0f, 6.0f, 4.0f, 5.0f, 8.0f,
164 1.0f, 1.0f, 6.0f, 0.0f, 3.0f, 7.0f, 4.0f, 7.0f,
165 8.0f, 5.0f, 0.0f, 0.0f, 8.0f, 3.0f, 4.0f, 3.0f,
166 8.0f, 2.0f, 5.0f, 4.0f, 1.0f, 9.0f, 2.0f, 0.0f,
167 5.0f, 4.0f, 5.0f, 0.0f, 0.0f, 0.0f, 7.0f, 2.0f,
168 1.0f, 2.0f, 6.0f, 2.0f, 7.0f, 9.0f, 5.0f, 2.0f,
169 9.0f, 7.0f, 3.0f, 1.0f, 3.0f, 4.0f, 8.0f, 3.0f,
170 1.0f, 0.0f, 0.0f, 5.0f, 5.0f, 4.0f, 2.0f, 0.0f,
171 6.0f, 4.0f, 3.0f, 6.0f, 9.0f, 5.0f, 5.0f, 6.0f,
172 8.0f, 7.0f, 9.0f, 6.0f, 1.0f, 4.0f, 1.0f, 9.0f,
173 7.0f, 1.0f, 9.0f, 2.0f, 9.0f, 9.0f, 8.0f, 1.0f,
174 4.0f, 4.0f, 5.0f, 9.0f, 2.0f, 6.0f, 6.0f, 4.0f,
175 3.0f, 5.0f, 4.0f, 0.0f, 1.0f, 5.0f, 9.0f, 7.0f,
176 });
177
telsoa01c577f2c2018-08-31 09:22:23 +0100178 // Constructs input data.
telsoa014fcda012018-03-09 14:13:49 +0000179 std::vector<float> inputData;
180 auto negator = [](float f) { return -f; };
181
telsoa01c577f2c2018-08-31 09:22:23 +0100182 // First image (two channels where the second channel is the negative of the first one).
telsoa014fcda012018-03-09 14:13:49 +0000183 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
184 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
185
telsoa01c577f2c2018-08-31 09:22:23 +0100186 // Second image (same as first image).
telsoa014fcda012018-03-09 14:13:49 +0000187 inputData.insert(inputData.end(), singleChannelData.begin(), singleChannelData.end());
188 std::transform(singleChannelData.begin(), singleChannelData.end(), std::back_inserter(inputData), negator);
189
190 auto input = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
191
telsoa01c577f2c2018-08-31 09:22:23 +0100192 // These were calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000193 auto shape(GetTensorShapeAsArray<4>(outputTensorInfo));
194 boost::multi_array<T, 4> outputExpected(shape);
195 if (forceNoPadding)
196 {
197 outputExpected = MakeTensor<T, 4>(outputTensorInfo,
198 QuantizedVector<T>(qScale, qOffset, {
199 8.0f, 8.0f, 8.0f,
200 9.0f, 7.0f, 9.0f,
201 9.0f, 9.0f, 9.0f,
202
203 0.0f, 0.0f, -3.0f,
204 -1.0f, 0.0f, 0.0f,
205 -1.0f, -1.0f, -1.0f,
206
207 8.0f, 8.0f, 8.0f,
208 9.0f, 7.0f, 9.0f,
209 9.0f, 9.0f, 9.0f,
210
211 0.0f, 0.0f, -3.0f,
212 -1.0f, 0.0f, 0.0f,
213 -1.0f, -1.0f, -1.0f
214 }));
215 }
216 else
217 {
218 outputExpected = MakeTensor<T, 4>(outputTensorInfo,
219 QuantizedVector<T>(qScale, qOffset, {
220 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
221 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
222 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
223
224 0.0f, 0.0f, 0.0f, 0.0f,-3.0f, 0.0f,
225 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
226 0.0f,-1.0f,-1.0f,-1.0f,-1.0f, 0.0f,
227
228 0.0f, 8.0f, 8.0f, 8.0f, 8.0f, 8.0f,
229 0.0f, 9.0f, 7.0f, 9.0f, 9.0f, 3.0f,
230 0.0f, 8.0f, 9.0f, 9.0f, 9.0f, 9.0f,
231
232 0.0f, 0.0f, 0.0f, 0.0f,-3.0f, 0.0f,
233 0.0f,-1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
234 0.0f,-1.0f,-1.0f,-1.0f,-1.0f, 0.0f
235 }));
236 }
237
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000238 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000239 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000240}
241
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000242template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000243LayerTestResult<T, 4> SimpleMaxPooling2dTestCommon(
244 armnn::IWorkloadFactory& workloadFactory,
245 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Matthew Bentham8800c002018-11-19 13:19:28 +0000246 const armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000247 float qScale = 1.0f,
248 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000249{
250 armnn::Pooling2dDescriptor descriptor;
James Conroy45a9b772018-10-31 11:47:53 +0000251 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
telsoa014fcda012018-03-09 14:13:49 +0000252 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
253 descriptor.m_StrideX = descriptor.m_StrideY = 2;
telsoa014fcda012018-03-09 14:13:49 +0000254 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy69482272018-10-19 10:41:35 +0100255 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000256
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000257 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
258 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000259
260 // Set quantization parameters if the requested type is a quantized type.
261 if(armnn::IsQuantizedType<T>())
262 {
263 inputTensorInfo.SetQuantizationScale(qScale);
264 inputTensorInfo.SetQuantizationOffset(qOffset);
265 outputTensorInfo.SetQuantizationScale(qScale);
266 outputTensorInfo.SetQuantizationOffset(qOffset);
267 }
268
James Conroy45a9b772018-10-31 11:47:53 +0000269 std::vector<T> inputData(
telsoa014fcda012018-03-09 14:13:49 +0000270 QuantizedVector<T>(qScale, qOffset, {
James Conroy45a9b772018-10-31 11:47:53 +0000271 1.0f, 2.0f, 5.0f, 6.0f,
272 3.0f, 4.0f, 7.0f, 8.0f,
273 9.0f, 10.0f, 13.0f, 14.0f,
274 11.0f, 12.0f, 15.0f, 16.0f,
275
276 17.0f, 18.0f, 21.0f, 22.0f,
277 19.0f, 20.0f, 23.0f, 24.0f,
278 25.0f, 26.0f, 29.0f, 30.0f,
279 27.0f, 28.0f, 31.0f, 32.0f,
telsoa014fcda012018-03-09 14:13:49 +0000280 }));
281
James Conroy45a9b772018-10-31 11:47:53 +0000282 std::vector<T> outputData(
telsoa014fcda012018-03-09 14:13:49 +0000283 QuantizedVector<T>(qScale, qOffset, {
James Conroy45a9b772018-10-31 11:47:53 +0000284 4.0f, 8.0f,
285 12.0f, 16.0f,
286
287 20.0f, 24.0f,
288 28.0f, 32.0f,
telsoa014fcda012018-03-09 14:13:49 +0000289 }));
290
James Conroy45a9b772018-10-31 11:47:53 +0000291 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000292 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000293 {
294 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000295 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000296 inputData = tmp;
297
298 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000299 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000300 outputData = tmp1;
301 }
302
303 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
304
305 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
306
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000307 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000308 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000309}
310
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000311template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000312LayerTestResult<T, 4> SimpleAveragePooling2dTestCommon(
313 armnn::IWorkloadFactory& workloadFactory,
314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Matthew Bentham8800c002018-11-19 13:19:28 +0000315 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000316 float qScale = 1.0f,
317 int32_t qOffset = 0)
Francis Murtagh043d0d02018-10-05 14:08:48 +0100318{
James Conroy45a9b772018-10-31 11:47:53 +0000319 armnn::Pooling2dDescriptor descriptor;
320 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
321 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
322 descriptor.m_StrideX = descriptor.m_StrideY = 2;
323 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
324 descriptor.m_DataLayout = dataLayout;
Francis Murtagh043d0d02018-10-05 14:08:48 +0100325
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000326 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
327 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
Francis Murtagh043d0d02018-10-05 14:08:48 +0100328
James Conroy45a9b772018-10-31 11:47:53 +0000329 // Set quantization parameters if the requested type is a quantized type.
330 if(armnn::IsQuantizedType<T>())
331 {
332 inputTensorInfo.SetQuantizationScale(qScale);
333 inputTensorInfo.SetQuantizationOffset(qOffset);
334 outputTensorInfo.SetQuantizationScale(qScale);
335 outputTensorInfo.SetQuantizationOffset(qOffset);
336 }
Francis Murtagh043d0d02018-10-05 14:08:48 +0100337
James Conroy45a9b772018-10-31 11:47:53 +0000338 std::vector<T> inputData(
339 QuantizedVector<T>(qScale, qOffset, {
340 2.0f, 2.0f, 6.0f, 6.0f,
341 4.0f, 4.0f, 8.0f, 8.0f,
342 10.0f, 12.0f, 14.0f, 16.0f,
343 10.0f, 12.0f, 16.0f, 14.0f,
344
345 18.0f, 20.0f, 24.0f, 22.0f,
346 20.0f, 18.0f, 22.0f, 24.0f,
347 26.0f, 28.0f, 0.0f, 0.0f,
348 26.0f, 28.0f, 0.0f, 0.0f,
349 }));
350
351 std::vector<T> outputData(
352 QuantizedVector<T>(qScale, qOffset, {
353 3.0f, 7.0f,
354 11.0f, 15.0f,
355
356 19.0f, 23.0f,
357 27.0f, 0.0f,
358 }));
359
360 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000361 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000362 {
363 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000364 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000365 inputData = tmp;
366
367 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000368 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000369 outputData = tmp1;
370 }
371
372 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
373
374 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
375
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000376 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000377 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
Francis Murtagh043d0d02018-10-05 14:08:48 +0100378}
379
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000380template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000381LayerTestResult<T, 4> LargeTensorsAveragePooling2dTestCommon(
382 armnn::IWorkloadFactory& workloadFactory,
383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
384 float qScale = 1.0f,
385 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000386{
387 armnn::Pooling2dDescriptor descriptor;
388 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
389 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 100;
390 descriptor.m_StrideX = descriptor.m_StrideY = 5;
391 descriptor.m_PadLeft = 50;
392 descriptor.m_PadRight = 50;
393 descriptor.m_PadTop = 50;
394 descriptor.m_PadBottom = 50;
395 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
396
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000397 armnn::TensorInfo inputTensorInfo({ 5, 3, 52, 60 }, ArmnnType);
398 armnn::TensorInfo outputTensorInfo({ 5, 3, 11, 13 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000399
400 // Set quantization parameters if the requested type is a quantized type.
401 if(armnn::IsQuantizedType<T>())
402 {
403 inputTensorInfo.SetQuantizationScale(qScale);
404 inputTensorInfo.SetQuantizationOffset(qOffset);
405 outputTensorInfo.SetQuantizationScale(qScale);
406 outputTensorInfo.SetQuantizationOffset(qOffset);
407 }
408
409 std::vector<T> inputVec;
410
411 for (unsigned int i = 0 ; i < inputTensorInfo.GetShape().GetNumElements(); ++i)
412 {
413 inputVec.push_back(1);
414 }
415
416 auto input = MakeTensor<T, 4>(inputTensorInfo, inputVec);
417
418 std::vector<T> outputVec;
419
420 for (unsigned int i = 0 ; i < outputTensorInfo.GetShape().GetNumElements(); ++i)
421 {
422 outputVec.push_back(1);
423 }
424
425 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputVec);
426
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000427 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000428 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000429}
430
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000431template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000432LayerTestResult<T, 4> SimpleL2Pooling2dTestCommon(
433 armnn::IWorkloadFactory& workloadFactory,
434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
Matthew Bentham8800c002018-11-19 13:19:28 +0000435 armnn::DataLayout dataLayout = armnn::DataLayout::NCHW,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000436 float qScale = 1.0f,
437 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000438{
439 armnn::Pooling2dDescriptor descriptor;
440 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
441 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
442 descriptor.m_StrideX = descriptor.m_StrideY = 2;
443 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
James Conroy45a9b772018-10-31 11:47:53 +0000444 descriptor.m_DataLayout = dataLayout;
telsoa014fcda012018-03-09 14:13:49 +0000445
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000446 armnn::TensorInfo inputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, ArmnnType);
447 armnn::TensorInfo outputTensorInfo = armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, ArmnnType);
James Conroy45a9b772018-10-31 11:47:53 +0000448
449 std::vector<T> inputData(
telsoa014fcda012018-03-09 14:13:49 +0000450 QuantizedVector<T>(qScale, qOffset, {
James Conroy45a9b772018-10-31 11:47:53 +0000451 1.0f, 7.0f, 5.0f, 5.0f,
452 1.0f, 7.0f, 5.0f, 5.0f,
453 3.0f, 3.0f, 1.0f, 1.0f,
454 3.0f, 3.0f, 1.0f, 1.0f,
455
456 1.0f, 7.0f, 0.0f, 0.0f,
457 1.0f, 7.0f, 2.0f, 0.0f,
458 0.0f, 2.0f, 1.0f, 1.0f,
459 0.0f, 0.0f, 1.0f, 1.0f,
telsoa014fcda012018-03-09 14:13:49 +0000460 }));
461
James Conroy45a9b772018-10-31 11:47:53 +0000462 std::vector<T> outputData(
telsoa014fcda012018-03-09 14:13:49 +0000463 QuantizedVector<T>(qScale, qOffset, {
464 5.0f, 5.0f,
James Conroy45a9b772018-10-31 11:47:53 +0000465 3.0f, 1.0f,
466
467 5.0f, 1.0f,
468 1.0f, 1.0f,
telsoa014fcda012018-03-09 14:13:49 +0000469 }));
470
James Conroy45a9b772018-10-31 11:47:53 +0000471 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
Matthew Bentham8800c002018-11-19 13:19:28 +0000472 if (dataLayout == armnn::DataLayout::NHWC)
James Conroy45a9b772018-10-31 11:47:53 +0000473 {
474 std::vector<T> tmp(inputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000475 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000476 inputData = tmp;
477
478 std::vector<T> tmp1(outputData.size());
Matteo Martincighd5b9e642019-01-04 18:01:21 +0000479 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(T));
James Conroy45a9b772018-10-31 11:47:53 +0000480 outputData = tmp1;
481 }
482
483 auto input = MakeTensor<T, 4>(inputTensorInfo, inputData);
484
485 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo, outputData);
486
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000487 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000488 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000489}
490
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000491template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000492LayerTestResult<T, 4> L2Pooling2dSize3Stride1TestCommon(
493 armnn::IWorkloadFactory& workloadFactory,
494 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
495 float qScale = 1.0f,
496 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000497{
498 armnn::Pooling2dDescriptor descriptor;
499 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
500 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
501 descriptor.m_StrideX = descriptor.m_StrideY = 1;
502 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
503
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000504 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000505 auto input = MakeTensor<T, 4>(inputTensorInfo,
506 QuantizedVector<T>(qScale, qOffset, {
507 2.0f, 1.0f, 5.0f, 2.0f,
508 1.0f, 2.0f, 2.0f, 1.0f,
509 5.0f, 4.0f, 1.0f, 5.0f,
510 2.0f, 1.0f, 5.0f, 2.0f,
511 }));
512
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000513 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000514 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
515 QuantizedVector<T>(qScale, qOffset, {
516 3.0f, 3.0f,
517 3.0f, 3.0f,
518 }));
519
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000520 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000521 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000522}
523
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000524template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000525LayerTestResult<T, 4> L2Pooling2dSize3Stride3TestCommon(
526 armnn::IWorkloadFactory& workloadFactory,
527 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
528 float qScale = 1.0f,
529 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000530{
531 armnn::Pooling2dDescriptor descriptor;
532 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
533 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
534 descriptor.m_StrideX = descriptor.m_StrideY = 3;
535 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
536
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000537 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000538 auto input = MakeTensor<T, 4>(inputTensorInfo,
539 QuantizedVector<T>(qScale, qOffset, {
540 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
541 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
542 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
543 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
544 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
545 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
546 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
547 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
548 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
549 }));
550
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000551 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000552 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
553 QuantizedVector<T>(qScale, qOffset, {
554 3.0f, 3.0f, 3.0f,
555 3.0f, 3.0f, 3.0f,
556 3.0f, 3.0f, 3.0f,
557 }));
558
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000559 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000560 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000561}
562
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000563template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000564LayerTestResult<T, 4> L2Pooling2dSize3Stride4TestCommon(
565 armnn::IWorkloadFactory& workloadFactory,
566 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
567 float qScale = 1.0f,
568 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000569{
570 armnn::Pooling2dDescriptor descriptor;
571 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
572 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
573 descriptor.m_StrideX = descriptor.m_StrideY = 4;
574 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
575
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000576 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000577 auto input = MakeTensor<T, 4>(inputTensorInfo,
578 QuantizedVector<T>(qScale, qOffset, {
579 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
580 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
581 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
582 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
583 2.0f, 1.0f, 5.0f, 0.0f, 2.0f, 1.0f, 5.0f,
584 1.0f, 2.0f, 2.0f, 0.0f, 1.0f, 2.0f, 2.0f,
585 5.0f, 4.0f, 1.0f, 0.0f, 5.0f, 4.0f, 1.0f,
586 }));
587
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000588 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000589 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
590 QuantizedVector<T>(qScale, qOffset, {
591 3.0f, 3.0f,
592 3.0f, 3.0f,
593 }));
594
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000595 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000596 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000597}
598
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000599template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000600LayerTestResult<T, 4> L2Pooling2dSize7TestCommon(
601 armnn::IWorkloadFactory& workloadFactory,
602 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
603 float qScale = 1.0f,
604 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000605{
606 armnn::Pooling2dDescriptor descriptor;
607 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
608 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 7;
609 descriptor.m_StrideX = descriptor.m_StrideY = 7;
610 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
611
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000612 armnn::TensorInfo inputTensorInfo({ 1, 1, 7, 7 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000613 auto input = MakeTensor<T, 4>(inputTensorInfo,
614 QuantizedVector<T>(qScale, qOffset, {
615 1.0f, 0.0f, 2.0f, 0.0f, 3.0f, 0.0f, 4.0f,
616 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
617 0.0f, 5.0f, 0.0f, 6.0f, 0.0f, 7.0f, 0.0f,
618 8.0f, 0.0f, 9.0f, 0.0f, 10.0f, 0.0f, 5.0f,
619 0.0f, 5.0f, 0.0f, 2.0f, 0.0f, 1.0f, 1.0f,
620 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
621 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
622 }));
623
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000624 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000625 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
626 QuantizedVector<T>(qScale, qOffset, {
627 3.0f,
628 }));
629
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000630 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000631 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000632}
633
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000634template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000635LayerTestResult<T, 4> L2Pooling2dSize9TestCommon(
636 armnn::IWorkloadFactory& workloadFactory,
637 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
638 float qScale = 1.0f,
639 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000640{
641 armnn::Pooling2dDescriptor descriptor;
642 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
643 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 9;
644 descriptor.m_StrideX = descriptor.m_StrideY = 9;
645 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
646
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000647 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000648 auto input = MakeTensor<T, 4>(inputTensorInfo,
649 QuantizedVector<T>(qScale, qOffset, {
650 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
651 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
652 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
653 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
654 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
655 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
656 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f, 2.0f, 1.0f, 5.0f,
657 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f, 1.0f, 2.0f, 2.0f,
658 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f, 5.0f, 4.0f, 1.0f,
659 }));
660
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000661 armnn::TensorInfo outputTensorInfo({ 1, 1, 1, 1 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000662 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
663 QuantizedVector<T>(qScale, qOffset, {
664 3.0f,
665 }));
666
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000667 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000668 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000669}
670
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000671template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000672LayerTestResult<T, 4> AsymmetricNonSquarePooling2dTestCommon(
673 armnn::IWorkloadFactory& workloadFactory,
674 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
675 float qScale = 1.0f,
676 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000677{
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000678 armnn::TensorInfo inputTensorInfo({ 1, 1, 1, 3 }, ArmnnType);
679 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000680
681 armnn::Pooling2dDescriptor descriptor;
682 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
683 descriptor.m_PoolWidth = 2;
684 descriptor.m_PoolHeight = 3;
685 descriptor.m_StrideX = 2;
686 descriptor.m_StrideY = 1;
687 descriptor.m_PadLeft = 2;
688 descriptor.m_PadRight = 0;
689 descriptor.m_PadTop = 1;
690 descriptor.m_PadBottom = 2;
691 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
692 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
693
telsoa01c577f2c2018-08-31 09:22:23 +0100694 // Construct input data.
telsoa014fcda012018-03-09 14:13:49 +0000695 auto input = MakeTensor<T, 4>(inputTensorInfo,
696 QuantizedVector<T>(qScale, qOffset, {
697 1.0f, 3.0f, 4.0f,
698 }));
699
telsoa01c577f2c2018-08-31 09:22:23 +0100700 // These were calculated manually.
telsoa014fcda012018-03-09 14:13:49 +0000701 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
702 QuantizedVector<T>(qScale, qOffset, {
703 0.0f, 3.0f, 0.0f, 3.0f,
704 }));
705
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000706 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000707 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000708}
709
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000710template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000711LayerTestResult<T, 4> ComparePooling2dTestCommon(
712 armnn::IWorkloadFactory& workloadFactory,
713 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
714 armnn::IWorkloadFactory& refWorkloadFactory,
715 armnn::PoolingAlgorithm poolingType,
716 float qScale = 1.0f,
717 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000718{
719 const unsigned int inputWidth = 16;
720 const unsigned int inputHeight = 32;
721 const unsigned int channelCount = 2;
722 const unsigned int batchSize = 5;
723
724 const unsigned int poolSize = 3;
725 const unsigned int strideX = 2;
726 const unsigned int strideY = 4;
727 const unsigned int padX = 0;
728 const unsigned int padY = 0;
729
730 const unsigned int outputWidth = (inputWidth + 2 * padX + strideX - poolSize) / strideX;
731 const unsigned int outputHeight = (inputHeight + 2 * padY + strideY - poolSize) / strideY;
732
733 armnn::TensorInfo inputTensorInfo;
734 armnn::TensorInfo outputTensorInfo;
735
736 unsigned int inputShape[] = { batchSize, channelCount, inputHeight, inputWidth };
737 unsigned int outputShape[] = { batchSize, channelCount, outputHeight, outputWidth };
738
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000739 inputTensorInfo = armnn::TensorInfo(4, inputShape, ArmnnType);
740 outputTensorInfo = armnn::TensorInfo(4, outputShape, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000741
742 // Set quantization parameters if the requested type is a quantized type.
743 if(armnn::IsQuantizedType<T>())
744 {
745 inputTensorInfo.SetQuantizationScale(qScale);
746 inputTensorInfo.SetQuantizationOffset(qOffset);
747 outputTensorInfo.SetQuantizationScale(qScale);
748 outputTensorInfo.SetQuantizationOffset(qOffset);
749 }
750
751 boost::multi_array<T, 4> input = MakeRandomTensor<T, 4>(inputTensorInfo, 81715);
752
753 LayerTestResult<T, 4> comparisonResult(outputTensorInfo);
754
755 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
756 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
757
758 armnn::Pooling2dQueueDescriptor data;
759 armnn::WorkloadInfo info;
760 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
761 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
762 data.m_Parameters.m_PoolType = poolingType;
763 data.m_Parameters.m_PoolWidth = poolSize;
764 data.m_Parameters.m_PoolHeight = poolSize;
765 data.m_Parameters.m_StrideX = strideX;
766 data.m_Parameters.m_StrideY = strideY;
767 data.m_Parameters.m_PadLeft = padX;
768 data.m_Parameters.m_PadRight = padX;
769 data.m_Parameters.m_PadTop = padY;
770 data.m_Parameters.m_PadBottom = padY;
771 data.m_Parameters.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
772
773 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
774 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.CreateTensorHandle(inputTensorInfo);
775
776 // Don't execute if Pooling is not supported, as an exception will be raised.
David Beck79141b92018-10-23 16:09:36 +0100777 armnn::BackendId backend = workloadFactory.GetBackendId();
telsoa014fcda012018-03-09 14:13:49 +0000778 const size_t reasonIfUnsupportedMaxLen = 255;
779 char reasonIfUnsupported[reasonIfUnsupportedMaxLen+1];
David Beck79141b92018-10-23 16:09:36 +0100780 comparisonResult.supported = armnn::IsPooling2dSupported(backend, inputTensorInfo, outputTensorInfo,
telsoa014fcda012018-03-09 14:13:49 +0000781 data.m_Parameters,
782 reasonIfUnsupported, reasonIfUnsupportedMaxLen);
783 if (!comparisonResult.supported)
784 {
785 return comparisonResult;
786 }
787
788 armnn::Pooling2dQueueDescriptor refData = data;
789 armnn::WorkloadInfo refInfo = info;
790 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
791 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
792
793 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(data, info);
794 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreatePooling2d(refData, refInfo);
795
796 outputHandleRef->Allocate();
797 inputHandleRef->Allocate();
798 inputHandle->Allocate();
799 outputHandle->Allocate();
800
801 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
802 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
803
804 workload->Execute();
805 workloadRef->Execute();
806
807 CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
808 CopyDataFromITensorHandle(&comparisonResult.outputExpected[0][0][0][0], outputHandleRef.get());
809
810 return comparisonResult;
811}
812
813//
814// Tests max pooling with the following parameters:
815//
816// Pooling size: 2x2
817// Stride: (2,2)
818// input size: 4x4
819// channels: 1
820// batch size: 1
821//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000822template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000823LayerTestResult<T, 4> SimpleMaxPooling2dSize2x2Stride2x2TestCommon(
824 armnn::IWorkloadFactory& workloadFactory,
825 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
826 bool forceNoPadding,
827 float qScale = 1.0f,
828 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000829{
830 armnn::Pooling2dDescriptor descriptor;
831 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
832 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
833 descriptor.m_StrideX = 2;
834 descriptor.m_StrideY = 2;
835 descriptor.m_PadLeft = descriptor.m_PadRight = forceNoPadding ? 0 : 3;
836 descriptor.m_PadTop = descriptor.m_PadBottom = 0;
837 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
838 descriptor.m_PaddingMethod = armnn::PaddingMethod::Exclude;
839
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000840
telsoa014fcda012018-03-09 14:13:49 +0000841 unsigned int inputWidth = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000842
telsoa014fcda012018-03-09 14:13:49 +0000843 unsigned int inputHeight = 4;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000844
telsoa014fcda012018-03-09 14:13:49 +0000845 unsigned int outputWidth =
846 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
847 descriptor.m_StrideX;
848 unsigned int outputHeight =
849 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
850 descriptor.m_StrideY;
851 unsigned int channels = 1;
852 unsigned int batchSize = 1;
853
854 std::vector<float> inputData = {
855 510.0f, 222.0f, 780.0f, 654.0f,
856 141.0f, 276.0f, 15.0f, 546.0f,
857 303.0f, 618.0f, 582.0f, 339.0f,
858 438.0f, 564.0f, 573.0f, 402.0f
859 };
860
telsoa01c577f2c2018-08-31 09:22:23 +0100861 // 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 +0000862 std::vector<float> expectedOutputDataWithPadding = {
863 0.0f, 510.0f, 780.0f, 654.0f, 0.0f,
864 0.0f, 438.0f, 618.0f, 402.0f, 0.0f
865 };
866
867 std::vector<float> expectedOutputDataNoPadding = {
868 510.0f, 780.0f,
869 618.0f, 582.0f
870 };
871
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000872 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000873
874 // Scale and offset should match input - we're just calculating maximum values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000875 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000876
877 // Set quantization parameters if the requested type is a quantized type.
878 if(armnn::IsQuantizedType<T>())
879 {
880 inputTensorInfo.SetQuantizationScale(qScale);
881 inputTensorInfo.SetQuantizationOffset(qOffset);
882 outputTensorInfo.SetQuantizationScale(qScale);
883 outputTensorInfo.SetQuantizationOffset(qOffset);
884 }
885
886 auto input = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
887
888 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
889 forceNoPadding ? QuantizedVector<T>(qScale, qOffset, expectedOutputDataNoPadding) :
890 QuantizedVector<T>(qScale, qOffset, expectedOutputDataWithPadding));
891
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000892 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000893 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +0000894}
895
surmeh01bceff2f2018-03-29 16:29:27 +0100896//
897// Tests max pooling with the following parameters:
898//
899// Pooling size: 3x2
900// Stride: (2,2)
901// input size: 3x2
902// channels: 1
903// batch size: 1
904//
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000905template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
surmeh01bceff2f2018-03-29 16:29:27 +0100906LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon(
907 armnn::IWorkloadFactory& workloadFactory,
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000908 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
surmeh01bceff2f2018-03-29 16:29:27 +0100909 bool forceNoPadding,
910 float qScale = 1.0f,
911 int32_t qOffset = 0)
912{
913 armnn::Pooling2dDescriptor descriptor;
914 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
915 descriptor.m_PoolWidth = 3;
916 descriptor.m_PoolHeight = 2;
917 descriptor.m_StrideX = 2;
918 descriptor.m_StrideY = 2;
919 descriptor.m_PadLeft = (forceNoPadding) ? 0 : 1;
920 descriptor.m_PadRight = descriptor.m_PadLeft;
921 descriptor.m_PadTop = 0;
922 descriptor.m_PadBottom = 0;
923 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Floor;
924 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
925
926 unsigned int inputWidth = 3;
927 unsigned int inputHeight = 2;
928 unsigned int outputWidth =
929 (inputWidth + descriptor.m_PadLeft + descriptor.m_PadRight + descriptor.m_StrideX - descriptor.m_PoolWidth) /
930 descriptor.m_StrideX;
931 unsigned int outputHeight =
932 (inputHeight + descriptor.m_PadTop + descriptor.m_PadBottom + descriptor.m_StrideY - descriptor.m_PoolHeight) /
933 descriptor.m_StrideY;
934 unsigned int channels = 1;
935 unsigned int batchSize = 1;
936
937 std::vector<float> inputData = {
938 3.0f, 6.0f, 9.0f,
939 12.0f, 15.0f, 18.0f,
940 };
941
942 std::vector<float> expectedOutputDataWithPadding = {
943 6.0f, 8.0f,
944 };
945
946 std::vector<float> expectedOutputDataNoPadding = {
947 10.5f,
948 };
949
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000950 armnn::TensorInfo inputTensorInfo({ batchSize, channels, inputHeight, inputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100951
952 // Scale and offset should match input - we're just calculating average values.
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000953 armnn::TensorInfo outputTensorInfo({ batchSize, channels, outputHeight, outputWidth }, ArmnnType);
surmeh01bceff2f2018-03-29 16:29:27 +0100954
955 // Set quantization parameters if the requested type is a quantized type.
956 if(armnn::IsQuantizedType<T>())
957 {
958 inputTensorInfo.SetQuantizationScale(qScale);
959 inputTensorInfo.SetQuantizationOffset(qOffset);
960 outputTensorInfo.SetQuantizationScale(qScale);
961 outputTensorInfo.SetQuantizationOffset(qOffset);
962 }
963
964 auto input = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, inputData));
965
966 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
967 forceNoPadding ? QuantizedVector<T>(qScale, qOffset, expectedOutputDataNoPadding) :
968 QuantizedVector<T>(qScale, qOffset, expectedOutputDataWithPadding));
969
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000970 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000971 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
surmeh01bceff2f2018-03-29 16:29:27 +0100972}
973
974
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000975template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000976LayerTestResult<T, 4> IgnorePaddingSimpleMaxPooling2dTestCommon(
977 armnn::IWorkloadFactory& workloadFactory,
978 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
979 float qScale = 1.0f,
980 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +0000981{
982 armnn::Pooling2dDescriptor descriptor;
983 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
984 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
985 descriptor.m_StrideX = descriptor.m_StrideY = 2;
986 descriptor.m_PadLeft = 1;
987 descriptor.m_PadRight = 1;
988 descriptor.m_PadTop = 1;
989 descriptor.m_PadBottom = 1;
990 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
991
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +0000992 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
993 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +0000994
995 // Set quantization parameters if the requested type is a quantized type.
996 if(armnn::IsQuantizedType<T>())
997 {
998 inputTensorInfo.SetQuantizationScale(qScale);
999 inputTensorInfo.SetQuantizationOffset(qOffset);
1000 outputTensorInfo.SetQuantizationScale(qScale);
1001 outputTensorInfo.SetQuantizationOffset(qOffset);
1002 }
1003
1004 auto input = MakeTensor<T, 4>(inputTensorInfo,
1005 QuantizedVector<T>(qScale, qOffset, {
1006 -1.0f, -2.0f, 3.0f, 4.0f,
1007 -1.0f, -2.0f, 3.0f, 4.0f,
1008 1.0f, 2.0f, -3.0f, -4.0f,
1009 1.0f, 2.0f, -3.0f, -4.0f,
1010 }));
1011
1012 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1013 QuantizedVector<T>(qScale, qOffset, {
1014 -1.0f, 3.0f, 4.0f,
1015 1.0f, 3.0f, 4.0f,
1016 1.0f, 2.0f, -4.0f,
1017 }));
1018
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001019 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001020 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001021}
1022
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001023template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001024LayerTestResult<T, 4> IgnorePaddingMaxPooling2dSize3TestCommon(
1025 armnn::IWorkloadFactory& workloadFactory,
1026 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1027 float qScale = 1.0f,
1028 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001029{
1030 armnn::Pooling2dDescriptor descriptor;
1031 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
1032 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1033 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1034 descriptor.m_PadLeft = 1;
1035 descriptor.m_PadRight = 1;
1036 descriptor.m_PadTop = 1;
1037 descriptor.m_PadBottom = 1;
1038 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1039
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001040 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1041 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001042
1043 // Set quantization parameters if the requested type is a quantized type.
1044 if(armnn::IsQuantizedType<T>())
1045 {
1046 inputTensorInfo.SetQuantizationScale(qScale);
1047 inputTensorInfo.SetQuantizationOffset(qOffset);
1048 outputTensorInfo.SetQuantizationScale(qScale);
1049 outputTensorInfo.SetQuantizationOffset(qOffset);
1050 }
1051
1052 auto input = MakeTensor<T, 4>(inputTensorInfo,
1053 QuantizedVector<T>(qScale, qOffset, {
1054 -1.0f, -2.0f, 3.0f, 4.0f,
1055 -1.0f, -2.0f, 3.0f, 4.0f,
1056 1.0f, 2.0f, -3.0f, -4.0f,
1057 1.0f, 2.0f, -3.0f, -4.0f,
1058 }));
1059
1060 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1061 QuantizedVector<T>(qScale, qOffset, {
1062 -1.0f, 3.0f, 4.0f, 4.0f,
1063 2.0f, 3.0f, 4.0f, 4.0f,
1064 2.0f, 3.0f, 4.0f, 4.0f,
1065 2.0f, 2.0f, 2.0f, -3.0f,
1066 }));
1067
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001068 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001069 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001070}
1071
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001072template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001073LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dTestCommon(
1074 armnn::IWorkloadFactory& workloadFactory,
1075 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1076 float qScale = 1.0f,
1077 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001078{
1079 armnn::Pooling2dDescriptor descriptor;
1080 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1081 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1082 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1083 descriptor.m_PadLeft = 1;
1084 descriptor.m_PadRight = 1;
1085 descriptor.m_PadTop = 1;
1086 descriptor.m_PadBottom = 1;
1087 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1088
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001089 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1090 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001091
1092 // Set quantization parameters if the requested type is a quantized type.
1093 if(armnn::IsQuantizedType<T>())
1094 {
1095 inputTensorInfo.SetQuantizationScale(qScale);
1096 inputTensorInfo.SetQuantizationOffset(qOffset);
1097 outputTensorInfo.SetQuantizationScale(qScale);
1098 outputTensorInfo.SetQuantizationOffset(qOffset);
1099 }
1100
1101 auto input = MakeTensor<T, 4>(inputTensorInfo,
1102 QuantizedVector<T>(qScale, qOffset, {
1103 12.0f, 20.0f, 32.0f, 40.0f,
1104 12.0f, 20.0f, 32.0f, 40.0f,
1105 12.0f, 20.0f, 32.0f, 40.0f,
1106 12.0f, 20.0f, 32.0f, 40.0f,
1107 }));
1108
1109 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1110 QuantizedVector<T>(qScale, qOffset, {
1111 3.0f, 13.0f, 10.0f,
1112 6.0f, 26.0f, 20.0f,
1113 3.0f, 13.0f, 10.0f,
1114 }));
1115
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001116 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001117 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001118}
1119
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001120template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001121LayerTestResult<T, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon(
1122 armnn::IWorkloadFactory& workloadFactory,
1123 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1124 float qScale = 1.0f,
1125 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001126{
1127 armnn::Pooling2dDescriptor descriptor;
1128 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1129 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1130 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1131 descriptor.m_PadLeft = 0;
1132 descriptor.m_PadRight = 0;
1133 descriptor.m_PadTop = 0;
1134 descriptor.m_PadBottom = 0;
1135 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1136 descriptor.m_OutputShapeRounding = armnn::OutputShapeRounding::Ceiling;
1137
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001138 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1139 armnn::TensorInfo outputTensorInfo({ 1, 1, 2, 2 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001140
1141 // Set quantization parameters if the requested type is a quantized type.
1142 if(armnn::IsQuantizedType<T>())
1143 {
1144 inputTensorInfo.SetQuantizationScale(qScale);
1145 inputTensorInfo.SetQuantizationOffset(qOffset);
1146 outputTensorInfo.SetQuantizationScale(qScale);
1147 outputTensorInfo.SetQuantizationOffset(qOffset);
1148 }
1149
1150 auto input = MakeTensor<T, 4>(inputTensorInfo,
1151 QuantizedVector<T>(qScale, qOffset, {
1152 1.0f, 2.0f, 3.0f, 4.0f,
1153 1.0f, 2.0f, 3.0f, 4.0f,
1154 1.0f, 2.0f, 3.0f, 4.0f,
1155 1.0f, 2.0f, 3.0f, 4.0f,
1156 }));
1157
1158 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1159 QuantizedVector<T>(qScale, qOffset, {
1160 2.0f, 3.5f,
1161 2.0f, 3.5f
1162 }));
1163
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001164 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001165 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001166}
1167
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001168template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001169LayerTestResult<T, 4> IgnorePaddingAveragePooling2dSize3TestCommon(
1170 armnn::IWorkloadFactory& workloadFactory,
1171 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1172 float qScale = 1.0f,
1173 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001174{
1175 armnn::Pooling2dDescriptor descriptor;
1176 descriptor.m_PoolType = armnn::PoolingAlgorithm::Average;
1177 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1178 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1179 descriptor.m_PadLeft = 1;
1180 descriptor.m_PadRight = 1;
1181 descriptor.m_PadTop = 1;
1182 descriptor.m_PadBottom = 1;
1183 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1184
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001185 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1186 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001187
1188 // Set quantization parameters if the requested type is a quantized type.
1189 if(armnn::IsQuantizedType<T>())
1190 {
1191 inputTensorInfo.SetQuantizationScale(qScale);
1192 inputTensorInfo.SetQuantizationOffset(qOffset);
1193 outputTensorInfo.SetQuantizationScale(qScale);
1194 outputTensorInfo.SetQuantizationOffset(qOffset);
1195 }
1196
1197 auto input = MakeTensor<T, 4>(inputTensorInfo,
1198 QuantizedVector<T>(qScale, qOffset, {
1199 9.0f, 27.0f, 18.0f, 36.0f,
1200 18.0f, 9.0f, 18.0f, 9.0f,
1201 27.0f, 18.0f, 9.0f, 27.0f,
1202 9.0f, 27.0f, 9.0f, 18.0f,
1203 }));
1204
1205 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1206 QuantizedVector<T>(qScale, qOffset, {
1207 7.0f, 11.0f, 13.0f, 9.0f,
1208 12.0f, 17.0f, 19.0f, 13.0f,
1209 12.0f, 16.0f, 16.0f, 10.0f,
1210 9.0f, 11.0f, 12.0f, 7.0f,
1211 }));
1212
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001213 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001214 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001215}
1216
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001217template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001218LayerTestResult<T, 4> IgnorePaddingSimpleL2Pooling2dTestCommon(
1219 armnn::IWorkloadFactory& workloadFactory,
1220 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1221 float qScale = 1.0f,
1222 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001223{
1224 armnn::Pooling2dDescriptor descriptor;
1225 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1226 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 2;
1227 descriptor.m_StrideX = descriptor.m_StrideY = 2;
1228 descriptor.m_PadLeft = 1;
1229 descriptor.m_PadRight = 1;
1230 descriptor.m_PadTop = 1;
1231 descriptor.m_PadBottom = 1;
1232 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1233
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001234 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1235 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001236
1237 // Set quantization parameters if the requested type is a quantized type.
1238 if(armnn::IsQuantizedType<T>())
1239 {
1240 inputTensorInfo.SetQuantizationScale(qScale);
1241 inputTensorInfo.SetQuantizationOffset(qOffset);
1242 outputTensorInfo.SetQuantizationScale(qScale);
1243 outputTensorInfo.SetQuantizationOffset(qOffset);
1244 }
1245
1246 auto input = MakeTensor<T, 4>(inputTensorInfo,
1247 QuantizedVector<T>(qScale, qOffset, {
1248 2.0f, 4.0f, 8.0f, 16.0f,
1249 4.0f, 2.0f, 2.0f, 4.0f,
1250 8.0f, 2.0f, 4.0f, 2.0f,
1251 16.0f, 2.0f, 2.0f, 8.0f,
1252 }));
1253
1254 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1255 QuantizedVector<T>(qScale, qOffset, {
1256 1.0f, 4.4721f, 8.0f,
1257 4.4721f, 2.6457f, 2.236f,
1258 8.0f, 1.4142f, 4.0f,
1259 }));
1260
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001261 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001262 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001263}
1264
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001265template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001266LayerTestResult<T, 4> IgnorePaddingL2Pooling2dSize3TestCommon(
1267 armnn::IWorkloadFactory& workloadFactory,
1268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1269 float qScale = 1.0f,
1270 int32_t qOffset = 0)
telsoa014fcda012018-03-09 14:13:49 +00001271{
1272 armnn::Pooling2dDescriptor descriptor;
1273 descriptor.m_PoolType = armnn::PoolingAlgorithm::L2;
1274 descriptor.m_PoolWidth = descriptor.m_PoolHeight = 3;
1275 descriptor.m_StrideX = descriptor.m_StrideY = 1;
1276 descriptor.m_PadLeft = 1;
1277 descriptor.m_PadRight = 1;
1278 descriptor.m_PadTop = 1;
1279 descriptor.m_PadBottom = 1;
1280 descriptor.m_PaddingMethod = armnn::PaddingMethod::IgnoreValue;
1281
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001282 armnn::TensorInfo inputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
1283 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4 }, ArmnnType);
telsoa014fcda012018-03-09 14:13:49 +00001284
1285 // Set quantization parameters if the requested type is a quantized type.
1286 if(armnn::IsQuantizedType<T>())
1287 {
1288 inputTensorInfo.SetQuantizationScale(qScale);
1289 inputTensorInfo.SetQuantizationOffset(qOffset);
1290 outputTensorInfo.SetQuantizationScale(qScale);
1291 outputTensorInfo.SetQuantizationOffset(qOffset);
1292 }
1293
1294 auto input = MakeTensor<T, 4>(inputTensorInfo,
1295 QuantizedVector<T>(qScale, qOffset, {
1296 1.0f, 2.0f, 3.0f, 4.0f,
1297 1.0f, 2.0f, 3.0f, 4.0f,
1298 1.0f, 2.0f, 3.0f, 4.0f,
1299 1.0f, 2.0f, 3.0f, 4.0f,
1300 }));
1301
1302 auto outputExpected = MakeTensor<T, 4>(outputTensorInfo,
1303 QuantizedVector<T>(qScale, qOffset, {
1304 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1305 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1306 1.2909f, 2.1602f, 3.1091f, 2.8867f,
1307 1.0540f, 1.7638f, 2.5385f, 2.3570f,
1308 }));
1309
Nattapat Chaimanowong649dd952019-01-22 16:10:44 +00001310 return SimplePooling2dTestImpl<ArmnnType>(
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001311 workloadFactory, memoryManager, descriptor, qScale, qOffset, input, outputExpected);
telsoa014fcda012018-03-09 14:13:49 +00001312}
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +01001313
1314} // anonymous namespace
1315
1316LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
1317 armnn::IWorkloadFactory& workloadFactory,
1318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1319 bool forceNoPadding)
1320{
1321 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
1322 workloadFactory, memoryManager, forceNoPadding);
1323}
1324
1325LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
1326 armnn::IWorkloadFactory& workloadFactory,
1327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1328 bool forceNoPadding)
1329{
1330 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedAsymm8>(
1331 workloadFactory, memoryManager, forceNoPadding, 3.0f, -5);
1332}
1333
1334LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
1335 armnn::IWorkloadFactory& workloadFactory,
1336 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1337 bool forceNoPadding)
1338{
1339 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedSymm16>(
1340 workloadFactory, memoryManager, forceNoPadding);
1341}
1342
1343LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
1344 armnn::IWorkloadFactory& workloadFactory,
1345 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1346 bool forceNoPadding)
1347{
1348 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
1349 workloadFactory, memoryManager, forceNoPadding);
1350}
1351
1352LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
1353 armnn::IWorkloadFactory& workloadFactory,
1354 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1355 bool forceNoPadding)
1356{
1357 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedAsymm8>(
1358 workloadFactory, memoryManager, forceNoPadding, 0.1f, 128);
1359}
1360
1361LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
1362 armnn::IWorkloadFactory& workloadFactory,
1363 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1364 bool forceNoPadding)
1365{
1366 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedSymm16>(
1367 workloadFactory, memoryManager, forceNoPadding);
1368}
1369
1370LayerTestResult<float, 4> SimpleMaxPooling2dTest(
1371 armnn::IWorkloadFactory& workloadFactory,
1372 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1373 const armnn::DataLayout dataLayout)
1374{
1375 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
1376}
1377
1378LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
1379 armnn::IWorkloadFactory& workloadFactory,
1380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1381 const armnn::DataLayout dataLayout)
1382{
1383 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
1384}
1385
1386LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
1387 armnn::IWorkloadFactory& workloadFactory,
1388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1389 const armnn::DataLayout dataLayout)
1390{
1391 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
1392}
1393LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
1394 armnn::IWorkloadFactory& workloadFactory,
1395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1396{
1397 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1398}
1399
1400LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
1401 armnn::IWorkloadFactory& workloadFactory,
1402 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1403{
1404 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
1405 workloadFactory, memoryManager, 1.0f, -5);
1406}
1407
1408LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
1409 armnn::IWorkloadFactory& workloadFactory,
1410 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1411{
1412 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
1413 workloadFactory, memoryManager);
1414}
1415
1416LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
1417 armnn::IWorkloadFactory& workloadFactory,
1418 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1419{
1420 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1421}
1422
1423LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
1424 armnn::IWorkloadFactory& workloadFactory,
1425 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1426{
1427 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
1428 workloadFactory, memoryManager, 1.0f, -5);
1429}
1430
1431LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
1432 armnn::IWorkloadFactory& workloadFactory,
1433 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1434{
1435 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
1436 workloadFactory, memoryManager);
1437}
1438
1439LayerTestResult<float, 4> SimpleAveragePooling2dTest(
1440 armnn::IWorkloadFactory& workloadFactory,
1441 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1442 const armnn::DataLayout dataLayout)
1443{
1444 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
1445}
1446
1447LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
1448 armnn::IWorkloadFactory& workloadFactory,
1449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1450 const armnn::DataLayout dataLayout)
1451{
1452 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
1453 workloadFactory, memoryManager, dataLayout, 0.5, -1);
1454}
1455
1456LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
1457 armnn::IWorkloadFactory& workloadFactory,
1458 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1459 const armnn::DataLayout dataLayout)
1460{
1461 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
1462 workloadFactory, memoryManager, dataLayout);
1463}
1464
1465LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
1466 armnn::IWorkloadFactory& workloadFactory,
1467 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1468 bool forceNoPadding)
1469{
1470 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
1471 workloadFactory, memoryManager, forceNoPadding);
1472}
1473
1474LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
1475 armnn::IWorkloadFactory& workloadFactory,
1476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1477{
1478 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1479}
1480
1481LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
1482 armnn::IWorkloadFactory& workloadFactory,
1483 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1484{
1485 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
1486 workloadFactory, memoryManager, 0.5, -1);
1487}
1488
1489LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
1490 armnn::IWorkloadFactory& workloadFactory,
1491 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1492{
1493 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
1494 workloadFactory, memoryManager);
1495}
1496LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
1497 armnn::IWorkloadFactory& workloadFactory,
1498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1499{
1500 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1501}
1502
1503LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
1504 armnn::IWorkloadFactory& workloadFactory,
1505 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1506{
1507 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
1508 workloadFactory, memoryManager);
1509}
1510
1511LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
1512 armnn::IWorkloadFactory& workloadFactory,
1513 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1514{
1515 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
1516 workloadFactory, memoryManager);
1517}
1518
1519LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
1520 armnn::IWorkloadFactory& workloadFactory,
1521 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1522{
1523 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
1524 workloadFactory, memoryManager);
1525}
1526
1527LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
1528 armnn::IWorkloadFactory& workloadFactory,
1529 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1530{
1531 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedAsymm8>(
1532 workloadFactory, memoryManager);
1533}
1534
1535LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
1536 armnn::IWorkloadFactory& workloadFactory,
1537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1538{
1539 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedSymm16>(
1540 workloadFactory, memoryManager);
1541}
1542
1543LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
1544 armnn::IWorkloadFactory& workloadFactory,
1545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1546{
1547 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1548}
1549
1550LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
1551 armnn::IWorkloadFactory& workloadFactory,
1552 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1553{
1554 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
1555 workloadFactory, memoryManager);
1556}
1557
1558LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
1559 armnn::IWorkloadFactory& workloadFactory,
1560 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1561{
1562 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
1563 workloadFactory, memoryManager);
1564}
1565
1566LayerTestResult<float, 4> SimpleL2Pooling2dTest(
1567 armnn::IWorkloadFactory& workloadFactory,
1568 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1569 const armnn::DataLayout dataLayout)
1570{
1571 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
1572}
1573
1574LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
1575 armnn::IWorkloadFactory& workloadFactory,
1576 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1577 const armnn::DataLayout dataLayout)
1578{
1579 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
1580}
1581
1582LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
1583 armnn::IWorkloadFactory& workloadFactory,
1584 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1585 const armnn::DataLayout dataLayout)
1586{
1587 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
1588}
1589
1590LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
1591 armnn::IWorkloadFactory& workloadFactory,
1592 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1593{
1594 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1595}
1596
1597LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
1598 armnn::IWorkloadFactory& workloadFactory,
1599 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1600{
1601 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1602}
1603
1604LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
1605 armnn::IWorkloadFactory& workloadFactory,
1606 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1607{
1608 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1609}
1610
1611LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
1612 armnn::IWorkloadFactory& workloadFactory,
1613 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1614{
1615 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1616}
1617
1618LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
1619 armnn::IWorkloadFactory& workloadFactory,
1620 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1621{
1622 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1623}
1624
1625LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
1626 armnn::IWorkloadFactory& workloadFactory,
1627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1628{
1629 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1630}
1631LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
1632 armnn::IWorkloadFactory& workloadFactory,
1633 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1634{
1635 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1636}
1637
1638LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
1639 armnn::IWorkloadFactory& workloadFactory,
1640 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1641{
1642 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1643}
1644
1645LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
1646 armnn::IWorkloadFactory& workloadFactory,
1647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1648{
1649 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1650}
1651
1652LayerTestResult<float, 4> L2Pooling2dSize7Test(
1653 armnn::IWorkloadFactory& workloadFactory,
1654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1655{
1656 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1657}
1658
1659LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
1660 armnn::IWorkloadFactory& workloadFactory,
1661 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1662{
1663 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1664}
1665
1666LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
1667 armnn::IWorkloadFactory& workloadFactory,
1668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1669{
1670 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1671}
1672
1673LayerTestResult<float, 4> L2Pooling2dSize9Test(
1674 armnn::IWorkloadFactory& workloadFactory,
1675 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1676{
1677 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1678}
1679
1680LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
1681 armnn::IWorkloadFactory& workloadFactory,
1682 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1683{
1684 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1685}
1686
1687LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
1688 armnn::IWorkloadFactory& workloadFactory,
1689 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1690{
1691 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1692}
1693LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
1694 armnn::IWorkloadFactory& workloadFactory,
1695 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1696{
1697 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1698}
1699
1700LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
1701 armnn::IWorkloadFactory& workloadFactory,
1702 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1703{
1704 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1705}
1706
1707LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
1708 armnn::IWorkloadFactory& workloadFactory,
1709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1710{
1711 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1712}
1713
1714LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
1715 armnn::IWorkloadFactory& workloadFactory,
1716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1717{
1718 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1719}
1720
1721LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
1722 armnn::IWorkloadFactory& workloadFactory,
1723 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1724{
1725 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1726}
1727
1728LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
1729 armnn::IWorkloadFactory& workloadFactory,
1730 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1731{
1732 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1733}
1734
1735LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
1736 armnn::IWorkloadFactory& workloadFactory,
1737 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1738{
1739 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
1740}
1741
1742LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
1743 armnn::IWorkloadFactory& workloadFactory,
1744 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1745{
1746 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
1747}
1748
1749LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
1750 armnn::IWorkloadFactory& workloadFactory,
1751 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1752{
1753 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
1754}
1755
1756LayerTestResult<float, 4> ComparePooling2dTest(
1757 armnn::IWorkloadFactory& workloadFactory,
1758 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1759 armnn::IWorkloadFactory& refWorkloadFactory,
1760 armnn::PoolingAlgorithm poolingType)
1761{
1762 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
1763 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
1764}
1765
1766LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
1767 armnn::IWorkloadFactory& workloadFactory,
1768 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1769 armnn::IWorkloadFactory& refWorkloadFactory,
1770 armnn::PoolingAlgorithm poolingType)
1771{
1772 return ComparePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
1773 workloadFactory, memoryManager, refWorkloadFactory, poolingType, 0.1f, 128);
1774}
1775
1776LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
1777 armnn::IWorkloadFactory& workloadFactory,
1778 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1779 armnn::IWorkloadFactory& refWorkloadFactory,
1780 armnn::PoolingAlgorithm poolingType)
1781{
1782 return ComparePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
1783 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
1784}