2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
5 #include "LayerTests.hpp"
6 #include "WorkloadTestUtils.hpp"
7 #include "TensorUtils.hpp"
8 #include <ResolveType.hpp>
10 #include "test/TensorHelpers.hpp"
11 #include "TensorCopyUtils.hpp"
12 #include "Permute.hpp"
14 #include <boost/test/unit_test.hpp>
15 #include <boost/assert.hpp>
17 #include <armnn/LayerSupport.hpp>
19 #include <backendsCommon/CpuTensorHandle.hpp>
20 #include <backendsCommon/IBackendInternal.hpp>
21 #include <backendsCommon/WorkloadFactory.hpp>
24 #include <boost/cast.hpp>
26 #include "WorkloadTestUtils.hpp"
27 #include "Conv2dTestImpl.hpp"
28 #include "BatchNormTestImpl.hpp"
29 #include "ActivationTestImpl.hpp"
30 #include "Pooling2dTestImpl.hpp"
31 #include "FullyConnectedTestImpl.hpp"
32 #include "GatherTestImpl.hpp"
33 #include "SpaceToBatchNdTestImpl.hpp"
34 #include "SpaceToDepthTestImpl.hpp"
35 #include "SplitterTestImpl.hpp"
36 #include "SoftmaxTestImpl.hpp"
37 #include "StridedSliceTestImpl.hpp"
38 #include "NormTestImpl.hpp"
39 #include "LstmTestImpl.hpp"
40 #include "ConvertFp16ToFp32TestImpl.hpp"
41 #include "ConvertFp32ToFp16TestImpl.hpp"
42 #include "DebugTestImpl.hpp"
43 #include "DequantizeTestImpl.hpp"
44 #include "QuantizeTestImpl.hpp"
45 #include "TransposeConvolution2dTestImpl.hpp"
47 // 3-channel 16x8 image used as common input data for a number of Conv2d tests.
48 static std::vector<float> ConvInput3x8x16({
49 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
50 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
51 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
52 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
53 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
54 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
55 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
56 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f, 0.5f,
57 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
58 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
59 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
60 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
61 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
62 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
63 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
64 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
65 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
66 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
67 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
68 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
69 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
70 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
71 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
72 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
75 // 2-channel bias used by a number of Conv2d tests.
76 static std::vector<float> Bias2({0, 2});
78 static std::vector<float> Bias4({1, 2, 3, 4});
80 static std::vector<float> Bias8({1, 2, 3, 4, 1, 2, 3, 4});
82 struct Simple3dSoftmaxOutputData
84 const std::vector<float> outputData =
86 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
87 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f
90 const armnn::TensorShape inputShape{ 1, 8, 1 };
92 const std::vector<float> inputData =
99 struct Simple4dSoftmaxData
101 const armnn::TensorShape inputShape{ 1, 8, 1, 1 };
103 const std::vector<float> outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
104 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f };
105 const std::vector<float> inputData =
112 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
113 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
114 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale)
118 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias2.size())}, ArmnnType);
119 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, 0.0f, Bias2));
124 return boost::multi_array<T, 1>();
128 // Helper function that returns either Bias4 or an empty vector depending on whether bias is enabled.
129 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
130 boost::multi_array<T, 1> GetBias4(bool biasEnabled, float qScale)
134 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias4.size())}, ArmnnType);
135 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, 0.0f, Bias4));
140 return boost::multi_array<T, 1>();
144 // Helper function that returns either Bias8 or an empty vector depending on whether bias is enabled.
145 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
146 boost::multi_array<T, 1> GetBias8(bool biasEnabled, float qScale)
150 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias4.size())}, ArmnnType);
151 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, 0.0f, Bias8));
156 return boost::multi_array<T, 1>();
160 // Helper function that returns either Bias4 or an empty vector depending on whether bias is enabled.
161 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
162 boost::multi_array<T, 1> GetBias(bool biasEnabled, float qScale, armnn::TensorInfo outputInfo, armnn::DataLayout layout)
164 const armnnUtils::DataLayoutIndexed dataLayoutIndexed(layout);
165 const unsigned int channelsIndex = dataLayoutIndexed.GetChannelsIndex();
166 const unsigned int outputChannels = outputInfo.GetShape()[channelsIndex];
168 switch (outputChannels)
173 return GetBias2<ArmnnType>(biasEnabled, qScale);
177 return GetBias4<ArmnnType>(biasEnabled, qScale);
181 return GetBias8<ArmnnType>(biasEnabled, qScale);
187 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
188 LayerTestResult<T, 4> SimpleConvolution2d3x5TestCommon(
189 armnn::IWorkloadFactory& workloadFactory,
190 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
194 const armnn::DataLayout layout)
196 // Use common single-batch 3-channel 16x8 image.
197 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
198 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
200 // Use a 2-element batch with 3-channel 3x5 kernels.
201 armnn::TensorInfo kernelDesc({2, 3, 5, 3}, ArmnnType);
202 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
203 QuantizedVector<T>(qScale, qOffset, {
242 // Expected output is 2 batch elements of a 1-channel 14x4 image.
243 armnn::TensorInfo outputDesc({1, 2, 4, 14}, ArmnnType);
244 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
245 QuantizedVector<T>(qScale, qOffset, {
246 -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
247 -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
248 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
249 -23.5f, -23.5f, -23.5f,
250 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
251 -23.5f, -23.5f, -23.5f,
253 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
254 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
255 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
256 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
259 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
264 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
271 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
272 typename T = armnn::ResolveType<ArmnnType>>
273 LayerTestResult<T, 4> SimpleConvolution2d3x3TestCommon(
274 armnn::IWorkloadFactory& workloadFactory,
275 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
279 const armnn::DataLayout layout)
281 // Use a 3x3 kernel, which exercises ArmCompute's direct convolution path.
283 // Use common single-batch 3-channel 16x8 image.
284 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
285 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
287 // Use a 2-element batch of 3-channel 3x3 kernels.
288 armnn::TensorInfo kernelDesc({2, 3, 3, 3}, ArmnnType);
289 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
290 QuantizedVector<T>(qScale, qOffset, {
317 // Expected output is 1 batch of a 2-channel 14x6 image.
318 armnn::TensorInfo outputDesc({1, 2, 6, 14}, ArmnnType);
319 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
320 QuantizedVector<T>(qScale, qOffset, {
321 -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
322 -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
323 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
324 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
325 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
326 -14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,-14.5f,
328 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
329 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
330 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
331 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
332 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
333 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
336 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
341 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
348 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
349 LayerTestResult<T, 4> SimpleConvolution2d3x3NhwcTestCommon(
350 armnn::IWorkloadFactory& workloadFactory,
351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
355 armnn::DataLayout dataLayout)
357 // Use common single-batch 5x5 image.
359 armnn::TensorInfo inputDesc({1, 3, 4, 1}, ArmnnType);
360 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
368 // Use a 2-element batch of 3-channel 3x3 kernels.
369 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
370 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, {
376 // Expected output is 1 batch of a 5x5 image.
377 armnn::TensorInfo outputDesc({1, 3, 4, 1}, ArmnnType);
379 const std::vector<float> outputData =
386 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
388 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
393 boost::multi_array<T, 1>(),
400 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
401 LayerTestResult<T, 4> SimpleConvolution2d3x3Stride2x2TestCommon(
402 armnn::IWorkloadFactory& workloadFactory,
403 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
407 const armnn::DataLayout& dataLayout)
409 // Input is a single-batch, 1 channel, 5x5 image.
410 armnn::TensorInfo inputDesc({1, 5, 5, 1}, ArmnnType);
411 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
421 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
422 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc,
429 // Expected output is a single-batch, 1 channel, 3x3 image.
430 armnn::TensorInfo outputDesc({1, 3, 3, 1}, ArmnnType);
432 const std::vector<T> outputData =
439 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
441 uint32_t padLeft = 1;
443 uint32_t padRight = 1;
444 uint32_t padBottom = 1;
445 uint32_t strideX = 2;
446 uint32_t strideY = 2;
448 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
453 boost::multi_array<T, 1>(),
466 LayerTestResult<float, 4> SimpleConvolution2d3x5Test(
467 armnn::IWorkloadFactory& workloadFactory,
468 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
470 const armnn::DataLayout layout)
472 return SimpleConvolution2d3x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
473 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
476 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x5Uint8Test(
477 armnn::IWorkloadFactory& workloadFactory,
478 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
480 const armnn::DataLayout layout)
482 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
483 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
486 LayerTestResult<float, 4> SimpleConvolution2d3x3Test(
487 armnn::IWorkloadFactory& workloadFactory,
488 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
490 const armnn::DataLayout layout)
492 return SimpleConvolution2d3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
493 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
496 LayerTestResult<float, 4> SimpleConvolution2d3x3NhwcTest(
497 armnn::IWorkloadFactory& workloadFactory,
498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
501 return SimpleConvolution2d3x3NhwcTestCommon<armnn::DataType::Float32>(
507 armnn::DataLayout::NHWC);
510 LayerTestResult<float, 4> SimpleConvolution2d3x3Stride2x2Test(
511 armnn::IWorkloadFactory& workloadFactory,
512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
514 const armnn::DataLayout layout)
516 return SimpleConvolution2d3x3Stride2x2TestCommon<armnn::DataType::Float32>(
525 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x3Uint8Test(
526 armnn::IWorkloadFactory& workloadFactory,
527 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
529 const armnn::DataLayout layout)
531 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
532 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
535 LayerTestResult<int16_t, 4> SimpleConvolution2d3x5QSymm16Test(
536 armnn::IWorkloadFactory& workloadFactory,
537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
539 const armnn::DataLayout layout)
541 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
542 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
545 LayerTestResult<int16_t, 4> SimpleConvolution2d3x3QSymm16Test(
546 armnn::IWorkloadFactory& workloadFactory,
547 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
549 const armnn::DataLayout layout)
551 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
552 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
555 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
556 typename T = armnn::ResolveType<ArmnnType>>
557 LayerTestResult<T, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon(
558 armnn::IWorkloadFactory& workloadFactory,
559 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
560 const armnn::DataLayout layout,
564 // Use a single-batch 1-channel 3x3 image as input.
565 armnn::TensorInfo inputDesc({1, 1, 3, 3}, ArmnnType);
566 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
567 QuantizedVector<T>(qScale, qOffset, {
573 // Use 1 batch of a 1-channel 2x2 kernel.
574 armnn::TensorInfo kernelDesc({1, 1, 2, 2}, ArmnnType);
575 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
576 QuantizedVector<T>(qScale, qOffset, {
581 // Expected output is 1 batch of a 1-channel 6x8 image.
582 // Manually calculated like this:
583 //[-11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ..]
584 //[-11*0 -21*0 -12*0 -22*11 ; -11*0 -21*0 -12*11 -22*21 ; -11*0 -21*0 -12*21 -22*31 ; -11*0 -21*0 -12*31 -22*0 ..]
585 //[-11*0 -21*11 -12*0 -22*12 ; -11*11 -21*21 -12*12 -22*22 ; -11*21 -21*31 -12*22 -22*32 ; -11*31 -21*0 -12*32 -22*0 ..]
586 //[-11*0 -21*12 -12*0 -22*13 ; -11*12 -21*22 -12*13 -22*23 ; -11*22 -21*32 -12*23 -22*33 ; -11*32 -21*0 -12*33 -22*0 ..]
587 //[-11*0 -21*13 -12*0 -22*0 ; -11*13 -21*23 -12*0 -22*0 ; -11*23 -21*33 -12*0 -22*0 ; -11*33 -21*0 -12*0 -22*0 ..]
588 //[-11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ; -11*0 -21*0 -12*0 -22*0 ..]
589 //[..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ..]
590 armnn::TensorInfo outputDesc({1, 1, 8, 6}, ArmnnType);
591 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
592 QuantizedVector<T>(qScale, qOffset, {
594 -242, -594, -934, -372, 0, 0,
595 -495, -1190, -1850, -725, 0, 0,
596 -538, -1256, -1916, -748, 0, 0,
597 -273, -626, -946, -363, 0, 0,
603 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
608 GetBias2<ArmnnBType>(false, qScale * qScale),
616 4); // Padding bottom.
619 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
620 typename T = armnn::ResolveType<ArmnnType>>
621 LayerTestResult<T, 4> SimpleConvolution2dAsymmetricPaddingTestCommon(
622 armnn::IWorkloadFactory& workloadFactory,
623 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
624 const armnn::DataLayout layout,
628 // Use a single-batch 1-channel 5x5 image as input.
629 armnn::TensorInfo inputDesc({ 1, 1, 5, 5 }, ArmnnType);
630 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
631 QuantizedVector<T>(qScale, qOffset, {
639 // Use 1 batch of a 1-channel 4x4 kernel.
640 armnn::TensorInfo kernelDesc({ 1, 1, 4, 4 }, ArmnnType);
641 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
642 QuantizedVector<T>(qScale, qOffset, {
649 // Expected output is 1 batch of a 1-channel 5x5 image.
650 armnn::TensorInfo outputDesc({ 1, 1, 5, 5 }, ArmnnType);
651 std::vector<T> myVec(outputDesc.GetNumElements(), 0);
652 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
653 QuantizedVector<T>(qScale, qOffset, {
654 -7140, -10580, -13940, -9300, -5230,
655 -9590, -14120, -18520, -12290, -6860,
656 -9980, -14560, -18960, -12560, -7000,
657 -7518, -10904, -14144, -9318, -5152,
658 -5032, -7256, -9376, -6142, -3368,
661 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
666 GetBias2<ArmnnBType>(false, qScale * qScale),
674 2); // Padding bottom.
677 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingTest(
678 armnn::IWorkloadFactory& workloadFactory,
679 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
680 armnn::DataLayout layout)
682 return SimpleConvolution2dAsymmetricPaddingTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
683 workloadFactory, memoryManager, layout, 0.0f, 0);
686 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest(
687 armnn::IWorkloadFactory& workloadFactory,
688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
689 armnn::DataLayout layout)
691 return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon
692 <armnn::DataType::Float32, armnn::DataType::Float32>(
693 workloadFactory, memoryManager, layout, 0.0f, 0);
696 LayerTestResult<float, 4> Convolution1dTest(
697 armnn::IWorkloadFactory& workloadFactory,
698 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
701 return Convolution1dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
702 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
705 LayerTestResult<uint8_t, 4> Convolution1dUint8Test(
706 armnn::IWorkloadFactory& workloadFactory,
707 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
710 return Convolution1dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
711 workloadFactory, memoryManager, 0.1f, 128, biasEnabled);
714 LayerTestResult<float,4> CompareConvolution2dTest(
715 armnn::IWorkloadFactory& workloadFactory,
716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
717 armnn::IWorkloadFactory& refWorkloadFactory)
719 return CompareConvolution2dTestImpl<armnn::DataType::Float32>(
720 workloadFactory, memoryManager, refWorkloadFactory);
723 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
724 LayerTestResult<T, 4> Convolution2d3x3DilationTestCommon(
725 armnn::IWorkloadFactory& workloadFactory,
726 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
727 const std::vector<float>& inputNoQuantizedValues,
728 armnn::TensorInfo& inputTensorInfo,
729 const std::vector<float>& kernelNoQuantizedValues,
730 armnn::TensorInfo& kernelTensorInfo,
731 const std::vector<float>& outputExpectedNoQuantizedValues,
732 armnn::TensorInfo& outputTensorInfo,
735 armnn::DataLayout layout = armnn::DataLayout::NCHW,
736 uint32_t padLeft = 0,
738 uint32_t padRight = 0,
739 uint32_t padBottom = 0,
740 uint32_t strideX = 1,
741 uint32_t strideY = 1,
742 bool biasEnabled = false
749 case armnn::DataType::QuantisedAsymm8:
755 case armnn::DataType::QuantisedSymm16:
761 case armnn::DataType::Float32:
770 inputTensorInfo.SetQuantizationScale(qScale);
771 inputTensorInfo.SetQuantizationOffset(qOffset);
772 kernelTensorInfo.SetQuantizationScale(qScale);
773 kernelTensorInfo.SetQuantizationOffset(qOffset);
774 outputTensorInfo.SetQuantizationScale(qScale);
775 outputTensorInfo.SetQuantizationOffset(qOffset);
777 auto input = MakeTensor<T, 4>(inputTensorInfo,
778 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
779 inputTensorInfo.GetQuantizationOffset(),
780 inputNoQuantizedValues)));
781 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
782 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
783 kernelTensorInfo.GetQuantizationOffset(),
784 kernelNoQuantizedValues)));
785 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
786 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
787 outputTensorInfo.GetQuantizationOffset(),
788 outputExpectedNoQuantizedValues)));
790 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
795 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
810 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
811 LayerTestResult<T, 4> Convolution2d3x3Dilation3x3Test(
812 armnn::IWorkloadFactory& workloadFactory,
813 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
815 const armnn::DataLayout layout)
817 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
818 std::vector<float> inputNoQuantizedValues =
820 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
821 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
822 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
823 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
824 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
825 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
827 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
829 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
832 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
833 std::vector<float> kernelNoQuantizedValues =
840 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
841 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
842 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
843 std::vector<float> outputExpectedNoQuantizedValues =
851 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
854 inputNoQuantizedValues,
856 kernelNoQuantizedValues,
858 outputExpectedNoQuantizedValues,
866 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
867 LayerTestResult<T, 4> Convolution2d2x3x3Dilation3x3Test(
868 armnn::IWorkloadFactory& workloadFactory,
869 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
871 const armnn::DataLayout layout)
873 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
874 std::vector<float> inputNoQuantizedValues =
876 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
877 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
878 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
879 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
880 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
881 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
882 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
883 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
884 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
885 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
887 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
888 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
889 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
890 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
891 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
892 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
893 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
894 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
895 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
896 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
899 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
900 std::vector<float> kernelNoQuantizedValues =
911 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
912 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
913 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
914 std::vector<float> outputExpectedNoQuantizedValues =
922 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
925 inputNoQuantizedValues,
927 kernelNoQuantizedValues,
929 outputExpectedNoQuantizedValues,
937 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
938 LayerTestResult<T, 4> Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test(
939 armnn::IWorkloadFactory &workloadFactory,
940 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
942 const armnn::DataLayout layout)
944 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
945 std::vector<float> inputNoQuantizedValues =
947 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
948 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
949 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
950 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
951 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
952 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
953 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
954 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
955 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
956 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
959 armnn::TensorInfo kernelTensorInfo({ 1, 1, 2, 2}, ArmnnType);
960 std::vector<float> kernelNoQuantizedValues =
966 // Since the dilation rate is 2 this will dilate the kernel to be like 3x3: d(K-1)+1 --> 2 x (2-1) + 1 = 3,
967 // therefore the output will be 4x4: (I − K + 2P)/S +1 => trunc ( (10 - 3 + 2x2 ) / 3 + 1 )
968 // where, dilation size = d = 2; kernel size = K = 2; input size = I = 10; padding size = P = 2; stride = S = 3
969 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
970 std::vector<float> outputExpectedNoQuantizedValues =
977 uint32_t padLeft = 1;
979 uint32_t padRight = 1;
980 uint32_t padBottom = 1;
982 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
985 inputNoQuantizedValues,
987 kernelNoQuantizedValues,
989 outputExpectedNoQuantizedValues,
1004 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1005 Convolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1006 armnn::IWorkloadFactory&,
1007 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1011 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1012 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1013 armnn::IWorkloadFactory&,
1014 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1018 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1019 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1020 armnn::IWorkloadFactory&,
1021 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1025 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1026 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1027 armnn::IWorkloadFactory&,
1028 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1032 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1033 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1034 armnn::IWorkloadFactory&,
1035 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1039 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1040 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1041 armnn::IWorkloadFactory&,
1042 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1046 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1047 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1048 armnn::IWorkloadFactory &workloadFactory,
1049 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1051 const armnn::DataLayout layout);
1053 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1054 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1055 armnn::IWorkloadFactory &workloadFactory,
1056 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1058 const armnn::DataLayout layout);
1060 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1061 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1062 armnn::IWorkloadFactory &workloadFactory,
1063 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1065 const armnn::DataLayout layout);
1067 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1068 typename T = armnn::ResolveType<ArmnnType>>
1069 LayerTestResult<T, 4> DepthwiseConvolution2dAsymmetricTestCommon(
1070 armnn::IWorkloadFactory& workloadFactory,
1071 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1075 const armnn::DataLayout layout)
1077 // Use a single-batch 2-channel 5x5 image as input.
1078 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1079 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1080 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1095 // Use a depth multiplier of 1 on a 2-channel 4x4 kernel.
1096 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1097 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1098 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1111 // Expected output is 1 batch of a 2-channel 5x5 image.
1112 // Calculated using the python tensorflow library with strideX=1, strideY=1.
1113 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1114 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1115 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1117 1062, 1580, 1850, 1530, 1117,
1118 2140, 3108, 3500, 2842, 2042,
1119 3580, 5068, 5460, 4342, 3062,
1120 3618, 5072, 5390, 4248, 2971,
1121 3074, 4282, 4510, 3533, 2457,
1123 1550, 2284, 2362, 1955, 1428,
1124 2910, 4206, 4342, 3528, 2536,
1125 3390, 4886, 5022, 4068, 2916,
1126 3566, 5056, 5182, 4133, 2922,
1127 3100, 4352, 4452, 3517, 2465
1130 return DepthwiseConvolution2dAsymmetricTestImpl<ArmnnType, ArmnnBType>(
1135 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1142 2, // Padding right.
1143 2, // Padding bottom.
1148 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1149 typename T = armnn::ResolveType<ArmnnType>>
1150 LayerTestResult<T, 4> DepthwiseConvolution2dNhwcTestCommon(
1151 armnn::IWorkloadFactory& workloadFactory,
1152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1157 auto layout = armnn::DataLayout::NHWC;
1159 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1160 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1161 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1176 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1177 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1178 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1191 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1192 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1193 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1195 1062, 1580, 1850, 1530, 1117,
1196 2140, 3108, 3500, 2842, 2042,
1197 3580, 5068, 5460, 4342, 3062,
1198 3618, 5072, 5390, 4248, 2971,
1199 3074, 4282, 4510, 3533, 2457,
1201 1550, 2284, 2362, 1955, 1428,
1202 2910, 4206, 4342, 3528, 2536,
1203 3390, 4886, 5022, 4068, 2916,
1204 3566, 5056, 5182, 4133, 2922,
1205 3100, 4352, 4452, 3517, 2465
1208 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1213 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1220 2, // Padding right.
1221 2, // Padding bottom.
1226 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1227 typename T = armnn::ResolveType<ArmnnType>>
1228 LayerTestResult<T, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon(
1229 armnn::IWorkloadFactory& workloadFactory,
1230 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1235 auto layout = armnn::DataLayout::NHWC;
1237 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9}, ArmnnType);
1238 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1239 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1241 0, 0, 0, 0, 0, 0, 0, 0, 0,
1242 0, 0, 0, 0, 0, 0, 0, 0, 0,
1243 0, 0, 0, 0, 0, 0, 0, 0, 0,
1244 0, 0, 0, 1, 1, 1, 0, 0, 0,
1245 0, 0, 0, 1, 1, 1, 0, 0, 0,
1246 0, 0, 0, 1, 1, 1, 0, 0, 0,
1247 0, 0, 0, 0, 0, 0, 0, 0, 0,
1248 0, 0, 0, 0, 0, 0, 0, 0, 0,
1249 0, 0, 0, 0, 0, 0, 0, 0, 0
1252 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1253 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1254 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1261 uint32_t padLeft = 0;
1262 uint32_t padTop = 0;
1263 uint32_t padRight = 0;
1264 uint32_t padBottom = 0;
1265 uint32_t strideX = 1;
1266 uint32_t strideY = 1;
1267 uint32_t dilationX = 3;
1268 uint32_t dilationY = 3;
1270 // Since the dilation rate is 3 this will reduce the size of the output from 9x9 to 3x3 of all 5s.
1271 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1272 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1273 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1280 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1285 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1301 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
1302 LayerTestResult<T, 4> DepthwiseConvolution2d3x3DilationTestCommon(
1303 armnn::IWorkloadFactory& workloadFactory,
1304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1305 const std::vector<float>& inputNoQuantizedValues,
1306 armnn::TensorInfo& inputTensorInfo,
1307 const std::vector<float>& kernelNoQuantizedValues,
1308 armnn::TensorInfo& kernelTensorInfo,
1309 const std::vector<float>& outputExpectedNoQuantizedValues,
1310 armnn::TensorInfo& outputTensorInfo,
1313 armnn::DataLayout layout = armnn::DataLayout::NCHW,
1314 bool biasEnabled = false)
1320 case armnn::DataType::QuantisedAsymm8:
1326 case armnn::DataType::QuantisedSymm16:
1332 case armnn::DataType::Float32:
1341 inputTensorInfo.SetQuantizationScale(qScale);
1342 inputTensorInfo.SetQuantizationOffset(qOffset);
1343 kernelTensorInfo.SetQuantizationScale(qScale);
1344 kernelTensorInfo.SetQuantizationOffset(qOffset);
1345 outputTensorInfo.SetQuantizationScale(qScale);
1346 outputTensorInfo.SetQuantizationOffset(qOffset);
1348 auto input = MakeTensor<T, 4>(inputTensorInfo,
1349 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
1350 inputTensorInfo.GetQuantizationOffset(),
1351 inputNoQuantizedValues)));
1352 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
1353 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
1354 kernelTensorInfo.GetQuantizationOffset(),
1355 kernelNoQuantizedValues)));
1356 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
1357 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
1358 outputTensorInfo.GetQuantizationOffset(),
1359 outputExpectedNoQuantizedValues)));
1361 uint32_t padLeft = 0;
1362 uint32_t padTop = 0;
1363 uint32_t padRight = 0;
1364 uint32_t padBottom = 0;
1365 uint32_t strideX = 1;
1366 uint32_t strideY = 1;
1368 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1373 GetBias<ArmnnBType>(biasEnabled, qScale * qScale, outputTensorInfo, layout),
1388 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1389 LayerTestResult<T, 4> DepthwiseConvolution2d3x3Dilation3x3Test(
1390 armnn::IWorkloadFactory& workloadFactory,
1391 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1393 const armnn::DataLayout layout)
1395 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
1396 std::vector<float> inputNoQuantizedValues =
1398 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1399 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1400 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1401 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1402 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1403 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1404 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1405 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1406 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1407 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1410 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1411 std::vector<float> kernelNoQuantizedValues =
1418 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1419 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1420 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1421 std::vector<float> outputExpectedNoQuantizedValues =
1429 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1432 inputNoQuantizedValues,
1434 kernelNoQuantizedValues,
1436 outputExpectedNoQuantizedValues,
1444 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1445 LayerTestResult<T, 4> DepthwiseConvolution2d2x3x3Dilation3x3Test(
1446 armnn::IWorkloadFactory& workloadFactory,
1447 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1449 const armnn::DataLayout layout)
1451 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
1452 std::vector<float> inputNoQuantizedValues =
1454 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1455 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1456 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1457 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1458 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1459 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1460 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1461 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1462 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1463 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1465 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1466 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1467 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1468 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1469 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1470 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1471 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1472 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1473 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1474 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1477 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
1478 std::vector<float> kernelNoQuantizedValues =
1489 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1490 // therefore the output will be 2x4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1491 armnn::TensorInfo outputTensorInfo({ 1, 2, 4, 4}, ArmnnType);
1492 std::vector<float> outputExpectedNoQuantizedValues =
1505 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1508 inputNoQuantizedValues,
1510 kernelNoQuantizedValues,
1512 outputExpectedNoQuantizedValues,
1520 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1521 LayerTestResult<T, 4> DepthwiseConvolution2dMult4Test(
1522 armnn::IWorkloadFactory& workloadFactory,
1523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1525 const armnn::DataLayout layout)
1527 armnn::TensorInfo inputTensorInfo({1, 2, 3, 3}, ArmnnType);
1528 std::vector<float> inputNoQuantizedValues =
1539 armnn::TensorInfo kernelTensorInfo({ 4, 2, 2, 2}, ArmnnType);
1541 std::vector<float> kernelNoQuantizedValues =
1568 armnn::TensorInfo outputTensorInfo({ 1, 8, 2, 2}, ArmnnType);
1569 std::vector<float> outputExpectedNoQuantizedValues =
1597 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1600 inputNoQuantizedValues,
1602 kernelNoQuantizedValues,
1604 outputExpectedNoQuantizedValues,
1612 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1613 LayerTestResult<T, 4> DepthwiseConvolution2dMult2Test(
1614 armnn::IWorkloadFactory& workloadFactory,
1615 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1617 const armnn::DataLayout layout)
1619 armnn::TensorInfo inputTensorInfo({1, 2, 3, 3}, ArmnnType);
1620 std::vector<float> inputNoQuantizedValues =
1631 armnn::TensorInfo kernelTensorInfo({ 2, 2, 2, 2}, ArmnnType);
1633 std::vector<float> kernelNoQuantizedValues =
1649 armnn::TensorInfo outputTensorInfo({ 1, 4, 2, 2}, ArmnnType);
1650 std::vector<float> outputExpectedNoQuantizedValues =
1666 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1669 inputNoQuantizedValues,
1671 kernelNoQuantizedValues,
1673 outputExpectedNoQuantizedValues,
1681 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1682 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1683 armnn::IWorkloadFactory&,
1684 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1688 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1689 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1690 armnn::IWorkloadFactory&,
1691 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1695 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1696 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1697 armnn::IWorkloadFactory&,
1698 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1702 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1703 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1704 armnn::IWorkloadFactory&,
1705 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1709 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1710 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1711 armnn::IWorkloadFactory&,
1712 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1716 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1717 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1718 armnn::IWorkloadFactory&,
1719 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1723 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1724 DepthwiseConvolution2dMult4Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1725 armnn::IWorkloadFactory &workloadFactory,
1726 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1728 const armnn::DataLayout layout);
1730 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1731 DepthwiseConvolution2dMult2Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1732 armnn::IWorkloadFactory &workloadFactory,
1733 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1735 const armnn::DataLayout layout);
1737 LayerTestResult<float, 4> DepthwiseConvolution2dTest(
1738 armnn::IWorkloadFactory& workloadFactory,
1739 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1741 const armnn::DataLayout layout)
1743 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1744 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1747 LayerTestResult<float, 4> DepthwiseConvolution2dDepthNhwcTest(
1748 armnn::IWorkloadFactory& workloadFactory,
1749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1752 return DepthwiseConvolution2dNhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1753 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
1756 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul1Test(
1757 armnn::IWorkloadFactory& workloadFactory,
1758 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1760 const armnn::DataLayout layout)
1762 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1763 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1766 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul64Test(
1767 armnn::IWorkloadFactory& workloadFactory,
1768 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1770 armnn::TensorInfo inputTensorInfo({ 1, 1, 2, 2 }, armnn::DataType::Float32);
1771 auto input = MakeTensor<float, 4>(inputTensorInfo, { 1.f, 2.f, 3.f, 4.f });
1773 std::vector<float> kernelData;
1774 std::vector<float> singleDepthKernel{ 1.f, -1.f, -1.f, 1.f };
1775 for (unsigned int i = 0; i < 64; ++i)
1777 kernelData.insert(kernelData.end(), singleDepthKernel.begin(), singleDepthKernel.end());
1779 armnn::TensorInfo kernelTensorInfo({ 64, 1, 2, 2 }, armnn::DataType::Float32);
1780 auto kernel = MakeTensor<float, 4>(kernelTensorInfo, kernelData);
1782 std::vector<float> expectedOutputData(64, 0.f);
1783 armnn::TensorInfo outputTensorInfo({ 1, 64, 1, 1 }, armnn::DataType::Float32);
1784 auto expectedOutput = MakeTensor<float, 4>(outputTensorInfo, expectedOutputData);
1786 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1791 boost::multi_array<float, 1>(),
1795 armnn::DataLayout::NCHW);
1798 LayerTestResult<float, 4> DepthwiseConvolution2dAsymmetricTest(
1799 armnn::IWorkloadFactory& workloadFactory,
1800 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1802 const armnn::DataLayout layout)
1804 return DepthwiseConvolution2dAsymmetricTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1805 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1808 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dUint8Test(
1809 armnn::IWorkloadFactory& workloadFactory,
1810 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1812 const armnn::DataLayout layout)
1814 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1815 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1818 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dDepthMul1Uint8Test(
1819 armnn::IWorkloadFactory& workloadFactory,
1820 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1822 const armnn::DataLayout layout)
1824 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1825 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1828 LayerTestResult<float, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTest(
1829 armnn::IWorkloadFactory& workloadFactory,
1830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1832 return SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1840 LayerTestResult<int16_t, 4> DepthwiseConvolution2dInt16Test(
1841 armnn::IWorkloadFactory& workloadFactory,
1842 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1844 const armnn::DataLayout layout)
1846 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1847 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1850 LayerTestResult<int16_t, 4> DepthwiseConvolution2dDepthMul1Int16Test(
1851 armnn::IWorkloadFactory& workloadFactory,
1852 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1854 const armnn::DataLayout layout)
1856 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1857 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1860 LayerTestResult<float, 4> CompareDepthwiseConvolution2dFloatTest(
1861 armnn::IWorkloadFactory& workloadFactory,
1862 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1863 armnn::IWorkloadFactory& refWorkloadFactory,
1864 const armnn::DataLayout layout)
1866 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::Float32>(
1867 workloadFactory, memoryManager, refWorkloadFactory, layout);
1870 LayerTestResult<uint8_t, 4> CompareDepthwiseConvolution2dUint8Test(
1871 armnn::IWorkloadFactory& workloadFactory,
1872 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1873 armnn::IWorkloadFactory& refWorkloadFactory,
1874 const armnn::DataLayout layout)
1876 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8>(
1877 workloadFactory, memoryManager, refWorkloadFactory, layout);
1880 LayerTestResult<float,4> SimpleNormalizationAcrossTest(
1881 armnn::IWorkloadFactory& workloadFactory,
1882 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1884 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1885 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1886 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1889 LayerTestResult<float,4> SimpleNormalizationWithinTest(
1890 armnn::IWorkloadFactory& workloadFactory,
1891 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1893 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1894 auto normChannel = armnn::NormalizationAlgorithmChannel::Within;
1895 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1898 LayerTestResult<float,4> SimpleNormalizationAcrossNhwcTest(
1899 armnn::IWorkloadFactory& workloadFactory,
1900 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1902 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1903 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1904 return SimpleNormalizationNhwcTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1907 LayerTestResult<float,2> SimpleSoftmaxTest(
1908 armnn::IWorkloadFactory& workloadFactory,
1909 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1912 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
1915 LayerTestResult<float,2> SimpleAxisSoftmaxTest(
1916 armnn::IWorkloadFactory& workloadFactory,
1917 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1921 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, axis);
1924 LayerTestResult<float,3> Simple3dSoftmaxTest(
1925 armnn::IWorkloadFactory& workloadFactory,
1926 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1929 Simple3dSoftmaxOutputData data;
1930 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
1931 data.inputShape, data.outputData, data.inputData);
1934 LayerTestResult<float,3> Simple3dAxisSoftmaxTest(
1935 armnn::IWorkloadFactory& workloadFactory,
1936 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1940 armnn::TensorShape inputShape;
1941 std::vector<float> inputData;
1942 std::vector<float> outputData;
1948 inputShape = {5, 2, 2};
1952 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1954 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
1959 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1961 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1964 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1966 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1967 7.246299848982885e-08f
1974 inputShape = {2, 5, 2};
1978 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1980 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
1985 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1987 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1988 7.246299848982885e-08f,
1990 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1992 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1993 7.246299848982885e-08f
2000 inputShape = {2, 2, 5};
2004 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
2005 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
2010 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2011 7.246299848982885e-08f,
2012 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2013 7.246299848982885e-08f,
2015 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2016 7.246299848982885e-08f,
2017 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2018 7.246299848982885e-08f
2024 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
2025 inputShape, outputData, inputData, axis);
2028 LayerTestResult<float,4> Simple4dSoftmaxTest(
2029 armnn::IWorkloadFactory& workloadFactory,
2030 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2033 Simple4dSoftmaxData data;
2034 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, data.inputShape,
2035 data.outputData, data.inputData);
2038 LayerTestResult<float,4> Simple4dAxisSoftmaxTest(
2039 armnn::IWorkloadFactory& workloadFactory,
2040 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2044 armnn::TensorShape inputShape;
2045 std::vector<float> inputData;
2046 std::vector<float> outputData;
2052 inputShape = {5, 2, 2, 2};
2056 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f,
2057 16.0f, -2.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f, 15.0f, -3.0f,
2058 15.0f, -3.0f, 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 14.0f, -4.0f,
2059 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f
2064 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
2066 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.236882800924671f,
2068 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.236882800924671f,
2070 0.236882800924671f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
2073 0.087144312427294f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
2075 0.032058600957022f, 0.032058600957022f, 0.032058600957022f, 0.032058600957022f,
2077 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f,
2078 7.246299848982885e-08f,
2079 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
2080 7.246299848982885e-08f, 7.246299848982885e-08f
2087 inputShape = {2, 5, 2, 2};
2091 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
2092 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f,
2093 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
2094 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
2099 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
2101 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
2103 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
2105 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
2106 7.246299848982885e-08f,
2109 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
2111 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
2113 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
2115 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
2116 7.246299848982885e-08f
2123 inputShape = {2, 2, 5, 2};
2127 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
2128 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
2129 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
2130 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
2135 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
2137 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
2138 7.246299848982885e-08f,
2139 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
2141 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
2142 7.246299848982885e-08f,
2144 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
2146 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
2147 7.246299848982885e-08f,
2148 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
2150 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
2151 7.246299848982885e-08f
2158 inputShape = {2, 2, 2, 5};
2162 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
2163 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
2164 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
2165 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
2170 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2171 7.246299848982885e-08f,
2172 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2173 7.246299848982885e-08f,
2174 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2175 7.246299848982885e-08f,
2176 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2177 7.246299848982885e-08f,
2179 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2180 7.246299848982885e-08f,
2181 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2182 7.246299848982885e-08f,
2183 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2184 7.246299848982885e-08f,
2185 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
2186 7.246299848982885e-08f
2192 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, inputShape,
2193 outputData, inputData, axis);
2196 LayerTestResult<uint8_t,2> SimpleSoftmaxUint8Test(
2197 armnn::IWorkloadFactory& workloadFactory,
2198 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2201 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
2204 LayerTestResult<uint8_t,3> Simple3dSoftmaxUint8Test(
2205 armnn::IWorkloadFactory& workloadFactory,
2206 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2209 Simple3dSoftmaxOutputData data;
2210 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
2211 data.inputShape, data.outputData, data.inputData);
2214 LayerTestResult<uint8_t,4> Simple4dSoftmaxUint8Test(
2215 armnn::IWorkloadFactory& workloadFactory,
2216 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2219 Simple4dSoftmaxData data;
2221 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
2222 data.inputShape, data.outputData, data.inputData);
2225 LayerTestResult<int16_t,2> SimpleSoftmaxUint16Test(
2226 armnn::IWorkloadFactory& workloadFactory,
2227 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2230 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta);
2233 LayerTestResult<int16_t,3> Simple3dSoftmaxUint16Test(
2234 armnn::IWorkloadFactory& workloadFactory,
2235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2238 Simple3dSoftmaxOutputData data;
2239 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2240 data.inputShape, data.outputData, data.inputData);
2243 LayerTestResult<int16_t,4> Simple4dSoftmaxUint16Test(
2244 armnn::IWorkloadFactory& workloadFactory,
2245 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2248 Simple4dSoftmaxData data;
2250 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2251 data.inputShape, data.outputData, data.inputData);
2254 LayerTestResult<float,4> CompareNormalizationTest(
2255 armnn::IWorkloadFactory& workloadFactory,
2256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2257 armnn::IWorkloadFactory& refWorkloadFactory,
2258 armnn::NormalizationAlgorithmChannel normChannel,
2259 armnn::NormalizationAlgorithmMethod normMethod)
2261 return CompareNormalizationTestImpl(workloadFactory, memoryManager, refWorkloadFactory, normChannel, normMethod);
2264 LayerTestResult<float,2> CompareSoftmaxTest(
2265 armnn::IWorkloadFactory& workloadFactory,
2266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2267 armnn::IWorkloadFactory& refWorkloadFactory,
2270 return CompareSoftmaxTestImpl<armnn::DataType::Float32>(
2271 workloadFactory, memoryManager, refWorkloadFactory, beta);
2274 LayerTestResult<uint8_t,2> CompareSoftmaxUint8Test(
2275 armnn::IWorkloadFactory& workloadFactory,
2276 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2277 armnn::IWorkloadFactory& refWorkloadFactory,
2280 return CompareSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(
2281 workloadFactory, memoryManager, refWorkloadFactory, beta);
2284 std::vector<LayerTestResult<float,3>> SplitterTest(
2285 armnn::IWorkloadFactory& workloadFactory,
2286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2288 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
2291 std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
2292 armnn::IWorkloadFactory& workloadFactory,
2293 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2295 return SplitterTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2298 std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
2299 armnn::IWorkloadFactory& workloadFactory,
2300 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2302 return SplitterTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2305 LayerTestResult<float, 3> CopyViaSplitterTest(
2306 armnn::IWorkloadFactory& workloadFactory,
2307 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2309 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
2312 LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
2313 armnn::IWorkloadFactory& workloadFactory,
2314 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2316 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2319 LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
2320 armnn::IWorkloadFactory& workloadFactory,
2321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2323 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2326 #if defined(ARMCOMPUTEREF_ENABLED)
2328 // The LSTM test units are run only for the reference backend at the moment
2330 void LstmUtilsZeroVectorTest()
2332 armnn::TensorInfo inputDesc({4}, armnn::DataType::Float32);
2333 boost::multi_array<float, 1> input = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2336 boost::multi_array<float, 1> expectedOutput = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2339 return LstmUtilsZeroVectorTestImpl<armnn::DataType::Float32>(input, 4, expectedOutput);
2342 void LstmUtilsMeanStddevNormalizationNoneZeroInputTest()
2344 uint32_t batchSize = 2;
2345 uint32_t vecSize = 4;
2346 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2347 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2348 { 0.1f, 0.2f, 0.3f, 0.4f, //batch 0
2349 0.9f, 1.0f, 1.1f, 1.2f })); //batch 1
2351 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2352 { -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f, //batch 0
2353 -1.34163153f, -0.447210163f, 0.447211236f, 1.3416326f })); //batch 1
2355 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2356 vecSize, batchSize, expectedOutput);
2359 void LstmUtilsMeanStddevNormalizationAllZeroInputTest()
2361 uint32_t batchSize = 2;
2362 uint32_t vecSize = 4;
2363 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2364 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2365 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2366 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2368 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2369 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2370 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2372 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2373 vecSize, batchSize, expectedOutput);
2376 void LstmUtilsMeanStddevNormalizationMixedZeroInputTest()
2378 uint32_t batchSize = 2;
2379 uint32_t vecSize = 4;
2380 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2381 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2382 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2383 0.1f, 0.2f, 0.3f, 0.4f })); //batch 1
2385 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2386 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2387 -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f })); //batch 1
2389 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2390 vecSize, batchSize, expectedOutput);
2394 void LstmUtilsVectorBatchVectorCwiseProductTest()
2396 uint32_t batchSize = 4;
2397 uint32_t vecSize = 29;
2398 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2399 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2400 { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2401 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2402 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f}));
2404 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2405 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2407 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2408 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2409 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f,
2411 -1.1f, -2.2f, -3.3f, -4.4f, -5.5f, -6.6f, -7.7f, -8.8f, -9.9f, -10.1f,
2412 -11.11f, -12.12f, -13.13f, -14.14f, -15.15f, -16.16f, -17.17f, -18.18f, -19.19f, -20.2f,
2413 -21.21f, -22.22f, -23.23f, -24.24f, -25.25f, -26.26f, -27.27f, -28.28f, 0.0f,
2415 1.1f, -2.2f, 3.3f, -4.4f, 5.5f, -6.6f, 7.7f, -8.8f, 9.9f, -10.1f,
2416 11.11f, -12.12f, 13.13f, -14.14f, 15.15f, -16.16f, 17.17f, -18.18f, 19.19f, -20.2f,
2417 21.21f, -22.22f, 23.23f, -24.24f, 25.25f, -26.26f, 27.27f, -28.28f, 0.0f,
2419 -1.1f, 2.2f, -3.3f, 4.4f, -5.5f, 6.6f, -7.7f, 8.8f, -9.9f, 10.1f,
2420 -11.11f, 12.12f, -13.13f, 14.14f, -15.15f, 16.16f, -17.17f, 18.18f, -19.19f, 20.2f,
2421 -21.21f, 22.22f, -23.23f, 24.24f, -25.25f, 26.26f, -27.27f, 28.28f, 0.0f}));
2423 // Expect output = input * output + output.
2424 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2426 1.210000f, 4.840000f, 10.889999f, 19.360001f, 30.250000f, 43.559998f,
2427 59.289997f, 77.440002f, 98.009995f, 102.010010f, 123.432091f, 146.894394f,
2428 172.396896f, 199.939606f, 229.522491f, 261.145599f, 294.808899f, 330.512421f,
2429 368.256134f, 408.040039f, 449.864075f, 493.728363f, 539.632874f, 587.577576f,
2430 637.562500f, 689.587585f, 743.652954f, 799.758423f, 0.000000f,
2432 -1.210000f, -4.840000f, -10.889999f, -19.360001f, -30.250000f, -43.559998f,
2433 -59.289997f, -77.440002f, -98.009995f, -102.010010f, -123.432091f, -146.894394f,
2434 -172.396896f, -199.939606f, -229.522491f, -261.145599f, -294.808899f, -330.512421f,
2435 -368.256134f, -408.040039f, -449.864075f, -493.728363f, -539.632874f, -587.577576f,
2436 -637.562500f, -689.587585f, -743.652954f, -799.758423f, 0.000000f,
2438 1.210000f, -4.840000f, 10.889999f, -19.360001f, 30.250000f, -43.559998f,
2439 59.289997f, -77.440002f, 98.009995f, -102.010010f, 123.432091f, -146.894394f,
2440 172.396896f, -199.939606f, 229.522491f, -261.145599f, 294.808899f, -330.512421f,
2441 368.256134f, -408.040039f, 449.864075f, -493.728363f, 539.632874f, -587.577576f,
2442 637.562500f, -689.587585f, 743.652954f, -799.758423f, 0.000000f,
2444 -1.210000f, 4.840000f, -10.889999f, 19.360001f, -30.250000f, 43.559998f,
2445 -59.289997f, 77.440002f, -98.009995f, 102.010010f, -123.432091f, 146.894394f,
2446 -172.396896f, 199.939606f, -229.522491f, 261.145599f, -294.808899f, 330.512421f,
2447 -368.256134f, 408.040039f, -449.864075f, 493.728363f, -539.632874f, 587.577576f,
2448 -637.562500f, 689.587585f, -743.652954f, 799.758423f, 0.000000f}));
2450 return LstmUtilsVectorBatchVectorCwiseProductTestImpl<armnn::DataType::Float32>(vector, batchVector,
2451 vecSize, batchSize, expectedOutput);
2455 void LstmUtilsVectorBatchVectorAddTest()
2457 uint32_t batchSize = 2;
2458 uint32_t vecSize = 3;
2459 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2460 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2461 { 0.0f, -0.5f, 1.0f}));
2463 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2464 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2465 { 1.0f, 2.0f, 3.0f, //batch 0
2466 4.0f, 5.0f, 6.0f})); //batch 1
2468 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2470 4.0f, 4.5f, 7.0f}));
2472 return LstmUtilsVectorBatchVectorAddTestImpl<armnn::DataType::Float32>(vector, batchVector,
2473 vecSize, batchSize, expectedOutput);
2478 LayerTestResult<float, 2> LstmLayerFloat32WithCifgWithPeepholeNoProjectionTest(
2479 armnn::IWorkloadFactory& workloadFactory,
2480 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2482 armnn::TensorInfo inputDesc({ 2, 2 }, armnn::DataType::Float32);
2483 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2484 { 2., 3., 3., 4. }));
2486 armnn::TensorInfo outputDesc({ 2, 4 }, armnn::DataType::Float32);
2487 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2488 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2489 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f}));
2490 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2491 workloadFactory, memoryManager, input, expectedOutput);
2494 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(
2495 armnn::IWorkloadFactory& workloadFactory,
2496 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2498 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2499 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2500 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2501 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f}));
2503 armnn::TensorInfo outputDesc({ 2, 16 }, armnn::DataType::Float32);
2504 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2505 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2506 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2507 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2508 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2509 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2510 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f,
2512 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<armnn::DataType::Float32>(
2513 workloadFactory, memoryManager, input, expectedOutput);
2516 LayerTestResult<float, 2> LstmLayerFloat32NoCifgNoPeepholeNoProjectionTest(
2517 armnn::IWorkloadFactory& workloadFactory,
2518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2520 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::Float32);
2521 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2525 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::Float32);
2526 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2527 {{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2528 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}}));
2530 return LstmNoCifgNoPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2531 workloadFactory, memoryManager, input, expectedOutput);
2535 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionWithLayerNormTest(
2536 armnn::IWorkloadFactory& workloadFactory,
2537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2539 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2540 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2541 {0.7f, 0.8f, 0.1f, 0.2f, 0.3f, //batch 0
2542 0.3f, 0.2f, 0.9f, 0.8f, 0.1f})); //batch 1
2544 armnn::TensorInfo outputDesc({ 2, 3 }, armnn::DataType::Float32);
2545 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2546 { 0.0244077f, 0.128027f, -0.00170918f, //batch 0
2547 -0.00692428f, 0.0848741f, 0.063445f})); //batch 1
2548 return LstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTestImpl<armnn::DataType::Float32>(
2549 workloadFactory, memoryManager, input, expectedOutput);
2553 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionTest(
2554 armnn::IWorkloadFactory& workloadFactory,
2555 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2557 const float qScale = 1.0f;
2558 const int32_t qOffset = 0;
2560 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2561 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2563 armnn::TensorInfo inputDesc({2, 2}, datatype);
2564 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2565 std::vector<float>{2., 3., 3., 4.}));
2567 armnn::TensorInfo outputDesc({2, 4}, datatype);
2568 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2569 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2570 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2572 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2573 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2577 LayerTestResult<int16_t, 2> LstmLayerInt16WithCifgWithPeepholeNoProjectionTest(
2578 armnn::IWorkloadFactory& workloadFactory,
2579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2581 const float qScale = 1.0f;
2582 const int32_t qOffset = 0;
2584 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2585 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2587 armnn::TensorInfo inputDesc({ 2, 2 }, datatype);
2588 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2589 std::vector<float>({ 2., 3., 3., 4. })));
2591 armnn::TensorInfo outputDesc({ 2, 4 }, datatype);
2592 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2593 qOffset, std::vector<float>(
2594 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2595 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f})));
2597 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<datatype>(
2598 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2601 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgWithPeepholeWithProjectionTest(
2602 armnn::IWorkloadFactory& workloadFactory,
2603 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2605 const float qScale = 2.0f;
2606 const int32_t qOffset = 0;
2608 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2609 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2611 armnn::TensorInfo inputDesc({ 2, 5 }, datatype);
2612 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2613 qOffset, std::vector<float>(
2614 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2615 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f})));
2617 armnn::TensorInfo outputDesc({ 2, 16 }, datatype);
2618 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2619 qOffset, std::vector<float>(
2620 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2621 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2622 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2623 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2624 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2625 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f, 0.02168f})));
2627 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<datatype>(
2628 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2631 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionInt16ConstantTest(
2632 armnn::IWorkloadFactory& workloadFactory,
2633 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2635 const float qScale = 1.0f;
2636 const int32_t qOffset = 0;
2638 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16; // datatype & constants set to QSymm16
2640 armnn::TensorInfo inputDesc({2, 2}, datatype);
2641 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2642 qOffset, std::vector<float>{2., 3., 3., 4.}));
2644 armnn::TensorInfo outputDesc({2, 4}, datatype);
2645 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2646 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2647 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2649 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2650 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, datatype);
2654 LayerTestResult<uint8_t, 2> QuantizedLstmTest(
2655 armnn::IWorkloadFactory& workloadFactory,
2656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2658 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::QuantisedAsymm8);
2659 boost::multi_array<uint8_t, 2> input = MakeTensor<uint8_t, 2>(inputDesc, std::vector<uint8_t>(
2660 {166, 179, 50, 150}));
2662 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::QuantisedAsymm8);
2663 boost::multi_array<uint8_t, 2> expectedOutput = MakeTensor<uint8_t, 2>(outputDesc, std::vector<uint8_t>(
2664 {140, 151, 146, 112, 136, 156, 142, 112 }));
2666 return QuantizedLstmTestImpl(workloadFactory, memoryManager, input, expectedOutput);
2669 LayerTestResult<float,3> ConcatTest(
2670 armnn::IWorkloadFactory& workloadFactory,
2671 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2673 unsigned int outputWidth = 3;
2674 unsigned int outputHeight = 6;
2675 unsigned int outputChannels = 3;
2677 unsigned int inputWidth1 = 3;
2678 unsigned int inputHeight1 = 6;
2679 unsigned int inputChannels1 = 2;
2681 unsigned int inputWidth2 = 3;
2682 unsigned int inputHeight2 = 6;
2683 unsigned int inputChannels2 = 1;
2685 // Define the tensor descriptors.
2686 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::Float32);
2687 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::Float32);
2688 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::Float32);
2690 LayerTestResult<float,3> ret(outputTensorInfo);
2692 ret.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float>(
2697 10.0f, 11.0f, 12.0f,
2698 13.0f, 14.0f, 15.0f,
2699 16.0f, 17.0f, 18.0f,
2701 19.0f, 20.0f, 21.0f,
2702 22.0f, 23.0f, 24.0f,
2703 25.0f, 26.0f, 27.0f,
2704 28.0f, 29.0f, 30.0f,
2705 31.0f, 32.0f, 33.0f,
2706 34.0f, 35.0f, 36.0f,
2708 37.0f, 38.0f, 39.0f,
2709 40.0f, 41.0f, 42.0f,
2710 43.0f, 44.0f, 45.0f,
2711 46.0f, 47.0f, 48.0f,
2712 49.0f, 50.0f, 51.0f,
2713 52.0f, 53.0f, 54.0f,
2717 auto input1 = MakeTensor<float, 3>(inputTensorInfo1, std::vector<float>(
2722 10.0f, 11.0f, 12.0f,
2723 13.0f, 14.0f, 15.0f,
2724 16.0f, 17.0f, 18.0f,
2726 19.0f, 20.0f, 21.0f,
2727 22.0f, 23.0f, 24.0f,
2728 25.0f, 26.0f, 27.0f,
2729 28.0f, 29.0f, 30.0f,
2730 31.0f, 32.0f, 33.0f,
2731 34.0f, 35.0f, 36.0f,
2735 auto input2 = MakeTensor<float, 3>(inputTensorInfo2, std::vector<float>(
2737 37.0f, 38.0f, 39.0f,
2738 40.0f, 41.0f, 42.0f,
2739 43.0f, 44.0f, 45.0f,
2740 46.0f, 47.0f, 48.0f,
2741 49.0f, 50.0f, 51.0f,
2742 52.0f, 53.0f, 54.0f,
2746 std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of input[0].
2747 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
2749 std::vector<unsigned int> wOrigin2 = {2, 0, 0}; //Extent of the window is defined by size of input[1].
2750 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
2752 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2754 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
2756 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
2757 subTensorsSupported ?
2758 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2759 workloadFactory.CreateTensorHandle(inputTensorInfo1);
2761 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
2762 subTensorsSupported ?
2763 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2764 workloadFactory.CreateTensorHandle(inputTensorInfo2);
2766 armnn::ConcatQueueDescriptor data;
2767 armnn::WorkloadInfo info;
2768 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2769 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2770 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2772 data.m_ViewOrigins.push_back(window1);
2773 data.m_ViewOrigins.push_back(window2);
2775 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
2777 inputHandle1->Allocate();
2778 inputHandle2->Allocate();
2779 outputHandle->Allocate();
2781 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
2782 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
2784 workload->PostAllocationConfigure();
2785 workload->Execute();
2787 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
2792 LayerTestResult<float,4> AdditionTest(
2793 armnn::IWorkloadFactory& workloadFactory,
2794 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2796 unsigned int batchSize = 2;
2797 unsigned int channels = 2;
2798 unsigned int height = 2;
2799 unsigned int width = 3;
2801 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2802 armnn::TensorInfo outputTensorInfo;
2804 unsigned int shape[] = {batchSize, channels, height, width};
2806 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2807 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2808 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2811 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, std::vector<float>(
2826 auto input2 = MakeTensor<float, 4>(inputTensorInfo2, std::vector<float>(
2841 LayerTestResult<float,4> ret(outputTensorInfo);
2842 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, std::vector<float>(
2857 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2858 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2859 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2861 armnn::AdditionQueueDescriptor data;
2862 armnn::WorkloadInfo info;
2863 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2864 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2865 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2867 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2869 inputHandle1->Allocate();
2870 inputHandle2->Allocate();
2871 outputHandle->Allocate();
2873 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2874 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2876 workload->PostAllocationConfigure();
2877 workload->Execute();
2879 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2884 LayerTestResult<float, 5> Addition5dTest(
2885 armnn::IWorkloadFactory& workloadFactory,
2886 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2888 unsigned int depth = 2;
2889 unsigned int batchSize = 2;
2890 unsigned int channels = 2;
2891 unsigned int height = 2;
2892 unsigned int width = 3;
2894 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2895 armnn::TensorInfo outputTensorInfo;
2897 unsigned int shape[] = {depth, batchSize, channels, height, width};
2899 inputTensorInfo1 = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2900 inputTensorInfo2 = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2901 outputTensorInfo = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2904 auto input1 = MakeTensor<float, 5>(inputTensorInfo1, std::vector<float>(
2906 2.6f, 4.0f, 4.4f, 2.7f, 4.6f, 2.8f,
2907 2.3f, 1.9f, 3.4f, 2.9f, 2.2f, 4.5f,
2909 2.8f, 1.9f, 2.3f, 2.6f, 4.7f, 3.5f,
2910 0.4f, 1.5f, 2.1f, 0.7f, 5.0f, 1.1f,
2913 1.0f, 2.7f, 0.0f, 0.6f, 0.8f, 0.9f,
2914 1.0f, 2.6f, 0.4f, 3.8f, 0.4f, 0.8f,
2916 0.5f, 4.3f, 3.1f, 4.4f, 0.7f, 1.4f,
2917 0.4f, 4.4f, 0.7f, 0.6f, 4.7f, 1.2f,
2921 auto input2 = MakeTensor<float, 5>(inputTensorInfo2, std::vector<float>(
2923 4.4f, 3.0f, 1.0f, 0.0f, 3.9f, 3.1f,
2924 1.7f, 2.9f, 1.3f, 0.4f, 0.4f, 4.3f,
2926 4.5f, 0.2f, 2.2f, 4.1f, 3.9f, 3.0f,
2927 0.1f, 2.5f, 4.1f, 4.6f, 1.5f, 0.0f,
2930 0.5f, 4.9f, 2.5f, 1.5f, 3.4f, 4.5f,
2931 2.0f, 3.0f, 4.9f, 1.6f, 2.4f, 3.4f,
2933 3.6f, 1.8f, 1.3f, 2.6f, 2.1f, 4.8f,
2934 2.0f, 4.3f, 4.0f, 0.2f, 0.6f, 4.4f,
2937 LayerTestResult<float, 5> ret(outputTensorInfo);
2938 ret.outputExpected = MakeTensor<float, 5>(outputTensorInfo, std::vector<float>(
2940 7.0f, 7.0f, 5.4f, 2.7f, 8.5f, 5.9f,
2941 4.0f, 4.8f, 4.7f, 3.3f, 2.6f, 8.8f,
2943 7.3f, 2.1f, 4.5f, 6.7f, 8.6f, 6.5f,
2944 0.5f, 4.0f, 6.2f, 5.3f, 6.5f, 1.1f,
2947 1.5f, 7.6f, 2.5f, 2.1f, 4.2f, 5.4f,
2948 3.0f, 5.6f, 5.3f, 5.4f, 2.8f, 4.2f,
2950 4.1f, 6.1f, 4.4f, 7.0f, 2.8f, 6.2f,
2951 2.4f, 8.7f, 4.7f, 0.8f, 5.3f, 5.6f,
2954 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2955 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2956 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2958 armnn::AdditionQueueDescriptor data;
2959 armnn::WorkloadInfo info;
2960 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2961 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2962 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2964 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2966 inputHandle1->Allocate();
2967 inputHandle2->Allocate();
2968 outputHandle->Allocate();
2970 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0][0]);
2971 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0][0]);
2973 workload->PostAllocationConfigure();
2974 workload->Execute();
2976 CopyDataFromITensorHandle(&ret.output[0][0][0][0][0], outputHandle.get());
2981 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2982 LayerTestResult<T, 4> AdditionBroadcastTestImpl(
2983 armnn::IWorkloadFactory& workloadFactory,
2984 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2988 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 1}, ArmnnType);
2989 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 2, 3}, ArmnnType);
2990 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2992 if (armnn::IsQuantizedType<T>())
2994 inputTensorInfo1.SetQuantizationScale(qScale);
2995 inputTensorInfo1.SetQuantizationOffset(qOffset);
2996 inputTensorInfo2.SetQuantizationScale(qScale);
2997 inputTensorInfo2.SetQuantizationOffset(qOffset);
2998 outputTensorInfo.SetQuantizationScale(qScale);
2999 outputTensorInfo.SetQuantizationOffset(qOffset);
3002 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
3014 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
3020 LayerTestResult<T,4> ret(outputTensorInfo);
3021 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
3033 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3034 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
3035 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3037 armnn::AdditionQueueDescriptor data;
3038 armnn::WorkloadInfo info;
3039 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3040 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
3041 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3043 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
3045 inputHandle1->Allocate();
3046 inputHandle2->Allocate();
3047 outputHandle->Allocate();
3049 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3050 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
3052 workload->PostAllocationConfigure();
3053 workload->Execute();
3055 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3060 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3061 LayerTestResult<T, 4> AdditionBroadcast1ElementTestImpl(
3062 armnn::IWorkloadFactory& workloadFactory,
3063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3067 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
3068 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 1, 1}, ArmnnType);
3069 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
3071 if (armnn::IsQuantizedType<T>())
3073 inputTensorInfo1.SetQuantizationScale(qScale);
3074 inputTensorInfo1.SetQuantizationOffset(qOffset);
3075 inputTensorInfo2.SetQuantizationScale(qScale);
3076 inputTensorInfo2.SetQuantizationOffset(qOffset);
3077 outputTensorInfo.SetQuantizationScale(qScale);
3078 outputTensorInfo.SetQuantizationOffset(qOffset);
3081 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
3087 12.0f, 13.0f, 14.0f,
3088 15.0f, 16.0f, 17.0f,
3091 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
3096 LayerTestResult<T,4> ret(outputTensorInfo);
3097 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
3103 12.5f, 13.5f, 14.5f,
3104 15.5f, 16.5f, 17.5f,
3107 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3108 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
3109 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3111 armnn::AdditionQueueDescriptor data;
3112 armnn::WorkloadInfo info;
3113 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3114 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
3115 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3117 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
3119 inputHandle1->Allocate();
3120 inputHandle2->Allocate();
3121 outputHandle->Allocate();
3123 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3124 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
3126 workload->PostAllocationConfigure();
3127 workload->Execute();
3129 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3134 LayerTestResult<float, 4> AdditionBroadcastTest(
3135 armnn::IWorkloadFactory& workloadFactory,
3136 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3138 return AdditionBroadcastTestImpl<armnn::DataType::Float32>(
3139 workloadFactory, memoryManager, 0.0f, 0);
3142 LayerTestResult<uint8_t, 4> AdditionBroadcastUint8Test(
3143 armnn::IWorkloadFactory& workloadFactory,
3144 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3146 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedAsymm8>(
3147 workloadFactory, memoryManager, 2.f, 0);
3150 LayerTestResult<int16_t, 4> AdditionBroadcastInt16Test(
3151 armnn::IWorkloadFactory& workloadFactory,
3152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3154 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedSymm16>(
3155 workloadFactory, memoryManager, 2.f, 0);
3158 LayerTestResult<float, 4> AdditionBroadcast1ElementTest(
3159 armnn::IWorkloadFactory& workloadFactory,
3160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3162 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Float32>(
3163 workloadFactory, memoryManager, 0.0f, 0);
3166 LayerTestResult<uint8_t, 4> AdditionBroadcast1ElementUint8Test(
3167 armnn::IWorkloadFactory& workloadFactory,
3168 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3170 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedAsymm8>(
3171 workloadFactory, memoryManager, 0.1333333f, 128);
3174 LayerTestResult<int16_t, 4> AdditionBroadcast1ElementInt16Test(
3175 armnn::IWorkloadFactory& workloadFactory,
3176 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3178 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedSymm16>(
3179 workloadFactory, memoryManager, 0.1333333f, 0);
3182 LayerTestResult<float,4> CompareAdditionTest(
3183 armnn::IWorkloadFactory& workloadFactory,
3184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3185 armnn::IWorkloadFactory& refWorkloadFactory)
3187 unsigned int batchSize = 4;
3188 unsigned int channels = 1;
3189 unsigned int height = 2;
3190 unsigned int width = 3;
3192 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
3193 armnn::TensorInfo outputTensorInfo;
3195 unsigned int shape[] = {batchSize, channels, height, width};
3197 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
3198 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
3199 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
3201 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 1232);
3202 auto input2 = MakeRandomTensor<float, 4>(inputTensorInfo2, 456);
3204 LayerTestResult<float,4> ret(outputTensorInfo);
3206 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3207 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
3208 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3210 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
3211 std::unique_ptr<armnn::ITensorHandle> inputHandle2Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo2);
3212 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
3214 armnn::AdditionQueueDescriptor data;
3215 armnn::WorkloadInfo info;
3216 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3217 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
3218 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3220 armnn::AdditionQueueDescriptor refData = data;
3221 armnn::WorkloadInfo refInfo = info;
3222 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo1, inputHandle1Ref.get());
3223 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo2, inputHandle2Ref.get());
3224 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
3226 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
3227 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateAddition(refData, refInfo);
3229 inputHandle1->Allocate();
3230 inputHandle2->Allocate();
3231 outputHandle->Allocate();
3232 inputHandle1Ref->Allocate();
3233 inputHandle2Ref->Allocate();
3234 outputHandleRef->Allocate();
3236 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3237 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
3238 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
3239 CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
3241 workload->PostAllocationConfigure();
3242 workload->Execute();
3243 workloadRef->PostAllocationConfigure();
3244 workloadRef->Execute();
3246 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3247 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
3253 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3254 LayerTestResult<T, 4> DivisionTestHelper(
3255 armnn::IWorkloadFactory& workloadFactory,
3256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3257 const unsigned int shape0[4],
3258 const std::vector<T>& values0,
3261 const unsigned int shape1[4],
3262 const std::vector<T> & values1,
3265 const unsigned int outShape[4],
3266 const std::vector<T> & outValues,
3270 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
3271 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
3272 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
3274 inputTensorInfo0.SetQuantizationScale(scale0);
3275 inputTensorInfo0.SetQuantizationOffset(offset0);
3277 inputTensorInfo1.SetQuantizationScale(scale1);
3278 inputTensorInfo1.SetQuantizationOffset(offset1);
3280 outputTensorInfo.SetQuantizationScale(outScale);
3281 outputTensorInfo.SetQuantizationOffset(outOffset);
3283 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
3284 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
3286 LayerTestResult<T, 4> result(outputTensorInfo);
3287 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
3289 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3290 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3291 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3293 armnn::DivisionQueueDescriptor data;
3294 armnn::WorkloadInfo info;
3295 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3296 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3297 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3299 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDivision(data, info);
3301 inputHandle0->Allocate();
3302 inputHandle1->Allocate();
3303 outputHandle->Allocate();
3305 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3306 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3308 workload->PostAllocationConfigure();
3309 workload->Execute();
3311 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
3315 } // anonymous namespace
3317 LayerTestResult<float,4> DivisionByZeroTest(
3318 armnn::IWorkloadFactory& workloadFactory,
3319 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3321 const unsigned int width = 2;
3322 const unsigned int height = 2;
3323 const unsigned int channelCount = 2;
3324 const unsigned int batchSize = 2;
3326 unsigned int shape[] = { batchSize, channelCount, height, width };
3328 std::vector<float> input0({
3329 1.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f,
3330 -1.f, -1.f, -1.f, -1.f, 5.f, 5.f, 5.f, 5.f });
3332 std::vector<float> input1({
3333 0.f, 0.f, -0.f, -0.f, 0.f, 0.f, -0.f, -0.f,
3334 0.f, 0.f, -0.f, -0.f, 5.f, 5.f, 5.f, 5.f });
3336 std::vector<float> output({
3337 INFINITY, INFINITY, -INFINITY, -INFINITY, NAN, NAN, -NAN, -NAN,
3338 -INFINITY, -INFINITY, INFINITY, INFINITY, 1, 1, 1, 1 });
3340 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3342 shape, input0, 1.0f, 0,
3343 shape, input1, 1.0f, 0,
3344 shape, output, 1.0f, 0);
3347 LayerTestResult<float,4> DivisionTest(
3348 armnn::IWorkloadFactory& workloadFactory,
3349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3351 const unsigned int width = 2;
3352 const unsigned int height = 2;
3353 const unsigned int channelCount = 2;
3354 const unsigned int batchSize = 2;
3356 unsigned int shape[] = { batchSize, channelCount, height, width };
3358 std::vector<float> input0({
3359 2, 2, 2, 2, 3, 3, 3, 3,
3360 4, 4, 4, 4, 5, 5, 5, 5 });
3362 std::vector<float> input1({
3363 1, 1, 1, 1, 2, 2, 2, 2,
3364 4, 4, 4, 4, 4, 4, 4, 4 });
3366 std::vector<float> output({
3367 2, 2, 2, 2, 1.5, 1.5, 1.5, 1.5,
3368 1, 1, 1, 1, 1.25, 1.25, 1.25, 1.25 });
3371 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3373 shape, input0, 1.0f, 0,
3374 shape, input1, 1.0f, 0,
3375 shape, output, 1.0f, 0);
3378 LayerTestResult<float, 4> DivisionBroadcast1ElementTest(
3379 armnn::IWorkloadFactory& workloadFactory,
3380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3382 unsigned int shape0[] = { 1, 2, 2, 2 };
3383 std::vector<float> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3385 unsigned int shape1[] = { 1, 1, 1, 1 };
3386 std::vector<float> input1({ 2 });
3388 std::vector<float> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3391 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3393 shape0, input0, 1.0f, 0,
3394 shape1, input1, 1.0f, 0,
3395 shape0, output, 1.0f, 0);
3398 LayerTestResult<float, 4> DivisionBroadcast1DVectorTest(
3399 armnn::IWorkloadFactory& workloadFactory,
3400 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3402 unsigned int shape0[] = { 1, 3, 3, 2 };
3403 std::vector<float> input0({
3405 7, 16, 9, 20, 11, 24,
3406 13, 28, 15, 32, 17, 36});
3408 unsigned int shape1[] = { 1, 1, 1, 2 };
3409 std::vector<float> input1({ 1, 2 });
3411 std::vector<float> output({
3413 7, 8, 9, 10, 11, 12,
3414 13, 14, 15, 16, 17, 18});
3416 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3418 shape0, input0, 1.0f, 0,
3419 shape1, input1, 1.0f, 0,
3420 shape0, output, 1.0f, 0);
3423 LayerTestResult<uint8_t,4> DivisionUint8Test(
3424 armnn::IWorkloadFactory& workloadFactory,
3425 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3427 const unsigned int width = 2;
3428 const unsigned int height = 2;
3429 const unsigned int channelCount = 2;
3430 const unsigned int batchSize = 2;
3432 unsigned int shape[] = { batchSize, channelCount, height, width };
3434 std::vector<uint8_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3435 4, 4, 4, 4, 5, 5, 5, 5 });
3437 std::vector<uint8_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3438 4, 4, 4, 4, 4, 4, 4, 4 });
3440 std::vector<uint8_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3441 4, 4, 4, 4, 5, 5, 5, 5});
3444 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3446 shape, input0, 1.0f, 0,
3447 shape, input1, 1.0f, 0,
3448 shape, output, 0.25f, 0);
3451 LayerTestResult<uint8_t, 4> DivisionBroadcast1ElementUint8Test(
3452 armnn::IWorkloadFactory& workloadFactory,
3453 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3455 unsigned int shape0[] = { 1, 2, 2, 2 };
3456 std::vector<uint8_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3458 unsigned int shape1[] = { 1, 1, 1, 1 };
3459 std::vector<uint8_t> input1({ 2 });
3461 std::vector<uint8_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3463 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3465 shape0, input0, 1.0f, 0,
3466 shape1, input1, 1.0f, 0,
3467 shape0, output, 1.0f, 0);
3470 LayerTestResult<uint8_t, 4> DivisionBroadcast1DVectorUint8Test(
3471 armnn::IWorkloadFactory& workloadFactory,
3472 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3474 unsigned int shape0[] = { 1, 3, 3, 2 };
3475 std::vector<uint8_t> input0({1, 4, 3, 8, 5, 12,
3476 7, 16, 9, 20, 11, 24,
3477 13, 28, 15, 32, 17, 36});
3479 unsigned int shape1[] = { 1, 1, 1, 2 };
3480 std::vector<uint8_t> input1({ 1, 2 });
3482 std::vector<uint8_t> output({1, 2, 3, 4, 5, 6,
3483 7, 8, 9, 10, 11, 12,
3484 13, 14, 15, 16, 17, 18});
3486 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3488 shape0, input0, 1.0f, 0,
3489 shape1, input1, 1.0f, 0,
3490 shape0, output, 1.0f, 0);
3493 LayerTestResult<int16_t,4> DivisionInt16Test(
3494 armnn::IWorkloadFactory& workloadFactory,
3495 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3497 unsigned int shape[] = { 2, 2, 2, 2 };
3499 std::vector<int16_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3500 4, 4, 4, 4, 5, 5, 5, 5 });
3502 std::vector<int16_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3503 4, 4, 4, 4, 4, 4, 4, 4 });
3505 std::vector<int16_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3506 4, 4, 4, 4, 5, 5, 5, 5});
3509 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3511 shape, input0, 1.0f, 0,
3512 shape, input1, 1.0f, 0,
3513 shape, output, 0.25f, 0);
3516 LayerTestResult<int16_t, 4> DivisionBroadcast1ElementInt16Test(
3517 armnn::IWorkloadFactory& workloadFactory,
3518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3520 unsigned int shape0[] = { 1, 2, 2, 2 };
3521 std::vector<int16_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3523 unsigned int shape1[] = { 1, 1, 1, 1 };
3524 std::vector<int16_t> input1({ 2 });
3526 std::vector<int16_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3528 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3530 shape0, input0, 1.0f, 0,
3531 shape1, input1, 1.0f, 0,
3532 shape0, output, 1.0f, 0);
3535 LayerTestResult<int16_t, 4> DivisionBroadcast1DVectorInt16Test(
3536 armnn::IWorkloadFactory& workloadFactory,
3537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3539 unsigned int shape0[] = { 1, 3, 3, 2 };
3540 std::vector<int16_t> input0({1, 4, 3, 8, 5, 12,
3541 7, 16, 9, 20, 11, 24,
3542 13, 28, 15, 32, 17, 36});
3544 unsigned int shape1[] = { 1, 1, 1, 2 };
3545 std::vector<int16_t> input1({ 1, 2 });
3547 std::vector<int16_t> output({1, 2, 3, 4, 5, 6,
3548 7, 8, 9, 10, 11, 12,
3549 13, 14, 15, 16, 17, 18});
3551 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3553 shape0, input0, 1.0f, 0,
3554 shape1, input1, 1.0f, 0,
3555 shape0, output, 1.0f, 0);
3558 template<typename DescriptorType>
3559 std::unique_ptr<armnn::IWorkload> CreateWorkload(
3560 const armnn::IWorkloadFactory& workloadFactory,
3561 const armnn::WorkloadInfo& info,
3562 const DescriptorType& descriptor)
3564 return CreateWorkload(workloadFactory, info, descriptor);
3568 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MaximumQueueDescriptor>(
3569 const armnn::IWorkloadFactory& workloadFactory,
3570 const armnn::WorkloadInfo& info,
3571 const armnn::MaximumQueueDescriptor& descriptor)
3573 return workloadFactory.CreateMaximum(descriptor, info);
3577 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MinimumQueueDescriptor>(
3578 const armnn::IWorkloadFactory& workloadFactory,
3579 const armnn::WorkloadInfo& info,
3580 const armnn::MinimumQueueDescriptor& descriptor)
3582 return workloadFactory.CreateMinimum(descriptor, info);
3586 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::EqualQueueDescriptor>(
3587 const armnn::IWorkloadFactory& workloadFactory,
3588 const armnn::WorkloadInfo& info,
3589 const armnn::EqualQueueDescriptor& descriptor)
3591 return workloadFactory.CreateEqual(descriptor, info);
3595 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::GreaterQueueDescriptor>(
3596 const armnn::IWorkloadFactory& workloadFactory,
3597 const armnn::WorkloadInfo& info,
3598 const armnn::GreaterQueueDescriptor& descriptor)
3600 return workloadFactory.CreateGreater(descriptor, info);
3605 template <typename Descriptor,
3606 armnn::DataType ArmnnTypeInput,
3607 armnn::DataType ArmnnTypeOutput,
3608 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
3609 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
3610 LayerTestResult<TOutput, 4> ElementwiseTestHelper(
3611 armnn::IWorkloadFactory & workloadFactory,
3612 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3613 const unsigned int shape0[4], std::vector<TInput> values0,
3614 const unsigned int shape1[4], std::vector<TInput> values1,
3615 const unsigned int outShape[4], std::vector<TOutput> outValues,
3616 float qScale = 0.0f, int qOffset = 0)
3618 const uint32_t dimensionCount = 4;
3619 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, ArmnnTypeInput};
3620 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, ArmnnTypeInput};
3621 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, ArmnnTypeOutput};
3623 auto input0 = MakeTensor<TInput, 4>(inputTensorInfo0, values0);
3624 auto input1 = MakeTensor<TInput, 4>(inputTensorInfo1, values1);
3626 if (armnn::IsQuantizedType<TInput>())
3628 inputTensorInfo0.SetQuantizationScale(qScale);
3629 inputTensorInfo0.SetQuantizationOffset(qOffset);
3631 inputTensorInfo1.SetQuantizationScale(qScale);
3632 inputTensorInfo1.SetQuantizationOffset(qOffset);
3634 outputTensorInfo.SetQuantizationScale(qScale);
3635 outputTensorInfo.SetQuantizationOffset(qOffset);
3638 LayerTestResult<TOutput,4> ret(outputTensorInfo);
3640 if(ArmnnTypeOutput == armnn::DataType::Boolean)
3642 ret.compareBoolean = true;
3645 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3646 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3647 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3650 armnn::WorkloadInfo info;
3651 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3652 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3653 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3654 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
3656 inputHandle0->Allocate();
3657 inputHandle1->Allocate();
3658 outputHandle->Allocate();
3660 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3661 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3663 workload->PostAllocationConfigure();
3664 ExecuteWorkload(*workload, memoryManager);
3666 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3668 ret.outputExpected = MakeTensor<TOutput, 4>(outputTensorInfo, outValues);
3672 template <typename Descriptor, armnn::DataType ArmnnT, typename T = armnn::ResolveType<ArmnnT>>
3673 LayerTestResult<T, 4> ElementwiseTestHelper(
3674 armnn::IWorkloadFactory & workloadFactory,
3675 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3676 const unsigned int shape0[4], std::vector<T> values0,
3677 const unsigned int shape1[4], std::vector<T> values1,
3678 const unsigned int outShape[4], std::vector<T> outValues,
3679 float qScale = 0.0f, int qOffset = 0)
3681 return ElementwiseTestHelper<Descriptor, ArmnnT, ArmnnT>
3695 LayerTestResult<uint8_t, 4> EqualSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3696 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3698 const unsigned int width = 2;
3699 const unsigned int height = 2;
3700 const unsigned int channelCount = 2;
3701 const unsigned int batchSize = 2;
3703 unsigned int shape[] = { batchSize, channelCount, height, width };
3705 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3706 3, 3, 3, 3, 4, 4, 4, 4 });
3708 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3709 5, 5, 5, 5, 4, 4, 4, 4 });
3711 std::vector<uint8_t> output({ 1, 1, 1, 1, 0, 0, 0, 0,
3712 0, 0, 0, 0, 1, 1, 1, 1 });
3714 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3725 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementTest(
3726 armnn::IWorkloadFactory& workloadFactory,
3727 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3729 unsigned int shape0[] = { 1, 2, 2, 2 };
3730 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3732 unsigned int shape1[] = { 1, 1, 1, 1 };
3733 std::vector<float> input1({ 1 });
3735 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0, 0, 0});
3737 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3748 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorTest(
3749 armnn::IWorkloadFactory& workloadFactory,
3750 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3752 const unsigned int shape0[] = { 1, 2, 2, 3 };
3753 const unsigned int shape1[] = { 1, 1, 1, 3 };
3755 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
3756 7, 8, 9, 10, 11, 12 });
3758 std::vector<float> input1({ 1, 2, 3});
3760 std::vector<uint8_t> output({ 1, 1, 1, 0, 0, 0,
3761 0, 0, 0, 0, 0, 0 });
3763 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3774 LayerTestResult<uint8_t, 4> EqualUint8Test(
3775 armnn::IWorkloadFactory& workloadFactory,
3776 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3778 unsigned int shape[] = { 2, 2, 2, 2 };
3780 // See dequantized values to the right.
3781 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3782 3, 3, 3, 3, 7, 7, 7, 7 });
3784 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3785 3, 3, 3, 3, 5, 5, 5, 5 });
3787 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3788 1, 1, 1, 1, 0, 0, 0, 0 });
3790 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3791 armnn::DataType::QuantisedAsymm8,
3792 armnn::DataType::Boolean>(
3805 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementUint8Test(
3806 armnn::IWorkloadFactory& workloadFactory,
3807 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3809 const unsigned int shape0[] = { 1, 2, 2, 3 };
3810 const unsigned int shape1[] = { 1, 1, 1, 1 };
3812 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3813 7, 8, 9, 10, 11, 12 });
3815 std::vector<uint8_t> input1({ 1 });
3817 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0,
3818 0, 0, 0, 0, 0, 0 });
3820 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3821 armnn::DataType::QuantisedAsymm8,
3822 armnn::DataType::Boolean>(
3835 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorUint8Test(
3836 armnn::IWorkloadFactory& workloadFactory,
3837 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3839 const unsigned int shape0[] = { 1, 2, 2, 3 };
3840 const unsigned int shape1[] = { 1, 1, 1, 3 };
3842 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3843 7, 8, 9, 10, 11, 12 });
3845 std::vector<uint8_t> input1({ 1, 1, 3});
3847 std::vector<uint8_t> output({ 1, 0, 1, 0, 0, 0,
3848 0, 0, 0, 0, 0, 0 });
3850 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3851 armnn::DataType::QuantisedAsymm8,
3852 armnn::DataType::Boolean>(
3865 LayerTestResult<uint8_t, 4> GreaterSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3866 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3868 const unsigned int width = 2;
3869 const unsigned int height = 2;
3870 const unsigned int channelCount = 2;
3871 const unsigned int batchSize = 2;
3873 unsigned int shape[] = { batchSize, channelCount, height, width };
3875 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3876 3, 3, 3, 3, 4, 4, 4, 4 });
3878 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3879 5, 5, 5, 5, 4, 4, 4, 4 });
3881 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3882 0, 0, 0, 0, 0, 0, 0, 0 });
3884 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3895 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementTest(
3896 armnn::IWorkloadFactory& workloadFactory,
3897 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3899 unsigned int shape0[] = { 1, 2, 2, 2 };
3900 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3902 unsigned int shape1[] = { 1, 1, 1, 1 };
3903 std::vector<float> input1({ 1 });
3905 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1, 1, 1});
3907 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3918 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorTest(
3919 armnn::IWorkloadFactory& workloadFactory,
3920 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3922 const unsigned int shape0[] = { 1, 2, 2, 3 };
3923 const unsigned int shape1[] = { 1, 1, 1, 3 };
3925 std::vector<float> input0({ 1, 2.9f, 2.1f, 4, 5, 6,
3926 7, 8, 9, 10, 11, 12 });
3928 std::vector<float> input1({ 1, 3, 2});
3930 std::vector<uint8_t> output({ 0, 0, 1, 1, 1, 1,
3931 1, 1, 1, 1, 1, 1 });
3933 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3944 LayerTestResult<uint8_t, 4> GreaterUint8Test(
3945 armnn::IWorkloadFactory& workloadFactory,
3946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3948 unsigned int shape[] = { 2, 2, 2, 2 };
3950 // See dequantized values to the right.
3951 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3952 3, 3, 3, 3, 5, 5, 5, 5 });
3954 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3955 2, 2, 2, 2, 5, 5, 5, 5 });
3957 std::vector<uint8_t> output({ 0, 0, 0, 0, 0, 0, 0, 0,
3958 1, 1, 1, 1, 0, 0, 0, 0 });
3960 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3961 armnn::DataType::QuantisedAsymm8,
3962 armnn::DataType::Boolean>(
3975 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementUint8Test(
3976 armnn::IWorkloadFactory& workloadFactory,
3977 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3979 const unsigned int shape0[] = { 1, 2, 2, 3 };
3980 const unsigned int shape1[] = { 1, 1, 1, 1 };
3982 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3983 7, 8, 9, 10, 11, 12 });
3985 std::vector<uint8_t> input1({ 1 });
3987 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1,
3988 1, 1, 1, 1, 1, 1 });
3990 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3991 armnn::DataType::QuantisedAsymm8,
3992 armnn::DataType::Boolean>(
4005 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorUint8Test(
4006 armnn::IWorkloadFactory& workloadFactory,
4007 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4009 const unsigned int shape0[] = { 1, 2, 2, 3 };
4010 const unsigned int shape1[] = { 1, 1, 1, 3 };
4012 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
4013 7, 8, 9, 10, 11, 12 });
4015 std::vector<uint8_t> input1({ 1, 1, 3});
4017 std::vector<uint8_t> output({ 0, 1, 0, 1, 1, 1,
4018 1, 1, 1, 1, 1, 1 });
4020 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
4021 armnn::DataType::QuantisedAsymm8,
4022 armnn::DataType::Boolean>(
4035 LayerTestResult<float, 4> MaximumSimpleTest(armnn::IWorkloadFactory& workloadFactory,
4036 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4038 const unsigned int width = 2;
4039 const unsigned int height = 2;
4040 const unsigned int channelCount = 2;
4041 const unsigned int batchSize = 2;
4043 unsigned int shape[] = { batchSize, channelCount, height, width };
4045 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
4046 3, 3, 3, 3, 4, 4, 4, 4 });
4048 std::vector<float> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4049 4, 4, 4, 4, 5, 5, 5, 5 });
4051 std::vector<float> output({ 2, 2, 2, 2, 5, 5, 5, 5,
4052 4, 4, 4, 4, 5, 5, 5, 5 });
4054 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
4065 LayerTestResult<float, 4> MaximumBroadcast1ElementTest(
4066 armnn::IWorkloadFactory& workloadFactory,
4067 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4069 unsigned int shape0[] = { 1, 2, 2, 2 };
4070 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4072 unsigned int shape1[] = { 1, 1, 1, 1 };
4073 std::vector<float> input1({ 2 });
4075 std::vector<float> output({ 2, 2, 3, 4, 5, 6, 7, 8});
4077 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
4088 LayerTestResult<float, 4> MaximumBroadcast1DVectorTest(
4089 armnn::IWorkloadFactory& workloadFactory,
4090 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4092 const unsigned int shape0[] = { 1, 2, 2, 3 };
4093 const unsigned int shape1[] = { 1, 1, 1, 3 };
4095 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
4096 7, 8, 9, 10, 11, 12 });
4098 std::vector<float> input1({ 1, 2, 3});
4100 std::vector<float> output({ 1, 2, 3, 4, 5, 6,
4101 7, 8, 9, 10, 11, 12 });
4103 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
4114 LayerTestResult<uint8_t, 4> MaximumUint8Test(
4115 armnn::IWorkloadFactory& workloadFactory,
4116 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4118 unsigned int shape[] = { 2, 2, 2, 2 };
4120 // See dequantized values to the right.
4121 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
4122 3, 3, 3, 3, 4, 4, 4, 4 });
4124 std::vector<uint8_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4125 4, 4, 4, 4, 5, 5, 5, 5 });
4127 std::vector<uint8_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
4128 4, 4, 4, 4, 5, 5, 5, 5 });
4130 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4143 LayerTestResult<uint8_t, 4> MaximumBroadcast1ElementUint8Test(
4144 armnn::IWorkloadFactory& workloadFactory,
4145 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4147 const unsigned int shape0[] = { 1, 2, 2, 3 };
4148 const unsigned int shape1[] = { 1, 1, 1, 1 };
4150 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
4151 7, 8, 9, 10, 11, 12 });
4153 std::vector<uint8_t> input1({2});
4155 std::vector<uint8_t> output({ 2, 2, 3, 4, 5, 6,
4156 7, 8, 9, 10, 11, 12 });
4158 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4171 LayerTestResult<uint8_t, 4> MaximumBroadcast1DVectorUint8Test(
4172 armnn::IWorkloadFactory& workloadFactory,
4173 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4175 const unsigned int shape0[] = { 1, 2, 2, 3 };
4176 const unsigned int shape1[] = { 1, 1, 1, 3 };
4178 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
4179 7, 8, 9, 10, 11, 12 });
4181 std::vector<uint8_t> input1({ 1, 10, 3});
4183 std::vector<uint8_t> output({ 1, 10, 3, 4, 10, 6,
4184 7, 10, 9, 10, 11, 12 });
4186 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4199 LayerTestResult<int16_t, 4> MaximumInt16Test(
4200 armnn::IWorkloadFactory& workloadFactory,
4201 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4203 unsigned int shape[] = { 2, 2, 2, 2 };
4205 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
4206 3, 3, 3, 3, 4, 4, 4, 4 });
4208 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4209 4, 4, 4, 4, 5, 5, 5, 5 });
4211 std::vector<int16_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
4212 4, 4, 4, 4, 5, 5, 5, 5 });
4214 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4227 LayerTestResult<int16_t, 4> MaximumBroadcast1ElementInt16Test(
4228 armnn::IWorkloadFactory& workloadFactory,
4229 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4231 const unsigned int shape0[] = { 1, 2, 2, 3 };
4232 const unsigned int shape1[] = { 1, 1, 1, 1 };
4234 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4235 7, 8, 9, 10, 11, 12 });
4237 std::vector<int16_t> input1({2});
4239 std::vector<int16_t> output({ 2, 2, 3, 4, 5, 6,
4240 7, 8, 9, 10, 11, 12 });
4242 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4255 LayerTestResult<int16_t, 4> MaximumBroadcast1DVectorInt16Test(
4256 armnn::IWorkloadFactory& workloadFactory,
4257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4259 const unsigned int shape0[] = { 1, 2, 2, 3 };
4260 const unsigned int shape1[] = { 1, 1, 1, 3 };
4262 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4263 7, 8, 9, 10, 11, 12 });
4265 std::vector<int16_t> input1({ 1, 10, 3});
4267 std::vector<int16_t> output({ 1, 10, 3, 4, 10, 6,
4268 7, 10, 9, 10, 11, 12 });
4270 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4283 LayerTestResult<float, 4> MinimumBroadcast1ElementTest1(
4284 armnn::IWorkloadFactory& workloadFactory,
4285 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4287 unsigned int shape0[] = { 1, 2, 2, 2 };
4288 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4290 unsigned int shape1[] = { 1, 1, 1, 1 };
4291 std::vector<float> input1({ 2 });
4293 std::vector<float> output({ 1, 2, 2, 2, 2, 2, 2, 2});
4295 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
4307 LayerTestResult<float, 4> MinimumBroadcast1ElementTest2(
4308 armnn::IWorkloadFactory& workloadFactory,
4309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4311 unsigned int shape0[] = { 1, 2, 2, 2 };
4312 std::vector<float> input0({ 1, 6, 3, 2, 8, 9, 1, 10});
4314 unsigned int shape1[] = { 1, 1, 1, 1 };
4315 std::vector<float> input1({ 5 });
4317 std::vector<float> output({ 1, 5, 3, 2, 5, 5, 1, 5});
4319 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
4330 LayerTestResult<uint8_t, 4> MinimumBroadcast1DVectorUint8Test(
4331 armnn::IWorkloadFactory & workloadFactory,
4332 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)
4334 const unsigned int shape0[] = { 1, 2, 2, 3 };
4335 const unsigned int shape1[] = { 1, 1, 1, 3 };
4337 std::vector<uint8_t> input0({ 1, 2, 3, 3, 2, 1,
4338 7, 1, 2, 3, 4, 5 });
4340 std::vector<uint8_t> input1({ 1, 2, 3});
4342 std::vector<uint8_t> output({ 1, 2, 3, 1, 2, 1,
4343 1, 1, 2, 1, 2, 3 });
4345 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4358 LayerTestResult<int16_t, 4> MinimumInt16Test(
4359 armnn::IWorkloadFactory& workloadFactory,
4360 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4362 unsigned int shape[] = { 2, 2, 2, 2 };
4364 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
4365 3, 3, 3, 3, 4, 4, 4, 4 });
4367 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4368 4, 4, 4, 4, 5, 5, 5, 5 });
4370 std::vector<int16_t> output({ 1, 1, 1, 1, 3, 3, 3, 3,
4371 3, 3, 3, 3, 4, 4, 4, 4 });
4373 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4386 LayerTestResult<int16_t, 4> MinimumBroadcast1ElementInt16Test(
4387 armnn::IWorkloadFactory& workloadFactory,
4388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4390 const unsigned int shape0[] = { 1, 2, 2, 3 };
4391 const unsigned int shape1[] = { 1, 1, 1, 1 };
4393 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4394 7, 8, 9, 10, 11, 12 });
4396 std::vector<int16_t> input1({2});
4398 std::vector<int16_t> output({ 1, 2, 2, 2, 2, 2,
4399 2, 2, 2, 2, 2, 2 });
4401 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4414 LayerTestResult<int16_t, 4> MinimumBroadcast1DVectorInt16Test(
4415 armnn::IWorkloadFactory& workloadFactory,
4416 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4418 const unsigned int shape0[] = { 1, 2, 2, 3 };
4419 const unsigned int shape1[] = { 1, 1, 1, 3 };
4421 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4422 7, 8, 9, 10, 11, 12 });
4424 std::vector<int16_t> input1({ 1, 10, 3});
4426 std::vector<int16_t> output({ 1, 2, 3, 1, 5, 3,
4427 1, 8, 3, 1, 10, 3 });
4429 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4443 template<std::size_t NumDims>
4444 LayerTestResult<float,NumDims> MultiplicationTestHelper(
4445 armnn::IWorkloadFactory& workloadFactory,
4446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4447 const unsigned int shape0[NumDims],
4448 const std::vector<float> & values0,
4449 const unsigned int shape1[NumDims],
4450 const std::vector<float> & values1,
4451 const unsigned int outShape[NumDims],
4452 const std::vector<float> & outValues)
4454 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, armnn::DataType::Float32};
4455 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, armnn::DataType::Float32};
4456 armnn::TensorInfo outputTensorInfo{NumDims, outShape, armnn::DataType::Float32};
4458 auto input0 = MakeTensor<float, NumDims>(inputTensorInfo0, values0);
4459 auto input1 = MakeTensor<float, NumDims>(inputTensorInfo1, values1);
4461 LayerTestResult<float,NumDims> ret(outputTensorInfo);
4463 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4464 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4465 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4467 armnn::MultiplicationQueueDescriptor data;
4468 armnn::WorkloadInfo info;
4469 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4470 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4471 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4473 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4475 inputHandle0->Allocate();
4476 inputHandle1->Allocate();
4477 outputHandle->Allocate();
4479 CopyDataToITensorHandle(inputHandle0.get(), input0.origin());
4480 CopyDataToITensorHandle(inputHandle1.get(), input1.origin());
4482 workload->PostAllocationConfigure();
4483 workload->Execute();
4485 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
4487 ret.outputExpected = MakeTensor<float, NumDims>(outputTensorInfo, outValues);
4490 } // anonymous namespace
4493 LayerTestResult<float,4> MultiplicationTest(
4494 armnn::IWorkloadFactory& workloadFactory,
4495 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4497 const unsigned int width = 2;
4498 const unsigned int height = 2;
4499 const unsigned int channelCount = 2;
4500 const unsigned int batchSize = 2;
4502 unsigned int shape[] = { batchSize, channelCount, height, width };
4504 std::vector<float> input0({
4505 1, 1, 1, 1, 2, 2, 2, 2,
4506 3, 3, 3, 3, 4, 4, 4, 4 });
4508 std::vector<float> input1({
4509 2, 2, 2, 2, 3, 3, 3, 3,
4510 4, 4, 4, 4, 5, 5, 5, 5 });
4512 std::vector<float> output({
4513 2, 2, 2, 2, 6, 6, 6, 6,
4514 12, 12, 12, 12, 20, 20, 20, 20 });
4516 return MultiplicationTestHelper<4>(workloadFactory,
4526 LayerTestResult<float,5> Multiplication5dTest(
4527 armnn::IWorkloadFactory& workloadFactory,
4528 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4530 const unsigned int width = 3;
4531 const unsigned int height = 2;
4532 const unsigned int channelCount = 2;
4533 const unsigned int batchSize = 2;
4534 const unsigned int depth = 2;
4536 unsigned int shape[] = { depth, batchSize, channelCount, height, width };
4538 std::vector<float> input0({
4539 1.80f, 0.20f, 2.30f, 1.30f, 2.10f, 1.00f,
4540 2.60f, 0.60f, 2.10f, 2.30f, 2.30f, 2.00f,
4542 2.50f, 1.00f, 2.90f, 3.10f, 1.50f, 2.40f,
4543 2.80f, 1.10f, 1.00f, 3.20f, 1.00f, 2.30f,
4546 0.30f, 2.20f, 1.00f, 0.20f, 1.60f, 1.40f,
4547 0.80f, 3.20f, 0.10f, 0.10f, 3.10f, 2.10f,
4549 1.50f, 2.40f, 1.40f, 0.70f, 2.40f, 1.40f,
4550 1.60f, 1.20f, 1.90f, 0.80f, 0.00f, 0.10f,
4553 std::vector<float> input1({
4554 0.70f, 1.00f, 2.90f, 2.20f, 3.10f, 2.80f,
4555 1.80f, 2.00f, 0.50f, 2.30f, 1.20f, 2.70f,
4557 2.40f, 0.20f, 3.20f, 1.60f, 0.20f, 2.50f,
4558 2.30f, 0.70f, 2.70f, 1.80f, 2.90f, 2.70f,
4561 3.20f, 3.20f, 0.70f, 1.90f, 2.70f, 2.50f,
4562 2.40f, 0.90f, 2.30f, 1.80f, 2.50f, 2.00f,
4564 1.60f, 2.20f, 1.60f, 2.00f, 0.30f, 3.20f,
4565 0.40f, 3.00f, 2.60f, 0.30f, 0.00f, 2.50f,
4568 std::vector<float> output({
4569 1.26f, 0.20f, 6.67f, 2.86f, 6.51f, 2.80f,
4570 4.68f, 1.20f, 1.05f, 5.29f, 2.76f, 5.40f,
4572 6.00f, 0.20f, 9.28f, 4.96f, 0.30f, 6.00f,
4573 6.44f, 0.77f, 2.70f, 5.76f, 2.90f, 6.21f,
4576 0.96f, 7.04f, 0.70f, 0.38f, 4.32f, 3.50f,
4577 1.92f, 2.88f, 0.23f, 0.18f, 7.75f, 4.20f,
4579 2.40f, 5.28f, 2.24f, 1.40f, 0.72f, 4.48f,
4580 0.64f, 3.60f, 4.94f, 0.24f, 0.00f, 0.25f,
4583 return MultiplicationTestHelper<5>(workloadFactory,
4593 LayerTestResult<float, 4> MultiplicationBroadcast1ElementTest(
4594 armnn::IWorkloadFactory& workloadFactory,
4595 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4597 unsigned int shape0[] = { 1, 2, 2, 2 };
4598 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4600 unsigned int shape1[] = { 1, 1, 1, 1 };
4601 std::vector<float> input1({ 2 });
4603 std::vector<float> output({ 2, 4, 6, 8, 10, 12, 14, 16});
4605 return MultiplicationTestHelper<4>(workloadFactory,
4615 LayerTestResult<float, 4> MultiplicationBroadcast1DVectorTest(
4616 armnn::IWorkloadFactory& workloadFactory,
4617 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4619 unsigned int shape0[] = { 1, 3, 3, 2 };
4620 std::vector<float> input0({
4622 7, 8, 9, 10, 11, 12,
4623 13, 14, 15, 16, 17, 18});
4625 unsigned int shape1[] = { 1, 1, 1, 2 };
4626 std::vector<float> input1({ 1, 2 });
4628 std::vector<float> output({
4630 7, 16, 9, 20, 11, 24,
4631 13, 28, 15, 32, 17, 36});
4633 return MultiplicationTestHelper<4>(workloadFactory,
4643 LayerTestResult<float,4> CompareMultiplicationTest(
4644 armnn::IWorkloadFactory& workloadFactory,
4645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4646 armnn::IWorkloadFactory& refWorkloadFactory)
4648 const unsigned int width = 16;
4649 const unsigned int height = 32;
4650 const unsigned int channelCount = 2;
4651 const unsigned int batchSize = 5;
4653 armnn::TensorInfo inputTensorInfo0;
4654 armnn::TensorInfo inputTensorInfo1;
4655 armnn::TensorInfo outputTensorInfo;
4657 constexpr unsigned int shape[] = { batchSize, channelCount, height, width };
4659 inputTensorInfo0 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4660 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4661 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4663 LayerTestResult<float,4> comparisonResult(outputTensorInfo);
4665 auto input0 = MakeRandomTensor<float, 4>(inputTensorInfo0, 803506992);
4666 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 54902257);
4668 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4669 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4670 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4672 std::unique_ptr<armnn::ITensorHandle> inputHandle0Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo0);
4673 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
4674 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4676 armnn::MultiplicationQueueDescriptor data;
4677 armnn::WorkloadInfo info;
4678 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4679 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4680 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4682 armnn::MultiplicationQueueDescriptor refData = data;
4683 armnn::WorkloadInfo refInfo = info;
4684 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo0, inputHandle0Ref.get());
4685 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo1, inputHandle1Ref.get());
4686 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4688 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4689 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateMultiplication(refData, refInfo);
4691 inputHandle0->Allocate();
4692 inputHandle1->Allocate();
4693 outputHandle->Allocate();
4694 inputHandle0Ref->Allocate();
4695 inputHandle1Ref->Allocate();
4696 outputHandleRef->Allocate();
4698 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
4699 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
4700 CopyDataToITensorHandle(inputHandle0Ref.get(), &input0[0][0][0][0]);
4701 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
4703 workload->PostAllocationConfigure();
4704 workload->Execute();
4705 workloadRef->PostAllocationConfigure();
4706 workloadRef->Execute();
4707 CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
4708 CopyDataFromITensorHandle(&comparisonResult.outputExpected[0][0][0][0], outputHandleRef.get());
4710 return comparisonResult;
4713 LayerTestResult<float,4> CompareBatchNormTest(
4714 armnn::IWorkloadFactory& workloadFactory,
4715 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4716 armnn::IWorkloadFactory& refWorkloadFactory)
4718 const unsigned int width = 2;
4719 const unsigned int height = 3;
4720 const unsigned int channels = 5;
4721 const unsigned int batchSize = 3;
4723 armnn::TensorInfo inputTensorInfo;
4724 armnn::TensorInfo outputTensorInfo;
4725 armnn::TensorInfo tensorInfo;
4727 constexpr unsigned int shape[] = {batchSize, channels, height, width};
4728 constexpr unsigned int tensorShape[] = {channels};
4730 inputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4731 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4732 tensorInfo = armnn::TensorInfo(1, tensorShape, armnn::DataType::Float32);
4734 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 21312);
4736 auto mean = MakeRandomTensor<float, 1>(tensorInfo, 123);
4737 auto variance = MakeRandomTensor<float, 1>(tensorInfo, 234, 0.0f);
4738 auto beta = MakeRandomTensor<float, 1>(tensorInfo, 123);
4739 auto gamma = MakeRandomTensor<float, 1>(tensorInfo, 345);
4741 LayerTestResult<float,4> ret(outputTensorInfo);
4743 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4744 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4746 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.CreateTensorHandle(inputTensorInfo);
4747 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4749 armnn::BatchNormalizationQueueDescriptor data;
4750 armnn::WorkloadInfo info;
4751 armnn::ScopedCpuTensorHandle meanTensor(tensorInfo);
4752 armnn::ScopedCpuTensorHandle varianceTensor(tensorInfo);
4753 armnn::ScopedCpuTensorHandle betaTensor(tensorInfo);
4754 armnn::ScopedCpuTensorHandle gammaTensor(tensorInfo);
4756 AllocateAndCopyDataToITensorHandle(&meanTensor, &mean[0]);
4757 AllocateAndCopyDataToITensorHandle(&varianceTensor, &variance[0]);
4758 AllocateAndCopyDataToITensorHandle(&betaTensor, &beta[0]);
4759 AllocateAndCopyDataToITensorHandle(&gammaTensor, &gamma[0]);
4761 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
4762 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4763 data.m_Mean = &meanTensor;
4764 data.m_Variance = &varianceTensor;
4765 data.m_Beta = &betaTensor;
4766 data.m_Gamma = &gammaTensor;
4767 data.m_Parameters.m_Eps = 0.01f;
4769 armnn::BatchNormalizationQueueDescriptor refData = data;
4770 armnn::WorkloadInfo refInfo = info;
4771 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
4772 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4774 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateBatchNormalization(data, info);
4775 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateBatchNormalization(refData, refInfo);
4777 inputHandle->Allocate();
4778 outputHandle->Allocate();
4779 inputHandleRef->Allocate();
4780 outputHandleRef->Allocate();
4782 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
4783 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
4785 workload->PostAllocationConfigure();
4786 workload->Execute();
4787 workloadRef->PostAllocationConfigure();
4788 workloadRef->Execute();
4790 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
4791 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
4796 template<typename T>
4797 void PermuteTensorData(
4798 armnn::IWorkloadFactory& workloadFactory,
4799 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4800 const armnn::PermutationVector& mappings,
4801 armnn::TensorInfo & inputTensorInfo,
4802 const T * inputData,
4803 std::vector<T>& outputData)
4805 BOOST_ASSERT_MSG(inputData != nullptr, "inputData must not be null");
4806 if (inputData == nullptr)
4808 // Nullptr is an error in the test. By returning without doing the concatenation
4809 // I expect the caller to fail the test. It still makes sense to report this as
4810 // an assert for Debug builds.
4814 armnn::TensorInfo outputTensorInfo = armnnUtils::Permuted(inputTensorInfo, mappings);
4816 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4817 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4819 armnn::PermuteQueueDescriptor queueDescriptor;
4820 queueDescriptor.m_Parameters = armnn::PermuteDescriptor{mappings};
4821 armnn::WorkloadInfo workloadInfo;
4822 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
4823 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
4825 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(queueDescriptor, workloadInfo);
4827 inputHandle->Allocate();
4828 outputHandle->Allocate();
4830 CopyDataToITensorHandle(inputHandle.get(), inputData);
4832 workload->PostAllocationConfigure();
4833 workload->Execute();
4835 outputData.resize(outputTensorInfo.GetNumElements());
4836 CopyDataFromITensorHandle(&outputData[0], outputHandle.get());
4837 inputTensorInfo = outputTensorInfo;
4840 armnn::OriginsDescriptor CreateDescriptorForConcatenation(
4841 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4842 unsigned int concatDim)
4844 std::vector<armnn::TensorShape> shapes;
4845 shapes.reserve(inputTensorInfos.size());
4846 for (const armnn::TensorInfo& it: inputTensorInfos)
4848 shapes.push_back(it.GetShape());
4851 return armnn::CreateDescriptorForConcatenation(shapes.begin(),
4857 // Concatenation is only supported for N and C dimensions for NCHW and the inner most dimension
4858 // In case of <4 dimensions we need to make sure that the concat dimensions are at least
4859 // the 3rd slowest iterating one or the inner most dimension.
4862 bool NeedPermuteForConcat(
4863 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4864 unsigned int concatDim)
4866 // See note above. Additionally we expect the input shapes to have the
4867 // same number of dimensions.
4868 unsigned int nDimensions = 0;
4870 // Determine the number of dimensions as well as sanity check them
4871 // agains test implementation issues.
4872 for (auto && tensorInfo : inputTensorInfos)
4876 nDimensions = tensorInfo.GetShape().GetNumDimensions();
4880 BOOST_ASSERT_MSG(nDimensions == tensorInfo.GetShape().GetNumDimensions(),
4881 "Input shapes must have the same number of dimensions");
4885 return (nDimensions < 3 || (nDimensions == 3 && (nDimensions-concatDim) < 3 && (nDimensions-concatDim) != 1));
4888 armnn::TensorShape ExpandTensorShapeTo3dForPermute(const armnn::TensorShape & inputShape)
4890 unsigned int numDims = inputShape.GetNumDimensions();
4893 // Nothing to do if the inputShape has at least 3 dimensions.
4897 std::vector<unsigned int> newDims(size_t(3), 1u);
4898 unsigned int expandedBy = 3 - numDims;
4899 for (unsigned int i=0; i<numDims; ++i)
4901 newDims[expandedBy+i] = inputShape[i];
4903 return armnn::TensorShape(3u, &newDims[0]);
4906 void Generate3dPermuteVectorForConcat(
4907 unsigned int numDimensions,
4908 unsigned int & concatDim,
4909 std::pair<armnn::PermutationVector, armnn::PermutationVector> & permutations)
4911 BOOST_ASSERT_MSG(numDimensions <= 3,
4912 "Only dimensions 1,2 and 3 are supported by this helper");
4913 unsigned int expandedBy = 3 - numDimensions;
4914 unsigned int expandedConcatAxis = concatDim + expandedBy;
4916 if (expandedConcatAxis == 2)
4919 armnn::PermutationVector forwardPermutation({1, 2, 0});
4920 armnn::PermutationVector reversePermutation({2, 0, 1});
4921 permutations = std::make_pair(forwardPermutation, reversePermutation);
4923 else if (expandedConcatAxis == 1)
4926 armnn::PermutationVector forwardPermutation({2, 0, 1});
4927 armnn::PermutationVector reversePermutation({1, 2, 0});
4928 permutations = std::make_pair(forwardPermutation, reversePermutation);
4932 BOOST_ASSERT(expandedConcatAxis == 0);
4938 // Permute the input tensors so we can do a supported concatenation.
4939 // Also treat lower than 3d tensors as 3d by adding dummy 1 dimensions
4940 // at the front. Finally this function tells what the output shape
4941 // of the permuted concatenated tensor is going to be.
4943 template <typename T>
4944 void PermuteInputsForConcat(
4945 armnn::IWorkloadFactory& workloadFactory,
4946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4947 std::vector<armnn::TensorInfo> & inputTensorInfos,
4948 std::vector<T *> & inputData,
4949 std::vector<std::vector<T>> & inputDataStorage,
4950 armnn::PermutationVector & permuteVector,
4951 unsigned int & concatDim,
4952 armnn::TensorInfo & outputTensorInfo)
4954 BOOST_ASSERT_MSG(inputTensorInfos.size() > 1,
4955 "Expecting more than one tensor to be concatenated here");
4957 unsigned int numDims = 0;
4958 unsigned int nthInput = 0;
4959 const armnn::PermutationVector identity({0, 1, 2});
4961 std::pair<armnn::PermutationVector, armnn::PermutationVector> permutations =
4962 std::make_pair(identity, identity);
4964 inputDataStorage.resize(inputData.size());
4966 for (auto && tensorInfo : inputTensorInfos)
4970 numDims = tensorInfo.GetShape().GetNumDimensions();
4971 Generate3dPermuteVectorForConcat(numDims, concatDim, permutations);
4973 // Store the reverese permutation.
4974 permuteVector = permutations.second;
4975 BOOST_ASSERT_MSG(!permuteVector.IsEqual(identity),
4976 "Test logic error, we don't need permutation, so we shouldn't arrive here");
4980 BOOST_ASSERT_MSG(numDims == tensorInfo.GetShape().GetNumDimensions(),
4981 "All inputs must have the same number of dimensions");
4984 armnn::TensorInfo newTensorInfo = tensorInfo;
4985 newTensorInfo.SetShape(ExpandTensorShapeTo3dForPermute(tensorInfo.GetShape()));
4987 PermuteTensorData<T>(workloadFactory,
4991 inputData[nthInput],
4992 inputDataStorage[nthInput]);
4994 inputData[nthInput] = inputDataStorage[nthInput].data();
4995 inputTensorInfos[nthInput] = newTensorInfo;
5000 outputTensorInfo.SetShape(
5001 armnnUtils::Permuted(
5002 ExpandTensorShapeTo3dForPermute(outputTensorInfo.GetShape()),
5003 permutations.first));
5008 // This is the pair of PermuteInputsForConcat(...) which permutes back
5009 // the output of the concatenation so we can check it against an expected
5012 template <typename T>
5013 void PermuteOutputForConcat(
5014 armnn::IWorkloadFactory& workloadFactory,
5015 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5016 const armnn::TensorInfo & tensorInfo,
5017 const armnn::PermutationVector & permuteVector,
5018 std::unique_ptr<armnn::ITensorHandle> && inputDataHandle,
5021 BOOST_ASSERT_MSG(data != nullptr, "data must not be null");
5022 if (data == nullptr)
5024 // Nullptr is an error in the test. By returning without doing the permutation
5025 // I expect the caller to fail the test. It still makes sense to report this as
5026 // an assert for Debug builds.
5030 armnn::TensorInfo resultTensorInfo = tensorInfo;
5031 std::vector<T> inputData(tensorInfo.GetNumElements());
5032 std::vector<T> outputData;
5034 CopyDataFromITensorHandle(&inputData[0], inputDataHandle.get());
5036 PermuteTensorData<T>(workloadFactory,
5043 ::memcpy(data, &outputData[0], sizeof(T)*outputData.size());
5046 template <typename T>
5048 armnn::IWorkloadFactory& workloadFactory,
5049 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5050 std::initializer_list<const armnn::TensorInfo> inputTensorInfosOrig,
5051 std::initializer_list<T *> inputsOrig,
5052 const armnn::TensorInfo& outputTensorInfoOrig,
5054 unsigned int concatDim,
5057 BOOST_ASSERT_MSG(output != nullptr, "output must not be null");
5058 if (output == nullptr)
5060 // Nullptr is an error in the test. By returning without doing the permutation
5061 // I expect the caller to fail the test. It still makes sense to report this as
5062 // an assert for Debug builds.
5066 // Saves a copy of the parameters which we might need to change.
5067 std::vector<armnn::TensorInfo> inputTensorInfos(inputTensorInfosOrig.begin(), inputTensorInfosOrig.end());
5068 std::vector<T *> inputs = inputsOrig;
5069 armnn::TensorInfo outputTensorInfo = outputTensorInfoOrig;
5071 armnn::PermutationVector permuteVector{0, 1, 2};
5073 // Holds and automatically releases memory for the reshaped input data.
5074 std::vector<std::vector<T>> tmpInputDataStorage;
5076 const size_t inputCount = inputTensorInfos.size();
5078 bool needPermuteForConcat = NeedPermuteForConcat(inputTensorInfos, concatDim);
5080 if (needPermuteForConcat)
5083 // We need to permute the inputs, because concatenation along
5084 // the requested axis is not supported.
5086 PermuteInputsForConcat<T>(workloadFactory,
5090 tmpInputDataStorage,
5096 armnn::WorkloadInfo workloadInfo;
5098 std::vector<std::unique_ptr<armnn::ITensorHandle>> inputHandles;
5099 inputHandles.reserve(inputCount);
5101 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5103 armnn::ConcatQueueDescriptor queueDescriptor;
5104 armnn::OriginsDescriptor viewsDescriptor = CreateDescriptorForConcatenation(inputTensorInfos, concatDim);
5105 queueDescriptor.m_Parameters = viewsDescriptor;
5109 queueDescriptor.m_ViewOrigins.reserve(viewsDescriptor.GetNumViews());
5110 for (unsigned int i = 0; i < viewsDescriptor.GetNumViews(); ++i)
5112 queueDescriptor.m_ViewOrigins.emplace_back(std::vector<unsigned int>(viewsDescriptor.GetViewOrigin(i),
5113 viewsDescriptor.GetViewOrigin(i) + viewsDescriptor.GetNumDimensions()));
5116 outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5118 const bool subTensorsSupported = workloadFactory.SupportsSubTensors();
5119 for (unsigned int i = 0; i < inputCount; ++i)
5121 const armnn::TensorInfo& inputTensorInfo = inputTensorInfos[i];
5122 std::unique_ptr<armnn::ITensorHandle> inputHandle =
5123 subTensorsSupported ?
5124 workloadFactory.CreateSubTensorHandle(*outputHandle,
5125 inputTensorInfo.GetShape(),
5126 queueDescriptor.m_ViewOrigins[i].m_Origin.data()) :
5127 workloadFactory.CreateTensorHandle(inputTensorInfo);
5129 inputHandles.emplace_back(std::move(inputHandle));
5135 for (unsigned int i = 0; i < inputCount; ++i)
5137 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfos[i]);
5138 inputHandles.emplace_back(std::move(inputHandle));
5142 for (unsigned int i = 0; i < inputCount; ++i)
5144 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfos[i], inputHandles[i].get());
5147 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
5149 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(queueDescriptor, workloadInfo);
5151 for (auto& inputHandle : inputHandles)
5153 inputHandle->Allocate();
5156 outputHandle->Allocate();
5158 unsigned int nextInputId = 0;
5159 for (auto& inputHandle : inputHandles)
5161 CopyDataToITensorHandle(inputHandle.get(), inputs[nextInputId]);
5165 workload->PostAllocationConfigure();
5166 workload->Execute();
5168 if (needPermuteForConcat)
5170 PermuteOutputForConcat<T>(workloadFactory,
5174 std::move(outputHandle),
5179 CopyDataFromITensorHandle(output, outputHandle.get());
5183 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5184 LayerTestResult<T, 1> Concatenation1dTestImpl(
5185 armnn::IWorkloadFactory& workloadFactory,
5186 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5190 armnn::TensorInfo inputTensorInfo({ 3 }, ArmnnType, qScale, qOffset);
5192 auto input0 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 1.0f, 2.0f, 3.0f }));
5193 auto input1 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 4.0f, 5.0f, 6.0f }));
5194 auto input2 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 7.0f, 8.0f, 9.0f }));
5196 armnn::TensorInfo outputTensorInfo({ 9 }, ArmnnType, qScale, qOffset);
5198 LayerTestResult<T, 1> result(outputTensorInfo);
5200 std::vector<T> output;
5201 output.resize(outputTensorInfo.GetNumElements());
5202 Concatenate<T>(workloadFactory, memoryManager,
5203 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5204 { input0.data(), input1.data(), input2.data() },
5210 result.output = MakeTensor<T, 1>(outputTensorInfo, output);
5211 result.outputExpected = MakeTensor<T, 1>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5212 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
5218 LayerTestResult<float, 1> Concatenation1dTest(
5219 armnn::IWorkloadFactory& workloadFactory,
5220 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5222 return Concatenation1dTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5225 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5226 LayerTestResult<T, 2> Concatenation2dTestImpl(
5227 armnn::IWorkloadFactory& workloadFactory,
5228 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5229 const armnn::TensorInfo& outputTensorInfo,
5230 unsigned int dimension,
5232 const int32_t qOffset)
5234 armnn::TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5236 auto input0 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5241 10.0f, 11.0f, 12.0f,
5244 auto input1 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5249 13.0f, 14.0f, 15.0f,
5252 auto input2 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5257 16.0f, 17.0f, 18.0f,
5260 LayerTestResult<T, 2> result(outputTensorInfo);
5262 std::vector<T> output;
5263 output.resize(outputTensorInfo.GetNumElements());
5264 Concatenate<T>(workloadFactory, memoryManager,
5265 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5266 { input0.data(), input1.data(), input2.data() },
5272 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5276 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5277 LayerTestResult<T, 2> Concatenation2dDim0TestImpl(
5278 armnn::IWorkloadFactory& workloadFactory,
5279 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5283 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
5285 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
5286 workloadFactory, memoryManager, outputTensorInfo, 0, qScale, qOffset);
5288 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5293 10.0f, 11.0f, 12.0f,
5299 13.0f, 14.0f, 15.0f,
5305 16.0f, 17.0f, 18.0f,
5311 LayerTestResult<float, 2> Concatenation2dDim0Test(
5312 armnn::IWorkloadFactory& workloadFactory,
5313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5315 return Concatenation2dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5318 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5319 LayerTestResult<T, 2> Concatenation2dDim1TestImpl(
5320 armnn::IWorkloadFactory& workloadFactory,
5321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5325 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
5327 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
5328 workloadFactory, memoryManager, outputTensorInfo, 1, qScale, qOffset);
5330 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5332 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
5335 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
5341 LayerTestResult<float, 2> Concatenation2dDim1Test(
5342 armnn::IWorkloadFactory& workloadFactory,
5343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5345 return Concatenation2dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5348 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5349 LayerTestResult<T, 2> Concatenation2dDim0DiffInputDimsTestImpl(
5350 armnn::IWorkloadFactory& workloadFactory,
5351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5355 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5356 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5361 10.0f, 11.0f, 12.0f,
5364 armnn::TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType, qScale, qOffset);
5365 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5370 13.0f, 14.0f, 15.0f,
5376 armnn::TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType, qScale, qOffset);
5377 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5379 16.0f, 17.0f, 18.0f,
5382 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
5383 LayerTestResult<T, 2> result(outputTensorInfo);
5385 std::vector<T> output;
5386 output.resize(outputTensorInfo.GetNumElements());
5387 Concatenate<T>(workloadFactory, memoryManager,
5388 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5389 { input0.data(), input1.data(), input2.data() },
5395 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5396 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5401 10.0f, 11.0f, 12.0f,
5407 13.0f, 14.0f, 15.0f,
5413 16.0f, 17.0f, 18.0f,
5419 LayerTestResult<float, 2> Concatenation2dDim0DiffInputDimsTest(
5420 armnn::IWorkloadFactory& workloadFactory,
5421 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5423 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5424 workloadFactory, memoryManager, 0.0f, 0);
5427 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5428 LayerTestResult<T, 2> Concatenation2dDim1DiffInputDimsTestImpl(
5429 armnn::IWorkloadFactory& workloadFactory,
5430 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5434 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5435 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5440 10.0f, 11.0f, 12.0f,
5443 armnn::TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType, qScale, qOffset);
5444 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5446 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
5449 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
5452 armnn::TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType, qScale, qOffset);
5453 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5461 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
5462 LayerTestResult<T, 2> result(outputTensorInfo);
5464 std::vector<T> output;
5465 output.resize(outputTensorInfo.GetNumElements());
5466 Concatenate<T>(workloadFactory, memoryManager,
5467 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5468 { input0.data(), input1.data(), input2.data() },
5474 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5475 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5477 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
5480 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
5486 LayerTestResult<float, 2> Concatenation2dDim1DiffInputDimsTest(
5487 armnn::IWorkloadFactory& workloadFactory,
5488 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5490 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
5491 workloadFactory, memoryManager, 0.0f, 0);
5494 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5495 LayerTestResult<T, 3> Concatenation3dTestImpl(
5496 armnn::IWorkloadFactory& workloadFactory,
5497 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5498 const armnn::TensorInfo& outputTensorInfo,
5499 unsigned int dimension,
5504 armnn::TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5506 auto input0 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5507 // Batch 0, Channel 0
5510 // Batch 0, Channel 1
5513 // Batch 0, Channel 2
5516 // Batch 1, Channel 0
5519 // Batch 1, Channel 1
5522 // Batch 1, Channel 2
5526 auto input1 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5527 // Batch 0, Channel 0
5530 // Batch 0, Channel 1
5533 // Batch 0, Channel 2
5536 // Batch 1, Channel 0
5539 // Batch 1, Channel 1
5542 // Batch 1, Channel 2
5546 auto input2 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5547 // Batch 0, Channel 0
5550 // Batch 0, Channel 1
5553 // Batch 0, Channel 2
5556 // Batch 1, Channel 0
5559 // Batch 1, Channel 1
5562 // Batch 1, Channel 2
5566 LayerTestResult<T, 3> result(outputTensorInfo);
5568 std::vector<T> output;
5569 output.resize(outputTensorInfo.GetNumElements());
5570 Concatenate<T>(workloadFactory, memoryManager,
5571 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5572 { input0.data(), input1.data(), input2.data() },
5578 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5582 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5583 LayerTestResult<T, 3> Concatenation3dDim0TestImpl(
5584 armnn::IWorkloadFactory& workloadFactory,
5585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5589 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType, qScale, qOffset);
5591 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5592 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
5594 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5595 // Batch 0, Channel 0
5598 // Batch 0, Channel 1
5601 // Batch 0, Channel 2
5604 // Batch 1, Channel 0
5607 // Batch 1, Channel 1
5610 // Batch 1, Channel 2
5613 // Batch 2, Channel 0
5616 // Batch 2, Channel 1
5619 // Batch 2, Channel 2
5622 // Batch 3, Channel 0
5625 // Batch 3, Channel 1
5628 // Batch 3, Channel 2
5631 // Batch 4, Channel 0
5634 // Batch 4, Channel 1
5637 // Batch 4, Channel 2
5640 // Batch 5, Channel 0
5643 // Batch 5, Channel 1
5646 // Batch 5, Channel 2
5653 LayerTestResult<float, 3> Concatenation3dDim0Test(
5654 armnn::IWorkloadFactory& workloadFactory,
5655 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5657 return Concatenation3dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5660 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5661 LayerTestResult<T, 3> Concatenation3dDim1TestImpl(
5662 armnn::IWorkloadFactory& workloadFactory,
5663 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5667 armnn::TensorInfo outputTensorInfo({ 2, 9, 2 }, ArmnnType, qScale, qOffset);
5669 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5670 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
5672 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5673 // Batch 0, Channel 0
5676 // Batch 0, Channel 1
5679 // Batch 0, Channel 2
5682 // Batch 0, Channel 3
5685 // Batch 0, Channel 4
5688 // Batch 0, Channel 5
5691 // Batch 0, Channel 6
5694 // Batch 0, Channel 7
5697 // Batch 0, Channel 8
5700 // Batch 1, Channel 0
5703 // Batch 1, Channel 1
5706 // Batch 1, Channel 2
5709 // Batch 1, Channel 3
5712 // Batch 1, Channel 4
5715 // Batch 1, Channel 5
5718 // Batch 1, Channel 6
5721 // Batch 1, Channel 7
5724 // Batch 1, Channel 8
5731 LayerTestResult<float, 3> Concatenation3dDim1Test(
5732 armnn::IWorkloadFactory& workloadFactory,
5733 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5735 return Concatenation3dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5738 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5739 LayerTestResult<T, 3> Concatenation3dDim2TestImpl(
5740 armnn::IWorkloadFactory& workloadFactory,
5741 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5746 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
5748 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5749 workloadFactory, memoryManager, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
5751 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5752 // Batch 0, Channel 0
5753 1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
5755 // Batch 0, Channel 1
5756 3.0f, 4.0f, 9.0f, 10.0f, 15.0f, 16.0f,
5758 // Batch 0, Channel 2
5759 5.0f, 6.0f, 11.0f, 12.0f, 17.0f, 18.0f,
5761 // Batch 1, Channel 0
5762 19.0f, 20.0f, 25.0f, 26.0f, 31.0f, 32.0f,
5764 // Batch 1, Channel 1
5765 21.0f, 22.0f, 27.0f, 28.0f, 33.0f, 34.0f,
5767 // Batch 1, Channel 2
5768 23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
5774 LayerTestResult<float, 3> Concatenation3dDim2Test(
5775 armnn::IWorkloadFactory& workloadFactory,
5776 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5779 return Concatenation3dDim2TestImpl<armnn::DataType::Float32>(
5780 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
5783 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5784 LayerTestResult<T, 3> Concatenation3dDim0DiffInputDimsTestImpl(
5785 armnn::IWorkloadFactory& workloadFactory,
5786 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5790 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
5791 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5792 // Batch 0, Channel 0
5795 // Batch 0, Channel 1
5798 // Batch 0, Channel 2
5801 // Batch 1, Channel 0
5804 // Batch 1, Channel 1
5807 // Batch 1, Channel 2
5811 armnn::TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
5812 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5813 // Batch 0, Channel 0
5816 // Batch 0, Channel 1
5819 // Batch 0, Channel 2
5823 armnn::TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
5824 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5825 // Batch 0, Channel 0
5828 // Batch 0, Channel 1
5831 // Batch 0, Channel 2
5834 // Batch 1, Channel 0
5837 // Batch 1, Channel 1
5840 // Batch 1, Channel 2
5843 // Batch 2, Channel 0
5846 // Batch 2, Channel 1
5849 // Batch 2, Channel 2
5853 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
5854 LayerTestResult<T, 3> result(outputTensorInfo);
5856 std::vector<T> output;
5857 output.resize(outputTensorInfo.GetNumElements());
5858 Concatenate<T>(workloadFactory, memoryManager,
5859 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5860 { input0.data(), input1.data(), input2.data() },
5866 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5867 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5868 // Batch 0, Channel 0
5871 // Batch 0, Channel 1
5874 // Batch 0, Channel 2
5877 // Batch 1, Channel 0
5880 // Batch 1, Channel 1
5883 // Batch 1, Channel 2
5886 // Batch 2, Channel 0
5889 // Batch 2, Channel 1
5892 // Batch 2, Channel 2
5895 // Batch 3, Channel 0
5898 // Batch 3, Channel 1
5901 // Batch 3, Channel 2
5904 // Batch 4, Channel 0
5907 // Batch 4, Channel 1
5910 // Batch 4, Channel 2
5913 // Batch 5, Channel 0
5916 // Batch 5, Channel 1
5919 // Batch 5, Channel 2
5926 LayerTestResult<float, 3> Concatenation3dDim0DiffInputDimsTest(
5927 armnn::IWorkloadFactory& workloadFactory,
5928 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5930 return Concatenation3dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5931 workloadFactory, memoryManager, 0.0f, 0);
5934 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5935 LayerTestResult<T, 3> Concatenation3dDim1DiffInputDimsTestImpl(
5936 armnn::IWorkloadFactory& workloadFactory,
5937 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5941 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5942 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5943 // Batch 0, Channel 0
5946 // Batch 0, Channel 1
5949 // Batch 0, Channel 2
5952 // Batch 1, Channel 0
5955 // Batch 1, Channel 1
5958 // Batch 1, Channel 2
5962 armnn::TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType, qScale, qOffset);
5963 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5964 // Batch 0, Channel 0
5967 // Batch 0, Channel 1
5970 // Batch 0, Channel 2
5973 // Batch 0, Channel 3
5976 // Batch 1, Channel 0
5979 // Batch 1, Channel 1
5982 // Batch 1, Channel 2
5985 // Batch 1, Channel 3
5989 armnn::TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType, qScale, qOffset);
5990 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5991 // Batch 0, Channel 0
5994 // Batch 1, Channel 0
5998 armnn::TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType, qScale, qOffset);
5999 LayerTestResult<T, 3> result(outputTensorInfo);
6001 std::vector<T> output;
6002 output.resize(outputTensorInfo.GetNumElements());
6003 Concatenate<T>(workloadFactory, memoryManager,
6004 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
6005 { input0.data(), input1.data(), input2.data() },
6011 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
6012 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6013 // Batch 0, Channel 0
6016 // Batch 0, Channel 1
6019 // Batch 0, Channel 2
6022 // Batch 0, Channel 3
6025 // Batch 0, Channel 4
6028 // Batch 0, Channel 5
6031 // Batch 0, Channel 6
6034 // Batch 0, Channel 7
6037 // Batch 1, Channel 0
6040 // Batch 1, Channel 1
6043 // Batch 1, Channel 2
6046 // Batch 1, Channel 3
6049 // Batch 1, Channel 4
6052 // Batch 1, Channel 5
6055 // Batch 1, Channel 6
6058 // Batch 1, Channel 7
6065 LayerTestResult<float, 3> Concatenation3dDim1DiffInputDimsTest(
6066 armnn::IWorkloadFactory& workloadFactory,
6067 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6069 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
6070 workloadFactory, memoryManager, 0.0f, 0);
6073 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6074 LayerTestResult<T, 3> Concatenation3dDim2DiffInputDimsTestImpl(
6075 armnn::IWorkloadFactory& workloadFactory,
6076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6081 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
6082 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
6083 // Batch 0, Channel 0
6086 // Batch 0, Channel 1
6089 // Batch 0, Channel 2
6092 // Batch 1, Channel 0
6095 // Batch 1, Channel 1
6098 // Batch 1, Channel 2
6102 armnn::TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType, qScale, qOffset);
6103 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
6104 // Batch 0, Channel 0
6107 // Batch 0, Channel 1
6110 // Batch 0, Channel 2
6113 // Batch 1, Channel 0
6116 // Batch 1, Channel 1
6119 // Batch 1, Channel 2
6123 armnn::TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType, qScale, qOffset);
6124 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
6125 // Batch 0, Channel 0
6126 13.0f, 14.0f, 50.0f,
6128 // Batch 0, Channel 1
6129 15.0f, 16.0f, 51.0f,
6131 // Batch 0, Channel 2
6132 17.0f, 18.0f, 52.0f,
6134 // Batch 1, Channel 0
6135 31.0f, 32.0f, 53.0f,
6137 // Batch 1, Channel 1
6138 33.0f, 34.0f, 54.0f,
6140 // Batch 1, Channel 2
6141 35.0f, 36.0f, 55.0f,
6144 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
6145 LayerTestResult<T, 3> result(outputTensorInfo);
6147 std::vector<T> output;
6148 output.resize(outputTensorInfo.GetNumElements());
6149 Concatenate<T>(workloadFactory, memoryManager,
6150 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
6151 { input0.data(), input1.data(), input2.data() },
6157 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
6158 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6159 // Batch 0, Channel 0
6160 1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
6162 // Batch 0, Channel 1
6163 3.0f, 4.0f, 9.0f, 15.0f, 16.0f, 51.0f,
6165 // Batch 0, Channel 2
6166 5.0f, 6.0f, 11.0f, 17.0f, 18.0f, 52.0f,
6168 // Batch 1, Channel 0
6169 19.0f, 20.0f, 25.0f, 31.0f, 32.0f, 53.0f,
6171 // Batch 1, Channel 1
6172 21.0f, 22.0f, 27.0f, 33.0f, 34.0f, 54.0f,
6174 // Batch 1, Channel 2
6175 23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
6181 LayerTestResult<float, 3> Concatenation3dDim2DiffInputDimsTest(
6182 armnn::IWorkloadFactory& workloadFactory,
6183 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6186 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::Float32>(
6187 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
6190 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6191 LayerTestResult<T, 4> Concatenation4dTestImpl(
6192 armnn::IWorkloadFactory& workloadFactory,
6193 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6194 const armnn::TensorInfo& outputTensorInfo,
6195 unsigned int dimension,
6200 armnn::TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6202 auto input0 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6211 auto input1 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6220 auto input2 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6229 LayerTestResult<T, 4> result(outputTensorInfo);
6231 std::vector<T> output;
6232 output.resize(outputTensorInfo.GetNumElements());
6234 Concatenate<T>(workloadFactory,
6236 {inputTensorInfo, inputTensorInfo, inputTensorInfo},
6237 {input0.data(), input1.data(), input2.data()},
6243 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6247 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6248 LayerTestResult<T, 4> Concatenation4dDim0TestImpl(
6249 armnn::IWorkloadFactory& workloadFactory,
6250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6254 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6256 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6257 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
6259 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6284 LayerTestResult<float, 4> Concatenation4dDim0Test(
6285 armnn::IWorkloadFactory& workloadFactory,
6286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6288 return Concatenation4dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6291 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6292 LayerTestResult<T, 4> Concatenation4dDim1TestImpl(
6293 armnn::IWorkloadFactory& workloadFactory,
6294 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6298 armnn::TensorInfo outputTensorInfo({ 1, 9, 2, 2 }, ArmnnType, qScale, qOffset);
6300 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6301 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
6303 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6329 LayerTestResult<float, 4> Concatenation4dDim1Test(
6330 armnn::IWorkloadFactory& workloadFactory,
6331 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6333 return Concatenation4dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6336 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6337 LayerTestResult<T, 4> Concatenation4dDim2TestImpl(
6338 armnn::IWorkloadFactory& workloadFactory,
6339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6343 armnn::TensorInfo outputTensorInfo({ 1, 3, 6, 2 }, ArmnnType, qScale, qOffset);
6345 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6346 workloadFactory, memoryManager, outputTensorInfo, 2, true, qScale, qOffset);
6348 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6374 LayerTestResult<float, 4> Concatenation4dDim2Test(
6375 armnn::IWorkloadFactory& workloadFactory,
6376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6378 return Concatenation4dDim2TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6381 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6382 LayerTestResult<T, 4> Concatenation4dDim3TestImpl(
6383 armnn::IWorkloadFactory& workloadFactory,
6384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6389 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 6 }, ArmnnType, qScale, qOffset);
6391 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6392 workloadFactory, memoryManager, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
6394 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6420 LayerTestResult<float, 4> Concatenation4dDim3Test(
6421 armnn::IWorkloadFactory& workloadFactory,
6422 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6425 return Concatenation4dDim3TestImpl<armnn::DataType::Float32>(
6426 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6429 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6430 LayerTestResult<T, 4> Concatenation4dDiffShapeDim0TestImpl(
6431 armnn::IWorkloadFactory& workloadFactory,
6432 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6436 unsigned int dimension = 0;
6437 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6439 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6448 armnn::TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6450 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6467 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6469 LayerTestResult<T, 4> result(outputTensorInfo);
6471 std::vector<T> output;
6472 output.resize(outputTensorInfo.GetNumElements());
6473 Concatenate<T>(workloadFactory,
6475 {inputTensorInfo0, inputTensorInfo1},
6476 {input0.data(), input1.data()},
6482 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6483 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6509 LayerTestResult<float, 4> Concatenation4dDiffShapeDim0Test(
6510 armnn::IWorkloadFactory& workloadFactory,
6511 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6513 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::Float32>(
6514 workloadFactory, memoryManager, 0.0f, 0);
6517 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6518 LayerTestResult<T, 4> Concatenation4dDiffShapeDim1TestImpl(
6519 armnn::IWorkloadFactory& workloadFactory,
6520 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6524 unsigned int dimension = 1;
6525 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6527 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6536 armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType, qScale, qOffset);
6538 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6546 armnn::TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType, qScale, qOffset);
6548 LayerTestResult<T, 4> result(outputTensorInfo);
6550 std::vector<T> output;
6551 output.resize(outputTensorInfo.GetNumElements());
6552 Concatenate<T>(workloadFactory,
6554 {inputTensorInfo0, inputTensorInfo1},
6555 {input0.data(), input1.data()},
6561 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6562 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6578 LayerTestResult<float, 4> Concatenation4dDiffShapeDim1Test(
6579 armnn::IWorkloadFactory& workloadFactory,
6580 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6582 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::Float32>(
6583 workloadFactory, memoryManager, 0.0f, 0);
6586 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6587 LayerTestResult<T, 4> Concatenation4dDiffShapeDim2TestImpl(
6588 armnn::IWorkloadFactory& workloadFactory,
6589 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6593 unsigned int dimension = 2;
6594 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6596 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6605 armnn::TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType, qScale, qOffset);
6607 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6619 armnn::TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType, qScale, qOffset);
6621 LayerTestResult<T, 4> result(outputTensorInfo);
6623 std::vector<T> output;
6624 output.resize(outputTensorInfo.GetNumElements());
6625 Concatenate<T>(workloadFactory,
6627 {inputTensorInfo0, inputTensorInfo1},
6628 {input0.data(), input1.data()},
6634 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6635 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6658 LayerTestResult<float, 4> Concatenation4dDiffShapeDim2Test(
6659 armnn::IWorkloadFactory& workloadFactory,
6660 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6662 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::Float32>(
6663 workloadFactory, memoryManager, 0.0f, 0);
6666 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6667 LayerTestResult<T, 4> Concatenation4dDiffShapeDim3TestImpl(
6668 armnn::IWorkloadFactory& workloadFactory,
6669 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6674 unsigned int dimension = 3;
6675 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6677 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6686 armnn::TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType, qScale, qOffset);
6688 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6689 11.0f, 12.0f, 13.0f,
6690 14.0f, 15.0f, 16.0f,
6692 17.0f, 18.0f, 19.0f,
6693 20.0f, 21.0f, 22.0f,
6695 23.0f, 24.0f, 25.0f,
6699 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType, qScale, qOffset);
6701 LayerTestResult<T, 4> result(outputTensorInfo);
6703 std::vector<T> output;
6704 output.resize(outputTensorInfo.GetNumElements());
6705 Concatenate<T>(workloadFactory,
6707 {inputTensorInfo0, inputTensorInfo1},
6708 {input0.data(), input1.data()},
6714 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6715 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6716 1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
6717 3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
6718 5.0f, 6.0f, 17.0f, 18.0f, 19.0f,
6719 7.0f, 8.0f, 20.0f, 21.0f, 22.0f,
6720 9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
6721 11.0f, 12.0f, 26.0f, 27.0f, 28.0f
6727 LayerTestResult<float, 4> Concatenation4dDiffShapeDim3Test(
6728 armnn::IWorkloadFactory& workloadFactory,
6729 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6732 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::Float32>(
6733 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6736 LayerTestResult<float, 2> FakeQuantizationTest(
6737 armnn::IWorkloadFactory& workloadFactory,
6738 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6740 constexpr unsigned int width = 2;
6741 constexpr unsigned int height = 3;
6743 const armnn::TensorInfo tensorInfo({height, width },
6744 armnn::DataType::Float32);
6745 auto input = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6751 LayerTestResult<float, 2> ret(tensorInfo);
6753 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6755 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6757 armnn::FakeQuantizationQueueDescriptor data;
6758 armnn::WorkloadInfo info;
6760 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
6761 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
6765 data.m_Parameters.m_Min = min;
6766 data.m_Parameters.m_Max = max;
6768 armnn::PassthroughCpuTensorHandle refHandle(tensorInfo, &ret.outputExpected[0][0]);
6769 armnn::FakeQuantizationQueueDescriptor refData = data;
6770 armnn::WorkloadInfo refInfo = info;
6771 SetWorkloadOutput(refData, refInfo, 0, tensorInfo, &refHandle);
6773 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateFakeQuantization(data, info);
6775 inputHandle->Allocate();
6776 outputHandle->Allocate();
6778 CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
6780 workload->PostAllocationConfigure();
6781 workload->Execute();
6783 CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
6785 ret.outputExpected = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6795 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6796 LayerTestResult<T, 4> L2NormalizationTestImpl(
6797 armnn::IWorkloadFactory& workloadFactory,
6798 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6799 const armnn::TensorShape& inputOutputTensorShape,
6802 const std::vector<float>& inputValues,
6805 const std::vector<float>& expectedOutputValues,
6806 const armnn::DataLayout layout,
6807 float epsilon = 1e-12f)
6809 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, ArmnnType, scale, offset);
6810 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, ArmnnType, outScale, outOffset);
6812 // at this point if we require it permute the input data
6813 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
6814 std::vector<float> inputData = inputValues;
6815 if (layout == armnn::DataLayout::NHWC)
6817 std::vector<float> tmp(inputData.size());
6818 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
6822 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
6823 inputTensorInfo.GetQuantizationScale(),
6824 inputTensorInfo.GetQuantizationOffset(),
6827 std::vector<float> expectedOutputData = expectedOutputValues;
6828 if (layout == armnn::DataLayout::NHWC)
6830 std::vector<float> tmp(expectedOutputData.size());
6831 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, expectedOutputData.data(), tmp.data(),
6833 expectedOutputData = tmp;
6836 LayerTestResult<T, 4> result(outputTensorInfo);
6837 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
6838 outputTensorInfo.GetQuantizationScale(),
6839 outputTensorInfo.GetQuantizationOffset(),
6840 expectedOutputData));
6842 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6843 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6845 armnn::L2NormalizationQueueDescriptor descriptor;
6846 descriptor.m_Parameters.m_Eps = epsilon;
6847 descriptor.m_Parameters.m_DataLayout = layout;
6848 armnn::WorkloadInfo info;
6850 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6851 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6853 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
6855 inputHandle->Allocate();
6856 outputHandle->Allocate();
6858 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
6860 workload->PostAllocationConfigure();
6861 ExecuteWorkload(*workload, memoryManager);
6863 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6868 float CalcInvL2Norm(std::initializer_list<float> elements)
6870 const float reduction = std::accumulate(elements.begin(), elements.end(), 0.0f,
6871 [](float acc, float element) { return acc + element * element; });
6872 return 1.0f / sqrtf(reduction);
6875 } // anonymous namespace
6877 template<armnn::DataType ArmnnType, typename T>
6878 LayerTestResult<T, 2> Pad2dTestCommon(
6879 armnn::IWorkloadFactory& workloadFactory,
6880 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6883 const float customPaddingValue)
6885 const armnn::TensorShape inputShape{ 3, 3 };
6886 const armnn::TensorShape outputShape{ 7, 7 };
6888 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6889 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6891 std::vector<T> inputValues(
6892 QuantizedVector<T>(qScale, qOffset,
6894 // Height (3) x Width (3)
6900 auto p = customPaddingValue;
6901 std::vector<T> expectedOutputValues;
6902 expectedOutputValues = (
6903 QuantizedVector<T>(qScale, qOffset,
6905 p, p, p, p, p, p, p,
6906 p, p, p, p, p, p, p,
6907 p, p, 4, 8, 6, p, p,
6908 p, p, 7, 4, 4, p, p,
6909 p, p, 3, 2, 4, p, p,
6910 p, p, p, p, p, p, p,
6914 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
6916 LayerTestResult<T, 2> result(outputTensorInfo);
6917 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6919 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6920 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6922 armnn::PadQueueDescriptor descriptor;
6924 std::vector<std::pair<unsigned int, unsigned int>> padList;
6925 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6926 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6928 descriptor.m_Parameters.m_PadList = padList;
6929 descriptor.m_Parameters.m_PadValue = customPaddingValue;
6930 armnn::WorkloadInfo info;
6932 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6933 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6935 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6937 inputHandle->Allocate();
6938 outputHandle->Allocate();
6940 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
6942 workload->PostAllocationConfigure();
6943 workload->Execute();
6945 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
6950 template<armnn::DataType ArmnnType, typename T>
6951 LayerTestResult<T, 3> Pad3dTestCommon(
6952 armnn::IWorkloadFactory& workloadFactory,
6953 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6957 const armnn::TensorShape inputShape{ 2, 2, 2 };
6958 const armnn::TensorShape outputShape{ 3, 5, 6 };
6960 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6961 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6963 std::vector<T> inputValues(
6964 QuantizedVector<T>(qScale,qOffset,
6966 // Channel 0, Height (2) x Width (2)
6970 // Channel 1, Height (2) x Width (2)
6975 std::vector<T> expectedOutputValues(
6976 QuantizedVector<T>(qScale,qOffset,
6999 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(inputValues));
7001 LayerTestResult<T, 3> result(outputTensorInfo);
7002 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(expectedOutputValues));
7004 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7005 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7007 armnn::PadQueueDescriptor descriptor;
7009 std::vector<std::pair<unsigned int, unsigned int>> PadList;
7010 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
7011 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
7012 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
7014 descriptor.m_Parameters.m_PadList = PadList;
7015 armnn::WorkloadInfo info;
7017 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7018 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7020 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
7022 inputHandle->Allocate();
7023 outputHandle->Allocate();
7025 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
7027 workload->PostAllocationConfigure();
7028 workload->Execute();
7030 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
7035 template<armnn::DataType ArmnnType, typename T>
7036 LayerTestResult<T, 4> Pad4dTestCommon(
7037 armnn::IWorkloadFactory& workloadFactory,
7038 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7042 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
7043 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
7045 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
7046 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
7048 std::vector<T> inputValues(
7049 QuantizedVector<T>(qScale,qOffset,
7051 // Batch 0, Channel 0, Height (3) x Width (2)
7056 // Batch 0, Channel 1, Height (3) x Width (2)
7061 // Batch 1, Channel 0, Height (3) x Width (2)
7066 // Batch 1, Channel 1, Height (3) x Width (2)
7072 std::vector<T> expectedOutputValues(
7073 QuantizedVector<T>(qScale,qOffset,
7236 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(inputValues));
7238 LayerTestResult<T, 4> result(outputTensorInfo);
7239 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(expectedOutputValues));
7241 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7242 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7244 armnn::PadQueueDescriptor descriptor;
7246 std::vector<std::pair<unsigned int, unsigned int>> PadList;
7247 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
7248 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
7249 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
7250 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
7252 descriptor.m_Parameters.m_PadList = PadList;
7253 armnn::WorkloadInfo info;
7255 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7256 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7258 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
7260 inputHandle->Allocate();
7261 outputHandle->Allocate();
7263 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
7265 workload->PostAllocationConfigure();
7266 workload->Execute();
7268 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7273 LayerTestResult<uint8_t, 2> PadUint82dTest(
7274 armnn::IWorkloadFactory& workloadFactory,
7275 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7277 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7280 LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
7281 armnn::IWorkloadFactory& workloadFactory,
7282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7284 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0, 1.0f);
7287 LayerTestResult<uint8_t, 3> PadUint83dTest(
7288 armnn::IWorkloadFactory& workloadFactory,
7289 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7291 return Pad3dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7294 LayerTestResult<uint8_t, 4> PadUint84dTest(
7295 armnn::IWorkloadFactory& workloadFactory,
7296 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7298 return Pad4dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7302 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 2>
7303 Pad2dTestCommon<armnn::DataType::QuantisedSymm16>(
7304 armnn::IWorkloadFactory& workloadFactory,
7305 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7308 const float customPaddingValue);
7310 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 3>
7311 Pad3dTestCommon<armnn::DataType::QuantisedSymm16>(
7312 armnn::IWorkloadFactory& workloadFactory,
7313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7317 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
7318 Pad4dTestCommon<armnn::DataType::QuantisedSymm16>(
7319 armnn::IWorkloadFactory& workloadFactory,
7320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7324 LayerTestResult<float, 2> PadFloat322dTest(
7325 armnn::IWorkloadFactory& workloadFactory,
7326 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7328 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7331 LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
7332 armnn::IWorkloadFactory& workloadFactory,
7333 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7335 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0, 1.0f);
7338 LayerTestResult<float, 3> PadFloat323dTest(
7339 armnn::IWorkloadFactory& workloadFactory,
7340 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7342 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7345 LayerTestResult<float, 4> PadFloat324dTest(
7346 armnn::IWorkloadFactory& workloadFactory,
7347 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7349 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7352 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7353 LayerTestResult<T, 4> L2NormalizationEpsilonTestCommon(
7354 armnn::IWorkloadFactory& workloadFactory,
7355 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7360 const armnn::DataLayout layout,
7367 unsigned int numberOfBatches = 1;
7368 unsigned int numberOfChannels = 3;
7369 unsigned int height = 1;
7370 unsigned int width = 1;
7372 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7373 numberOfBatches, numberOfChannels, height, width, layout);
7375 // 0.0000001^2 + 0.00000002^2 + 0.00000003^2 < 1e-12
7376 std::vector<float> inputValues
7378 // Batch 0, Channel 0, Height (1) x Width (1)
7381 // Batch 0, Channel 1, Height (1) x Width (1)
7384 // Batch 0, Channel 2, Height (1) x Width (1)
7388 const float approxInvL2Norm = 1.f / sqrtf(epsilon);
7389 std::vector<float> expectedOutputValues
7391 // Batch 0, Channel 0, Height (1) x Width (1)
7392 0.00000001f * approxInvL2Norm,
7393 0.00000002f * approxInvL2Norm,
7394 0.00000003f * approxInvL2Norm,
7397 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7398 inputValues, outScale, outOffset, expectedOutputValues, layout,
7403 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7404 LayerTestResult<T, 4> L2Normalization1dTestCommon(
7405 armnn::IWorkloadFactory& workloadFactory,
7406 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7411 const armnn::DataLayout layout)
7417 unsigned int numberOfBatches = 1;
7418 unsigned int numberOfChannels = 10;
7419 unsigned int height = 1;
7420 unsigned int width = 1;
7423 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7424 numberOfBatches, numberOfChannels, height, width, layout);
7425 std::vector<float> inputValues
7427 // Batch 0, Channel 0, Height (1) x Width (1)
7430 // Batch 0, Channel 1, Height (1) x Width (1)
7433 // Batch 0, Channel 2, Height (1) x Width (1)
7436 // Batch 0, Channel 3, Height (1) x Width (1)
7439 // Batch 0, Channel 4, Height (1) x Width (1)
7442 // Batch 0, Channel 5, Height (1) x Width (1)
7445 // Batch 0, Channel 6, Height (1) x Width (1)
7448 // Batch 0, Channel 7, Height (1) x Width (1)
7451 // Batch 0, Channel 8, Height (1) x Width (1)
7454 // Batch 0, Channel 9, Height (1) x Width (1)
7457 const float approxInvL2Norm = 0.050964719f;
7458 std::vector<float> expectedOutputValues
7460 // Batch 0, Channel 0, Height (1) x Width (1)
7461 1.0f * approxInvL2Norm,
7462 2.0f * approxInvL2Norm,
7463 3.0f * approxInvL2Norm,
7464 4.0f * approxInvL2Norm,
7465 5.0f * approxInvL2Norm,
7466 6.0f * approxInvL2Norm,
7467 7.0f * approxInvL2Norm,
7468 8.0f * approxInvL2Norm,
7469 9.0f * approxInvL2Norm,
7470 10.0f * approxInvL2Norm
7474 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7475 inputValues, outScale, outOffset, expectedOutputValues, layout);
7478 LayerTestResult<float, 4> L2NormalizationDefaultEpsilonTest(
7479 armnn::IWorkloadFactory& workloadFactory,
7480 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7481 const armnn::DataLayout layout)
7483 // Dummy descriptor to get the default value of epsilon.
7484 armnn::L2NormalizationDescriptor descriptor;
7486 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7487 layout, descriptor.m_Eps);
7490 LayerTestResult<float, 4> L2NormalizationNonDefaultEpsilonTest(
7491 armnn::IWorkloadFactory& workloadFactory,
7492 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7493 const armnn::DataLayout layout)
7495 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7499 LayerTestResult<float, 4> L2Normalization1dTest(
7500 armnn::IWorkloadFactory& workloadFactory,
7501 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7502 const armnn::DataLayout layout)
7504 return L2Normalization1dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,layout);
7507 LayerTestResult<int16_t, 4> L2Normalization1dInt16Test(
7508 armnn::IWorkloadFactory& workloadFactory,
7509 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7510 const armnn::DataLayout layout)
7512 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7516 LayerTestResult<uint8_t, 4> L2Normalization1dUint8Test(
7517 armnn::IWorkloadFactory& workloadFactory,
7518 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7519 const armnn::DataLayout layout)
7521 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7522 1.f/128, 128, layout);
7525 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7526 LayerTestResult<T, 4> L2Normalization2dTestCommon(
7527 armnn::IWorkloadFactory& workloadFactory,
7528 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7533 const armnn::DataLayout layout)
7539 unsigned int numberOfBatches = 1;
7540 unsigned int numberOfChannels = 2;
7541 unsigned int height = 1;
7542 unsigned int width = 5;
7544 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7545 numberOfBatches, numberOfChannels, height, width, layout);
7546 std::vector<float> inputValues
7548 // Batch 0, Channel 0, Height (1) x Width (5)
7549 1.0f, 3.0f, 5.0f, 7.0f, 9.0f,
7551 // Batch 0, Channel 1, Height (1) x Width (5)
7552 2.0f, 4.0f, 6.0f, 8.0f, 10.0f
7554 std::vector<float> expectedOutputValues
7556 // Batch 0, Channel 0, Height (1) x Width (5)
7557 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7558 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7559 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7560 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7561 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
7563 // Batch 0, Channel 1, Height (1) x Width (5)
7564 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7565 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7566 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7567 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7568 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
7571 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7572 inputValues, outScale, outOffset, expectedOutputValues, layout);
7575 LayerTestResult<float, 4> L2Normalization2dTest(
7576 armnn::IWorkloadFactory& workloadFactory,
7577 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7578 const armnn::DataLayout layout)
7580 return L2Normalization2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7584 LayerTestResult<int16_t, 4> L2Normalization2dInt16Test(
7585 armnn::IWorkloadFactory& workloadFactory,
7586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7587 const armnn::DataLayout layout)
7589 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7593 LayerTestResult<uint8_t, 4> L2Normalization2dUint8Test(
7594 armnn::IWorkloadFactory& workloadFactory,
7595 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7596 const armnn::DataLayout layout)
7598 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7599 1.f/128, 128, layout);
7602 LayerTestResult<float, 2> L2Normalization2dShapeTest(
7603 armnn::IWorkloadFactory& workloadFactory,
7604 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7606 const armnn::DataLayout layout = armnn::DataLayout::NHWC;
7607 const armnn::TensorShape inputOutputTensorShape = armnn::TensorShape({ 5, 2 });
7609 std::vector<float> inputData
7611 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f
7613 std::vector<float> expectedOutputData
7615 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7616 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7617 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7618 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7619 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7620 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7621 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7622 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7623 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
7624 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
7627 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32, 0.f, 0);
7628 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32, 0.f, 0);
7630 auto inputTensor = MakeTensor<float, 2>(inputTensorInfo, QuantizedVector<float>(
7631 inputTensorInfo.GetQuantizationScale(),
7632 inputTensorInfo.GetQuantizationOffset(),
7635 LayerTestResult<float, 2> result(outputTensorInfo);
7636 result.outputExpected = MakeTensor<float, 2>(outputTensorInfo, QuantizedVector<float>(
7637 outputTensorInfo.GetQuantizationScale(),
7638 outputTensorInfo.GetQuantizationOffset(),
7639 expectedOutputData));
7641 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7642 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7644 armnn::L2NormalizationQueueDescriptor descriptor;
7645 descriptor.m_Parameters.m_Eps = 1e-12f;
7646 descriptor.m_Parameters.m_DataLayout = layout;
7647 armnn::WorkloadInfo info;
7649 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7650 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7652 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
7654 inputHandle->Allocate();
7655 outputHandle->Allocate();
7657 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
7659 workload->PostAllocationConfigure();
7660 ExecuteWorkload(*workload, memoryManager);
7662 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
7667 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7668 LayerTestResult<T, 4> L2Normalization3dTestCommon(
7669 armnn::IWorkloadFactory& workloadFactory,
7670 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7675 const armnn::DataLayout layout)
7681 unsigned int numberOfBatches = 1;
7682 unsigned int numberOfChannels = 2;
7683 unsigned int height = 4;
7684 unsigned int width = 3;
7686 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7687 numberOfBatches, numberOfChannels, height, width, layout);
7688 std::vector<float> inputValues
7690 // Batch 0, Channel 0, Height (4) x Width (3)
7691 119.0f, 21.0f, 150.0f,
7692 149.0f, 32.0f, 179.0f,
7693 15.0f, 227.0f, 141.0f,
7694 147.0f, 199.0f, 220.0f,
7696 // Batch 0, Channel 1, Height (4) x Width (3)
7697 110.0f, 140.0f, 73.0f,
7698 211.0f, 212.0f, 89.0f,
7699 24.0f, 138.0f, 188.0f,
7700 162.0f, 12.0f, 161.0f
7702 std::vector<float> expectedOutputValues
7704 // Batch 0, Channel 0, Height (4) x Width (3)
7705 119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7706 21.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7707 150.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7708 149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7709 32.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7710 179.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7711 15.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7712 227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7713 141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7714 147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7715 199.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7716 220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
7718 // Batch 0, Channel 1, Height (4) x Width (3)
7719 110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7720 140.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7721 73.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7722 211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7723 212.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7724 89.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7725 24.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7726 138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7727 188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7728 162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7729 12.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7730 161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
7733 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7734 inputValues, outScale, outOffset, expectedOutputValues, layout);
7737 LayerTestResult<float, 4> L2Normalization3dTest(
7738 armnn::IWorkloadFactory& workloadFactory,
7739 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7740 const armnn::DataLayout layout)
7742 return L2Normalization3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7746 LayerTestResult<int16_t, 4> L2Normalization3dInt16Test(
7747 armnn::IWorkloadFactory& workloadFactory,
7748 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7749 const armnn::DataLayout layout)
7751 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7755 LayerTestResult<uint8_t, 4> L2Normalization3dUint8Test(
7756 armnn::IWorkloadFactory& workloadFactory,
7757 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7758 const armnn::DataLayout layout)
7760 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7761 1.f/128, 128, layout);
7764 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7765 LayerTestResult<T, 4> L2Normalization4dTestCommon(
7766 armnn::IWorkloadFactory& workloadFactory,
7767 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7772 const armnn::DataLayout layout)
7778 unsigned int numberOfBatches = 2;
7779 unsigned int numberOfChannels = 3;
7780 unsigned int height = 4;
7781 unsigned int width = 3;
7783 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7784 numberOfBatches, numberOfChannels, height, width, layout);
7785 std::vector<float> inputValues
7787 // Batch 0, Channel 0, Height (4) x Width (3)
7788 235.0f, 46.0f, 178.0f,
7789 100.0f, 123.0f, 19.0f,
7790 172.0f, 74.0f, 250.0f,
7791 6.0f, 195.0f, 80.0f,
7793 // Batch 0, Channel 1, Height (4) x Width (3)
7794 113.0f, 95.0f, 202.0f,
7795 77.0f, 114.0f, 71.0f,
7796 122.0f, 246.0f, 166.0f,
7797 82.0f, 28.0f, 37.0f,
7799 // Batch 0, Channel 2, Height (4) x Width (3)
7800 56.0f, 170.0f, 162.0f,
7801 194.0f, 89.0f, 254.0f,
7802 12.0f, 209.0f, 200.0f,
7805 // Batch 1, Channel 0, Height (4) x Width (3)
7806 67.0f, 90.0f, 49.0f,
7807 7.0f, 163.0f, 18.0f,
7808 25.0f, 117.0f, 103.0f,
7809 247.0f, 59.0f, 189.0f,
7811 // Batch 1, Channel 1, Height (4) x Width (3)
7812 239.0f, 104.0f, 199.0f,
7813 17.0f, 124.0f, 153.0f,
7814 222.0f, 217.0f, 75.0f,
7815 32.0f, 126.0f, 21.0f,
7817 // Batch 1, Channel 2, Height (4) x Width (3)
7818 97.0f, 145.0f, 215.0f,
7819 115.0f, 116.0f, 238.0f,
7820 226.0f, 16.0f, 132.0f,
7821 92.0f, 125.0f, 88.0f
7823 std::vector<float> expectedOutputValues
7825 // Batch 0, Channel 0, Height (4) x Width (3)
7826 235.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7827 46.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7828 178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7829 100.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7830 123.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7831 19.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7832 172.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7833 74.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7834 250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7835 6.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7836 195.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7837 80.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7839 // Batch 0, Channel 1, Height (4) x Width (3)
7840 113.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7841 95.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7842 202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7843 77.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7844 114.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7845 71.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7846 122.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7847 246.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7848 166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7849 82.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7850 28.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7851 37.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7853 // Batch 0, Channel 2, Height (4) x Width (3)
7854 56.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7855 170.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7856 162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7857 194.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7858 89.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7859 254.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7860 12.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7861 209.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7862 200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7863 1.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7864 64.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7865 54.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7867 // Batch 1, Channel 0, Height (4) x Width (3)
7868 67.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7869 90.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7870 49.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7871 7.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7872 163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7873 18.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7874 25.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7875 117.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7876 103.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7877 247.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7878 59.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7879 189.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7881 // Batch 1, Channel 1, Height (4) x Width (3)
7882 239.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7883 104.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7884 199.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7885 17.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7886 124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7887 153.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7888 222.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7889 217.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7890 75.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7891 32.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7892 126.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7893 21.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7895 // Batch 1, Channel 2, Height (4) x Width (3)
7896 97.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7897 145.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7898 215.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7899 115.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7900 116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7901 238.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7902 226.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7903 16.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7904 132.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7905 92.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7906 125.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7907 88.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f })
7910 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7911 inputValues, outScale, outOffset, expectedOutputValues, layout);
7914 LayerTestResult<float, 4> L2Normalization4dTest(
7915 armnn::IWorkloadFactory& workloadFactory,
7916 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7917 const armnn::DataLayout layout)
7919 return L2Normalization4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7923 LayerTestResult<int16_t, 4> L2Normalization4dInt16Test(
7924 armnn::IWorkloadFactory& workloadFactory,
7925 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7926 const armnn::DataLayout layout)
7928 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7932 LayerTestResult<uint8_t, 4> L2Normalization4dUint8Test(
7933 armnn::IWorkloadFactory& workloadFactory,
7934 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7935 const armnn::DataLayout layout)
7937 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7938 1.f/128, 128, layout);
7941 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7942 LayerTestResult<T, 4> ConstantTestImpl(
7943 armnn::IWorkloadFactory& workloadFactory,
7944 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7948 constexpr unsigned int inputWidth = 3;
7949 constexpr unsigned int inputHeight = 4;
7950 constexpr unsigned int inputChannels = 3;
7951 constexpr unsigned int inputBatchSize = 2;
7953 constexpr unsigned int outputWidth = inputWidth;
7954 constexpr unsigned int outputHeight = inputHeight;
7955 constexpr unsigned int outputChannels = inputChannels;
7956 constexpr unsigned int outputBatchSize = inputBatchSize;
7958 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7959 ArmnnType, qScale, qOffset);
7961 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7962 ArmnnType, qScale, qOffset);
7964 // Set quantization parameters if the requested type is a quantized type.
7965 if(armnn::IsQuantizedType<T>())
7967 inputTensorInfo.SetQuantizationScale(qScale);
7968 inputTensorInfo.SetQuantizationOffset(qOffset);
7969 outputTensorInfo.SetQuantizationScale(qScale);
7970 outputTensorInfo.SetQuantizationOffset(qOffset);
7973 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
7974 QuantizedVector<T>(qScale, qOffset, {
7975 // Batch 0, Channel 0
7976 235.0f, 46.0f, 178.0f,
7977 100.0f, 123.0f, 19.0f,
7978 172.0f, 74.0f, 250.0f,
7979 6.0f, 195.0f, 80.0f,
7981 // Batch 0, Channel 1
7982 113.0f, 95.0f, 202.0f,
7983 77.0f, 114.0f, 71.0f,
7984 122.0f, 246.0f, 166.0f,
7985 82.0f, 28.0f, 37.0f,
7987 // Batch 0, Channel 2
7988 56.0f, 170.0f, 162.0f,
7989 194.0f, 89.0f, 254.0f,
7990 12.0f, 209.0f, 200.0f,
7993 // Batch 1, Channel 0
7994 67.0f, 90.0f, 49.0f,
7995 7.0f, 163.0f, 18.0f,
7996 25.0f, 117.0f, 103.0f,
7997 247.0f, 59.0f, 189.0f,
7999 // Batch 1, Channel 1
8000 239.0f, 104.0f, 199.0f,
8001 17.0f, 124.0f, 153.0f,
8002 222.0f, 217.0f, 75.0f,
8003 32.0f, 126.0f, 21.0f,
8005 // Batch 1, Channel 2
8006 97.0f, 145.0f, 215.0f,
8007 115.0f, 116.0f, 238.0f,
8008 226.0f, 16.0f, 132.0f,
8009 92.0f, 125.0f, 88.0f,
8012 LayerTestResult<T, 4> result(outputTensorInfo);
8013 result.outputExpected = input;
8015 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8017 armnn::ScopedCpuTensorHandle constantTensor(inputTensorInfo);
8018 AllocateAndCopyDataToITensorHandle(&constantTensor, &input[0][0][0][0]);
8020 armnn::ConstantQueueDescriptor descriptor;
8021 descriptor.m_LayerOutput = &constantTensor;
8023 armnn::WorkloadInfo info;
8024 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
8026 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConstant(descriptor, info);
8028 outputHandle->Allocate();
8030 workload->PostAllocationConfigure();
8031 workload->Execute();
8033 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8037 LayerTestResult<float, 4> ConstantTest(
8038 armnn::IWorkloadFactory& workloadFactory,
8039 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8041 return ConstantTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
8044 LayerTestResult<int16_t, 4> ConstantInt16SimpleQuantizationScaleNoOffsetTest(
8045 armnn::IWorkloadFactory& workloadFactory,
8046 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8048 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
8051 LayerTestResult<uint8_t, 4> ConstantUint8SimpleQuantizationScaleNoOffsetTest(
8052 armnn::IWorkloadFactory& workloadFactory,
8053 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8055 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
8058 LayerTestResult<uint8_t, 3> ConcatUint8DifferentQParamsTest(
8059 armnn::IWorkloadFactory& workloadFactory,
8060 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8062 unsigned int outputWidth = 3;
8063 unsigned int outputHeight = 6;
8064 unsigned int outputChannels = 3;
8066 unsigned int inputWidth1 = 3;
8067 unsigned int inputHeight1 = 6;
8068 unsigned int inputChannels1 = 2;
8070 unsigned int inputWidth2 = 3;
8071 unsigned int inputHeight2 = 6;
8072 unsigned int inputChannels2 = 1;
8074 // Defines the tensor descriptors.
8075 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
8076 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
8077 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
8079 // Quantized input1 tensor. Range [-3, 1]
8080 const float inputScale1 = 0.015686f;
8081 const int32_t inputOffset1 = 192;
8083 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
8101 // Quatized input2 tensor. Range [-1, 4]
8102 const float inputScale2 = 0.019608f;
8103 const int32_t inputOffset2 = 50;
8105 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
8116 // Output has the same quantization parameters than input1,
8117 // so that only the requantization of input2 is required
8118 const float outputScale = 0.015686f;
8119 const int32_t outputOffset = 192;
8121 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
8123 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
8148 outputTensorInfo.SetQuantizationScale(outputScale);
8149 outputTensorInfo.SetQuantizationOffset(outputOffset);
8150 inputTensorInfo1.SetQuantizationScale(inputScale1);
8151 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
8152 inputTensorInfo2.SetQuantizationScale(inputScale2);
8153 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
8155 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
8156 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
8158 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
8159 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
8161 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8163 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
8165 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
8166 subTensorsSupported ?
8167 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
8168 workloadFactory.CreateTensorHandle(inputTensorInfo1);
8170 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
8171 subTensorsSupported ?
8172 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
8173 workloadFactory.CreateTensorHandle(inputTensorInfo2);
8175 armnn::ConcatQueueDescriptor data;
8176 armnn::WorkloadInfo info;
8177 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8178 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
8179 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8181 data.m_ViewOrigins.push_back(window1);
8182 data.m_ViewOrigins.push_back(window2);
8184 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
8186 inputHandle1->Allocate();
8187 inputHandle2->Allocate();
8188 outputHandle->Allocate();
8190 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
8191 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
8193 workload->PostAllocationConfigure();
8194 workload->Execute();
8196 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
8201 LayerTestResult<uint8_t, 3> ConcatUint8Test(
8202 armnn::IWorkloadFactory& workloadFactory,
8203 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8205 unsigned int outputWidth = 3;
8206 unsigned int outputHeight = 6;
8207 unsigned int outputChannels = 3;
8209 unsigned int inputWidth1 = 3;
8210 unsigned int inputHeight1 = 6;
8211 unsigned int inputChannels1 = 2;
8213 unsigned int inputWidth2 = 3;
8214 unsigned int inputHeight2 = 6;
8215 unsigned int inputChannels2 = 1;
8217 // Defines the tensor descriptors.
8218 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
8219 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
8220 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
8222 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
8223 const float scale = 0.13497836f;
8224 const int32_t offset = -7;
8226 outputTensorInfo.SetQuantizationScale(scale);
8227 outputTensorInfo.SetQuantizationOffset(offset);
8228 inputTensorInfo1.SetQuantizationScale(scale);
8229 inputTensorInfo1.SetQuantizationOffset(offset);
8230 inputTensorInfo2.SetQuantizationScale(scale);
8231 inputTensorInfo2.SetQuantizationOffset(offset);
8233 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
8235 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
8260 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
8278 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
8289 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
8290 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
8292 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
8293 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
8296 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8298 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
8300 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
8301 subTensorsSupported ?
8302 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
8303 workloadFactory.CreateTensorHandle(inputTensorInfo1);
8305 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
8306 subTensorsSupported ?
8307 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
8308 workloadFactory.CreateTensorHandle(inputTensorInfo2);
8311 armnn::ConcatQueueDescriptor data;
8312 armnn::WorkloadInfo info;
8313 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8314 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
8315 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8317 data.m_ViewOrigins.push_back(window1);
8318 data.m_ViewOrigins.push_back(window2);
8320 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
8322 inputHandle1->Allocate();
8323 inputHandle2->Allocate();
8324 outputHandle->Allocate();
8326 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
8327 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
8329 workload->PostAllocationConfigure();
8330 workload->Execute();
8332 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
8337 LayerTestResult<uint16_t, 3> ConcatUint16Test(
8338 armnn::IWorkloadFactory& workloadFactory,
8339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8341 unsigned int outputWidth = 3;
8342 unsigned int outputHeight = 6;
8343 unsigned int outputChannels = 3;
8345 unsigned int inputWidth1 = 3;
8346 unsigned int inputHeight1 = 6;
8347 unsigned int inputChannels1 = 2;
8349 unsigned int inputWidth2 = 3;
8350 unsigned int inputHeight2 = 6;
8351 unsigned int inputChannels2 = 1;
8353 // Defines the tensor descriptors.
8354 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedSymm16);
8355 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedSymm16);
8356 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedSymm16);
8358 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
8359 const float scale = 0.13497836f;
8360 const int32_t offset = -7;
8362 outputTensorInfo.SetQuantizationScale(scale);
8363 outputTensorInfo.SetQuantizationOffset(offset);
8364 inputTensorInfo1.SetQuantizationScale(scale);
8365 inputTensorInfo1.SetQuantizationOffset(offset);
8366 inputTensorInfo2.SetQuantizationScale(scale);
8367 inputTensorInfo2.SetQuantizationOffset(offset);
8369 LayerTestResult<uint16_t, 3> ret(outputTensorInfo);
8371 ret.outputExpected = MakeTensor<uint16_t, 3>(outputTensorInfo, std::vector<uint16_t>(
8395 auto input1 = MakeTensor<uint16_t, 3>(inputTensorInfo1, std::vector<uint16_t>(
8412 auto input2 = MakeTensor<uint16_t, 3>(inputTensorInfo2, std::vector<uint16_t>(
8422 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
8423 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
8425 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
8426 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
8429 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8431 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
8433 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
8434 subTensorsSupported ?
8435 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
8436 workloadFactory.CreateTensorHandle(inputTensorInfo1);
8438 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
8439 subTensorsSupported ?
8440 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
8441 workloadFactory.CreateTensorHandle(inputTensorInfo2);
8444 armnn::ConcatQueueDescriptor data;
8445 armnn::WorkloadInfo info;
8446 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8447 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
8448 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8450 data.m_ViewOrigins.push_back(window1);
8451 data.m_ViewOrigins.push_back(window2);
8453 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
8455 inputHandle1->Allocate();
8456 inputHandle2->Allocate();
8457 outputHandle->Allocate();
8459 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
8460 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
8462 workload->PostAllocationConfigure();
8463 workload->Execute();
8465 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
8472 template <typename T>
8473 LayerTestResult<T, 4> AdditionQuantizeTestHelper(
8474 armnn::IWorkloadFactory& workloadFactory,
8475 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8476 const unsigned int shape0[4],
8477 const std::vector<T>& values0,
8480 const unsigned int shape1[4],
8481 const std::vector<T> & values1,
8484 const unsigned int outShape[4],
8485 const std::vector<T> & outValues,
8489 auto dataType = (std::is_same<T, uint8_t>::value ?
8490 armnn::DataType::QuantisedAsymm8 :
8491 armnn::DataType::QuantisedSymm16);
8493 armnn::TensorInfo inputTensorInfo0(4, shape0, dataType);
8494 armnn::TensorInfo inputTensorInfo1(4, shape1, dataType);
8495 armnn::TensorInfo outputTensorInfo(4, outShape, dataType);
8497 inputTensorInfo0.SetQuantizationScale(scale0);
8498 inputTensorInfo0.SetQuantizationOffset(offset0);
8500 inputTensorInfo1.SetQuantizationScale(scale1);
8501 inputTensorInfo1.SetQuantizationOffset(offset1);
8503 outputTensorInfo.SetQuantizationScale(outScale);
8504 outputTensorInfo.SetQuantizationOffset(outOffset);
8506 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8507 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8509 LayerTestResult<T, 4> result(outputTensorInfo);
8510 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8512 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8513 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8514 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8516 armnn::AdditionQueueDescriptor data;
8517 armnn::WorkloadInfo info;
8518 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8519 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8520 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8522 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
8524 inputHandle0->Allocate();
8525 inputHandle1->Allocate();
8526 outputHandle->Allocate();
8528 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8529 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8531 workload->PostAllocationConfigure();
8532 workload->Execute();
8534 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8538 } // anonymous namespace
8540 LayerTestResult<uint8_t, 4> AdditionUint8Test(
8541 armnn::IWorkloadFactory& workloadFactory,
8542 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8544 const unsigned int shape0[] = { 1, 2, 2, 3 };
8545 const unsigned int shape1[] = { 1, 2, 2, 3 };
8547 std::vector<uint8_t> input0(
8549 63, 35, 77, 70, 56, 112, // 420, 224, 518, 469, 371, 763
8550 203, 28, 252, 168, 245, 91 // 1400, 175, 1743, 1155, 1694, 616
8553 std::vector<uint8_t> input1(
8555 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8556 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8559 std::vector<uint8_t> output(
8561 81, 39, 249, 255, 228, 255, // 546, 252, 1722, 2065(clamped), 1575, 2212(clamped)
8562 255, 186, 255, 186, 255, 214, // 2261(clamped), 1281, 2163(clamped), 1281, 2408(clamped), 1477
8565 return AdditionQuantizeTestHelper(workloadFactory,
8567 shape0, input0, 7.0f, 3,
8568 shape1, input1, 7.0f, 3,
8569 shape0, output, 7.0f, 3);
8572 LayerTestResult<int16_t, 4> AdditionInt16Test(
8573 armnn::IWorkloadFactory& workloadFactory,
8574 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8576 const unsigned int shape0[] = { 1, 2, 2, 3 };
8577 const unsigned int shape1[] = { 1, 2, 2, 3 };
8579 std::vector<int16_t> input0(
8581 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
8582 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
8585 std::vector<int16_t> input1(
8587 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8588 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8591 std::vector<int16_t> output(
8593 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
8594 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
8597 return AdditionQuantizeTestHelper(workloadFactory,
8599 shape0, input0, 7.0f, 0,
8600 shape1, input1, 7.0f, 0,
8601 shape0, output, 7.0f, 0);
8606 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8607 LayerTestResult<T, 4> MultiplicationQuantizeTestHelper(
8608 armnn::IWorkloadFactory& workloadFactory,
8609 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8610 const unsigned int shape0[4],
8611 const std::vector<T> & values0,
8614 const unsigned int shape1[4],
8615 const std::vector<T> & values1,
8618 const unsigned int outShape[4],
8619 const std::vector<T> & outValues,
8623 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8624 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8625 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8627 inputTensorInfo0.SetQuantizationScale(scale0);
8628 inputTensorInfo0.SetQuantizationOffset(offset0);
8630 inputTensorInfo1.SetQuantizationScale(scale1);
8631 inputTensorInfo1.SetQuantizationOffset(offset1);
8633 outputTensorInfo.SetQuantizationScale(outScale);
8634 outputTensorInfo.SetQuantizationOffset(outOffset);
8636 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8637 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8639 LayerTestResult<T, 4> result(outputTensorInfo);
8640 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8642 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8643 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8644 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8646 armnn::MultiplicationQueueDescriptor data;
8647 armnn::WorkloadInfo info;
8648 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8649 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8650 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8652 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
8654 inputHandle0->Allocate();
8655 inputHandle1->Allocate();
8656 outputHandle->Allocate();
8658 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8659 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8661 workload->PostAllocationConfigure();
8662 workload->Execute();
8664 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8668 } // anonymous namespace
8670 LayerTestResult<uint8_t, 4> MultiplicationUint8Test(
8671 armnn::IWorkloadFactory& workloadFactory,
8672 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8674 unsigned int batchSize = 1;
8675 unsigned int channels = 2;
8676 unsigned int height = 2;
8677 unsigned int width = 3;
8678 const unsigned int shape[] = { batchSize, channels, height, width };
8680 // See dequantized values to the right.
8681 std::vector<uint8_t> input0({
8682 62, 37, 3, 172, 13, 111, // 244, 144, 8, 684, 48, 440,
8683 188, 20, 73, 31, 23, 31 // 748, 76, 288, 120, 88, 120
8686 // See dequantized values to the right.
8687 std::vector<uint8_t> input1({
8688 126, 240, 252, 183, 121, 247, // 384, 726, 762, 555, 369, 747,
8689 48, 115, 151, 79, 78, 97 // 150, 351, 459, 243, 240, 297
8692 // See dequantized values to the right.
8693 std::vector<uint8_t> output(
8695 64, 72, 0, 255, 8, 236, // 93696, 104544, 6096(clamped), 379620(clamped), 17712, 328680,
8696 77, 15, 92, 16, 10, 21, // 112200, 26676, 132192, 29160, 21120, 35640
8699 // Scale/offset chosen to have output values out of range.
8700 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8716 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1ElementUint8Test(
8717 armnn::IWorkloadFactory& workloadFactory,
8718 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8720 const unsigned int shape0[] = { 1, 2, 2, 3 };
8721 const unsigned int shape1[] = { 1, 1, 1, 1 };
8723 std::vector<uint8_t> input0({
8728 std::vector<uint8_t> input1({2});
8730 std::vector<uint8_t> output({
8732 14, 16, 18, 20, 22, 24
8735 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8751 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1DVectorUint8Test(
8752 armnn::IWorkloadFactory& workloadFactory,
8753 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8755 const unsigned int shape0[] = { 1, 2, 2, 3 };
8756 const unsigned int shape1[] = { 1, 1, 1, 3 };
8758 std::vector<uint8_t> input0({
8763 std::vector<uint8_t> input1({1, 2, 3});
8765 std::vector<uint8_t> output({
8767 7, 16, 27, 10, 22, 36
8770 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8786 LayerTestResult<int16_t, 4> MultiplicationInt16Test(
8787 armnn::IWorkloadFactory& workloadFactory,
8788 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8790 const unsigned int shape[] = { 1, 2, 2, 3 };
8792 std::vector<int16_t> input0(
8795 12, 13, 14, 15, 16, 17
8798 std::vector<int16_t> input1(
8804 std::vector<int16_t> output(
8806 6, 14, 24, 36, 50, 66,
8807 84, 104, 126, 150, 176, 204
8810 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8826 LayerTestResult<int16_t, 4> MultiplicationBroadcast1ElementInt16Test(
8827 armnn::IWorkloadFactory& workloadFactory,
8828 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8830 const unsigned int shape0[] = { 1, 2, 2, 3 };
8831 const unsigned int shape1[] = { 1, 1, 1, 1 };
8833 std::vector<int16_t> input0(
8839 std::vector<int16_t> input1({2});
8841 std::vector<int16_t> output(
8844 14, 16, 18, 20, 22, 24
8847 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8863 LayerTestResult<int16_t, 4> MultiplicationBroadcast1DVectorInt16Test(
8864 armnn::IWorkloadFactory& workloadFactory,
8865 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8867 const unsigned int shape0[] = { 1, 2, 2, 3 };
8868 const unsigned int shape1[] = { 1, 1, 1, 3 };
8870 std::vector<int16_t> input0(
8876 std::vector<int16_t> input1({1, 2, 3});
8878 std::vector<int16_t> output(
8881 7, 16, 27, 10, 22, 36
8884 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8902 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8903 LayerTestResult<T, 4> SubtractionTestHelper(
8904 armnn::IWorkloadFactory& workloadFactory,
8905 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8906 const unsigned int shape0[4],
8907 const std::vector<T>& values0,
8910 const unsigned int shape1[4],
8911 const std::vector<T> & values1,
8914 const unsigned int outShape[4],
8915 const std::vector<T> & outValues,
8919 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8920 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8921 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8923 inputTensorInfo0.SetQuantizationScale(scale0);
8924 inputTensorInfo0.SetQuantizationOffset(offset0);
8926 inputTensorInfo1.SetQuantizationScale(scale1);
8927 inputTensorInfo1.SetQuantizationOffset(offset1);
8929 outputTensorInfo.SetQuantizationScale(outScale);
8930 outputTensorInfo.SetQuantizationOffset(outOffset);
8932 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8933 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8935 LayerTestResult<T, 4> result(outputTensorInfo);
8936 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8938 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8939 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8940 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8942 armnn::SubtractionQueueDescriptor data;
8943 armnn::WorkloadInfo info;
8944 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8945 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8946 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8948 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSubtraction(data, info);
8950 inputHandle0->Allocate();
8951 inputHandle1->Allocate();
8952 outputHandle->Allocate();
8954 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8955 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8957 workload->PostAllocationConfigure();
8958 workload->Execute();
8960 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8964 } // anonymous namespace
8966 LayerTestResult<uint8_t, 4> SubtractionUint8Test(
8967 armnn::IWorkloadFactory& workloadFactory,
8968 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8970 const unsigned int shape0[] = { 1, 1, 2, 2 };
8971 const unsigned int shape1[] = { 1, 1, 2, 2 };
8973 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8974 std::vector<uint8_t> input1({ 1, 2, 1, 2 });
8975 std::vector<uint8_t> output({ 3, 3, 5, 5 });
8977 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8979 shape0, input0, 0.5f, 2,
8980 shape1, input1, 1.0f, 0,
8981 shape0, output, 1.0f, 0);
8984 LayerTestResult<uint8_t, 4> SubtractionBroadcast1ElementUint8Test(
8985 armnn::IWorkloadFactory& workloadFactory,
8986 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8988 const unsigned int shape0[] = { 1, 1, 2, 2 };
8989 const unsigned int shape1[] = { 1, 1, 1, 1 };
8991 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8992 std::vector<uint8_t> input1({ 2 });
8993 std::vector<uint8_t> output({ 5, 6, 7, 8 });
8995 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8997 shape0, input0, 0.5f, 2,
8998 shape1, input1, 1.0f, 0,
8999 shape0, output, 1.0f, 3);
9002 LayerTestResult<uint8_t, 4> SubtractionBroadcastUint8Test(
9003 armnn::IWorkloadFactory& workloadFactory,
9004 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9006 const unsigned int shape0[] = { 1, 1, 2, 2 };
9007 const unsigned int shape1[] = { 1, 1, 2, 1 };
9009 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
9010 std::vector<uint8_t> input1({ 2, 1 });
9011 std::vector<uint8_t> output({ 8, 11, 12, 15 });
9013 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
9015 shape0, input0, 1.0f, 0,
9016 shape1, input1, 1.0f, 0,
9017 shape0, output, 1.0f, 0);
9020 LayerTestResult<float, 4> SubtractionTest(
9021 armnn::IWorkloadFactory& workloadFactory,
9022 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9024 const unsigned int shape0[] = { 1, 1, 2, 2 };
9025 const unsigned int shape1[] = { 1, 1, 2, 2 };
9027 std::vector<float> input0({ 1, 2, 3, 4 });
9028 std::vector<float> input1({ 1, -1, 0, 2 });
9029 std::vector<float> output({ 0, 3, 3, 2 });
9031 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
9033 shape0, input0, 1.0f, 0,
9034 shape1, input1, 1.0f, 0,
9035 shape0, output, 1.0f, 0);
9038 LayerTestResult<float, 4> SubtractionBroadcast1ElementTest(
9039 armnn::IWorkloadFactory& workloadFactory,
9040 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9042 const unsigned int shape0[] = { 1, 1, 2, 2 };
9043 const unsigned int shape1[] = { 1, 1, 1, 1 };
9045 std::vector<float> input0({ 1, 2, 3, 4 });
9046 std::vector<float> input1({ 10 });
9047 std::vector<float> output({ -9, -8, -7, -6 });
9049 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
9051 shape0, input0, 1.0f, 0,
9052 shape1, input1, 1.0f, 0,
9053 shape0, output, 1.0f, 0);
9056 LayerTestResult<float, 4> SubtractionBroadcastTest(
9057 armnn::IWorkloadFactory& workloadFactory,
9058 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9060 const unsigned int shape0[] = { 1, 1, 2, 2 };
9061 const unsigned int shape1[] = { 1, 1, 1, 2 };
9063 std::vector<float> input0({ 1, 2, 3, 4 });
9064 std::vector<float> input1({ 10, -5 });
9065 std::vector<float> output({ -9, 7, -7, 9 });
9067 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
9069 shape0, input0, 1.0f, 0,
9070 shape1, input1, 1.0f, 0,
9071 shape0, output, 1.0f, 0);
9074 LayerTestResult<int16_t, 4> SubtractionInt16Test(
9075 armnn::IWorkloadFactory& workloadFactory,
9076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9078 const unsigned int shape0[] = { 1, 1, 2, 2 };
9079 const unsigned int shape1[] = { 1, 1, 2, 2 };
9081 std::vector<int16_t> input0({ 10, 12, 14, 16 });
9082 std::vector<int16_t> input1({ 1, 2, 1, 2 });
9083 std::vector<int16_t> output({ 3, 3, 5, 5 });
9085 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
9087 shape0, input0, 0.5f, 0,
9088 shape1, input1, 1.0f, 0,
9089 shape0, output, 1.0f, 0);
9092 LayerTestResult<int16_t, 4> SubtractionBroadcast1ElementInt16Test(
9093 armnn::IWorkloadFactory& workloadFactory,
9094 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9096 const unsigned int shape0[] = { 1, 1, 2, 2 };
9097 const unsigned int shape1[] = { 1, 1, 1, 1 };
9099 std::vector<int16_t> input0({ 10, 12, 14, 16 });
9100 std::vector<int16_t> input1({ 2 });
9101 std::vector<int16_t> output({ 3, 4, 5, 6 });
9103 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
9105 shape0, input0, 0.5f, 0,
9106 shape1, input1, 1.0f, 0,
9107 shape0, output, 1.0f, 0);
9110 LayerTestResult<int16_t, 4> SubtractionBroadcastInt16Test(
9111 armnn::IWorkloadFactory& workloadFactory,
9112 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9114 const unsigned int shape0[] = { 1, 1, 2, 2 };
9115 const unsigned int shape1[] = { 1, 1, 2, 1 };
9117 std::vector<int16_t> input0({ 10, 12, 14, 16 });
9118 std::vector<int16_t> input1({ 2, 1 });
9119 std::vector<int16_t> output({ 8, 11, 12, 15 });
9121 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
9123 shape0, input0, 1.0f, 0,
9124 shape1, input1, 1.0f, 0,
9125 shape0, output, 1.0f, 0);
9128 LayerTestResult<float, 4> BatchNormTest(
9129 armnn::IWorkloadFactory& workloadFactory,
9130 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9137 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
9138 std::vector<float> inputValues
9140 // Batch 0, Channel 0, Height (3) x Width (2)
9145 // Batch 0, Channel 1, Height (3) x Width (2)
9150 std::vector<float> expectedOutputValues
9152 // Batch 0, Channel 0, Height (3) x Width (2)
9157 // Batch 0, Channel 1, Height (3) x Width (2)
9163 return BatchNormTestImpl<armnn::DataType::Float32>(
9164 workloadFactory, memoryManager,
9165 inputOutputShape, inputValues, expectedOutputValues,
9166 0.f, 0, armnn::DataLayout::NCHW);
9169 LayerTestResult<float, 4> BatchNormNhwcTest(
9170 armnn::IWorkloadFactory& workloadFactory,
9171 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9178 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
9179 std::vector<float> inputValues
9181 // Batch 0, Height 0, Width (2) x Channel (2)
9185 // Batch 0, Height 1, Width (2) x Channel (2)
9189 // Batch 0, Height 2, Width (2) x Channel (2)
9193 std::vector<float> expectedOutputValues
9195 // Batch 0, Height 0, Width (2) x Channel (2)
9199 // Batch 0, Height 1, Width (2) x Channel (2)
9203 // Batch 0, Height 2, Width (2) x Channel (2)
9208 return BatchNormTestImpl<armnn::DataType::Float32>(
9209 workloadFactory, memoryManager,
9210 inputOutputShape, inputValues, expectedOutputValues,
9211 0.f, 0, armnn::DataLayout::NHWC);
9214 LayerTestResult<uint8_t, 4> BatchNormUint8Test(
9215 armnn::IWorkloadFactory& workloadFactory,
9216 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9223 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
9224 std::vector<float> inputValues
9226 // Batch 0, Channel 0, Height (3) x Width (2)
9231 // Batch 0, Channel 1, Height (3) x Width (2)
9236 std::vector<float> expectedOutputValues
9238 // Batch 0, Channel 0, Height (3) x Width (2)
9243 // Batch 0, Channel 1, Height (3) x Width (2)
9249 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>(
9250 workloadFactory, memoryManager,
9251 inputOutputShape, inputValues, expectedOutputValues,
9252 1.f/20.f, 50, armnn::DataLayout::NCHW);
9255 LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest(
9256 armnn::IWorkloadFactory& workloadFactory,
9257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9264 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
9265 std::vector<float> inputValues
9267 // Batch 0, Height 0, Width (2) x Channel (2)
9271 // Batch 0, Height 1, Width (2) x Channel (2)
9275 // Batch 0, Height 2, Width (2) x Channel (2)
9279 std::vector<float> expectedOutputValues
9281 // Batch 0, Height 0, Width (2) x Channel (2)
9285 // Batch 0, Height 1, Width (2) x Channel (2)
9289 // Batch 0, Height 2, Width (2) x Channel (2)
9294 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>
9295 (workloadFactory, memoryManager,
9296 inputOutputShape, inputValues, expectedOutputValues,
9297 1.f/20.f, 50, armnn::DataLayout::NHWC);
9300 LayerTestResult<int16_t, 4> BatchNormInt16Test(
9301 armnn::IWorkloadFactory& workloadFactory,
9302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9309 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
9310 std::vector<float> inputValues
9312 // Batch 0, Channel 0, Height (3) x Width (2)
9317 // Batch 0, Channel 1, Height (3) x Width (2)
9322 std::vector<float> expectedOutputValues
9324 // Batch 0, Channel 0, Height (3) x Width (2)
9329 // Batch 0, Channel 1, Height (3) x Width (2)
9335 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>(
9336 workloadFactory, memoryManager,
9337 inputOutputShape, inputValues, expectedOutputValues,
9338 1.f/20.f, 50, armnn::DataLayout::NCHW);
9341 LayerTestResult<int16_t, 4> BatchNormInt16NhwcTest(
9342 armnn::IWorkloadFactory& workloadFactory,
9343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9350 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
9351 std::vector<float> inputValues
9353 // Batch 0, Height 0, Width (2) x Channel (2)
9357 // Batch 0, Height 1, Width (2) x Channel (2)
9361 // Batch 0, Height 2, Width (2) x Channel (2)
9365 std::vector<float> expectedOutputValues
9367 // Batch 0, Height 0, Width (2) x Channel (2)
9371 // Batch 0, Height 1, Width (2) x Channel (2)
9375 // Batch 0, Height 2, Width (2) x Channel (2)
9380 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>
9381 (workloadFactory, memoryManager,
9382 inputOutputShape, inputValues, expectedOutputValues,
9383 1.f/20.f, 50, armnn::DataLayout::NHWC);
9386 LayerTestResult<uint8_t, 4> ConstantUint8CustomQuantizationScaleAndOffsetTest(
9387 armnn::IWorkloadFactory& workloadFactory,
9388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9390 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 2e-6f, 1);
9393 LayerTestResult<int16_t, 4> ConstantInt16CustomQuantizationScaleAndOffsetTest(
9394 armnn::IWorkloadFactory& workloadFactory,
9395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9397 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 2e-6f, 1);
9400 LayerTestResult<uint8_t, 1> Concatenation1dUint8Test(
9401 armnn::IWorkloadFactory& workloadFactory,
9402 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9404 return Concatenation1dTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9407 LayerTestResult<uint8_t, 2> Concatenation2dDim0Uint8Test(
9408 armnn::IWorkloadFactory& workloadFactory,
9409 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9411 return Concatenation2dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9414 LayerTestResult<uint8_t, 2> Concatenation2dDim1Uint8Test(
9415 armnn::IWorkloadFactory& workloadFactory,
9416 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9418 return Concatenation2dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9421 LayerTestResult<uint8_t, 2> Concatenation2dDim0DiffInputDimsUint8Test(
9422 armnn::IWorkloadFactory& workloadFactory,
9423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9425 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9426 workloadFactory, memoryManager, 0.5f, -1);
9429 LayerTestResult<uint8_t, 2> Concatenation2dDim1DiffInputDimsUint8Test(
9430 armnn::IWorkloadFactory& workloadFactory,
9431 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9433 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9434 workloadFactory, memoryManager, 0.5f, -1);
9437 LayerTestResult<uint8_t, 3> Concatenation3dDim0Uint8Test(
9438 armnn::IWorkloadFactory& workloadFactory,
9439 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9441 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9444 LayerTestResult<uint8_t, 3> Concatenation3dDim1Uint8Test(
9445 armnn::IWorkloadFactory& workloadFactory,
9446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9448 return Concatenation3dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9451 LayerTestResult<uint8_t, 3> Concatenation3dDim2Uint8Test(
9452 armnn::IWorkloadFactory& workloadFactory,
9453 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9456 return Concatenation3dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
9457 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
9460 LayerTestResult<uint8_t, 3> Concatenation3dDim0DiffInputDimsUint8Test(
9461 armnn::IWorkloadFactory& workloadFactory,
9462 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9464 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9467 LayerTestResult<uint8_t, 3> Concatenation3dDim1DiffInputDimsUint8Test(
9468 armnn::IWorkloadFactory& workloadFactory,
9469 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9471 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9472 workloadFactory, memoryManager, 0.5f, -1);
9475 LayerTestResult<uint8_t, 3> Concatenation3dDim2DiffInputDimsUint8Test(
9476 armnn::IWorkloadFactory& workloadFactory,
9477 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9480 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9481 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
9484 LayerTestResult<uint8_t, 4> Concatenation4dDim0Uint8Test(
9485 armnn::IWorkloadFactory& workloadFactory,
9486 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9488 return Concatenation4dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9491 LayerTestResult<uint8_t, 4> Concatenation4dDim1Uint8Test(
9492 armnn::IWorkloadFactory& workloadFactory,
9493 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9495 return Concatenation4dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9498 LayerTestResult<uint8_t, 4> Concatenation4dDim2Uint8Test(
9499 armnn::IWorkloadFactory& workloadFactory,
9500 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9502 return Concatenation4dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9505 LayerTestResult<uint8_t, 4> Concatenation4dDim3Uint8Test(
9506 armnn::IWorkloadFactory& workloadFactory,
9507 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, bool useSubtensor)
9509 return Concatenation4dDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9510 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9513 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim0Uint8Test(
9514 armnn::IWorkloadFactory& workloadFactory,
9515 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9517 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::QuantisedAsymm8>(
9518 workloadFactory, memoryManager, 0.5f, -1);
9521 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim1Uint8Test(
9522 armnn::IWorkloadFactory& workloadFactory,
9523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9525 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::QuantisedAsymm8>(
9526 workloadFactory, memoryManager, 0.5f, -1);
9529 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim2Uint8Test(
9530 armnn::IWorkloadFactory& workloadFactory,
9531 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9533 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
9534 workloadFactory, memoryManager, 0.5f, -1);
9537 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim3Uint8Test(
9538 armnn::IWorkloadFactory& workloadFactory,
9539 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9542 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9543 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9546 LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
9547 armnn::IWorkloadFactory& workloadFactory,
9548 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9549 bool forceNoPadding)
9551 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
9552 workloadFactory, memoryManager, forceNoPadding);
9555 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
9556 armnn::IWorkloadFactory& workloadFactory,
9557 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9558 bool forceNoPadding)
9560 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedAsymm8>(
9561 workloadFactory, memoryManager, forceNoPadding, 3.0f, -5);
9564 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
9565 armnn::IWorkloadFactory& workloadFactory,
9566 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9567 bool forceNoPadding)
9569 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedSymm16>(
9570 workloadFactory, memoryManager, forceNoPadding);
9573 LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
9574 armnn::IWorkloadFactory& workloadFactory,
9575 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9576 bool forceNoPadding)
9578 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
9579 workloadFactory, memoryManager, forceNoPadding);
9582 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
9583 armnn::IWorkloadFactory& workloadFactory,
9584 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9585 bool forceNoPadding)
9587 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedAsymm8>(
9588 workloadFactory, memoryManager, forceNoPadding, 0.1f, 128);
9591 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
9592 armnn::IWorkloadFactory& workloadFactory,
9593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9594 bool forceNoPadding)
9596 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedSymm16>(
9597 workloadFactory, memoryManager, forceNoPadding);
9600 LayerTestResult<float, 4> SimpleMaxPooling2dTest(
9601 armnn::IWorkloadFactory& workloadFactory,
9602 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9603 const armnn::DataLayout dataLayout)
9605 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9608 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
9609 armnn::IWorkloadFactory& workloadFactory,
9610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9611 const armnn::DataLayout dataLayout)
9613 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9616 LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
9617 armnn::IWorkloadFactory& workloadFactory,
9618 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9619 const armnn::DataLayout dataLayout)
9621 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9623 LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
9624 armnn::IWorkloadFactory& workloadFactory,
9625 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9627 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9630 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
9631 armnn::IWorkloadFactory& workloadFactory,
9632 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9634 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9635 workloadFactory, memoryManager, 1.0f, -5);
9638 LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
9639 armnn::IWorkloadFactory& workloadFactory,
9640 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9642 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9643 workloadFactory, memoryManager);
9646 LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
9647 armnn::IWorkloadFactory& workloadFactory,
9648 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9650 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9653 LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
9654 armnn::IWorkloadFactory& workloadFactory,
9655 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9657 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9658 workloadFactory, memoryManager, 1.0f, -5);
9661 LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
9662 armnn::IWorkloadFactory& workloadFactory,
9663 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9665 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9666 workloadFactory, memoryManager);
9669 LayerTestResult<float, 4> SimpleAveragePooling2dTest(
9670 armnn::IWorkloadFactory& workloadFactory,
9671 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9672 const armnn::DataLayout dataLayout)
9674 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9677 LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
9678 armnn::IWorkloadFactory& workloadFactory,
9679 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9680 const armnn::DataLayout dataLayout)
9682 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9683 workloadFactory, memoryManager, dataLayout, 0.5, -1);
9686 LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
9687 armnn::IWorkloadFactory& workloadFactory,
9688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9689 const armnn::DataLayout dataLayout)
9691 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9692 workloadFactory, memoryManager, dataLayout);
9695 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
9696 armnn::IWorkloadFactory& workloadFactory,
9697 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9698 bool forceNoPadding)
9700 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
9701 workloadFactory, memoryManager, forceNoPadding);
9704 LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
9705 armnn::IWorkloadFactory& workloadFactory,
9706 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9708 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9711 LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
9712 armnn::IWorkloadFactory& workloadFactory,
9713 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9715 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9716 workloadFactory, memoryManager, 0.5, -1);
9719 LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
9720 armnn::IWorkloadFactory& workloadFactory,
9721 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9723 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9724 workloadFactory, memoryManager);
9726 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
9727 armnn::IWorkloadFactory& workloadFactory,
9728 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9730 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9733 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
9734 armnn::IWorkloadFactory& workloadFactory,
9735 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9737 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9738 workloadFactory, memoryManager);
9741 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
9742 armnn::IWorkloadFactory& workloadFactory,
9743 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9745 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9746 workloadFactory, memoryManager);
9749 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
9750 armnn::IWorkloadFactory& workloadFactory,
9751 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9753 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
9754 workloadFactory, memoryManager);
9757 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
9758 armnn::IWorkloadFactory& workloadFactory,
9759 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9761 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedAsymm8>(
9762 workloadFactory, memoryManager);
9765 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
9766 armnn::IWorkloadFactory& workloadFactory,
9767 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9769 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedSymm16>(
9770 workloadFactory, memoryManager);
9773 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
9774 armnn::IWorkloadFactory& workloadFactory,
9775 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9777 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9780 LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
9781 armnn::IWorkloadFactory& workloadFactory,
9782 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9784 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9785 workloadFactory, memoryManager);
9788 LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
9789 armnn::IWorkloadFactory& workloadFactory,
9790 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9792 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9793 workloadFactory, memoryManager);
9796 LayerTestResult<float, 4> SimpleL2Pooling2dTest(
9797 armnn::IWorkloadFactory& workloadFactory,
9798 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9799 const armnn::DataLayout dataLayout)
9801 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9804 LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
9805 armnn::IWorkloadFactory& workloadFactory,
9806 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9807 const armnn::DataLayout dataLayout)
9809 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9812 LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
9813 armnn::IWorkloadFactory& workloadFactory,
9814 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9815 const armnn::DataLayout dataLayout)
9817 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9820 LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
9821 armnn::IWorkloadFactory& workloadFactory,
9822 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9824 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9827 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
9828 armnn::IWorkloadFactory& workloadFactory,
9829 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9831 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9834 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
9835 armnn::IWorkloadFactory& workloadFactory,
9836 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9838 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9841 LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
9842 armnn::IWorkloadFactory& workloadFactory,
9843 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9845 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9848 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
9849 armnn::IWorkloadFactory& workloadFactory,
9850 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9852 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9855 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
9856 armnn::IWorkloadFactory& workloadFactory,
9857 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9859 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9861 LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
9862 armnn::IWorkloadFactory& workloadFactory,
9863 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9865 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9868 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
9869 armnn::IWorkloadFactory& workloadFactory,
9870 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9872 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9875 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
9876 armnn::IWorkloadFactory& workloadFactory,
9877 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9879 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9882 LayerTestResult<float, 4> L2Pooling2dSize7Test(
9883 armnn::IWorkloadFactory& workloadFactory,
9884 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9886 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9889 LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
9890 armnn::IWorkloadFactory& workloadFactory,
9891 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9893 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9896 LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
9897 armnn::IWorkloadFactory& workloadFactory,
9898 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9900 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9903 LayerTestResult<float, 4> L2Pooling2dSize9Test(
9904 armnn::IWorkloadFactory& workloadFactory,
9905 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9907 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9910 LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
9911 armnn::IWorkloadFactory& workloadFactory,
9912 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9914 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9917 LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
9918 armnn::IWorkloadFactory& workloadFactory,
9919 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9921 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9923 LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
9924 armnn::IWorkloadFactory& workloadFactory,
9925 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9927 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9930 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
9931 armnn::IWorkloadFactory& workloadFactory,
9932 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9934 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9937 LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
9938 armnn::IWorkloadFactory& workloadFactory,
9939 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9941 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9944 LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
9945 armnn::IWorkloadFactory& workloadFactory,
9946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9948 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9951 LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
9952 armnn::IWorkloadFactory& workloadFactory,
9953 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9955 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9958 LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
9959 armnn::IWorkloadFactory& workloadFactory,
9960 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9962 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9965 LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
9966 armnn::IWorkloadFactory& workloadFactory,
9967 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9969 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9972 LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
9973 armnn::IWorkloadFactory& workloadFactory,
9974 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9976 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9979 LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
9980 armnn::IWorkloadFactory& workloadFactory,
9981 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9983 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9986 LayerTestResult<float, 4> ComparePooling2dTest(
9987 armnn::IWorkloadFactory& workloadFactory,
9988 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9989 armnn::IWorkloadFactory& refWorkloadFactory,
9990 armnn::PoolingAlgorithm poolingType)
9992 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
9993 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
9996 LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
9997 armnn::IWorkloadFactory& workloadFactory,
9998 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9999 armnn::IWorkloadFactory& refWorkloadFactory,
10000 armnn::PoolingAlgorithm poolingType)
10002 return ComparePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
10003 workloadFactory, memoryManager, refWorkloadFactory, poolingType, 0.1f, 128);
10006 LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
10007 armnn::IWorkloadFactory& workloadFactory,
10008 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
10009 armnn::IWorkloadFactory& refWorkloadFactory,
10010 armnn::PoolingAlgorithm poolingType)
10012 return ComparePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
10013 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
10016 LayerTestResult<float, 2> FullyConnectedLargeTest(
10017 armnn::IWorkloadFactory& workloadFactory,
10018 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
10019 bool transposeWeights)
10021 return FullyConnectedLargeTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, transposeWeights);
10024 LayerTestResult<float, 4> AdditionAfterMaxPoolTest(
10025 armnn::IWorkloadFactory& workloadFactory,
10026 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10028 // Create Initial Tensor
10033 armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::DataType::Float32);
10034 armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::DataType::Float32);
10036 boost::multi_array<float, 4> poolingInput = MakeTensor<float,4>(poolingInputTensorInfo,
10042 std::unique_ptr<armnn::ITensorHandle> poolingInputHandle =
10043 workloadFactory.CreateTensorHandle(poolingInputTensorInfo);
10044 std::unique_ptr<armnn::ITensorHandle> poolingOutputHandle =
10045 workloadFactory.CreateTensorHandle(poolingOutputTensorInfo);
10047 // Apply MaxPool poolSize = 1x1, stride=2x2
10051 armnn::Pooling2dDescriptor descriptor;
10052 descriptor.m_PoolHeight = 1;
10053 descriptor.m_PoolWidth = 1;
10054 descriptor.m_StrideX = 2;
10055 descriptor.m_StrideY = 2;
10056 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
10058 armnn::Pooling2dQueueDescriptor queueDescriptor;
10059 queueDescriptor.m_Parameters = descriptor;
10060 armnn::WorkloadInfo workloadInfo;
10061 AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get());
10062 AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get());
10064 // Create the MaxPool
10065 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
10067 //LayerTestResult<float, 4> result(poolingOutputTensorInfo);
10068 auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo));
10069 boost::multi_array<float, 4> resultMaxPool;
10070 resultMaxPool.resize(shape);
10073 // Create addition with another tensor the same size
10074 // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1
10075 // with the initial tensor.
10079 armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
10080 armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
10082 boost::multi_array<float, 4> addInput = MakeTensor<float,4>(addInputTensorInfo,
10087 // Expected output tensor after MaxPool and Addition.
10088 LayerTestResult<float,4> addRet(addOutputTensorInfo);
10089 addRet.outputExpected = MakeTensor<float, 4>(addOutputTensorInfo, std::vector<float>(
10095 std::unique_ptr<armnn::ITensorHandle> addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo);
10096 std::unique_ptr<armnn::ITensorHandle> addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo);
10098 armnn::AdditionQueueDescriptor data;
10099 armnn::WorkloadInfo info;
10101 // Add the output of the MaxPool and the new tensor
10102 AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get());
10103 AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get());
10104 AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get());
10106 std::unique_ptr<armnn::IWorkload> addWorkload = workloadFactory.CreateAddition(data, info);
10108 poolingInputHandle->Allocate();
10109 poolingOutputHandle->Allocate();
10110 addInputHandle->Allocate();
10111 addOutputHandle->Allocate();
10113 CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]);
10114 CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get());
10116 CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]);
10117 CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]);
10119 workload->PostAllocationConfigure();
10120 workload->Execute();
10121 addWorkload->PostAllocationConfigure();
10122 addWorkload->Execute();
10124 CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
10129 LayerTestResult<float, 4> SpaceToBatchNdSimpleFloat32Test(
10130 armnn::IWorkloadFactory& workloadFactory,
10131 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10133 return SpaceToBatchNdSimpleTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10136 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsFloat32Test(
10137 armnn::IWorkloadFactory& workloadFactory,
10138 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10140 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10143 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockFloat32Test(
10144 armnn::IWorkloadFactory& workloadFactory,
10145 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10147 return SpaceToBatchNdMultiBlockTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10150 LayerTestResult<float, 4> SpaceToBatchNdPaddingFloat32Test(
10151 armnn::IWorkloadFactory& workloadFactory,
10152 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10154 return SpaceToBatchNdPaddingTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10157 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleUint8Test(
10158 armnn::IWorkloadFactory& workloadFactory,
10159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10161 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10164 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsUint8Test(
10165 armnn::IWorkloadFactory& workloadFactory,
10166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10168 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10171 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockUint8Test(
10172 armnn::IWorkloadFactory& workloadFactory,
10173 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10175 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10178 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingUint8Test(
10179 armnn::IWorkloadFactory& workloadFactory,
10180 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10182 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10185 LayerTestResult<float, 4> SpaceToBatchNdSimpleNHWCFloat32Test(
10186 armnn::IWorkloadFactory& workloadFactory,
10187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10189 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10192 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsNHWCFloat32Test(
10193 armnn::IWorkloadFactory& workloadFactory,
10194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10196 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10199 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockNHWCFloat32Test(
10200 armnn::IWorkloadFactory& workloadFactory,
10201 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10203 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10206 LayerTestResult<float, 4> SpaceToBatchNdPaddingNHWCFloat32Test(
10207 armnn::IWorkloadFactory& workloadFactory,
10208 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10210 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10213 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleNHWCUint8Test(
10214 armnn::IWorkloadFactory& workloadFactory,
10215 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10217 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10220 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsNHWCUint8Test(
10221 armnn::IWorkloadFactory& workloadFactory,
10222 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10224 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10227 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockNHWCUint8Test(
10228 armnn::IWorkloadFactory& workloadFactory,
10229 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10231 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10234 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingNHWCUint8Test(
10235 armnn::IWorkloadFactory& workloadFactory,
10236 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10238 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10241 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleUint16Test(
10242 armnn::IWorkloadFactory& workloadFactory,
10243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10245 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10248 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsUint16Test(
10249 armnn::IWorkloadFactory& workloadFactory,
10250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10252 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10255 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockUint16Test(
10256 armnn::IWorkloadFactory& workloadFactory,
10257 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10259 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10262 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingUint16Test(
10263 armnn::IWorkloadFactory& workloadFactory,
10264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10266 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10269 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleNHWCUint16Test(
10270 armnn::IWorkloadFactory& workloadFactory,
10271 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10273 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10276 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsNHWCUint16Test(
10277 armnn::IWorkloadFactory& workloadFactory,
10278 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10280 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10283 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockNHWCUint16Test(
10284 armnn::IWorkloadFactory& workloadFactory,
10285 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10287 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10290 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingNHWCUint16Test(
10291 armnn::IWorkloadFactory& workloadFactory,
10292 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10294 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10297 LayerTestResult<uint8_t, 4> SpaceToDepthNHWCAsymmQ8Test(
10298 armnn::IWorkloadFactory& workloadFactory,
10299 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10301 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
10306 LayerTestResult<uint8_t, 4> SpaceToDepthNCHWAsymmQ8Test(
10307 armnn::IWorkloadFactory& workloadFactory,
10308 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10310 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
10313 armnn::DataLayout::NCHW);
10316 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test1(
10317 armnn::IWorkloadFactory& workloadFactory,
10318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10320 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
10325 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test1(
10326 armnn::IWorkloadFactory& workloadFactory,
10327 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10329 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
10332 armnn::DataLayout::NCHW);
10335 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test2(
10336 armnn::IWorkloadFactory& workloadFactory,
10337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10339 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
10344 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test2(
10345 armnn::IWorkloadFactory& workloadFactory,
10346 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10348 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
10351 armnn::DataLayout::NCHW);
10354 LayerTestResult<int16_t, 4> SpaceToDepthNHWCQSymm16Test(
10355 armnn::IWorkloadFactory& workloadFactory,
10356 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10358 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
10363 LayerTestResult<int16_t, 4> SpaceToDepthNCHWQSymm16Test(
10364 armnn::IWorkloadFactory& workloadFactory,
10365 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10367 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
10370 armnn::DataLayout::NCHW);
10375 } // anonymous namespace
10377 LayerTestResult<float, 4> StridedSlice4DFloat32Test(
10378 armnn::IWorkloadFactory& workloadFactory,
10379 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10381 return StridedSlice4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10384 LayerTestResult<float, 4> StridedSlice4DReverseFloat32Test(
10385 armnn::IWorkloadFactory& workloadFactory,
10386 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10388 return StridedSlice4DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10391 LayerTestResult<float, 4> StridedSliceSimpleStrideFloat32Test(
10392 armnn::IWorkloadFactory& workloadFactory,
10393 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10395 return StridedSliceSimpleStrideTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10398 LayerTestResult<float, 4> StridedSliceSimpleRangeMaskFloat32Test(
10399 armnn::IWorkloadFactory& workloadFactory,
10400 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10402 return StridedSliceSimpleRangeMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10405 LayerTestResult<float, 2> StridedSliceShrinkAxisMaskFloat32Test(
10406 armnn::IWorkloadFactory& workloadFactory,
10407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10409 return StridedSliceShrinkAxisMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10412 LayerTestResult<float, 3> StridedSlice3DFloat32Test(
10413 armnn::IWorkloadFactory& workloadFactory,
10414 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10416 return StridedSlice3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10419 LayerTestResult<float, 3> StridedSlice3DReverseFloat32Test(
10420 armnn::IWorkloadFactory& workloadFactory,
10421 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10423 return StridedSlice3DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10426 LayerTestResult<float, 2> StridedSlice2DFloat32Test(
10427 armnn::IWorkloadFactory& workloadFactory,
10428 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10430 return StridedSlice2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10433 LayerTestResult<float, 2> StridedSlice2DReverseFloat32Test(
10434 armnn::IWorkloadFactory& workloadFactory,
10435 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10437 return StridedSlice2DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10440 LayerTestResult<uint8_t, 4> StridedSlice4DUint8Test(
10441 armnn::IWorkloadFactory& workloadFactory,
10442 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10444 return StridedSlice4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10447 LayerTestResult<uint8_t, 4> StridedSlice4DReverseUint8Test(
10448 armnn::IWorkloadFactory& workloadFactory,
10449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10451 return StridedSlice4DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10454 LayerTestResult<uint8_t, 4> StridedSliceSimpleStrideUint8Test(
10455 armnn::IWorkloadFactory& workloadFactory,
10456 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10458 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10461 LayerTestResult<uint8_t, 4> StridedSliceSimpleRangeMaskUint8Test(
10462 armnn::IWorkloadFactory& workloadFactory,
10463 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10465 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10468 LayerTestResult<uint8_t, 2> StridedSliceShrinkAxisMaskUint8Test(
10469 armnn::IWorkloadFactory& workloadFactory,
10470 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10472 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10475 LayerTestResult<uint8_t, 3> StridedSlice3DUint8Test(
10476 armnn::IWorkloadFactory& workloadFactory,
10477 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10479 return StridedSlice3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10482 LayerTestResult<uint8_t, 3> StridedSlice3DReverseUint8Test(
10483 armnn::IWorkloadFactory& workloadFactory,
10484 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10486 return StridedSlice3DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10489 LayerTestResult<uint8_t, 2> StridedSlice2DUint8Test(
10490 armnn::IWorkloadFactory& workloadFactory,
10491 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10493 return StridedSlice2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10496 LayerTestResult<uint8_t, 2> StridedSlice2DReverseUint8Test(
10497 armnn::IWorkloadFactory& workloadFactory,
10498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10500 return StridedSlice2DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10503 LayerTestResult<int16_t, 4> StridedSlice4DInt16Test(
10504 armnn::IWorkloadFactory& workloadFactory,
10505 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10507 return StridedSlice4DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10510 LayerTestResult<int16_t, 4> StridedSlice4DReverseInt16Test(
10511 armnn::IWorkloadFactory& workloadFactory,
10512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10514 return StridedSlice4DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10517 LayerTestResult<int16_t, 4> StridedSliceSimpleStrideInt16Test(
10518 armnn::IWorkloadFactory& workloadFactory,
10519 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10521 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10524 LayerTestResult<int16_t, 4> StridedSliceSimpleRangeMaskInt16Test(
10525 armnn::IWorkloadFactory& workloadFactory,
10526 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10528 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10531 LayerTestResult<int16_t, 2> StridedSliceShrinkAxisMaskInt16Test(
10532 armnn::IWorkloadFactory& workloadFactory,
10533 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10535 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10538 LayerTestResult<int16_t, 3> StridedSlice3DInt16Test(
10539 armnn::IWorkloadFactory& workloadFactory,
10540 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10542 return StridedSlice3DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10545 LayerTestResult<int16_t, 3> StridedSlice3DReverseInt16Test(
10546 armnn::IWorkloadFactory& workloadFactory,
10547 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10549 return StridedSlice3DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10552 LayerTestResult<int16_t, 2> StridedSlice2DInt16Test(
10553 armnn::IWorkloadFactory& workloadFactory,
10554 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10556 return StridedSlice2DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10559 LayerTestResult<int16_t, 2> StridedSlice2DReverseInt16Test(
10560 armnn::IWorkloadFactory& workloadFactory,
10561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10563 return StridedSlice2DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10566 LayerTestResult<float, 4> Debug4DFloat32Test(
10567 armnn::IWorkloadFactory& workloadFactory,
10568 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10570 return Debug4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10573 LayerTestResult<float, 3> Debug3DFloat32Test(
10574 armnn::IWorkloadFactory& workloadFactory,
10575 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10577 return Debug3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10580 LayerTestResult<float, 2> Debug2DFloat32Test(
10581 armnn::IWorkloadFactory& workloadFactory,
10582 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10584 return Debug2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10587 LayerTestResult<float, 1> Debug1DFloat32Test(
10588 armnn::IWorkloadFactory& workloadFactory,
10589 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10591 return Debug1DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10594 LayerTestResult<uint8_t, 4> Debug4DUint8Test(
10595 armnn::IWorkloadFactory& workloadFactory,
10596 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10598 return Debug4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10601 LayerTestResult<uint8_t, 3> Debug3DUint8Test(
10602 armnn::IWorkloadFactory& workloadFactory,
10603 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10605 return Debug3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10608 LayerTestResult<uint8_t, 2> Debug2DUint8Test(
10609 armnn::IWorkloadFactory& workloadFactory,
10610 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10612 return Debug2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10615 LayerTestResult<uint8_t, 1> Debug1DUint8Test(
10616 armnn::IWorkloadFactory& workloadFactory,
10617 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10619 return Debug1DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10622 LayerTestResult<float, 1> Gather1DParamsFloatTest(
10623 armnn::IWorkloadFactory& workloadFactory,
10624 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10626 return Gather1DParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10629 LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test(
10630 armnn::IWorkloadFactory& workloadFactory,
10631 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10633 return Gather1DParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10636 LayerTestResult<int16_t, 1> Gather1DParamsInt16Test(
10637 armnn::IWorkloadFactory& workloadFactory,
10638 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10640 return Gather1DParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10643 LayerTestResult<float, 2> GatherMultiDimParamsFloatTest(
10644 armnn::IWorkloadFactory& workloadFactory,
10645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10647 return GatherMultiDimParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10650 LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test(
10651 armnn::IWorkloadFactory& workloadFactory,
10652 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10654 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10657 LayerTestResult<int16_t, 2> GatherMultiDimParamsInt16Test(
10658 armnn::IWorkloadFactory& workloadFactory,
10659 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10661 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10664 LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest(
10665 armnn::IWorkloadFactory& workloadFactory,
10666 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10668 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10671 LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test(
10672 armnn::IWorkloadFactory& workloadFactory,
10673 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10675 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedAsymm8>(
10676 workloadFactory, memoryManager);
10679 LayerTestResult<int16_t, 4> GatherMultiDimParamsMultiDimIndicesInt16Test(
10680 armnn::IWorkloadFactory& workloadFactory,
10681 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10683 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedSymm16>(
10684 workloadFactory, memoryManager);
10687 LayerTestResult<float, 4> DequantizeSimpleUint8Test(
10688 armnn::IWorkloadFactory& workloadFactory,
10689 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10691 return DequantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10694 LayerTestResult<float, 4> DequantizeOffsetUint8Test(
10695 armnn::IWorkloadFactory& workloadFactory,
10696 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10698 return DequantizeOffsetTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10701 LayerTestResult<float, 4> DequantizeSimpleInt16Test(
10702 armnn::IWorkloadFactory& workloadFactory,
10703 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10705 return DequantizeSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10708 LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
10709 armnn::IWorkloadFactory& workloadFactory,
10710 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10712 return QuantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10715 LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
10716 armnn::IWorkloadFactory& workloadFactory,
10717 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10719 return QuantizeClampTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10722 LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
10723 armnn::IWorkloadFactory& workloadFactory,
10724 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10726 return QuantizeClampTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);