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 struct Simple3dSoftmaxOutputData
80 const std::vector<float> outputData =
82 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
83 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f
86 const armnn::TensorShape inputShape{ 1, 8, 1 };
88 const std::vector<float> inputData =
95 struct Simple4dSoftmaxData
97 const armnn::TensorShape inputShape{ 1, 8, 1, 1 };
99 const std::vector<float> outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
100 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f };
101 const std::vector<float> inputData =
108 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
109 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
110 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale)
114 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias2.size())}, ArmnnType);
115 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, 0.0f, Bias2));
120 return boost::multi_array<T, 1>();
124 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
125 LayerTestResult<T, 4> SimpleConvolution2d3x5TestCommon(
126 armnn::IWorkloadFactory& workloadFactory,
127 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
131 const armnn::DataLayout layout)
133 // Use common single-batch 3-channel 16x8 image.
134 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
135 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
137 // Use a 2-element batch with 3-channel 3x5 kernels.
138 armnn::TensorInfo kernelDesc({2, 3, 5, 3}, ArmnnType);
139 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
140 QuantizedVector<T>(qScale, qOffset, {
179 // Expected output is 2 batch elements of a 1-channel 14x4 image.
180 armnn::TensorInfo outputDesc({1, 2, 4, 14}, ArmnnType);
181 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
182 QuantizedVector<T>(qScale, qOffset, {
183 -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
184 -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
185 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
186 -23.5f, -23.5f, -23.5f,
187 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
188 -23.5f, -23.5f, -23.5f,
190 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
191 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
192 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
193 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
196 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
201 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
208 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
209 typename T = armnn::ResolveType<ArmnnType>>
210 LayerTestResult<T, 4> SimpleConvolution2d3x3TestCommon(
211 armnn::IWorkloadFactory& workloadFactory,
212 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
216 const armnn::DataLayout layout)
218 // Use a 3x3 kernel, which exercises ArmCompute's direct convolution path.
220 // Use common single-batch 3-channel 16x8 image.
221 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
222 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
224 // Use a 2-element batch of 3-channel 3x3 kernels.
225 armnn::TensorInfo kernelDesc({2, 3, 3, 3}, ArmnnType);
226 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
227 QuantizedVector<T>(qScale, qOffset, {
254 // Expected output is 1 batch of a 2-channel 14x6 image.
255 armnn::TensorInfo outputDesc({1, 2, 6, 14}, ArmnnType);
256 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
257 QuantizedVector<T>(qScale, qOffset, {
258 -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
259 -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
260 -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,
261 -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,
262 -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,
263 -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,
265 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
266 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
267 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
268 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
269 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
270 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
273 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
278 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
285 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
286 LayerTestResult<T, 4> SimpleConvolution2d3x3NhwcTestCommon(
287 armnn::IWorkloadFactory& workloadFactory,
288 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
292 armnn::DataLayout dataLayout)
294 // Use common single-batch 5x5 image.
296 armnn::TensorInfo inputDesc({1, 3, 4, 1}, ArmnnType);
297 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
305 // Use a 2-element batch of 3-channel 3x3 kernels.
306 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
307 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, {
313 // Expected output is 1 batch of a 5x5 image.
314 armnn::TensorInfo outputDesc({1, 3, 4, 1}, ArmnnType);
316 const std::vector<float> outputData =
323 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
325 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
330 boost::multi_array<T, 1>(),
337 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
338 LayerTestResult<T, 4> SimpleConvolution2d3x3Stride2x2TestCommon(
339 armnn::IWorkloadFactory& workloadFactory,
340 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
344 const armnn::DataLayout& dataLayout)
346 // Input is a single-batch, 1 channel, 5x5 image.
347 armnn::TensorInfo inputDesc({1, 5, 5, 1}, ArmnnType);
348 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
358 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
359 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc,
366 // Expected output is a single-batch, 1 channel, 3x3 image.
367 armnn::TensorInfo outputDesc({1, 3, 3, 1}, ArmnnType);
369 const std::vector<T> outputData =
376 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
378 uint32_t padLeft = 1;
380 uint32_t padRight = 1;
381 uint32_t padBottom = 1;
382 uint32_t strideX = 2;
383 uint32_t strideY = 2;
385 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
390 boost::multi_array<T, 1>(),
403 LayerTestResult<float, 4> SimpleConvolution2d3x5Test(
404 armnn::IWorkloadFactory& workloadFactory,
405 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
407 const armnn::DataLayout layout)
409 return SimpleConvolution2d3x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
410 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
413 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x5Uint8Test(
414 armnn::IWorkloadFactory& workloadFactory,
415 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
417 const armnn::DataLayout layout)
419 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
420 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
423 LayerTestResult<float, 4> SimpleConvolution2d3x3Test(
424 armnn::IWorkloadFactory& workloadFactory,
425 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
427 const armnn::DataLayout layout)
429 return SimpleConvolution2d3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
430 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
433 LayerTestResult<float, 4> SimpleConvolution2d3x3NhwcTest(
434 armnn::IWorkloadFactory& workloadFactory,
435 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
438 return SimpleConvolution2d3x3NhwcTestCommon<armnn::DataType::Float32>(
444 armnn::DataLayout::NHWC);
447 LayerTestResult<float, 4> SimpleConvolution2d3x3Stride2x2Test(
448 armnn::IWorkloadFactory& workloadFactory,
449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
451 const armnn::DataLayout layout)
453 return SimpleConvolution2d3x3Stride2x2TestCommon<armnn::DataType::Float32>(
462 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x3Uint8Test(
463 armnn::IWorkloadFactory& workloadFactory,
464 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
466 const armnn::DataLayout layout)
468 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
469 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
472 LayerTestResult<int16_t, 4> SimpleConvolution2d3x5QSymm16Test(
473 armnn::IWorkloadFactory& workloadFactory,
474 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
476 const armnn::DataLayout layout)
478 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
479 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
482 LayerTestResult<int16_t, 4> SimpleConvolution2d3x3QSymm16Test(
483 armnn::IWorkloadFactory& workloadFactory,
484 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
486 const armnn::DataLayout layout)
488 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
489 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
492 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
493 typename T = armnn::ResolveType<ArmnnType>>
494 LayerTestResult<T, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon(
495 armnn::IWorkloadFactory& workloadFactory,
496 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
497 const armnn::DataLayout layout,
501 // Use a single-batch 1-channel 3x3 image as input.
502 armnn::TensorInfo inputDesc({1, 1, 3, 3}, ArmnnType);
503 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
504 QuantizedVector<T>(qScale, qOffset, {
510 // Use 1 batch of a 1-channel 2x2 kernel.
511 armnn::TensorInfo kernelDesc({1, 1, 2, 2}, ArmnnType);
512 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
513 QuantizedVector<T>(qScale, qOffset, {
518 // Expected output is 1 batch of a 1-channel 6x8 image.
519 // Manually calculated like this:
520 //[-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 ..]
521 //[-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 ..]
522 //[-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 ..]
523 //[-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 ..]
524 //[-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 ..]
525 //[-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 ..]
526 //[..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ..]
527 armnn::TensorInfo outputDesc({1, 1, 8, 6}, ArmnnType);
528 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
529 QuantizedVector<T>(qScale, qOffset, {
531 -242, -594, -934, -372, 0, 0,
532 -495, -1190, -1850, -725, 0, 0,
533 -538, -1256, -1916, -748, 0, 0,
534 -273, -626, -946, -363, 0, 0,
540 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
545 GetBias2<ArmnnBType>(false, qScale * qScale),
553 4); // Padding bottom.
556 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
557 typename T = armnn::ResolveType<ArmnnType>>
558 LayerTestResult<T, 4> SimpleConvolution2dAsymmetricPaddingTestCommon(
559 armnn::IWorkloadFactory& workloadFactory,
560 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
561 const armnn::DataLayout layout,
565 // Use a single-batch 1-channel 5x5 image as input.
566 armnn::TensorInfo inputDesc({ 1, 1, 5, 5 }, ArmnnType);
567 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
568 QuantizedVector<T>(qScale, qOffset, {
576 // Use 1 batch of a 1-channel 4x4 kernel.
577 armnn::TensorInfo kernelDesc({ 1, 1, 4, 4 }, ArmnnType);
578 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
579 QuantizedVector<T>(qScale, qOffset, {
586 // Expected output is 1 batch of a 1-channel 5x5 image.
587 armnn::TensorInfo outputDesc({ 1, 1, 5, 5 }, ArmnnType);
588 std::vector<T> myVec(outputDesc.GetNumElements(), 0);
589 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
590 QuantizedVector<T>(qScale, qOffset, {
591 -7140, -10580, -13940, -9300, -5230,
592 -9590, -14120, -18520, -12290, -6860,
593 -9980, -14560, -18960, -12560, -7000,
594 -7518, -10904, -14144, -9318, -5152,
595 -5032, -7256, -9376, -6142, -3368,
598 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
603 GetBias2<ArmnnBType>(false, qScale * qScale),
611 2); // Padding bottom.
614 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingTest(
615 armnn::IWorkloadFactory& workloadFactory,
616 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
617 armnn::DataLayout layout)
619 return SimpleConvolution2dAsymmetricPaddingTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
620 workloadFactory, memoryManager, layout, 0.0f, 0);
623 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest(
624 armnn::IWorkloadFactory& workloadFactory,
625 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
626 armnn::DataLayout layout)
628 return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon
629 <armnn::DataType::Float32, armnn::DataType::Float32>(
630 workloadFactory, memoryManager, layout, 0.0f, 0);
633 LayerTestResult<float, 4> Convolution1dTest(
634 armnn::IWorkloadFactory& workloadFactory,
635 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
638 return Convolution1dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
639 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
642 LayerTestResult<uint8_t, 4> Convolution1dUint8Test(
643 armnn::IWorkloadFactory& workloadFactory,
644 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
647 return Convolution1dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
648 workloadFactory, memoryManager, 0.1f, 128, biasEnabled);
651 LayerTestResult<float,4> CompareConvolution2dTest(
652 armnn::IWorkloadFactory& workloadFactory,
653 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
654 armnn::IWorkloadFactory& refWorkloadFactory)
656 return CompareConvolution2dTestImpl<armnn::DataType::Float32>(
657 workloadFactory, memoryManager, refWorkloadFactory);
660 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
661 LayerTestResult<T, 4> Convolution2d3x3DilationTestCommon(
662 armnn::IWorkloadFactory& workloadFactory,
663 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
664 const std::vector<float>& inputNoQuantizedValues,
665 armnn::TensorInfo& inputTensorInfo,
666 const std::vector<float>& kernelNoQuantizedValues,
667 armnn::TensorInfo& kernelTensorInfo,
668 const std::vector<float>& outputExpectedNoQuantizedValues,
669 armnn::TensorInfo& outputTensorInfo,
672 armnn::DataLayout layout = armnn::DataLayout::NCHW,
673 uint32_t padLeft = 0,
675 uint32_t padRight = 0,
676 uint32_t padBottom = 0,
677 uint32_t strideX = 1,
678 uint32_t strideY = 1,
679 bool biasEnabled = false
686 case armnn::DataType::QuantisedAsymm8:
692 case armnn::DataType::QuantisedSymm16:
698 case armnn::DataType::Float32:
707 inputTensorInfo.SetQuantizationScale(qScale);
708 inputTensorInfo.SetQuantizationOffset(qOffset);
709 kernelTensorInfo.SetQuantizationScale(qScale);
710 kernelTensorInfo.SetQuantizationOffset(qOffset);
711 outputTensorInfo.SetQuantizationScale(qScale);
712 outputTensorInfo.SetQuantizationOffset(qOffset);
714 auto input = MakeTensor<T, 4>(inputTensorInfo,
715 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
716 inputTensorInfo.GetQuantizationOffset(),
717 inputNoQuantizedValues)));
718 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
719 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
720 kernelTensorInfo.GetQuantizationOffset(),
721 kernelNoQuantizedValues)));
722 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
723 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
724 outputTensorInfo.GetQuantizationOffset(),
725 outputExpectedNoQuantizedValues)));
727 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
732 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
747 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
748 LayerTestResult<T, 4> Convolution2d3x3Dilation3x3Test(
749 armnn::IWorkloadFactory& workloadFactory,
750 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
752 const armnn::DataLayout layout)
754 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
755 std::vector<float> inputNoQuantizedValues =
757 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
758 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
759 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
760 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
761 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
762 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
763 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
764 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
765 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
766 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
769 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
770 std::vector<float> kernelNoQuantizedValues =
777 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
778 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
779 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
780 std::vector<float> outputExpectedNoQuantizedValues =
788 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
791 inputNoQuantizedValues,
793 kernelNoQuantizedValues,
795 outputExpectedNoQuantizedValues,
803 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
804 LayerTestResult<T, 4> Convolution2d2x3x3Dilation3x3Test(
805 armnn::IWorkloadFactory& workloadFactory,
806 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
808 const armnn::DataLayout layout)
810 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
811 std::vector<float> inputNoQuantizedValues =
813 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
814 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
815 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
816 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
817 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
818 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
819 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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,
824 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
825 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
827 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
828 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
829 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
830 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
831 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
832 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
833 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
836 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
837 std::vector<float> kernelNoQuantizedValues =
848 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
849 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
850 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
851 std::vector<float> outputExpectedNoQuantizedValues =
859 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
862 inputNoQuantizedValues,
864 kernelNoQuantizedValues,
866 outputExpectedNoQuantizedValues,
874 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
875 LayerTestResult<T, 4> Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test(
876 armnn::IWorkloadFactory &workloadFactory,
877 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
879 const armnn::DataLayout layout)
881 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
882 std::vector<float> inputNoQuantizedValues =
884 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
885 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
886 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
887 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
888 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
889 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
890 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
891 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
892 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
893 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
896 armnn::TensorInfo kernelTensorInfo({ 1, 1, 2, 2}, ArmnnType);
897 std::vector<float> kernelNoQuantizedValues =
903 // 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,
904 // therefore the output will be 4x4: (I − K + 2P)/S +1 => trunc ( (10 - 3 + 2x2 ) / 3 + 1 )
905 // where, dilation size = d = 2; kernel size = K = 2; input size = I = 10; padding size = P = 2; stride = S = 3
906 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
907 std::vector<float> outputExpectedNoQuantizedValues =
914 uint32_t padLeft = 1;
916 uint32_t padRight = 1;
917 uint32_t padBottom = 1;
919 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
922 inputNoQuantizedValues,
924 kernelNoQuantizedValues,
926 outputExpectedNoQuantizedValues,
941 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
942 Convolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
943 armnn::IWorkloadFactory&,
944 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
948 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
949 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
950 armnn::IWorkloadFactory&,
951 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
955 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
956 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
957 armnn::IWorkloadFactory&,
958 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
962 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
963 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
964 armnn::IWorkloadFactory&,
965 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
969 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
970 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
971 armnn::IWorkloadFactory&,
972 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
976 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
977 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
978 armnn::IWorkloadFactory&,
979 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
983 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
984 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
985 armnn::IWorkloadFactory &workloadFactory,
986 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
988 const armnn::DataLayout layout);
990 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
991 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
992 armnn::IWorkloadFactory &workloadFactory,
993 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
995 const armnn::DataLayout layout);
997 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
998 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
999 armnn::IWorkloadFactory &workloadFactory,
1000 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1002 const armnn::DataLayout layout);
1004 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1005 typename T = armnn::ResolveType<ArmnnType>>
1006 LayerTestResult<T, 4> DepthwiseConvolution2dAsymmetricTestCommon(
1007 armnn::IWorkloadFactory& workloadFactory,
1008 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1012 const armnn::DataLayout layout)
1014 // Use a single-batch 2-channel 5x5 image as input.
1015 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1016 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1017 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1032 // Use a depth multiplier of 1 on a 2-channel 4x4 kernel.
1033 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1034 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1035 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1048 // Expected output is 1 batch of a 2-channel 5x5 image.
1049 // Calculated using the python tensorflow library with strideX=1, strideY=1.
1050 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1051 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1052 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1054 1062, 1580, 1850, 1530, 1117,
1055 2140, 3108, 3500, 2842, 2042,
1056 3580, 5068, 5460, 4342, 3062,
1057 3618, 5072, 5390, 4248, 2971,
1058 3074, 4282, 4510, 3533, 2457,
1060 1550, 2284, 2362, 1955, 1428,
1061 2910, 4206, 4342, 3528, 2536,
1062 3390, 4886, 5022, 4068, 2916,
1063 3566, 5056, 5182, 4133, 2922,
1064 3100, 4352, 4452, 3517, 2465
1067 return DepthwiseConvolution2dAsymmetricTestImpl<ArmnnType, ArmnnBType>(
1072 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1079 2, // Padding right.
1080 2, // Padding bottom.
1085 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1086 typename T = armnn::ResolveType<ArmnnType>>
1087 LayerTestResult<T, 4> DepthwiseConvolution2dNhwcTestCommon(
1088 armnn::IWorkloadFactory& workloadFactory,
1089 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1094 auto layout = armnn::DataLayout::NHWC;
1096 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1097 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1098 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1113 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1114 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1115 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1128 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1129 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1130 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1132 1062, 1580, 1850, 1530, 1117,
1133 2140, 3108, 3500, 2842, 2042,
1134 3580, 5068, 5460, 4342, 3062,
1135 3618, 5072, 5390, 4248, 2971,
1136 3074, 4282, 4510, 3533, 2457,
1138 1550, 2284, 2362, 1955, 1428,
1139 2910, 4206, 4342, 3528, 2536,
1140 3390, 4886, 5022, 4068, 2916,
1141 3566, 5056, 5182, 4133, 2922,
1142 3100, 4352, 4452, 3517, 2465
1145 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1150 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1157 2, // Padding right.
1158 2, // Padding bottom.
1163 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1164 typename T = armnn::ResolveType<ArmnnType>>
1165 LayerTestResult<T, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon(
1166 armnn::IWorkloadFactory& workloadFactory,
1167 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1172 auto layout = armnn::DataLayout::NHWC;
1174 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9}, ArmnnType);
1175 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1176 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1178 0, 0, 0, 0, 0, 0, 0, 0, 0,
1179 0, 0, 0, 0, 0, 0, 0, 0, 0,
1180 0, 0, 0, 0, 0, 0, 0, 0, 0,
1181 0, 0, 0, 1, 1, 1, 0, 0, 0,
1182 0, 0, 0, 1, 1, 1, 0, 0, 0,
1183 0, 0, 0, 1, 1, 1, 0, 0, 0,
1184 0, 0, 0, 0, 0, 0, 0, 0, 0,
1185 0, 0, 0, 0, 0, 0, 0, 0, 0,
1186 0, 0, 0, 0, 0, 0, 0, 0, 0
1189 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1190 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1191 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1198 uint32_t padLeft = 0;
1199 uint32_t padTop = 0;
1200 uint32_t padRight = 0;
1201 uint32_t padBottom = 0;
1202 uint32_t strideX = 1;
1203 uint32_t strideY = 1;
1204 uint32_t dilationX = 3;
1205 uint32_t dilationY = 3;
1207 // Since the dilation rate is 3 this will reduce the size of the output from 9x9 to 3x3 of all 5s.
1208 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1209 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1210 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1217 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1222 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1238 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
1239 LayerTestResult<T, 4> DepthwiseConvolution2d3x3DilationTestCommon(
1240 armnn::IWorkloadFactory& workloadFactory,
1241 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1242 const std::vector<float>& inputNoQuantizedValues,
1243 armnn::TensorInfo& inputTensorInfo,
1244 const std::vector<float>& kernelNoQuantizedValues,
1245 armnn::TensorInfo& kernelTensorInfo,
1246 const std::vector<float>& outputExpectedNoQuantizedValues,
1247 armnn::TensorInfo& outputTensorInfo,
1250 armnn::DataLayout layout = armnn::DataLayout::NCHW,
1251 bool biasEnabled = false)
1257 case armnn::DataType::QuantisedAsymm8:
1263 case armnn::DataType::QuantisedSymm16:
1269 case armnn::DataType::Float32:
1278 inputTensorInfo.SetQuantizationScale(qScale);
1279 inputTensorInfo.SetQuantizationOffset(qOffset);
1280 kernelTensorInfo.SetQuantizationScale(qScale);
1281 kernelTensorInfo.SetQuantizationOffset(qOffset);
1282 outputTensorInfo.SetQuantizationScale(qScale);
1283 outputTensorInfo.SetQuantizationOffset(qOffset);
1285 auto input = MakeTensor<T, 4>(inputTensorInfo,
1286 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
1287 inputTensorInfo.GetQuantizationOffset(),
1288 inputNoQuantizedValues)));
1289 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
1290 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
1291 kernelTensorInfo.GetQuantizationOffset(),
1292 kernelNoQuantizedValues)));
1293 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
1294 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
1295 outputTensorInfo.GetQuantizationOffset(),
1296 outputExpectedNoQuantizedValues)));
1298 uint32_t padLeft = 0;
1299 uint32_t padTop = 0;
1300 uint32_t padRight = 0;
1301 uint32_t padBottom = 0;
1302 uint32_t strideX = 1;
1303 uint32_t strideY = 1;
1305 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1310 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1325 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1326 LayerTestResult<T, 4> DepthwiseConvolution2d3x3Dilation3x3Test(
1327 armnn::IWorkloadFactory& workloadFactory,
1328 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1330 const armnn::DataLayout layout)
1332 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
1333 std::vector<float> inputNoQuantizedValues =
1335 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1336 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1338 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1339 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1340 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1341 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1342 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1343 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1344 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1347 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1348 std::vector<float> kernelNoQuantizedValues =
1355 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1356 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1357 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1358 std::vector<float> outputExpectedNoQuantizedValues =
1366 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1369 inputNoQuantizedValues,
1371 kernelNoQuantizedValues,
1373 outputExpectedNoQuantizedValues,
1381 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1382 LayerTestResult<T, 4> DepthwiseConvolution2d2x3x3Dilation3x3Test(
1383 armnn::IWorkloadFactory& workloadFactory,
1384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1386 const armnn::DataLayout layout)
1388 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
1389 std::vector<float> inputNoQuantizedValues =
1391 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1392 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1393 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1394 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1395 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1396 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1397 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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,
1402 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1403 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1404 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1405 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1406 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1407 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1408 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1409 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1410 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1411 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1414 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
1415 std::vector<float> kernelNoQuantizedValues =
1426 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1427 // therefore the output will be 2x4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1428 armnn::TensorInfo outputTensorInfo({ 1, 2, 4, 4}, ArmnnType);
1429 std::vector<float> outputExpectedNoQuantizedValues =
1442 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1445 inputNoQuantizedValues,
1447 kernelNoQuantizedValues,
1449 outputExpectedNoQuantizedValues,
1458 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1459 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1460 armnn::IWorkloadFactory&,
1461 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1465 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1466 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1467 armnn::IWorkloadFactory&,
1468 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1472 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1473 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1474 armnn::IWorkloadFactory&,
1475 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1479 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1480 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1481 armnn::IWorkloadFactory&,
1482 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1486 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1487 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1488 armnn::IWorkloadFactory&,
1489 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1493 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1494 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1495 armnn::IWorkloadFactory&,
1496 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1500 LayerTestResult<float, 4> DepthwiseConvolution2dTest(
1501 armnn::IWorkloadFactory& workloadFactory,
1502 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1504 const armnn::DataLayout layout)
1506 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1507 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1510 LayerTestResult<float, 4> DepthwiseConvolution2dDepthNhwcTest(
1511 armnn::IWorkloadFactory& workloadFactory,
1512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1515 return DepthwiseConvolution2dNhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1516 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
1519 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul1Test(
1520 armnn::IWorkloadFactory& workloadFactory,
1521 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1523 const armnn::DataLayout layout)
1525 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1526 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1529 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul64Test(
1530 armnn::IWorkloadFactory& workloadFactory,
1531 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1533 armnn::TensorInfo inputTensorInfo({ 1, 1, 2, 2 }, armnn::DataType::Float32);
1534 auto input = MakeTensor<float, 4>(inputTensorInfo, { 1.f, 2.f, 3.f, 4.f });
1536 std::vector<float> kernelData;
1537 std::vector<float> singleDepthKernel{ 1.f, -1.f, -1.f, 1.f };
1538 for (unsigned int i = 0; i < 64; ++i)
1540 kernelData.insert(kernelData.end(), singleDepthKernel.begin(), singleDepthKernel.end());
1542 armnn::TensorInfo kernelTensorInfo({ 64, 1, 2, 2 }, armnn::DataType::Float32);
1543 auto kernel = MakeTensor<float, 4>(kernelTensorInfo, kernelData);
1545 std::vector<float> expectedOutputData(64, 0.f);
1546 armnn::TensorInfo outputTensorInfo({ 1, 64, 1, 1 }, armnn::DataType::Float32);
1547 auto expectedOutput = MakeTensor<float, 4>(outputTensorInfo, expectedOutputData);
1549 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1554 boost::multi_array<float, 1>(),
1558 armnn::DataLayout::NCHW);
1561 LayerTestResult<float, 4> DepthwiseConvolution2dAsymmetricTest(
1562 armnn::IWorkloadFactory& workloadFactory,
1563 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1565 const armnn::DataLayout layout)
1567 return DepthwiseConvolution2dAsymmetricTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1568 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1571 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dUint8Test(
1572 armnn::IWorkloadFactory& workloadFactory,
1573 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1575 const armnn::DataLayout layout)
1577 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1578 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1581 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dDepthMul1Uint8Test(
1582 armnn::IWorkloadFactory& workloadFactory,
1583 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1585 const armnn::DataLayout layout)
1587 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1588 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1591 LayerTestResult<float, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTest(
1592 armnn::IWorkloadFactory& workloadFactory,
1593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1595 return SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1603 LayerTestResult<int16_t, 4> DepthwiseConvolution2dInt16Test(
1604 armnn::IWorkloadFactory& workloadFactory,
1605 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1607 const armnn::DataLayout layout)
1609 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1610 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1613 LayerTestResult<int16_t, 4> DepthwiseConvolution2dDepthMul1Int16Test(
1614 armnn::IWorkloadFactory& workloadFactory,
1615 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1617 const armnn::DataLayout layout)
1619 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1620 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1623 LayerTestResult<float, 4> CompareDepthwiseConvolution2dFloatTest(
1624 armnn::IWorkloadFactory& workloadFactory,
1625 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1626 armnn::IWorkloadFactory& refWorkloadFactory,
1627 const armnn::DataLayout layout)
1629 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::Float32>(
1630 workloadFactory, memoryManager, refWorkloadFactory, layout);
1633 LayerTestResult<uint8_t, 4> CompareDepthwiseConvolution2dUint8Test(
1634 armnn::IWorkloadFactory& workloadFactory,
1635 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1636 armnn::IWorkloadFactory& refWorkloadFactory,
1637 const armnn::DataLayout layout)
1639 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8>(
1640 workloadFactory, memoryManager, refWorkloadFactory, layout);
1643 LayerTestResult<float,4> SimpleNormalizationAcrossTest(
1644 armnn::IWorkloadFactory& workloadFactory,
1645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1647 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1648 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1649 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1652 LayerTestResult<float,4> SimpleNormalizationWithinTest(
1653 armnn::IWorkloadFactory& workloadFactory,
1654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1656 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1657 auto normChannel = armnn::NormalizationAlgorithmChannel::Within;
1658 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1661 LayerTestResult<float,4> SimpleNormalizationAcrossNhwcTest(
1662 armnn::IWorkloadFactory& workloadFactory,
1663 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1665 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1666 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1667 return SimpleNormalizationNhwcTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1670 LayerTestResult<float,2> SimpleSoftmaxTest(
1671 armnn::IWorkloadFactory& workloadFactory,
1672 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1675 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
1678 LayerTestResult<float,2> SimpleAxisSoftmaxTest(
1679 armnn::IWorkloadFactory& workloadFactory,
1680 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1684 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, axis);
1687 LayerTestResult<float,3> Simple3dSoftmaxTest(
1688 armnn::IWorkloadFactory& workloadFactory,
1689 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1692 Simple3dSoftmaxOutputData data;
1693 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
1694 data.inputShape, data.outputData, data.inputData);
1697 LayerTestResult<float,3> Simple3dAxisSoftmaxTest(
1698 armnn::IWorkloadFactory& workloadFactory,
1699 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1703 armnn::TensorShape inputShape;
1704 std::vector<float> inputData;
1705 std::vector<float> outputData;
1711 inputShape = {5, 2, 2};
1715 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1717 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
1722 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1724 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1727 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1729 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1730 7.246299848982885e-08f
1737 inputShape = {2, 5, 2};
1741 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1743 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
1748 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1750 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1751 7.246299848982885e-08f,
1753 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1755 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1756 7.246299848982885e-08f
1763 inputShape = {2, 2, 5};
1767 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1768 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
1773 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1774 7.246299848982885e-08f,
1775 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1776 7.246299848982885e-08f,
1778 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1779 7.246299848982885e-08f,
1780 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1781 7.246299848982885e-08f
1787 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
1788 inputShape, outputData, inputData, axis);
1791 LayerTestResult<float,4> Simple4dSoftmaxTest(
1792 armnn::IWorkloadFactory& workloadFactory,
1793 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1796 Simple4dSoftmaxData data;
1797 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, data.inputShape,
1798 data.outputData, data.inputData);
1801 LayerTestResult<float,4> Simple4dAxisSoftmaxTest(
1802 armnn::IWorkloadFactory& workloadFactory,
1803 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1807 armnn::TensorShape inputShape;
1808 std::vector<float> inputData;
1809 std::vector<float> outputData;
1815 inputShape = {5, 2, 2, 2};
1819 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f,
1820 16.0f, -2.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f, 15.0f, -3.0f,
1821 15.0f, -3.0f, 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 14.0f, -4.0f,
1822 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f
1827 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1829 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.236882800924671f,
1831 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.236882800924671f,
1833 0.236882800924671f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
1836 0.087144312427294f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
1838 0.032058600957022f, 0.032058600957022f, 0.032058600957022f, 0.032058600957022f,
1840 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1841 7.246299848982885e-08f,
1842 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1843 7.246299848982885e-08f, 7.246299848982885e-08f
1850 inputShape = {2, 5, 2, 2};
1854 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1855 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f,
1856 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1857 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
1862 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1864 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1866 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1868 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1869 7.246299848982885e-08f,
1872 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1874 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1876 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1878 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1879 7.246299848982885e-08f
1886 inputShape = {2, 2, 5, 2};
1890 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1891 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1892 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1893 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
1898 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1900 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1901 7.246299848982885e-08f,
1902 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1904 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1905 7.246299848982885e-08f,
1907 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1909 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1910 7.246299848982885e-08f,
1911 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1913 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1914 7.246299848982885e-08f
1921 inputShape = {2, 2, 2, 5};
1925 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1926 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1927 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1928 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
1933 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1934 7.246299848982885e-08f,
1935 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1936 7.246299848982885e-08f,
1937 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1938 7.246299848982885e-08f,
1939 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1940 7.246299848982885e-08f,
1942 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1943 7.246299848982885e-08f,
1944 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1945 7.246299848982885e-08f,
1946 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1947 7.246299848982885e-08f,
1948 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1949 7.246299848982885e-08f
1955 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, inputShape,
1956 outputData, inputData, axis);
1959 LayerTestResult<uint8_t,2> SimpleSoftmaxUint8Test(
1960 armnn::IWorkloadFactory& workloadFactory,
1961 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1964 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
1967 LayerTestResult<uint8_t,3> Simple3dSoftmaxUint8Test(
1968 armnn::IWorkloadFactory& workloadFactory,
1969 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1972 Simple3dSoftmaxOutputData data;
1973 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
1974 data.inputShape, data.outputData, data.inputData);
1977 LayerTestResult<uint8_t,4> Simple4dSoftmaxUint8Test(
1978 armnn::IWorkloadFactory& workloadFactory,
1979 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1982 Simple4dSoftmaxData data;
1984 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
1985 data.inputShape, data.outputData, data.inputData);
1988 LayerTestResult<int16_t,2> SimpleSoftmaxUint16Test(
1989 armnn::IWorkloadFactory& workloadFactory,
1990 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1993 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta);
1996 LayerTestResult<int16_t,3> Simple3dSoftmaxUint16Test(
1997 armnn::IWorkloadFactory& workloadFactory,
1998 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2001 Simple3dSoftmaxOutputData data;
2002 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2003 data.inputShape, data.outputData, data.inputData);
2006 LayerTestResult<int16_t,4> Simple4dSoftmaxUint16Test(
2007 armnn::IWorkloadFactory& workloadFactory,
2008 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2011 Simple4dSoftmaxData data;
2013 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2014 data.inputShape, data.outputData, data.inputData);
2017 LayerTestResult<float,4> CompareNormalizationTest(
2018 armnn::IWorkloadFactory& workloadFactory,
2019 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2020 armnn::IWorkloadFactory& refWorkloadFactory,
2021 armnn::NormalizationAlgorithmChannel normChannel,
2022 armnn::NormalizationAlgorithmMethod normMethod)
2024 return CompareNormalizationTestImpl(workloadFactory, memoryManager, refWorkloadFactory, normChannel, normMethod);
2027 LayerTestResult<float,2> CompareSoftmaxTest(
2028 armnn::IWorkloadFactory& workloadFactory,
2029 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2030 armnn::IWorkloadFactory& refWorkloadFactory,
2033 return CompareSoftmaxTestImpl<armnn::DataType::Float32>(
2034 workloadFactory, memoryManager, refWorkloadFactory, beta);
2037 LayerTestResult<uint8_t,2> CompareSoftmaxUint8Test(
2038 armnn::IWorkloadFactory& workloadFactory,
2039 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2040 armnn::IWorkloadFactory& refWorkloadFactory,
2043 return CompareSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(
2044 workloadFactory, memoryManager, refWorkloadFactory, beta);
2047 std::vector<LayerTestResult<float,3>> SplitterTest(
2048 armnn::IWorkloadFactory& workloadFactory,
2049 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2051 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
2054 std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
2055 armnn::IWorkloadFactory& workloadFactory,
2056 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2058 return SplitterTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2061 std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
2062 armnn::IWorkloadFactory& workloadFactory,
2063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2065 return SplitterTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2068 LayerTestResult<float, 3> CopyViaSplitterTest(
2069 armnn::IWorkloadFactory& workloadFactory,
2070 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2072 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
2075 LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
2076 armnn::IWorkloadFactory& workloadFactory,
2077 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2079 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2082 LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
2083 armnn::IWorkloadFactory& workloadFactory,
2084 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2086 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2089 #if defined(ARMCOMPUTEREF_ENABLED)
2091 // The LSTM test units are run only for the reference backend at the moment
2093 void LstmUtilsZeroVectorTest()
2095 armnn::TensorInfo inputDesc({4}, armnn::DataType::Float32);
2096 boost::multi_array<float, 1> input = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2099 boost::multi_array<float, 1> expectedOutput = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2102 return LstmUtilsZeroVectorTestImpl<armnn::DataType::Float32>(input, 4, expectedOutput);
2105 void LstmUtilsMeanStddevNormalizationNoneZeroInputTest()
2107 uint32_t batchSize = 2;
2108 uint32_t vecSize = 4;
2109 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2110 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2111 { 0.1f, 0.2f, 0.3f, 0.4f, //batch 0
2112 0.9f, 1.0f, 1.1f, 1.2f })); //batch 1
2114 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2115 { -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f, //batch 0
2116 -1.34163153f, -0.447210163f, 0.447211236f, 1.3416326f })); //batch 1
2118 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2119 vecSize, batchSize, expectedOutput);
2122 void LstmUtilsMeanStddevNormalizationAllZeroInputTest()
2124 uint32_t batchSize = 2;
2125 uint32_t vecSize = 4;
2126 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2127 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2128 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2129 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2131 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2132 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2133 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2135 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2136 vecSize, batchSize, expectedOutput);
2139 void LstmUtilsMeanStddevNormalizationMixedZeroInputTest()
2141 uint32_t batchSize = 2;
2142 uint32_t vecSize = 4;
2143 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2144 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2145 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2146 0.1f, 0.2f, 0.3f, 0.4f })); //batch 1
2148 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2149 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2150 -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f })); //batch 1
2152 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2153 vecSize, batchSize, expectedOutput);
2157 void LstmUtilsVectorBatchVectorCwiseProductTest()
2159 uint32_t batchSize = 4;
2160 uint32_t vecSize = 29;
2161 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2162 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2163 { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2164 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2165 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f}));
2167 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2168 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2170 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2171 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2172 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f,
2174 -1.1f, -2.2f, -3.3f, -4.4f, -5.5f, -6.6f, -7.7f, -8.8f, -9.9f, -10.1f,
2175 -11.11f, -12.12f, -13.13f, -14.14f, -15.15f, -16.16f, -17.17f, -18.18f, -19.19f, -20.2f,
2176 -21.21f, -22.22f, -23.23f, -24.24f, -25.25f, -26.26f, -27.27f, -28.28f, 0.0f,
2178 1.1f, -2.2f, 3.3f, -4.4f, 5.5f, -6.6f, 7.7f, -8.8f, 9.9f, -10.1f,
2179 11.11f, -12.12f, 13.13f, -14.14f, 15.15f, -16.16f, 17.17f, -18.18f, 19.19f, -20.2f,
2180 21.21f, -22.22f, 23.23f, -24.24f, 25.25f, -26.26f, 27.27f, -28.28f, 0.0f,
2182 -1.1f, 2.2f, -3.3f, 4.4f, -5.5f, 6.6f, -7.7f, 8.8f, -9.9f, 10.1f,
2183 -11.11f, 12.12f, -13.13f, 14.14f, -15.15f, 16.16f, -17.17f, 18.18f, -19.19f, 20.2f,
2184 -21.21f, 22.22f, -23.23f, 24.24f, -25.25f, 26.26f, -27.27f, 28.28f, 0.0f}));
2186 // Expect output = input * output + output.
2187 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2189 1.210000f, 4.840000f, 10.889999f, 19.360001f, 30.250000f, 43.559998f,
2190 59.289997f, 77.440002f, 98.009995f, 102.010010f, 123.432091f, 146.894394f,
2191 172.396896f, 199.939606f, 229.522491f, 261.145599f, 294.808899f, 330.512421f,
2192 368.256134f, 408.040039f, 449.864075f, 493.728363f, 539.632874f, 587.577576f,
2193 637.562500f, 689.587585f, 743.652954f, 799.758423f, 0.000000f,
2195 -1.210000f, -4.840000f, -10.889999f, -19.360001f, -30.250000f, -43.559998f,
2196 -59.289997f, -77.440002f, -98.009995f, -102.010010f, -123.432091f, -146.894394f,
2197 -172.396896f, -199.939606f, -229.522491f, -261.145599f, -294.808899f, -330.512421f,
2198 -368.256134f, -408.040039f, -449.864075f, -493.728363f, -539.632874f, -587.577576f,
2199 -637.562500f, -689.587585f, -743.652954f, -799.758423f, 0.000000f,
2201 1.210000f, -4.840000f, 10.889999f, -19.360001f, 30.250000f, -43.559998f,
2202 59.289997f, -77.440002f, 98.009995f, -102.010010f, 123.432091f, -146.894394f,
2203 172.396896f, -199.939606f, 229.522491f, -261.145599f, 294.808899f, -330.512421f,
2204 368.256134f, -408.040039f, 449.864075f, -493.728363f, 539.632874f, -587.577576f,
2205 637.562500f, -689.587585f, 743.652954f, -799.758423f, 0.000000f,
2207 -1.210000f, 4.840000f, -10.889999f, 19.360001f, -30.250000f, 43.559998f,
2208 -59.289997f, 77.440002f, -98.009995f, 102.010010f, -123.432091f, 146.894394f,
2209 -172.396896f, 199.939606f, -229.522491f, 261.145599f, -294.808899f, 330.512421f,
2210 -368.256134f, 408.040039f, -449.864075f, 493.728363f, -539.632874f, 587.577576f,
2211 -637.562500f, 689.587585f, -743.652954f, 799.758423f, 0.000000f}));
2213 return LstmUtilsVectorBatchVectorCwiseProductTestImpl<armnn::DataType::Float32>(vector, batchVector,
2214 vecSize, batchSize, expectedOutput);
2218 void LstmUtilsVectorBatchVectorAddTest()
2220 uint32_t batchSize = 2;
2221 uint32_t vecSize = 3;
2222 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2223 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2224 { 0.0f, -0.5f, 1.0f}));
2226 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2227 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2228 { 1.0f, 2.0f, 3.0f, //batch 0
2229 4.0f, 5.0f, 6.0f})); //batch 1
2231 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2233 4.0f, 4.5f, 7.0f}));
2235 return LstmUtilsVectorBatchVectorAddTestImpl<armnn::DataType::Float32>(vector, batchVector,
2236 vecSize, batchSize, expectedOutput);
2241 LayerTestResult<float, 2> LstmLayerFloat32WithCifgWithPeepholeNoProjectionTest(
2242 armnn::IWorkloadFactory& workloadFactory,
2243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2245 armnn::TensorInfo inputDesc({ 2, 2 }, armnn::DataType::Float32);
2246 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2247 { 2., 3., 3., 4. }));
2249 armnn::TensorInfo outputDesc({ 2, 4 }, armnn::DataType::Float32);
2250 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2251 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2252 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f}));
2253 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2254 workloadFactory, memoryManager, input, expectedOutput);
2257 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(
2258 armnn::IWorkloadFactory& workloadFactory,
2259 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2261 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2262 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2263 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2264 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f}));
2266 armnn::TensorInfo outputDesc({ 2, 16 }, armnn::DataType::Float32);
2267 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2268 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2269 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2270 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2271 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2272 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2273 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f,
2275 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<armnn::DataType::Float32>(
2276 workloadFactory, memoryManager, input, expectedOutput);
2279 LayerTestResult<float, 2> LstmLayerFloat32NoCifgNoPeepholeNoProjectionTest(
2280 armnn::IWorkloadFactory& workloadFactory,
2281 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2283 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::Float32);
2284 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2288 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::Float32);
2289 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2290 {{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2291 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}}));
2293 return LstmNoCifgNoPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2294 workloadFactory, memoryManager, input, expectedOutput);
2298 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionWithLayerNormTest(
2299 armnn::IWorkloadFactory& workloadFactory,
2300 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2302 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2303 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2304 {0.7f, 0.8f, 0.1f, 0.2f, 0.3f, //batch 0
2305 0.3f, 0.2f, 0.9f, 0.8f, 0.1f})); //batch 1
2307 armnn::TensorInfo outputDesc({ 2, 3 }, armnn::DataType::Float32);
2308 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2309 { 0.0244077f, 0.128027f, -0.00170918f, //batch 0
2310 -0.00692428f, 0.0848741f, 0.063445f})); //batch 1
2311 return LstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTestImpl<armnn::DataType::Float32>(
2312 workloadFactory, memoryManager, input, expectedOutput);
2316 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionTest(
2317 armnn::IWorkloadFactory& workloadFactory,
2318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2320 const float qScale = 1.0f;
2321 const int32_t qOffset = 0;
2323 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2324 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2326 armnn::TensorInfo inputDesc({2, 2}, datatype);
2327 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2328 std::vector<float>{2., 3., 3., 4.}));
2330 armnn::TensorInfo outputDesc({2, 4}, datatype);
2331 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2332 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2333 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2335 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2336 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2340 LayerTestResult<int16_t, 2> LstmLayerInt16WithCifgWithPeepholeNoProjectionTest(
2341 armnn::IWorkloadFactory& workloadFactory,
2342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2344 const float qScale = 1.0f;
2345 const int32_t qOffset = 0;
2347 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2348 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2350 armnn::TensorInfo inputDesc({ 2, 2 }, datatype);
2351 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2352 std::vector<float>({ 2., 3., 3., 4. })));
2354 armnn::TensorInfo outputDesc({ 2, 4 }, datatype);
2355 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2356 qOffset, std::vector<float>(
2357 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2358 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f})));
2360 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<datatype>(
2361 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2364 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgWithPeepholeWithProjectionTest(
2365 armnn::IWorkloadFactory& workloadFactory,
2366 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2368 const float qScale = 2.0f;
2369 const int32_t qOffset = 0;
2371 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2372 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2374 armnn::TensorInfo inputDesc({ 2, 5 }, datatype);
2375 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2376 qOffset, std::vector<float>(
2377 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2378 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f})));
2380 armnn::TensorInfo outputDesc({ 2, 16 }, datatype);
2381 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2382 qOffset, std::vector<float>(
2383 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2384 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2385 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2386 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2387 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2388 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f, 0.02168f})));
2390 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<datatype>(
2391 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2394 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionInt16ConstantTest(
2395 armnn::IWorkloadFactory& workloadFactory,
2396 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2398 const float qScale = 1.0f;
2399 const int32_t qOffset = 0;
2401 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16; // datatype & constants set to QSymm16
2403 armnn::TensorInfo inputDesc({2, 2}, datatype);
2404 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2405 qOffset, std::vector<float>{2., 3., 3., 4.}));
2407 armnn::TensorInfo outputDesc({2, 4}, datatype);
2408 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2409 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2410 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2412 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2413 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, datatype);
2417 LayerTestResult<uint8_t, 2> QuantizedLstmTest(
2418 armnn::IWorkloadFactory& workloadFactory,
2419 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2421 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::QuantisedAsymm8);
2422 boost::multi_array<uint8_t, 2> input = MakeTensor<uint8_t, 2>(inputDesc, std::vector<uint8_t>(
2423 {166, 179, 50, 150}));
2425 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::QuantisedAsymm8);
2426 boost::multi_array<uint8_t, 2> expectedOutput = MakeTensor<uint8_t, 2>(outputDesc, std::vector<uint8_t>(
2427 {140, 151, 146, 112, 136, 156, 142, 112 }));
2429 return QuantizedLstmTestImpl(workloadFactory, memoryManager, input, expectedOutput);
2432 LayerTestResult<float,3> ConcatTest(
2433 armnn::IWorkloadFactory& workloadFactory,
2434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2436 unsigned int outputWidth = 3;
2437 unsigned int outputHeight = 6;
2438 unsigned int outputChannels = 3;
2440 unsigned int inputWidth1 = 3;
2441 unsigned int inputHeight1 = 6;
2442 unsigned int inputChannels1 = 2;
2444 unsigned int inputWidth2 = 3;
2445 unsigned int inputHeight2 = 6;
2446 unsigned int inputChannels2 = 1;
2448 // Define the tensor descriptors.
2449 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::Float32);
2450 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::Float32);
2451 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::Float32);
2453 LayerTestResult<float,3> ret(outputTensorInfo);
2455 ret.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float>(
2460 10.0f, 11.0f, 12.0f,
2461 13.0f, 14.0f, 15.0f,
2462 16.0f, 17.0f, 18.0f,
2464 19.0f, 20.0f, 21.0f,
2465 22.0f, 23.0f, 24.0f,
2466 25.0f, 26.0f, 27.0f,
2467 28.0f, 29.0f, 30.0f,
2468 31.0f, 32.0f, 33.0f,
2469 34.0f, 35.0f, 36.0f,
2471 37.0f, 38.0f, 39.0f,
2472 40.0f, 41.0f, 42.0f,
2473 43.0f, 44.0f, 45.0f,
2474 46.0f, 47.0f, 48.0f,
2475 49.0f, 50.0f, 51.0f,
2476 52.0f, 53.0f, 54.0f,
2480 auto input1 = MakeTensor<float, 3>(inputTensorInfo1, std::vector<float>(
2485 10.0f, 11.0f, 12.0f,
2486 13.0f, 14.0f, 15.0f,
2487 16.0f, 17.0f, 18.0f,
2489 19.0f, 20.0f, 21.0f,
2490 22.0f, 23.0f, 24.0f,
2491 25.0f, 26.0f, 27.0f,
2492 28.0f, 29.0f, 30.0f,
2493 31.0f, 32.0f, 33.0f,
2494 34.0f, 35.0f, 36.0f,
2498 auto input2 = MakeTensor<float, 3>(inputTensorInfo2, std::vector<float>(
2500 37.0f, 38.0f, 39.0f,
2501 40.0f, 41.0f, 42.0f,
2502 43.0f, 44.0f, 45.0f,
2503 46.0f, 47.0f, 48.0f,
2504 49.0f, 50.0f, 51.0f,
2505 52.0f, 53.0f, 54.0f,
2509 std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of input[0].
2510 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
2512 std::vector<unsigned int> wOrigin2 = {2, 0, 0}; //Extent of the window is defined by size of input[1].
2513 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
2515 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2517 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
2519 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
2520 subTensorsSupported ?
2521 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2522 workloadFactory.CreateTensorHandle(inputTensorInfo1);
2524 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
2525 subTensorsSupported ?
2526 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2527 workloadFactory.CreateTensorHandle(inputTensorInfo2);
2529 armnn::ConcatQueueDescriptor data;
2530 armnn::WorkloadInfo info;
2531 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2532 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2533 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2535 data.m_ViewOrigins.push_back(window1);
2536 data.m_ViewOrigins.push_back(window2);
2538 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
2540 inputHandle1->Allocate();
2541 inputHandle2->Allocate();
2542 outputHandle->Allocate();
2544 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
2545 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
2547 workload->PostAllocationConfigure();
2548 workload->Execute();
2550 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
2555 LayerTestResult<float,4> AdditionTest(
2556 armnn::IWorkloadFactory& workloadFactory,
2557 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2559 unsigned int batchSize = 2;
2560 unsigned int channels = 2;
2561 unsigned int height = 2;
2562 unsigned int width = 3;
2564 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2565 armnn::TensorInfo outputTensorInfo;
2567 unsigned int shape[] = {batchSize, channels, height, width};
2569 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2570 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2571 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2574 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, std::vector<float>(
2589 auto input2 = MakeTensor<float, 4>(inputTensorInfo2, std::vector<float>(
2604 LayerTestResult<float,4> ret(outputTensorInfo);
2605 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, std::vector<float>(
2620 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2621 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2622 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2624 armnn::AdditionQueueDescriptor data;
2625 armnn::WorkloadInfo info;
2626 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2627 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2628 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2630 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2632 inputHandle1->Allocate();
2633 inputHandle2->Allocate();
2634 outputHandle->Allocate();
2636 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2637 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2639 workload->PostAllocationConfigure();
2640 workload->Execute();
2642 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2647 LayerTestResult<float, 5> Addition5dTest(
2648 armnn::IWorkloadFactory& workloadFactory,
2649 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2651 unsigned int depth = 2;
2652 unsigned int batchSize = 2;
2653 unsigned int channels = 2;
2654 unsigned int height = 2;
2655 unsigned int width = 3;
2657 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2658 armnn::TensorInfo outputTensorInfo;
2660 unsigned int shape[] = {depth, batchSize, channels, height, width};
2662 inputTensorInfo1 = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2663 inputTensorInfo2 = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2664 outputTensorInfo = armnn::TensorInfo(5, shape, armnn::DataType::Float32);
2667 auto input1 = MakeTensor<float, 5>(inputTensorInfo1, std::vector<float>(
2669 2.6f, 4.0f, 4.4f, 2.7f, 4.6f, 2.8f,
2670 2.3f, 1.9f, 3.4f, 2.9f, 2.2f, 4.5f,
2672 2.8f, 1.9f, 2.3f, 2.6f, 4.7f, 3.5f,
2673 0.4f, 1.5f, 2.1f, 0.7f, 5.0f, 1.1f,
2676 1.0f, 2.7f, 0.0f, 0.6f, 0.8f, 0.9f,
2677 1.0f, 2.6f, 0.4f, 3.8f, 0.4f, 0.8f,
2679 0.5f, 4.3f, 3.1f, 4.4f, 0.7f, 1.4f,
2680 0.4f, 4.4f, 0.7f, 0.6f, 4.7f, 1.2f,
2684 auto input2 = MakeTensor<float, 5>(inputTensorInfo2, std::vector<float>(
2686 4.4f, 3.0f, 1.0f, 0.0f, 3.9f, 3.1f,
2687 1.7f, 2.9f, 1.3f, 0.4f, 0.4f, 4.3f,
2689 4.5f, 0.2f, 2.2f, 4.1f, 3.9f, 3.0f,
2690 0.1f, 2.5f, 4.1f, 4.6f, 1.5f, 0.0f,
2693 0.5f, 4.9f, 2.5f, 1.5f, 3.4f, 4.5f,
2694 2.0f, 3.0f, 4.9f, 1.6f, 2.4f, 3.4f,
2696 3.6f, 1.8f, 1.3f, 2.6f, 2.1f, 4.8f,
2697 2.0f, 4.3f, 4.0f, 0.2f, 0.6f, 4.4f,
2700 LayerTestResult<float, 5> ret(outputTensorInfo);
2701 ret.outputExpected = MakeTensor<float, 5>(outputTensorInfo, std::vector<float>(
2703 7.0f, 7.0f, 5.4f, 2.7f, 8.5f, 5.9f,
2704 4.0f, 4.8f, 4.7f, 3.3f, 2.6f, 8.8f,
2706 7.3f, 2.1f, 4.5f, 6.7f, 8.6f, 6.5f,
2707 0.5f, 4.0f, 6.2f, 5.3f, 6.5f, 1.1f,
2710 1.5f, 7.6f, 2.5f, 2.1f, 4.2f, 5.4f,
2711 3.0f, 5.6f, 5.3f, 5.4f, 2.8f, 4.2f,
2713 4.1f, 6.1f, 4.4f, 7.0f, 2.8f, 6.2f,
2714 2.4f, 8.7f, 4.7f, 0.8f, 5.3f, 5.6f,
2717 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2718 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2719 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2721 armnn::AdditionQueueDescriptor data;
2722 armnn::WorkloadInfo info;
2723 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2724 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2725 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2727 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2729 inputHandle1->Allocate();
2730 inputHandle2->Allocate();
2731 outputHandle->Allocate();
2733 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0][0]);
2734 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0][0]);
2736 workload->PostAllocationConfigure();
2737 workload->Execute();
2739 CopyDataFromITensorHandle(&ret.output[0][0][0][0][0], outputHandle.get());
2744 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2745 LayerTestResult<T, 4> AdditionBroadcastTestImpl(
2746 armnn::IWorkloadFactory& workloadFactory,
2747 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2751 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 1}, ArmnnType);
2752 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 2, 3}, ArmnnType);
2753 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2755 if (armnn::IsQuantizedType<T>())
2757 inputTensorInfo1.SetQuantizationScale(qScale);
2758 inputTensorInfo1.SetQuantizationOffset(qOffset);
2759 inputTensorInfo2.SetQuantizationScale(qScale);
2760 inputTensorInfo2.SetQuantizationOffset(qOffset);
2761 outputTensorInfo.SetQuantizationScale(qScale);
2762 outputTensorInfo.SetQuantizationOffset(qOffset);
2765 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
2777 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
2783 LayerTestResult<T,4> ret(outputTensorInfo);
2784 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
2796 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2797 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2798 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2800 armnn::AdditionQueueDescriptor data;
2801 armnn::WorkloadInfo info;
2802 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2803 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2804 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2806 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2808 inputHandle1->Allocate();
2809 inputHandle2->Allocate();
2810 outputHandle->Allocate();
2812 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2813 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2815 workload->PostAllocationConfigure();
2816 workload->Execute();
2818 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2823 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2824 LayerTestResult<T, 4> AdditionBroadcast1ElementTestImpl(
2825 armnn::IWorkloadFactory& workloadFactory,
2826 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2830 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2831 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 1, 1}, ArmnnType);
2832 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2834 if (armnn::IsQuantizedType<T>())
2836 inputTensorInfo1.SetQuantizationScale(qScale);
2837 inputTensorInfo1.SetQuantizationOffset(qOffset);
2838 inputTensorInfo2.SetQuantizationScale(qScale);
2839 inputTensorInfo2.SetQuantizationOffset(qOffset);
2840 outputTensorInfo.SetQuantizationScale(qScale);
2841 outputTensorInfo.SetQuantizationOffset(qOffset);
2844 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
2850 12.0f, 13.0f, 14.0f,
2851 15.0f, 16.0f, 17.0f,
2854 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
2859 LayerTestResult<T,4> ret(outputTensorInfo);
2860 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
2866 12.5f, 13.5f, 14.5f,
2867 15.5f, 16.5f, 17.5f,
2870 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2871 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2872 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2874 armnn::AdditionQueueDescriptor data;
2875 armnn::WorkloadInfo info;
2876 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2877 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2878 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2880 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2882 inputHandle1->Allocate();
2883 inputHandle2->Allocate();
2884 outputHandle->Allocate();
2886 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2887 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2889 workload->PostAllocationConfigure();
2890 workload->Execute();
2892 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2897 LayerTestResult<float, 4> AdditionBroadcastTest(
2898 armnn::IWorkloadFactory& workloadFactory,
2899 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2901 return AdditionBroadcastTestImpl<armnn::DataType::Float32>(
2902 workloadFactory, memoryManager, 0.0f, 0);
2905 LayerTestResult<uint8_t, 4> AdditionBroadcastUint8Test(
2906 armnn::IWorkloadFactory& workloadFactory,
2907 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2909 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedAsymm8>(
2910 workloadFactory, memoryManager, 2.f, 0);
2913 LayerTestResult<int16_t, 4> AdditionBroadcastInt16Test(
2914 armnn::IWorkloadFactory& workloadFactory,
2915 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2917 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedSymm16>(
2918 workloadFactory, memoryManager, 2.f, 0);
2921 LayerTestResult<float, 4> AdditionBroadcast1ElementTest(
2922 armnn::IWorkloadFactory& workloadFactory,
2923 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2925 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Float32>(
2926 workloadFactory, memoryManager, 0.0f, 0);
2929 LayerTestResult<uint8_t, 4> AdditionBroadcast1ElementUint8Test(
2930 armnn::IWorkloadFactory& workloadFactory,
2931 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2933 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedAsymm8>(
2934 workloadFactory, memoryManager, 0.1333333f, 128);
2937 LayerTestResult<int16_t, 4> AdditionBroadcast1ElementInt16Test(
2938 armnn::IWorkloadFactory& workloadFactory,
2939 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2941 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedSymm16>(
2942 workloadFactory, memoryManager, 0.1333333f, 0);
2945 LayerTestResult<float,4> CompareAdditionTest(
2946 armnn::IWorkloadFactory& workloadFactory,
2947 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2948 armnn::IWorkloadFactory& refWorkloadFactory)
2950 unsigned int batchSize = 4;
2951 unsigned int channels = 1;
2952 unsigned int height = 2;
2953 unsigned int width = 3;
2955 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2956 armnn::TensorInfo outputTensorInfo;
2958 unsigned int shape[] = {batchSize, channels, height, width};
2960 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2961 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2962 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2964 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 1232);
2965 auto input2 = MakeRandomTensor<float, 4>(inputTensorInfo2, 456);
2967 LayerTestResult<float,4> ret(outputTensorInfo);
2969 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2970 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2971 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2973 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
2974 std::unique_ptr<armnn::ITensorHandle> inputHandle2Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo2);
2975 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
2977 armnn::AdditionQueueDescriptor data;
2978 armnn::WorkloadInfo info;
2979 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2980 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2981 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2983 armnn::AdditionQueueDescriptor refData = data;
2984 armnn::WorkloadInfo refInfo = info;
2985 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo1, inputHandle1Ref.get());
2986 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo2, inputHandle2Ref.get());
2987 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
2989 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2990 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateAddition(refData, refInfo);
2992 inputHandle1->Allocate();
2993 inputHandle2->Allocate();
2994 outputHandle->Allocate();
2995 inputHandle1Ref->Allocate();
2996 inputHandle2Ref->Allocate();
2997 outputHandleRef->Allocate();
2999 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3000 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
3001 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
3002 CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
3004 workload->PostAllocationConfigure();
3005 workload->Execute();
3006 workloadRef->PostAllocationConfigure();
3007 workloadRef->Execute();
3009 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3010 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
3016 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3017 LayerTestResult<T, 4> DivisionTestHelper(
3018 armnn::IWorkloadFactory& workloadFactory,
3019 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3020 const unsigned int shape0[4],
3021 const std::vector<T>& values0,
3024 const unsigned int shape1[4],
3025 const std::vector<T> & values1,
3028 const unsigned int outShape[4],
3029 const std::vector<T> & outValues,
3033 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
3034 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
3035 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
3037 inputTensorInfo0.SetQuantizationScale(scale0);
3038 inputTensorInfo0.SetQuantizationOffset(offset0);
3040 inputTensorInfo1.SetQuantizationScale(scale1);
3041 inputTensorInfo1.SetQuantizationOffset(offset1);
3043 outputTensorInfo.SetQuantizationScale(outScale);
3044 outputTensorInfo.SetQuantizationOffset(outOffset);
3046 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
3047 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
3049 LayerTestResult<T, 4> result(outputTensorInfo);
3050 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
3052 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3053 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3054 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3056 armnn::DivisionQueueDescriptor data;
3057 armnn::WorkloadInfo info;
3058 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3059 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3060 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3062 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDivision(data, info);
3064 inputHandle0->Allocate();
3065 inputHandle1->Allocate();
3066 outputHandle->Allocate();
3068 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3069 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3071 workload->PostAllocationConfigure();
3072 workload->Execute();
3074 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
3078 } // anonymous namespace
3080 LayerTestResult<float,4> DivisionByZeroTest(
3081 armnn::IWorkloadFactory& workloadFactory,
3082 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3084 const unsigned int width = 2;
3085 const unsigned int height = 2;
3086 const unsigned int channelCount = 2;
3087 const unsigned int batchSize = 2;
3089 unsigned int shape[] = { batchSize, channelCount, height, width };
3091 std::vector<float> input0({
3092 1.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f,
3093 -1.f, -1.f, -1.f, -1.f, 5.f, 5.f, 5.f, 5.f });
3095 std::vector<float> input1({
3096 0.f, 0.f, -0.f, -0.f, 0.f, 0.f, -0.f, -0.f,
3097 0.f, 0.f, -0.f, -0.f, 5.f, 5.f, 5.f, 5.f });
3099 std::vector<float> output({
3100 INFINITY, INFINITY, -INFINITY, -INFINITY, NAN, NAN, -NAN, -NAN,
3101 -INFINITY, -INFINITY, INFINITY, INFINITY, 1, 1, 1, 1 });
3103 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3105 shape, input0, 1.0f, 0,
3106 shape, input1, 1.0f, 0,
3107 shape, output, 1.0f, 0);
3110 LayerTestResult<float,4> DivisionTest(
3111 armnn::IWorkloadFactory& workloadFactory,
3112 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3114 const unsigned int width = 2;
3115 const unsigned int height = 2;
3116 const unsigned int channelCount = 2;
3117 const unsigned int batchSize = 2;
3119 unsigned int shape[] = { batchSize, channelCount, height, width };
3121 std::vector<float> input0({
3122 2, 2, 2, 2, 3, 3, 3, 3,
3123 4, 4, 4, 4, 5, 5, 5, 5 });
3125 std::vector<float> input1({
3126 1, 1, 1, 1, 2, 2, 2, 2,
3127 4, 4, 4, 4, 4, 4, 4, 4 });
3129 std::vector<float> output({
3130 2, 2, 2, 2, 1.5, 1.5, 1.5, 1.5,
3131 1, 1, 1, 1, 1.25, 1.25, 1.25, 1.25 });
3134 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3136 shape, input0, 1.0f, 0,
3137 shape, input1, 1.0f, 0,
3138 shape, output, 1.0f, 0);
3141 LayerTestResult<float, 4> DivisionBroadcast1ElementTest(
3142 armnn::IWorkloadFactory& workloadFactory,
3143 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3145 unsigned int shape0[] = { 1, 2, 2, 2 };
3146 std::vector<float> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3148 unsigned int shape1[] = { 1, 1, 1, 1 };
3149 std::vector<float> input1({ 2 });
3151 std::vector<float> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3154 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3156 shape0, input0, 1.0f, 0,
3157 shape1, input1, 1.0f, 0,
3158 shape0, output, 1.0f, 0);
3161 LayerTestResult<float, 4> DivisionBroadcast1DVectorTest(
3162 armnn::IWorkloadFactory& workloadFactory,
3163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3165 unsigned int shape0[] = { 1, 3, 3, 2 };
3166 std::vector<float> input0({
3168 7, 16, 9, 20, 11, 24,
3169 13, 28, 15, 32, 17, 36});
3171 unsigned int shape1[] = { 1, 1, 1, 2 };
3172 std::vector<float> input1({ 1, 2 });
3174 std::vector<float> output({
3176 7, 8, 9, 10, 11, 12,
3177 13, 14, 15, 16, 17, 18});
3179 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3181 shape0, input0, 1.0f, 0,
3182 shape1, input1, 1.0f, 0,
3183 shape0, output, 1.0f, 0);
3186 LayerTestResult<uint8_t,4> DivisionUint8Test(
3187 armnn::IWorkloadFactory& workloadFactory,
3188 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3190 const unsigned int width = 2;
3191 const unsigned int height = 2;
3192 const unsigned int channelCount = 2;
3193 const unsigned int batchSize = 2;
3195 unsigned int shape[] = { batchSize, channelCount, height, width };
3197 std::vector<uint8_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3198 4, 4, 4, 4, 5, 5, 5, 5 });
3200 std::vector<uint8_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3201 4, 4, 4, 4, 4, 4, 4, 4 });
3203 std::vector<uint8_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3204 4, 4, 4, 4, 5, 5, 5, 5});
3207 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3209 shape, input0, 1.0f, 0,
3210 shape, input1, 1.0f, 0,
3211 shape, output, 0.25f, 0);
3214 LayerTestResult<uint8_t, 4> DivisionBroadcast1ElementUint8Test(
3215 armnn::IWorkloadFactory& workloadFactory,
3216 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3218 unsigned int shape0[] = { 1, 2, 2, 2 };
3219 std::vector<uint8_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3221 unsigned int shape1[] = { 1, 1, 1, 1 };
3222 std::vector<uint8_t> input1({ 2 });
3224 std::vector<uint8_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3226 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3228 shape0, input0, 1.0f, 0,
3229 shape1, input1, 1.0f, 0,
3230 shape0, output, 1.0f, 0);
3233 LayerTestResult<uint8_t, 4> DivisionBroadcast1DVectorUint8Test(
3234 armnn::IWorkloadFactory& workloadFactory,
3235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3237 unsigned int shape0[] = { 1, 3, 3, 2 };
3238 std::vector<uint8_t> input0({1, 4, 3, 8, 5, 12,
3239 7, 16, 9, 20, 11, 24,
3240 13, 28, 15, 32, 17, 36});
3242 unsigned int shape1[] = { 1, 1, 1, 2 };
3243 std::vector<uint8_t> input1({ 1, 2 });
3245 std::vector<uint8_t> output({1, 2, 3, 4, 5, 6,
3246 7, 8, 9, 10, 11, 12,
3247 13, 14, 15, 16, 17, 18});
3249 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3251 shape0, input0, 1.0f, 0,
3252 shape1, input1, 1.0f, 0,
3253 shape0, output, 1.0f, 0);
3256 LayerTestResult<int16_t,4> DivisionInt16Test(
3257 armnn::IWorkloadFactory& workloadFactory,
3258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3260 unsigned int shape[] = { 2, 2, 2, 2 };
3262 std::vector<int16_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3263 4, 4, 4, 4, 5, 5, 5, 5 });
3265 std::vector<int16_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3266 4, 4, 4, 4, 4, 4, 4, 4 });
3268 std::vector<int16_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3269 4, 4, 4, 4, 5, 5, 5, 5});
3272 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3274 shape, input0, 1.0f, 0,
3275 shape, input1, 1.0f, 0,
3276 shape, output, 0.25f, 0);
3279 LayerTestResult<int16_t, 4> DivisionBroadcast1ElementInt16Test(
3280 armnn::IWorkloadFactory& workloadFactory,
3281 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3283 unsigned int shape0[] = { 1, 2, 2, 2 };
3284 std::vector<int16_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3286 unsigned int shape1[] = { 1, 1, 1, 1 };
3287 std::vector<int16_t> input1({ 2 });
3289 std::vector<int16_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3291 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3293 shape0, input0, 1.0f, 0,
3294 shape1, input1, 1.0f, 0,
3295 shape0, output, 1.0f, 0);
3298 LayerTestResult<int16_t, 4> DivisionBroadcast1DVectorInt16Test(
3299 armnn::IWorkloadFactory& workloadFactory,
3300 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3302 unsigned int shape0[] = { 1, 3, 3, 2 };
3303 std::vector<int16_t> input0({1, 4, 3, 8, 5, 12,
3304 7, 16, 9, 20, 11, 24,
3305 13, 28, 15, 32, 17, 36});
3307 unsigned int shape1[] = { 1, 1, 1, 2 };
3308 std::vector<int16_t> input1({ 1, 2 });
3310 std::vector<int16_t> output({1, 2, 3, 4, 5, 6,
3311 7, 8, 9, 10, 11, 12,
3312 13, 14, 15, 16, 17, 18});
3314 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3316 shape0, input0, 1.0f, 0,
3317 shape1, input1, 1.0f, 0,
3318 shape0, output, 1.0f, 0);
3321 template<typename DescriptorType>
3322 std::unique_ptr<armnn::IWorkload> CreateWorkload(
3323 const armnn::IWorkloadFactory& workloadFactory,
3324 const armnn::WorkloadInfo& info,
3325 const DescriptorType& descriptor)
3327 return CreateWorkload(workloadFactory, info, descriptor);
3331 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MaximumQueueDescriptor>(
3332 const armnn::IWorkloadFactory& workloadFactory,
3333 const armnn::WorkloadInfo& info,
3334 const armnn::MaximumQueueDescriptor& descriptor)
3336 return workloadFactory.CreateMaximum(descriptor, info);
3340 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MinimumQueueDescriptor>(
3341 const armnn::IWorkloadFactory& workloadFactory,
3342 const armnn::WorkloadInfo& info,
3343 const armnn::MinimumQueueDescriptor& descriptor)
3345 return workloadFactory.CreateMinimum(descriptor, info);
3349 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::EqualQueueDescriptor>(
3350 const armnn::IWorkloadFactory& workloadFactory,
3351 const armnn::WorkloadInfo& info,
3352 const armnn::EqualQueueDescriptor& descriptor)
3354 return workloadFactory.CreateEqual(descriptor, info);
3358 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::GreaterQueueDescriptor>(
3359 const armnn::IWorkloadFactory& workloadFactory,
3360 const armnn::WorkloadInfo& info,
3361 const armnn::GreaterQueueDescriptor& descriptor)
3363 return workloadFactory.CreateGreater(descriptor, info);
3368 template <typename Descriptor,
3369 armnn::DataType ArmnnTypeInput,
3370 armnn::DataType ArmnnTypeOutput,
3371 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
3372 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
3373 LayerTestResult<TOutput, 4> ElementwiseTestHelper(
3374 armnn::IWorkloadFactory & workloadFactory,
3375 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3376 const unsigned int shape0[4], std::vector<TInput> values0,
3377 const unsigned int shape1[4], std::vector<TInput> values1,
3378 const unsigned int outShape[4], std::vector<TOutput> outValues,
3379 float qScale = 0.0f, int qOffset = 0)
3381 const uint32_t dimensionCount = 4;
3382 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, ArmnnTypeInput};
3383 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, ArmnnTypeInput};
3384 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, ArmnnTypeOutput};
3386 auto input0 = MakeTensor<TInput, 4>(inputTensorInfo0, values0);
3387 auto input1 = MakeTensor<TInput, 4>(inputTensorInfo1, values1);
3389 if (armnn::IsQuantizedType<TInput>())
3391 inputTensorInfo0.SetQuantizationScale(qScale);
3392 inputTensorInfo0.SetQuantizationOffset(qOffset);
3394 inputTensorInfo1.SetQuantizationScale(qScale);
3395 inputTensorInfo1.SetQuantizationOffset(qOffset);
3397 outputTensorInfo.SetQuantizationScale(qScale);
3398 outputTensorInfo.SetQuantizationOffset(qOffset);
3401 LayerTestResult<TOutput,4> ret(outputTensorInfo);
3403 if(ArmnnTypeOutput == armnn::DataType::Boolean)
3405 ret.compareBoolean = true;
3408 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3409 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3410 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3413 armnn::WorkloadInfo info;
3414 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3415 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3416 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3417 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
3419 inputHandle0->Allocate();
3420 inputHandle1->Allocate();
3421 outputHandle->Allocate();
3423 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3424 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3426 workload->PostAllocationConfigure();
3427 ExecuteWorkload(*workload, memoryManager);
3429 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3431 ret.outputExpected = MakeTensor<TOutput, 4>(outputTensorInfo, outValues);
3435 template <typename Descriptor, armnn::DataType ArmnnT, typename T = armnn::ResolveType<ArmnnT>>
3436 LayerTestResult<T, 4> ElementwiseTestHelper(
3437 armnn::IWorkloadFactory & workloadFactory,
3438 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3439 const unsigned int shape0[4], std::vector<T> values0,
3440 const unsigned int shape1[4], std::vector<T> values1,
3441 const unsigned int outShape[4], std::vector<T> outValues,
3442 float qScale = 0.0f, int qOffset = 0)
3444 return ElementwiseTestHelper<Descriptor, ArmnnT, ArmnnT>
3458 LayerTestResult<uint8_t, 4> EqualSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3459 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3461 const unsigned int width = 2;
3462 const unsigned int height = 2;
3463 const unsigned int channelCount = 2;
3464 const unsigned int batchSize = 2;
3466 unsigned int shape[] = { batchSize, channelCount, height, width };
3468 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3469 3, 3, 3, 3, 4, 4, 4, 4 });
3471 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3472 5, 5, 5, 5, 4, 4, 4, 4 });
3474 std::vector<uint8_t> output({ 1, 1, 1, 1, 0, 0, 0, 0,
3475 0, 0, 0, 0, 1, 1, 1, 1 });
3477 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3488 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementTest(
3489 armnn::IWorkloadFactory& workloadFactory,
3490 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3492 unsigned int shape0[] = { 1, 2, 2, 2 };
3493 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3495 unsigned int shape1[] = { 1, 1, 1, 1 };
3496 std::vector<float> input1({ 1 });
3498 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0, 0, 0});
3500 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3511 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorTest(
3512 armnn::IWorkloadFactory& workloadFactory,
3513 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3515 const unsigned int shape0[] = { 1, 2, 2, 3 };
3516 const unsigned int shape1[] = { 1, 1, 1, 3 };
3518 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
3519 7, 8, 9, 10, 11, 12 });
3521 std::vector<float> input1({ 1, 2, 3});
3523 std::vector<uint8_t> output({ 1, 1, 1, 0, 0, 0,
3524 0, 0, 0, 0, 0, 0 });
3526 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3537 LayerTestResult<uint8_t, 4> EqualUint8Test(
3538 armnn::IWorkloadFactory& workloadFactory,
3539 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3541 unsigned int shape[] = { 2, 2, 2, 2 };
3543 // See dequantized values to the right.
3544 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3545 3, 3, 3, 3, 7, 7, 7, 7 });
3547 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3548 3, 3, 3, 3, 5, 5, 5, 5 });
3550 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3551 1, 1, 1, 1, 0, 0, 0, 0 });
3553 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3554 armnn::DataType::QuantisedAsymm8,
3555 armnn::DataType::Boolean>(
3568 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementUint8Test(
3569 armnn::IWorkloadFactory& workloadFactory,
3570 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3572 const unsigned int shape0[] = { 1, 2, 2, 3 };
3573 const unsigned int shape1[] = { 1, 1, 1, 1 };
3575 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3576 7, 8, 9, 10, 11, 12 });
3578 std::vector<uint8_t> input1({ 1 });
3580 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0,
3581 0, 0, 0, 0, 0, 0 });
3583 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3584 armnn::DataType::QuantisedAsymm8,
3585 armnn::DataType::Boolean>(
3598 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorUint8Test(
3599 armnn::IWorkloadFactory& workloadFactory,
3600 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3602 const unsigned int shape0[] = { 1, 2, 2, 3 };
3603 const unsigned int shape1[] = { 1, 1, 1, 3 };
3605 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3606 7, 8, 9, 10, 11, 12 });
3608 std::vector<uint8_t> input1({ 1, 1, 3});
3610 std::vector<uint8_t> output({ 1, 0, 1, 0, 0, 0,
3611 0, 0, 0, 0, 0, 0 });
3613 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3614 armnn::DataType::QuantisedAsymm8,
3615 armnn::DataType::Boolean>(
3628 LayerTestResult<uint8_t, 4> GreaterSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3631 const unsigned int width = 2;
3632 const unsigned int height = 2;
3633 const unsigned int channelCount = 2;
3634 const unsigned int batchSize = 2;
3636 unsigned int shape[] = { batchSize, channelCount, height, width };
3638 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3639 3, 3, 3, 3, 4, 4, 4, 4 });
3641 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3642 5, 5, 5, 5, 4, 4, 4, 4 });
3644 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3645 0, 0, 0, 0, 0, 0, 0, 0 });
3647 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3658 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementTest(
3659 armnn::IWorkloadFactory& workloadFactory,
3660 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3662 unsigned int shape0[] = { 1, 2, 2, 2 };
3663 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3665 unsigned int shape1[] = { 1, 1, 1, 1 };
3666 std::vector<float> input1({ 1 });
3668 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1, 1, 1});
3670 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3681 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorTest(
3682 armnn::IWorkloadFactory& workloadFactory,
3683 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3685 const unsigned int shape0[] = { 1, 2, 2, 3 };
3686 const unsigned int shape1[] = { 1, 1, 1, 3 };
3688 std::vector<float> input0({ 1, 2.9f, 2.1f, 4, 5, 6,
3689 7, 8, 9, 10, 11, 12 });
3691 std::vector<float> input1({ 1, 3, 2});
3693 std::vector<uint8_t> output({ 0, 0, 1, 1, 1, 1,
3694 1, 1, 1, 1, 1, 1 });
3696 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3707 LayerTestResult<uint8_t, 4> GreaterUint8Test(
3708 armnn::IWorkloadFactory& workloadFactory,
3709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3711 unsigned int shape[] = { 2, 2, 2, 2 };
3713 // See dequantized values to the right.
3714 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3715 3, 3, 3, 3, 5, 5, 5, 5 });
3717 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3718 2, 2, 2, 2, 5, 5, 5, 5 });
3720 std::vector<uint8_t> output({ 0, 0, 0, 0, 0, 0, 0, 0,
3721 1, 1, 1, 1, 0, 0, 0, 0 });
3723 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3724 armnn::DataType::QuantisedAsymm8,
3725 armnn::DataType::Boolean>(
3738 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementUint8Test(
3739 armnn::IWorkloadFactory& workloadFactory,
3740 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3742 const unsigned int shape0[] = { 1, 2, 2, 3 };
3743 const unsigned int shape1[] = { 1, 1, 1, 1 };
3745 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3746 7, 8, 9, 10, 11, 12 });
3748 std::vector<uint8_t> input1({ 1 });
3750 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1,
3751 1, 1, 1, 1, 1, 1 });
3753 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3754 armnn::DataType::QuantisedAsymm8,
3755 armnn::DataType::Boolean>(
3768 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorUint8Test(
3769 armnn::IWorkloadFactory& workloadFactory,
3770 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3772 const unsigned int shape0[] = { 1, 2, 2, 3 };
3773 const unsigned int shape1[] = { 1, 1, 1, 3 };
3775 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3776 7, 8, 9, 10, 11, 12 });
3778 std::vector<uint8_t> input1({ 1, 1, 3});
3780 std::vector<uint8_t> output({ 0, 1, 0, 1, 1, 1,
3781 1, 1, 1, 1, 1, 1 });
3783 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3784 armnn::DataType::QuantisedAsymm8,
3785 armnn::DataType::Boolean>(
3798 LayerTestResult<float, 4> MaximumSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3799 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3801 const unsigned int width = 2;
3802 const unsigned int height = 2;
3803 const unsigned int channelCount = 2;
3804 const unsigned int batchSize = 2;
3806 unsigned int shape[] = { batchSize, channelCount, height, width };
3808 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3809 3, 3, 3, 3, 4, 4, 4, 4 });
3811 std::vector<float> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3812 4, 4, 4, 4, 5, 5, 5, 5 });
3814 std::vector<float> output({ 2, 2, 2, 2, 5, 5, 5, 5,
3815 4, 4, 4, 4, 5, 5, 5, 5 });
3817 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3828 LayerTestResult<float, 4> MaximumBroadcast1ElementTest(
3829 armnn::IWorkloadFactory& workloadFactory,
3830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3832 unsigned int shape0[] = { 1, 2, 2, 2 };
3833 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3835 unsigned int shape1[] = { 1, 1, 1, 1 };
3836 std::vector<float> input1({ 2 });
3838 std::vector<float> output({ 2, 2, 3, 4, 5, 6, 7, 8});
3840 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3851 LayerTestResult<float, 4> MaximumBroadcast1DVectorTest(
3852 armnn::IWorkloadFactory& workloadFactory,
3853 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3855 const unsigned int shape0[] = { 1, 2, 2, 3 };
3856 const unsigned int shape1[] = { 1, 1, 1, 3 };
3858 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
3859 7, 8, 9, 10, 11, 12 });
3861 std::vector<float> input1({ 1, 2, 3});
3863 std::vector<float> output({ 1, 2, 3, 4, 5, 6,
3864 7, 8, 9, 10, 11, 12 });
3866 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3877 LayerTestResult<uint8_t, 4> MaximumUint8Test(
3878 armnn::IWorkloadFactory& workloadFactory,
3879 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3881 unsigned int shape[] = { 2, 2, 2, 2 };
3883 // See dequantized values to the right.
3884 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3885 3, 3, 3, 3, 4, 4, 4, 4 });
3887 std::vector<uint8_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3888 4, 4, 4, 4, 5, 5, 5, 5 });
3890 std::vector<uint8_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
3891 4, 4, 4, 4, 5, 5, 5, 5 });
3893 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3906 LayerTestResult<uint8_t, 4> MaximumBroadcast1ElementUint8Test(
3907 armnn::IWorkloadFactory& workloadFactory,
3908 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3910 const unsigned int shape0[] = { 1, 2, 2, 3 };
3911 const unsigned int shape1[] = { 1, 1, 1, 1 };
3913 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3914 7, 8, 9, 10, 11, 12 });
3916 std::vector<uint8_t> input1({2});
3918 std::vector<uint8_t> output({ 2, 2, 3, 4, 5, 6,
3919 7, 8, 9, 10, 11, 12 });
3921 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3934 LayerTestResult<uint8_t, 4> MaximumBroadcast1DVectorUint8Test(
3935 armnn::IWorkloadFactory& workloadFactory,
3936 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3938 const unsigned int shape0[] = { 1, 2, 2, 3 };
3939 const unsigned int shape1[] = { 1, 1, 1, 3 };
3941 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3942 7, 8, 9, 10, 11, 12 });
3944 std::vector<uint8_t> input1({ 1, 10, 3});
3946 std::vector<uint8_t> output({ 1, 10, 3, 4, 10, 6,
3947 7, 10, 9, 10, 11, 12 });
3949 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3962 LayerTestResult<int16_t, 4> MaximumInt16Test(
3963 armnn::IWorkloadFactory& workloadFactory,
3964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3966 unsigned int shape[] = { 2, 2, 2, 2 };
3968 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3969 3, 3, 3, 3, 4, 4, 4, 4 });
3971 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3972 4, 4, 4, 4, 5, 5, 5, 5 });
3974 std::vector<int16_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
3975 4, 4, 4, 4, 5, 5, 5, 5 });
3977 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
3990 LayerTestResult<int16_t, 4> MaximumBroadcast1ElementInt16Test(
3991 armnn::IWorkloadFactory& workloadFactory,
3992 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3994 const unsigned int shape0[] = { 1, 2, 2, 3 };
3995 const unsigned int shape1[] = { 1, 1, 1, 1 };
3997 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
3998 7, 8, 9, 10, 11, 12 });
4000 std::vector<int16_t> input1({2});
4002 std::vector<int16_t> output({ 2, 2, 3, 4, 5, 6,
4003 7, 8, 9, 10, 11, 12 });
4005 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4018 LayerTestResult<int16_t, 4> MaximumBroadcast1DVectorInt16Test(
4019 armnn::IWorkloadFactory& workloadFactory,
4020 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4022 const unsigned int shape0[] = { 1, 2, 2, 3 };
4023 const unsigned int shape1[] = { 1, 1, 1, 3 };
4025 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4026 7, 8, 9, 10, 11, 12 });
4028 std::vector<int16_t> input1({ 1, 10, 3});
4030 std::vector<int16_t> output({ 1, 10, 3, 4, 10, 6,
4031 7, 10, 9, 10, 11, 12 });
4033 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4046 LayerTestResult<float, 4> MinimumBroadcast1ElementTest1(
4047 armnn::IWorkloadFactory& workloadFactory,
4048 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4050 unsigned int shape0[] = { 1, 2, 2, 2 };
4051 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4053 unsigned int shape1[] = { 1, 1, 1, 1 };
4054 std::vector<float> input1({ 2 });
4056 std::vector<float> output({ 1, 2, 2, 2, 2, 2, 2, 2});
4058 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
4070 LayerTestResult<float, 4> MinimumBroadcast1ElementTest2(
4071 armnn::IWorkloadFactory& workloadFactory,
4072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4074 unsigned int shape0[] = { 1, 2, 2, 2 };
4075 std::vector<float> input0({ 1, 6, 3, 2, 8, 9, 1, 10});
4077 unsigned int shape1[] = { 1, 1, 1, 1 };
4078 std::vector<float> input1({ 5 });
4080 std::vector<float> output({ 1, 5, 3, 2, 5, 5, 1, 5});
4082 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
4093 LayerTestResult<uint8_t, 4> MinimumBroadcast1DVectorUint8Test(
4094 armnn::IWorkloadFactory & workloadFactory,
4095 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)
4097 const unsigned int shape0[] = { 1, 2, 2, 3 };
4098 const unsigned int shape1[] = { 1, 1, 1, 3 };
4100 std::vector<uint8_t> input0({ 1, 2, 3, 3, 2, 1,
4101 7, 1, 2, 3, 4, 5 });
4103 std::vector<uint8_t> input1({ 1, 2, 3});
4105 std::vector<uint8_t> output({ 1, 2, 3, 1, 2, 1,
4106 1, 1, 2, 1, 2, 3 });
4108 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4121 LayerTestResult<int16_t, 4> MinimumInt16Test(
4122 armnn::IWorkloadFactory& workloadFactory,
4123 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4125 unsigned int shape[] = { 2, 2, 2, 2 };
4127 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
4128 3, 3, 3, 3, 4, 4, 4, 4 });
4130 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4131 4, 4, 4, 4, 5, 5, 5, 5 });
4133 std::vector<int16_t> output({ 1, 1, 1, 1, 3, 3, 3, 3,
4134 3, 3, 3, 3, 4, 4, 4, 4 });
4136 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4149 LayerTestResult<int16_t, 4> MinimumBroadcast1ElementInt16Test(
4150 armnn::IWorkloadFactory& workloadFactory,
4151 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4153 const unsigned int shape0[] = { 1, 2, 2, 3 };
4154 const unsigned int shape1[] = { 1, 1, 1, 1 };
4156 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4157 7, 8, 9, 10, 11, 12 });
4159 std::vector<int16_t> input1({2});
4161 std::vector<int16_t> output({ 1, 2, 2, 2, 2, 2,
4162 2, 2, 2, 2, 2, 2 });
4164 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4177 LayerTestResult<int16_t, 4> MinimumBroadcast1DVectorInt16Test(
4178 armnn::IWorkloadFactory& workloadFactory,
4179 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4181 const unsigned int shape0[] = { 1, 2, 2, 3 };
4182 const unsigned int shape1[] = { 1, 1, 1, 3 };
4184 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4185 7, 8, 9, 10, 11, 12 });
4187 std::vector<int16_t> input1({ 1, 10, 3});
4189 std::vector<int16_t> output({ 1, 2, 3, 1, 5, 3,
4190 1, 8, 3, 1, 10, 3 });
4192 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4206 template<std::size_t NumDims>
4207 LayerTestResult<float,NumDims> MultiplicationTestHelper(
4208 armnn::IWorkloadFactory& workloadFactory,
4209 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4210 const unsigned int shape0[NumDims],
4211 const std::vector<float> & values0,
4212 const unsigned int shape1[NumDims],
4213 const std::vector<float> & values1,
4214 const unsigned int outShape[NumDims],
4215 const std::vector<float> & outValues)
4217 armnn::TensorInfo inputTensorInfo0{NumDims, shape0, armnn::DataType::Float32};
4218 armnn::TensorInfo inputTensorInfo1{NumDims, shape1, armnn::DataType::Float32};
4219 armnn::TensorInfo outputTensorInfo{NumDims, outShape, armnn::DataType::Float32};
4221 auto input0 = MakeTensor<float, NumDims>(inputTensorInfo0, values0);
4222 auto input1 = MakeTensor<float, NumDims>(inputTensorInfo1, values1);
4224 LayerTestResult<float,NumDims> ret(outputTensorInfo);
4226 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4227 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4228 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4230 armnn::MultiplicationQueueDescriptor data;
4231 armnn::WorkloadInfo info;
4232 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4233 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4234 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4236 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4238 inputHandle0->Allocate();
4239 inputHandle1->Allocate();
4240 outputHandle->Allocate();
4242 CopyDataToITensorHandle(inputHandle0.get(), input0.origin());
4243 CopyDataToITensorHandle(inputHandle1.get(), input1.origin());
4245 workload->PostAllocationConfigure();
4246 workload->Execute();
4248 CopyDataFromITensorHandle(ret.output.origin(), outputHandle.get());
4250 ret.outputExpected = MakeTensor<float, NumDims>(outputTensorInfo, outValues);
4253 } // anonymous namespace
4256 LayerTestResult<float,4> MultiplicationTest(
4257 armnn::IWorkloadFactory& workloadFactory,
4258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4260 const unsigned int width = 2;
4261 const unsigned int height = 2;
4262 const unsigned int channelCount = 2;
4263 const unsigned int batchSize = 2;
4265 unsigned int shape[] = { batchSize, channelCount, height, width };
4267 std::vector<float> input0({
4268 1, 1, 1, 1, 2, 2, 2, 2,
4269 3, 3, 3, 3, 4, 4, 4, 4 });
4271 std::vector<float> input1({
4272 2, 2, 2, 2, 3, 3, 3, 3,
4273 4, 4, 4, 4, 5, 5, 5, 5 });
4275 std::vector<float> output({
4276 2, 2, 2, 2, 6, 6, 6, 6,
4277 12, 12, 12, 12, 20, 20, 20, 20 });
4279 return MultiplicationTestHelper<4>(workloadFactory,
4289 LayerTestResult<float,5> Multiplication5dTest(
4290 armnn::IWorkloadFactory& workloadFactory,
4291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4293 const unsigned int width = 3;
4294 const unsigned int height = 2;
4295 const unsigned int channelCount = 2;
4296 const unsigned int batchSize = 2;
4297 const unsigned int depth = 2;
4299 unsigned int shape[] = { depth, batchSize, channelCount, height, width };
4301 std::vector<float> input0({
4302 1.80f, 0.20f, 2.30f, 1.30f, 2.10f, 1.00f,
4303 2.60f, 0.60f, 2.10f, 2.30f, 2.30f, 2.00f,
4305 2.50f, 1.00f, 2.90f, 3.10f, 1.50f, 2.40f,
4306 2.80f, 1.10f, 1.00f, 3.20f, 1.00f, 2.30f,
4309 0.30f, 2.20f, 1.00f, 0.20f, 1.60f, 1.40f,
4310 0.80f, 3.20f, 0.10f, 0.10f, 3.10f, 2.10f,
4312 1.50f, 2.40f, 1.40f, 0.70f, 2.40f, 1.40f,
4313 1.60f, 1.20f, 1.90f, 0.80f, 0.00f, 0.10f,
4316 std::vector<float> input1({
4317 0.70f, 1.00f, 2.90f, 2.20f, 3.10f, 2.80f,
4318 1.80f, 2.00f, 0.50f, 2.30f, 1.20f, 2.70f,
4320 2.40f, 0.20f, 3.20f, 1.60f, 0.20f, 2.50f,
4321 2.30f, 0.70f, 2.70f, 1.80f, 2.90f, 2.70f,
4324 3.20f, 3.20f, 0.70f, 1.90f, 2.70f, 2.50f,
4325 2.40f, 0.90f, 2.30f, 1.80f, 2.50f, 2.00f,
4327 1.60f, 2.20f, 1.60f, 2.00f, 0.30f, 3.20f,
4328 0.40f, 3.00f, 2.60f, 0.30f, 0.00f, 2.50f,
4331 std::vector<float> output({
4332 1.26f, 0.20f, 6.67f, 2.86f, 6.51f, 2.80f,
4333 4.68f, 1.20f, 1.05f, 5.29f, 2.76f, 5.40f,
4335 6.00f, 0.20f, 9.28f, 4.96f, 0.30f, 6.00f,
4336 6.44f, 0.77f, 2.70f, 5.76f, 2.90f, 6.21f,
4339 0.96f, 7.04f, 0.70f, 0.38f, 4.32f, 3.50f,
4340 1.92f, 2.88f, 0.23f, 0.18f, 7.75f, 4.20f,
4342 2.40f, 5.28f, 2.24f, 1.40f, 0.72f, 4.48f,
4343 0.64f, 3.60f, 4.94f, 0.24f, 0.00f, 0.25f,
4346 return MultiplicationTestHelper<5>(workloadFactory,
4356 LayerTestResult<float, 4> MultiplicationBroadcast1ElementTest(
4357 armnn::IWorkloadFactory& workloadFactory,
4358 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4360 unsigned int shape0[] = { 1, 2, 2, 2 };
4361 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4363 unsigned int shape1[] = { 1, 1, 1, 1 };
4364 std::vector<float> input1({ 2 });
4366 std::vector<float> output({ 2, 4, 6, 8, 10, 12, 14, 16});
4368 return MultiplicationTestHelper<4>(workloadFactory,
4378 LayerTestResult<float, 4> MultiplicationBroadcast1DVectorTest(
4379 armnn::IWorkloadFactory& workloadFactory,
4380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4382 unsigned int shape0[] = { 1, 3, 3, 2 };
4383 std::vector<float> input0({
4385 7, 8, 9, 10, 11, 12,
4386 13, 14, 15, 16, 17, 18});
4388 unsigned int shape1[] = { 1, 1, 1, 2 };
4389 std::vector<float> input1({ 1, 2 });
4391 std::vector<float> output({
4393 7, 16, 9, 20, 11, 24,
4394 13, 28, 15, 32, 17, 36});
4396 return MultiplicationTestHelper<4>(workloadFactory,
4406 LayerTestResult<float,4> CompareMultiplicationTest(
4407 armnn::IWorkloadFactory& workloadFactory,
4408 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4409 armnn::IWorkloadFactory& refWorkloadFactory)
4411 const unsigned int width = 16;
4412 const unsigned int height = 32;
4413 const unsigned int channelCount = 2;
4414 const unsigned int batchSize = 5;
4416 armnn::TensorInfo inputTensorInfo0;
4417 armnn::TensorInfo inputTensorInfo1;
4418 armnn::TensorInfo outputTensorInfo;
4420 constexpr unsigned int shape[] = { batchSize, channelCount, height, width };
4422 inputTensorInfo0 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4423 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4424 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4426 LayerTestResult<float,4> comparisonResult(outputTensorInfo);
4428 auto input0 = MakeRandomTensor<float, 4>(inputTensorInfo0, 803506992);
4429 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 54902257);
4431 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4432 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4433 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4435 std::unique_ptr<armnn::ITensorHandle> inputHandle0Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo0);
4436 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
4437 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4439 armnn::MultiplicationQueueDescriptor data;
4440 armnn::WorkloadInfo info;
4441 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4442 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4443 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4445 armnn::MultiplicationQueueDescriptor refData = data;
4446 armnn::WorkloadInfo refInfo = info;
4447 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo0, inputHandle0Ref.get());
4448 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo1, inputHandle1Ref.get());
4449 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4451 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4452 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateMultiplication(refData, refInfo);
4454 inputHandle0->Allocate();
4455 inputHandle1->Allocate();
4456 outputHandle->Allocate();
4457 inputHandle0Ref->Allocate();
4458 inputHandle1Ref->Allocate();
4459 outputHandleRef->Allocate();
4461 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
4462 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
4463 CopyDataToITensorHandle(inputHandle0Ref.get(), &input0[0][0][0][0]);
4464 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
4466 workload->PostAllocationConfigure();
4467 workload->Execute();
4468 workloadRef->PostAllocationConfigure();
4469 workloadRef->Execute();
4470 CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
4471 CopyDataFromITensorHandle(&comparisonResult.outputExpected[0][0][0][0], outputHandleRef.get());
4473 return comparisonResult;
4476 LayerTestResult<float,4> CompareBatchNormTest(
4477 armnn::IWorkloadFactory& workloadFactory,
4478 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4479 armnn::IWorkloadFactory& refWorkloadFactory)
4481 const unsigned int width = 2;
4482 const unsigned int height = 3;
4483 const unsigned int channels = 5;
4484 const unsigned int batchSize = 3;
4486 armnn::TensorInfo inputTensorInfo;
4487 armnn::TensorInfo outputTensorInfo;
4488 armnn::TensorInfo tensorInfo;
4490 constexpr unsigned int shape[] = {batchSize, channels, height, width};
4491 constexpr unsigned int tensorShape[] = {channels};
4493 inputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4494 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4495 tensorInfo = armnn::TensorInfo(1, tensorShape, armnn::DataType::Float32);
4497 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 21312);
4499 auto mean = MakeRandomTensor<float, 1>(tensorInfo, 123);
4500 auto variance = MakeRandomTensor<float, 1>(tensorInfo, 234, 0.0f);
4501 auto beta = MakeRandomTensor<float, 1>(tensorInfo, 123);
4502 auto gamma = MakeRandomTensor<float, 1>(tensorInfo, 345);
4504 LayerTestResult<float,4> ret(outputTensorInfo);
4506 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4507 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4509 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.CreateTensorHandle(inputTensorInfo);
4510 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4512 armnn::BatchNormalizationQueueDescriptor data;
4513 armnn::WorkloadInfo info;
4514 armnn::ScopedCpuTensorHandle meanTensor(tensorInfo);
4515 armnn::ScopedCpuTensorHandle varianceTensor(tensorInfo);
4516 armnn::ScopedCpuTensorHandle betaTensor(tensorInfo);
4517 armnn::ScopedCpuTensorHandle gammaTensor(tensorInfo);
4519 AllocateAndCopyDataToITensorHandle(&meanTensor, &mean[0]);
4520 AllocateAndCopyDataToITensorHandle(&varianceTensor, &variance[0]);
4521 AllocateAndCopyDataToITensorHandle(&betaTensor, &beta[0]);
4522 AllocateAndCopyDataToITensorHandle(&gammaTensor, &gamma[0]);
4524 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
4525 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4526 data.m_Mean = &meanTensor;
4527 data.m_Variance = &varianceTensor;
4528 data.m_Beta = &betaTensor;
4529 data.m_Gamma = &gammaTensor;
4530 data.m_Parameters.m_Eps = 0.01f;
4532 armnn::BatchNormalizationQueueDescriptor refData = data;
4533 armnn::WorkloadInfo refInfo = info;
4534 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
4535 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4537 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateBatchNormalization(data, info);
4538 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateBatchNormalization(refData, refInfo);
4540 inputHandle->Allocate();
4541 outputHandle->Allocate();
4542 inputHandleRef->Allocate();
4543 outputHandleRef->Allocate();
4545 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
4546 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
4548 workload->PostAllocationConfigure();
4549 workload->Execute();
4550 workloadRef->PostAllocationConfigure();
4551 workloadRef->Execute();
4553 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
4554 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
4559 template<typename T>
4560 void PermuteTensorData(
4561 armnn::IWorkloadFactory& workloadFactory,
4562 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4563 const armnn::PermutationVector& mappings,
4564 armnn::TensorInfo & inputTensorInfo,
4565 const T * inputData,
4566 std::vector<T>& outputData)
4568 BOOST_ASSERT_MSG(inputData != nullptr, "inputData must not be null");
4569 if (inputData == nullptr)
4571 // Nullptr is an error in the test. By returning without doing the concatenation
4572 // I expect the caller to fail the test. It still makes sense to report this as
4573 // an assert for Debug builds.
4577 armnn::TensorInfo outputTensorInfo = armnnUtils::Permuted(inputTensorInfo, mappings);
4579 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4580 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4582 armnn::PermuteQueueDescriptor queueDescriptor;
4583 queueDescriptor.m_Parameters = armnn::PermuteDescriptor{mappings};
4584 armnn::WorkloadInfo workloadInfo;
4585 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
4586 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
4588 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(queueDescriptor, workloadInfo);
4590 inputHandle->Allocate();
4591 outputHandle->Allocate();
4593 CopyDataToITensorHandle(inputHandle.get(), inputData);
4595 workload->PostAllocationConfigure();
4596 workload->Execute();
4598 outputData.resize(outputTensorInfo.GetNumElements());
4599 CopyDataFromITensorHandle(&outputData[0], outputHandle.get());
4600 inputTensorInfo = outputTensorInfo;
4603 armnn::OriginsDescriptor CreateDescriptorForConcatenation(
4604 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4605 unsigned int concatDim)
4607 std::vector<armnn::TensorShape> shapes;
4608 shapes.reserve(inputTensorInfos.size());
4609 for (const armnn::TensorInfo& it: inputTensorInfos)
4611 shapes.push_back(it.GetShape());
4614 return armnn::CreateDescriptorForConcatenation(shapes.begin(),
4620 // Concatenation is only supported for N and C dimensions for NCHW and the inner most dimension
4621 // In case of <4 dimensions we need to make sure that the concat dimensions are at least
4622 // the 3rd slowest iterating one or the inner most dimension.
4625 bool NeedPermuteForConcat(
4626 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4627 unsigned int concatDim)
4629 // See note above. Additionally we expect the input shapes to have the
4630 // same number of dimensions.
4631 unsigned int nDimensions = 0;
4633 // Determine the number of dimensions as well as sanity check them
4634 // agains test implementation issues.
4635 for (auto && tensorInfo : inputTensorInfos)
4639 nDimensions = tensorInfo.GetShape().GetNumDimensions();
4643 BOOST_ASSERT_MSG(nDimensions == tensorInfo.GetShape().GetNumDimensions(),
4644 "Input shapes must have the same number of dimensions");
4648 return (nDimensions < 3 || (nDimensions == 3 && (nDimensions-concatDim) < 3 && (nDimensions-concatDim) != 1));
4651 armnn::TensorShape ExpandTensorShapeTo3dForPermute(const armnn::TensorShape & inputShape)
4653 unsigned int numDims = inputShape.GetNumDimensions();
4656 // Nothing to do if the inputShape has at least 3 dimensions.
4660 std::vector<unsigned int> newDims(size_t(3), 1u);
4661 unsigned int expandedBy = 3 - numDims;
4662 for (unsigned int i=0; i<numDims; ++i)
4664 newDims[expandedBy+i] = inputShape[i];
4666 return armnn::TensorShape(3u, &newDims[0]);
4669 void Generate3dPermuteVectorForConcat(
4670 unsigned int numDimensions,
4671 unsigned int & concatDim,
4672 std::pair<armnn::PermutationVector, armnn::PermutationVector> & permutations)
4674 BOOST_ASSERT_MSG(numDimensions <= 3,
4675 "Only dimensions 1,2 and 3 are supported by this helper");
4676 unsigned int expandedBy = 3 - numDimensions;
4677 unsigned int expandedConcatAxis = concatDim + expandedBy;
4679 if (expandedConcatAxis == 2)
4682 armnn::PermutationVector forwardPermutation({1, 2, 0});
4683 armnn::PermutationVector reversePermutation({2, 0, 1});
4684 permutations = std::make_pair(forwardPermutation, reversePermutation);
4686 else if (expandedConcatAxis == 1)
4689 armnn::PermutationVector forwardPermutation({2, 0, 1});
4690 armnn::PermutationVector reversePermutation({1, 2, 0});
4691 permutations = std::make_pair(forwardPermutation, reversePermutation);
4695 BOOST_ASSERT(expandedConcatAxis == 0);
4701 // Permute the input tensors so we can do a supported concatenation.
4702 // Also treat lower than 3d tensors as 3d by adding dummy 1 dimensions
4703 // at the front. Finally this function tells what the output shape
4704 // of the permuted concatenated tensor is going to be.
4706 template <typename T>
4707 void PermuteInputsForConcat(
4708 armnn::IWorkloadFactory& workloadFactory,
4709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4710 std::vector<armnn::TensorInfo> & inputTensorInfos,
4711 std::vector<T *> & inputData,
4712 std::vector<std::vector<T>> & inputDataStorage,
4713 armnn::PermutationVector & permuteVector,
4714 unsigned int & concatDim,
4715 armnn::TensorInfo & outputTensorInfo)
4717 BOOST_ASSERT_MSG(inputTensorInfos.size() > 1,
4718 "Expecting more than one tensor to be concatenated here");
4720 unsigned int numDims = 0;
4721 unsigned int nthInput = 0;
4722 const armnn::PermutationVector identity({0, 1, 2});
4724 std::pair<armnn::PermutationVector, armnn::PermutationVector> permutations =
4725 std::make_pair(identity, identity);
4727 inputDataStorage.resize(inputData.size());
4729 for (auto && tensorInfo : inputTensorInfos)
4733 numDims = tensorInfo.GetShape().GetNumDimensions();
4734 Generate3dPermuteVectorForConcat(numDims, concatDim, permutations);
4736 // Store the reverese permutation.
4737 permuteVector = permutations.second;
4738 BOOST_ASSERT_MSG(!permuteVector.IsEqual(identity),
4739 "Test logic error, we don't need permutation, so we shouldn't arrive here");
4743 BOOST_ASSERT_MSG(numDims == tensorInfo.GetShape().GetNumDimensions(),
4744 "All inputs must have the same number of dimensions");
4747 armnn::TensorInfo newTensorInfo = tensorInfo;
4748 newTensorInfo.SetShape(ExpandTensorShapeTo3dForPermute(tensorInfo.GetShape()));
4750 PermuteTensorData<T>(workloadFactory,
4754 inputData[nthInput],
4755 inputDataStorage[nthInput]);
4757 inputData[nthInput] = inputDataStorage[nthInput].data();
4758 inputTensorInfos[nthInput] = newTensorInfo;
4763 outputTensorInfo.SetShape(
4764 armnnUtils::Permuted(
4765 ExpandTensorShapeTo3dForPermute(outputTensorInfo.GetShape()),
4766 permutations.first));
4771 // This is the pair of PermuteInputsForConcat(...) which permutes back
4772 // the output of the concatenation so we can check it against an expected
4775 template <typename T>
4776 void PermuteOutputForConcat(
4777 armnn::IWorkloadFactory& workloadFactory,
4778 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4779 const armnn::TensorInfo & tensorInfo,
4780 const armnn::PermutationVector & permuteVector,
4781 std::unique_ptr<armnn::ITensorHandle> && inputDataHandle,
4784 BOOST_ASSERT_MSG(data != nullptr, "data must not be null");
4785 if (data == nullptr)
4787 // Nullptr is an error in the test. By returning without doing the permutation
4788 // I expect the caller to fail the test. It still makes sense to report this as
4789 // an assert for Debug builds.
4793 armnn::TensorInfo resultTensorInfo = tensorInfo;
4794 std::vector<T> inputData(tensorInfo.GetNumElements());
4795 std::vector<T> outputData;
4797 CopyDataFromITensorHandle(&inputData[0], inputDataHandle.get());
4799 PermuteTensorData<T>(workloadFactory,
4806 ::memcpy(data, &outputData[0], sizeof(T)*outputData.size());
4809 template <typename T>
4811 armnn::IWorkloadFactory& workloadFactory,
4812 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4813 std::initializer_list<const armnn::TensorInfo> inputTensorInfosOrig,
4814 std::initializer_list<T *> inputsOrig,
4815 const armnn::TensorInfo& outputTensorInfoOrig,
4817 unsigned int concatDim,
4820 BOOST_ASSERT_MSG(output != nullptr, "output must not be null");
4821 if (output == nullptr)
4823 // Nullptr is an error in the test. By returning without doing the permutation
4824 // I expect the caller to fail the test. It still makes sense to report this as
4825 // an assert for Debug builds.
4829 // Saves a copy of the parameters which we might need to change.
4830 std::vector<armnn::TensorInfo> inputTensorInfos(inputTensorInfosOrig.begin(), inputTensorInfosOrig.end());
4831 std::vector<T *> inputs = inputsOrig;
4832 armnn::TensorInfo outputTensorInfo = outputTensorInfoOrig;
4834 armnn::PermutationVector permuteVector{0, 1, 2};
4836 // Holds and automatically releases memory for the reshaped input data.
4837 std::vector<std::vector<T>> tmpInputDataStorage;
4839 const size_t inputCount = inputTensorInfos.size();
4841 bool needPermuteForConcat = NeedPermuteForConcat(inputTensorInfos, concatDim);
4843 if (needPermuteForConcat)
4846 // We need to permute the inputs, because concatenation along
4847 // the requested axis is not supported.
4849 PermuteInputsForConcat<T>(workloadFactory,
4853 tmpInputDataStorage,
4859 armnn::WorkloadInfo workloadInfo;
4861 std::vector<std::unique_ptr<armnn::ITensorHandle>> inputHandles;
4862 inputHandles.reserve(inputCount);
4864 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4866 armnn::ConcatQueueDescriptor queueDescriptor;
4867 armnn::OriginsDescriptor viewsDescriptor = CreateDescriptorForConcatenation(inputTensorInfos, concatDim);
4868 queueDescriptor.m_Parameters = viewsDescriptor;
4872 queueDescriptor.m_ViewOrigins.reserve(viewsDescriptor.GetNumViews());
4873 for (unsigned int i = 0; i < viewsDescriptor.GetNumViews(); ++i)
4875 queueDescriptor.m_ViewOrigins.emplace_back(std::vector<unsigned int>(viewsDescriptor.GetViewOrigin(i),
4876 viewsDescriptor.GetViewOrigin(i) + viewsDescriptor.GetNumDimensions()));
4879 outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4881 const bool subTensorsSupported = workloadFactory.SupportsSubTensors();
4882 for (unsigned int i = 0; i < inputCount; ++i)
4884 const armnn::TensorInfo& inputTensorInfo = inputTensorInfos[i];
4885 std::unique_ptr<armnn::ITensorHandle> inputHandle =
4886 subTensorsSupported ?
4887 workloadFactory.CreateSubTensorHandle(*outputHandle,
4888 inputTensorInfo.GetShape(),
4889 queueDescriptor.m_ViewOrigins[i].m_Origin.data()) :
4890 workloadFactory.CreateTensorHandle(inputTensorInfo);
4892 inputHandles.emplace_back(std::move(inputHandle));
4898 for (unsigned int i = 0; i < inputCount; ++i)
4900 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfos[i]);
4901 inputHandles.emplace_back(std::move(inputHandle));
4905 for (unsigned int i = 0; i < inputCount; ++i)
4907 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfos[i], inputHandles[i].get());
4910 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
4912 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(queueDescriptor, workloadInfo);
4914 for (auto& inputHandle : inputHandles)
4916 inputHandle->Allocate();
4919 outputHandle->Allocate();
4921 unsigned int nextInputId = 0;
4922 for (auto& inputHandle : inputHandles)
4924 CopyDataToITensorHandle(inputHandle.get(), inputs[nextInputId]);
4928 workload->PostAllocationConfigure();
4929 workload->Execute();
4931 if (needPermuteForConcat)
4933 PermuteOutputForConcat<T>(workloadFactory,
4937 std::move(outputHandle),
4942 CopyDataFromITensorHandle(output, outputHandle.get());
4946 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4947 LayerTestResult<T, 1> Concatenation1dTestImpl(
4948 armnn::IWorkloadFactory& workloadFactory,
4949 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4953 armnn::TensorInfo inputTensorInfo({ 3 }, ArmnnType, qScale, qOffset);
4955 auto input0 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 1.0f, 2.0f, 3.0f }));
4956 auto input1 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 4.0f, 5.0f, 6.0f }));
4957 auto input2 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 7.0f, 8.0f, 9.0f }));
4959 armnn::TensorInfo outputTensorInfo({ 9 }, ArmnnType, qScale, qOffset);
4961 LayerTestResult<T, 1> result(outputTensorInfo);
4963 std::vector<T> output;
4964 output.resize(outputTensorInfo.GetNumElements());
4965 Concatenate<T>(workloadFactory, memoryManager,
4966 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
4967 { input0.data(), input1.data(), input2.data() },
4973 result.output = MakeTensor<T, 1>(outputTensorInfo, output);
4974 result.outputExpected = MakeTensor<T, 1>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4975 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
4981 LayerTestResult<float, 1> Concatenation1dTest(
4982 armnn::IWorkloadFactory& workloadFactory,
4983 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4985 return Concatenation1dTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4988 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4989 LayerTestResult<T, 2> Concatenation2dTestImpl(
4990 armnn::IWorkloadFactory& workloadFactory,
4991 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4992 const armnn::TensorInfo& outputTensorInfo,
4993 unsigned int dimension,
4995 const int32_t qOffset)
4997 armnn::TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
4999 auto input0 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5004 10.0f, 11.0f, 12.0f,
5007 auto input1 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5012 13.0f, 14.0f, 15.0f,
5015 auto input2 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5020 16.0f, 17.0f, 18.0f,
5023 LayerTestResult<T, 2> result(outputTensorInfo);
5025 std::vector<T> output;
5026 output.resize(outputTensorInfo.GetNumElements());
5027 Concatenate<T>(workloadFactory, memoryManager,
5028 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5029 { input0.data(), input1.data(), input2.data() },
5035 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5039 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5040 LayerTestResult<T, 2> Concatenation2dDim0TestImpl(
5041 armnn::IWorkloadFactory& workloadFactory,
5042 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5046 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
5048 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
5049 workloadFactory, memoryManager, outputTensorInfo, 0, qScale, qOffset);
5051 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5056 10.0f, 11.0f, 12.0f,
5062 13.0f, 14.0f, 15.0f,
5068 16.0f, 17.0f, 18.0f,
5074 LayerTestResult<float, 2> Concatenation2dDim0Test(
5075 armnn::IWorkloadFactory& workloadFactory,
5076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5078 return Concatenation2dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5081 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5082 LayerTestResult<T, 2> Concatenation2dDim1TestImpl(
5083 armnn::IWorkloadFactory& workloadFactory,
5084 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5088 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
5090 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
5091 workloadFactory, memoryManager, outputTensorInfo, 1, qScale, qOffset);
5093 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5095 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
5098 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
5104 LayerTestResult<float, 2> Concatenation2dDim1Test(
5105 armnn::IWorkloadFactory& workloadFactory,
5106 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5108 return Concatenation2dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5111 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5112 LayerTestResult<T, 2> Concatenation2dDim0DiffInputDimsTestImpl(
5113 armnn::IWorkloadFactory& workloadFactory,
5114 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5118 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5119 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5124 10.0f, 11.0f, 12.0f,
5127 armnn::TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType, qScale, qOffset);
5128 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5133 13.0f, 14.0f, 15.0f,
5139 armnn::TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType, qScale, qOffset);
5140 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5142 16.0f, 17.0f, 18.0f,
5145 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
5146 LayerTestResult<T, 2> result(outputTensorInfo);
5148 std::vector<T> output;
5149 output.resize(outputTensorInfo.GetNumElements());
5150 Concatenate<T>(workloadFactory, memoryManager,
5151 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5152 { input0.data(), input1.data(), input2.data() },
5158 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5159 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5164 10.0f, 11.0f, 12.0f,
5170 13.0f, 14.0f, 15.0f,
5176 16.0f, 17.0f, 18.0f,
5182 LayerTestResult<float, 2> Concatenation2dDim0DiffInputDimsTest(
5183 armnn::IWorkloadFactory& workloadFactory,
5184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5186 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5187 workloadFactory, memoryManager, 0.0f, 0);
5190 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5191 LayerTestResult<T, 2> Concatenation2dDim1DiffInputDimsTestImpl(
5192 armnn::IWorkloadFactory& workloadFactory,
5193 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5197 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5198 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5203 10.0f, 11.0f, 12.0f,
5206 armnn::TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType, qScale, qOffset);
5207 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5209 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
5212 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
5215 armnn::TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType, qScale, qOffset);
5216 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5224 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
5225 LayerTestResult<T, 2> result(outputTensorInfo);
5227 std::vector<T> output;
5228 output.resize(outputTensorInfo.GetNumElements());
5229 Concatenate<T>(workloadFactory, memoryManager,
5230 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5231 { input0.data(), input1.data(), input2.data() },
5237 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5238 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5240 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
5243 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
5249 LayerTestResult<float, 2> Concatenation2dDim1DiffInputDimsTest(
5250 armnn::IWorkloadFactory& workloadFactory,
5251 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5253 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
5254 workloadFactory, memoryManager, 0.0f, 0);
5257 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5258 LayerTestResult<T, 3> Concatenation3dTestImpl(
5259 armnn::IWorkloadFactory& workloadFactory,
5260 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5261 const armnn::TensorInfo& outputTensorInfo,
5262 unsigned int dimension,
5267 armnn::TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5269 auto input0 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5270 // Batch 0, Channel 0
5273 // Batch 0, Channel 1
5276 // Batch 0, Channel 2
5279 // Batch 1, Channel 0
5282 // Batch 1, Channel 1
5285 // Batch 1, Channel 2
5289 auto input1 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5290 // Batch 0, Channel 0
5293 // Batch 0, Channel 1
5296 // Batch 0, Channel 2
5299 // Batch 1, Channel 0
5302 // Batch 1, Channel 1
5305 // Batch 1, Channel 2
5309 auto input2 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5310 // Batch 0, Channel 0
5313 // Batch 0, Channel 1
5316 // Batch 0, Channel 2
5319 // Batch 1, Channel 0
5322 // Batch 1, Channel 1
5325 // Batch 1, Channel 2
5329 LayerTestResult<T, 3> result(outputTensorInfo);
5331 std::vector<T> output;
5332 output.resize(outputTensorInfo.GetNumElements());
5333 Concatenate<T>(workloadFactory, memoryManager,
5334 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5335 { input0.data(), input1.data(), input2.data() },
5341 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5345 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5346 LayerTestResult<T, 3> Concatenation3dDim0TestImpl(
5347 armnn::IWorkloadFactory& workloadFactory,
5348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5352 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType, qScale, qOffset);
5354 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5355 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
5357 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5358 // Batch 0, Channel 0
5361 // Batch 0, Channel 1
5364 // Batch 0, Channel 2
5367 // Batch 1, Channel 0
5370 // Batch 1, Channel 1
5373 // Batch 1, Channel 2
5376 // Batch 2, Channel 0
5379 // Batch 2, Channel 1
5382 // Batch 2, Channel 2
5385 // Batch 3, Channel 0
5388 // Batch 3, Channel 1
5391 // Batch 3, Channel 2
5394 // Batch 4, Channel 0
5397 // Batch 4, Channel 1
5400 // Batch 4, Channel 2
5403 // Batch 5, Channel 0
5406 // Batch 5, Channel 1
5409 // Batch 5, Channel 2
5416 LayerTestResult<float, 3> Concatenation3dDim0Test(
5417 armnn::IWorkloadFactory& workloadFactory,
5418 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5420 return Concatenation3dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5423 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5424 LayerTestResult<T, 3> Concatenation3dDim1TestImpl(
5425 armnn::IWorkloadFactory& workloadFactory,
5426 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5430 armnn::TensorInfo outputTensorInfo({ 2, 9, 2 }, ArmnnType, qScale, qOffset);
5432 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5433 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
5435 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5436 // Batch 0, Channel 0
5439 // Batch 0, Channel 1
5442 // Batch 0, Channel 2
5445 // Batch 0, Channel 3
5448 // Batch 0, Channel 4
5451 // Batch 0, Channel 5
5454 // Batch 0, Channel 6
5457 // Batch 0, Channel 7
5460 // Batch 0, Channel 8
5463 // Batch 1, Channel 0
5466 // Batch 1, Channel 1
5469 // Batch 1, Channel 2
5472 // Batch 1, Channel 3
5475 // Batch 1, Channel 4
5478 // Batch 1, Channel 5
5481 // Batch 1, Channel 6
5484 // Batch 1, Channel 7
5487 // Batch 1, Channel 8
5494 LayerTestResult<float, 3> Concatenation3dDim1Test(
5495 armnn::IWorkloadFactory& workloadFactory,
5496 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5498 return Concatenation3dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5501 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5502 LayerTestResult<T, 3> Concatenation3dDim2TestImpl(
5503 armnn::IWorkloadFactory& workloadFactory,
5504 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5509 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
5511 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5512 workloadFactory, memoryManager, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
5514 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5515 // Batch 0, Channel 0
5516 1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
5518 // Batch 0, Channel 1
5519 3.0f, 4.0f, 9.0f, 10.0f, 15.0f, 16.0f,
5521 // Batch 0, Channel 2
5522 5.0f, 6.0f, 11.0f, 12.0f, 17.0f, 18.0f,
5524 // Batch 1, Channel 0
5525 19.0f, 20.0f, 25.0f, 26.0f, 31.0f, 32.0f,
5527 // Batch 1, Channel 1
5528 21.0f, 22.0f, 27.0f, 28.0f, 33.0f, 34.0f,
5530 // Batch 1, Channel 2
5531 23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
5537 LayerTestResult<float, 3> Concatenation3dDim2Test(
5538 armnn::IWorkloadFactory& workloadFactory,
5539 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5542 return Concatenation3dDim2TestImpl<armnn::DataType::Float32>(
5543 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
5546 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5547 LayerTestResult<T, 3> Concatenation3dDim0DiffInputDimsTestImpl(
5548 armnn::IWorkloadFactory& workloadFactory,
5549 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5553 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
5554 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5555 // Batch 0, Channel 0
5558 // Batch 0, Channel 1
5561 // Batch 0, Channel 2
5564 // Batch 1, Channel 0
5567 // Batch 1, Channel 1
5570 // Batch 1, Channel 2
5574 armnn::TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
5575 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5576 // Batch 0, Channel 0
5579 // Batch 0, Channel 1
5582 // Batch 0, Channel 2
5586 armnn::TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
5587 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5588 // Batch 0, Channel 0
5591 // Batch 0, Channel 1
5594 // Batch 0, Channel 2
5597 // Batch 1, Channel 0
5600 // Batch 1, Channel 1
5603 // Batch 1, Channel 2
5606 // Batch 2, Channel 0
5609 // Batch 2, Channel 1
5612 // Batch 2, Channel 2
5616 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
5617 LayerTestResult<T, 3> result(outputTensorInfo);
5619 std::vector<T> output;
5620 output.resize(outputTensorInfo.GetNumElements());
5621 Concatenate<T>(workloadFactory, memoryManager,
5622 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5623 { input0.data(), input1.data(), input2.data() },
5629 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5630 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5631 // Batch 0, Channel 0
5634 // Batch 0, Channel 1
5637 // Batch 0, Channel 2
5640 // Batch 1, Channel 0
5643 // Batch 1, Channel 1
5646 // Batch 1, Channel 2
5649 // Batch 2, Channel 0
5652 // Batch 2, Channel 1
5655 // Batch 2, Channel 2
5658 // Batch 3, Channel 0
5661 // Batch 3, Channel 1
5664 // Batch 3, Channel 2
5667 // Batch 4, Channel 0
5670 // Batch 4, Channel 1
5673 // Batch 4, Channel 2
5676 // Batch 5, Channel 0
5679 // Batch 5, Channel 1
5682 // Batch 5, Channel 2
5689 LayerTestResult<float, 3> Concatenation3dDim0DiffInputDimsTest(
5690 armnn::IWorkloadFactory& workloadFactory,
5691 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5693 return Concatenation3dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5694 workloadFactory, memoryManager, 0.0f, 0);
5697 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5698 LayerTestResult<T, 3> Concatenation3dDim1DiffInputDimsTestImpl(
5699 armnn::IWorkloadFactory& workloadFactory,
5700 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5704 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5705 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5706 // Batch 0, Channel 0
5709 // Batch 0, Channel 1
5712 // Batch 0, Channel 2
5715 // Batch 1, Channel 0
5718 // Batch 1, Channel 1
5721 // Batch 1, Channel 2
5725 armnn::TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType, qScale, qOffset);
5726 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5727 // Batch 0, Channel 0
5730 // Batch 0, Channel 1
5733 // Batch 0, Channel 2
5736 // Batch 0, Channel 3
5739 // Batch 1, Channel 0
5742 // Batch 1, Channel 1
5745 // Batch 1, Channel 2
5748 // Batch 1, Channel 3
5752 armnn::TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType, qScale, qOffset);
5753 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5754 // Batch 0, Channel 0
5757 // Batch 1, Channel 0
5761 armnn::TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType, qScale, qOffset);
5762 LayerTestResult<T, 3> result(outputTensorInfo);
5764 std::vector<T> output;
5765 output.resize(outputTensorInfo.GetNumElements());
5766 Concatenate<T>(workloadFactory, memoryManager,
5767 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5768 { input0.data(), input1.data(), input2.data() },
5774 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5775 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5776 // Batch 0, Channel 0
5779 // Batch 0, Channel 1
5782 // Batch 0, Channel 2
5785 // Batch 0, Channel 3
5788 // Batch 0, Channel 4
5791 // Batch 0, Channel 5
5794 // Batch 0, Channel 6
5797 // Batch 0, Channel 7
5800 // Batch 1, Channel 0
5803 // Batch 1, Channel 1
5806 // Batch 1, Channel 2
5809 // Batch 1, Channel 3
5812 // Batch 1, Channel 4
5815 // Batch 1, Channel 5
5818 // Batch 1, Channel 6
5821 // Batch 1, Channel 7
5828 LayerTestResult<float, 3> Concatenation3dDim1DiffInputDimsTest(
5829 armnn::IWorkloadFactory& workloadFactory,
5830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5832 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
5833 workloadFactory, memoryManager, 0.0f, 0);
5836 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5837 LayerTestResult<T, 3> Concatenation3dDim2DiffInputDimsTestImpl(
5838 armnn::IWorkloadFactory& workloadFactory,
5839 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5844 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5845 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5846 // Batch 0, Channel 0
5849 // Batch 0, Channel 1
5852 // Batch 0, Channel 2
5855 // Batch 1, Channel 0
5858 // Batch 1, Channel 1
5861 // Batch 1, Channel 2
5865 armnn::TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType, qScale, qOffset);
5866 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5867 // Batch 0, Channel 0
5870 // Batch 0, Channel 1
5873 // Batch 0, Channel 2
5876 // Batch 1, Channel 0
5879 // Batch 1, Channel 1
5882 // Batch 1, Channel 2
5886 armnn::TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType, qScale, qOffset);
5887 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5888 // Batch 0, Channel 0
5889 13.0f, 14.0f, 50.0f,
5891 // Batch 0, Channel 1
5892 15.0f, 16.0f, 51.0f,
5894 // Batch 0, Channel 2
5895 17.0f, 18.0f, 52.0f,
5897 // Batch 1, Channel 0
5898 31.0f, 32.0f, 53.0f,
5900 // Batch 1, Channel 1
5901 33.0f, 34.0f, 54.0f,
5903 // Batch 1, Channel 2
5904 35.0f, 36.0f, 55.0f,
5907 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
5908 LayerTestResult<T, 3> result(outputTensorInfo);
5910 std::vector<T> output;
5911 output.resize(outputTensorInfo.GetNumElements());
5912 Concatenate<T>(workloadFactory, memoryManager,
5913 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5914 { input0.data(), input1.data(), input2.data() },
5920 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5921 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5922 // Batch 0, Channel 0
5923 1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
5925 // Batch 0, Channel 1
5926 3.0f, 4.0f, 9.0f, 15.0f, 16.0f, 51.0f,
5928 // Batch 0, Channel 2
5929 5.0f, 6.0f, 11.0f, 17.0f, 18.0f, 52.0f,
5931 // Batch 1, Channel 0
5932 19.0f, 20.0f, 25.0f, 31.0f, 32.0f, 53.0f,
5934 // Batch 1, Channel 1
5935 21.0f, 22.0f, 27.0f, 33.0f, 34.0f, 54.0f,
5937 // Batch 1, Channel 2
5938 23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
5944 LayerTestResult<float, 3> Concatenation3dDim2DiffInputDimsTest(
5945 armnn::IWorkloadFactory& workloadFactory,
5946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5949 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::Float32>(
5950 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
5953 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5954 LayerTestResult<T, 4> Concatenation4dTestImpl(
5955 armnn::IWorkloadFactory& workloadFactory,
5956 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5957 const armnn::TensorInfo& outputTensorInfo,
5958 unsigned int dimension,
5963 armnn::TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
5965 auto input0 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5974 auto input1 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5983 auto input2 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5992 LayerTestResult<T, 4> result(outputTensorInfo);
5994 std::vector<T> output;
5995 output.resize(outputTensorInfo.GetNumElements());
5997 Concatenate<T>(workloadFactory,
5999 {inputTensorInfo, inputTensorInfo, inputTensorInfo},
6000 {input0.data(), input1.data(), input2.data()},
6006 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6010 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6011 LayerTestResult<T, 4> Concatenation4dDim0TestImpl(
6012 armnn::IWorkloadFactory& workloadFactory,
6013 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6017 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6019 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6020 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
6022 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6047 LayerTestResult<float, 4> Concatenation4dDim0Test(
6048 armnn::IWorkloadFactory& workloadFactory,
6049 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6051 return Concatenation4dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6054 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6055 LayerTestResult<T, 4> Concatenation4dDim1TestImpl(
6056 armnn::IWorkloadFactory& workloadFactory,
6057 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6061 armnn::TensorInfo outputTensorInfo({ 1, 9, 2, 2 }, ArmnnType, qScale, qOffset);
6063 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6064 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
6066 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6092 LayerTestResult<float, 4> Concatenation4dDim1Test(
6093 armnn::IWorkloadFactory& workloadFactory,
6094 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6096 return Concatenation4dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6099 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6100 LayerTestResult<T, 4> Concatenation4dDim2TestImpl(
6101 armnn::IWorkloadFactory& workloadFactory,
6102 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6106 armnn::TensorInfo outputTensorInfo({ 1, 3, 6, 2 }, ArmnnType, qScale, qOffset);
6108 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6109 workloadFactory, memoryManager, outputTensorInfo, 2, true, qScale, qOffset);
6111 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6137 LayerTestResult<float, 4> Concatenation4dDim2Test(
6138 armnn::IWorkloadFactory& workloadFactory,
6139 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6141 return Concatenation4dDim2TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6144 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6145 LayerTestResult<T, 4> Concatenation4dDim3TestImpl(
6146 armnn::IWorkloadFactory& workloadFactory,
6147 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6152 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 6 }, ArmnnType, qScale, qOffset);
6154 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
6155 workloadFactory, memoryManager, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
6157 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6183 LayerTestResult<float, 4> Concatenation4dDim3Test(
6184 armnn::IWorkloadFactory& workloadFactory,
6185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6188 return Concatenation4dDim3TestImpl<armnn::DataType::Float32>(
6189 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6192 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6193 LayerTestResult<T, 4> Concatenation4dDiffShapeDim0TestImpl(
6194 armnn::IWorkloadFactory& workloadFactory,
6195 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6199 unsigned int dimension = 0;
6200 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6202 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6211 armnn::TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6213 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6230 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6232 LayerTestResult<T, 4> result(outputTensorInfo);
6234 std::vector<T> output;
6235 output.resize(outputTensorInfo.GetNumElements());
6236 Concatenate<T>(workloadFactory,
6238 {inputTensorInfo0, inputTensorInfo1},
6239 {input0.data(), input1.data()},
6245 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6246 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6272 LayerTestResult<float, 4> Concatenation4dDiffShapeDim0Test(
6273 armnn::IWorkloadFactory& workloadFactory,
6274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6276 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::Float32>(
6277 workloadFactory, memoryManager, 0.0f, 0);
6280 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6281 LayerTestResult<T, 4> Concatenation4dDiffShapeDim1TestImpl(
6282 armnn::IWorkloadFactory& workloadFactory,
6283 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6287 unsigned int dimension = 1;
6288 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6290 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6299 armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType, qScale, qOffset);
6301 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6309 armnn::TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType, qScale, qOffset);
6311 LayerTestResult<T, 4> result(outputTensorInfo);
6313 std::vector<T> output;
6314 output.resize(outputTensorInfo.GetNumElements());
6315 Concatenate<T>(workloadFactory,
6317 {inputTensorInfo0, inputTensorInfo1},
6318 {input0.data(), input1.data()},
6324 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6325 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6341 LayerTestResult<float, 4> Concatenation4dDiffShapeDim1Test(
6342 armnn::IWorkloadFactory& workloadFactory,
6343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6345 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::Float32>(
6346 workloadFactory, memoryManager, 0.0f, 0);
6349 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6350 LayerTestResult<T, 4> Concatenation4dDiffShapeDim2TestImpl(
6351 armnn::IWorkloadFactory& workloadFactory,
6352 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6356 unsigned int dimension = 2;
6357 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6359 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6368 armnn::TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType, qScale, qOffset);
6370 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6382 armnn::TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType, qScale, qOffset);
6384 LayerTestResult<T, 4> result(outputTensorInfo);
6386 std::vector<T> output;
6387 output.resize(outputTensorInfo.GetNumElements());
6388 Concatenate<T>(workloadFactory,
6390 {inputTensorInfo0, inputTensorInfo1},
6391 {input0.data(), input1.data()},
6397 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6398 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6421 LayerTestResult<float, 4> Concatenation4dDiffShapeDim2Test(
6422 armnn::IWorkloadFactory& workloadFactory,
6423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6425 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::Float32>(
6426 workloadFactory, memoryManager, 0.0f, 0);
6429 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6430 LayerTestResult<T, 4> Concatenation4dDiffShapeDim3TestImpl(
6431 armnn::IWorkloadFactory& workloadFactory,
6432 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6437 unsigned int dimension = 3;
6438 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6440 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6449 armnn::TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType, qScale, qOffset);
6451 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6452 11.0f, 12.0f, 13.0f,
6453 14.0f, 15.0f, 16.0f,
6455 17.0f, 18.0f, 19.0f,
6456 20.0f, 21.0f, 22.0f,
6458 23.0f, 24.0f, 25.0f,
6462 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType, qScale, qOffset);
6464 LayerTestResult<T, 4> result(outputTensorInfo);
6466 std::vector<T> output;
6467 output.resize(outputTensorInfo.GetNumElements());
6468 Concatenate<T>(workloadFactory,
6470 {inputTensorInfo0, inputTensorInfo1},
6471 {input0.data(), input1.data()},
6477 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6478 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6479 1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
6480 3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
6481 5.0f, 6.0f, 17.0f, 18.0f, 19.0f,
6482 7.0f, 8.0f, 20.0f, 21.0f, 22.0f,
6483 9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
6484 11.0f, 12.0f, 26.0f, 27.0f, 28.0f
6490 LayerTestResult<float, 4> Concatenation4dDiffShapeDim3Test(
6491 armnn::IWorkloadFactory& workloadFactory,
6492 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6495 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::Float32>(
6496 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6499 LayerTestResult<float, 2> FakeQuantizationTest(
6500 armnn::IWorkloadFactory& workloadFactory,
6501 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6503 constexpr unsigned int width = 2;
6504 constexpr unsigned int height = 3;
6506 const armnn::TensorInfo tensorInfo({height, width },
6507 armnn::DataType::Float32);
6508 auto input = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6514 LayerTestResult<float, 2> ret(tensorInfo);
6516 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6518 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6520 armnn::FakeQuantizationQueueDescriptor data;
6521 armnn::WorkloadInfo info;
6523 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
6524 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
6528 data.m_Parameters.m_Min = min;
6529 data.m_Parameters.m_Max = max;
6531 armnn::PassthroughCpuTensorHandle refHandle(tensorInfo, &ret.outputExpected[0][0]);
6532 armnn::FakeQuantizationQueueDescriptor refData = data;
6533 armnn::WorkloadInfo refInfo = info;
6534 SetWorkloadOutput(refData, refInfo, 0, tensorInfo, &refHandle);
6536 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateFakeQuantization(data, info);
6538 inputHandle->Allocate();
6539 outputHandle->Allocate();
6541 CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
6543 workload->PostAllocationConfigure();
6544 workload->Execute();
6546 CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
6548 ret.outputExpected = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6558 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6559 LayerTestResult<T, 4> L2NormalizationTestImpl(
6560 armnn::IWorkloadFactory& workloadFactory,
6561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6562 const armnn::TensorShape& inputOutputTensorShape,
6565 const std::vector<float>& inputValues,
6568 const std::vector<float>& expectedOutputValues,
6569 const armnn::DataLayout layout,
6570 float epsilon = 1e-12f)
6572 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, ArmnnType, scale, offset);
6573 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, ArmnnType, outScale, outOffset);
6575 // at this point if we require it permute the input data
6576 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
6577 std::vector<float> inputData = inputValues;
6578 if (layout == armnn::DataLayout::NHWC)
6580 std::vector<float> tmp(inputData.size());
6581 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
6585 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
6586 inputTensorInfo.GetQuantizationScale(),
6587 inputTensorInfo.GetQuantizationOffset(),
6590 std::vector<float> expectedOutputData = expectedOutputValues;
6591 if (layout == armnn::DataLayout::NHWC)
6593 std::vector<float> tmp(expectedOutputData.size());
6594 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, expectedOutputData.data(), tmp.data(),
6596 expectedOutputData = tmp;
6599 LayerTestResult<T, 4> result(outputTensorInfo);
6600 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
6601 outputTensorInfo.GetQuantizationScale(),
6602 outputTensorInfo.GetQuantizationOffset(),
6603 expectedOutputData));
6605 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6606 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6608 armnn::L2NormalizationQueueDescriptor descriptor;
6609 descriptor.m_Parameters.m_Eps = epsilon;
6610 descriptor.m_Parameters.m_DataLayout = layout;
6611 armnn::WorkloadInfo info;
6613 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6614 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6616 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
6618 inputHandle->Allocate();
6619 outputHandle->Allocate();
6621 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
6623 workload->PostAllocationConfigure();
6624 ExecuteWorkload(*workload, memoryManager);
6626 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6631 float CalcInvL2Norm(std::initializer_list<float> elements)
6633 const float reduction = std::accumulate(elements.begin(), elements.end(), 0.0f,
6634 [](float acc, float element) { return acc + element * element; });
6635 return 1.0f / sqrtf(reduction);
6638 } // anonymous namespace
6640 template<armnn::DataType ArmnnType, typename T>
6641 LayerTestResult<T, 2> Pad2dTestCommon(
6642 armnn::IWorkloadFactory& workloadFactory,
6643 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6646 const float customPaddingValue)
6648 const armnn::TensorShape inputShape{ 3, 3 };
6649 const armnn::TensorShape outputShape{ 7, 7 };
6651 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6652 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6654 std::vector<T> inputValues(
6655 QuantizedVector<T>(qScale, qOffset,
6657 // Height (3) x Width (3)
6663 auto p = customPaddingValue;
6664 std::vector<T> expectedOutputValues;
6665 expectedOutputValues = (
6666 QuantizedVector<T>(qScale, qOffset,
6668 p, p, p, p, p, p, p,
6669 p, p, p, p, p, p, p,
6670 p, p, 4, 8, 6, p, p,
6671 p, p, 7, 4, 4, p, p,
6672 p, p, 3, 2, 4, p, p,
6673 p, p, p, p, p, p, p,
6677 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
6679 LayerTestResult<T, 2> result(outputTensorInfo);
6680 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6682 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6683 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6685 armnn::PadQueueDescriptor descriptor;
6687 std::vector<std::pair<unsigned int, unsigned int>> padList;
6688 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6689 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6691 descriptor.m_Parameters.m_PadList = padList;
6692 descriptor.m_Parameters.m_PadValue = customPaddingValue;
6693 armnn::WorkloadInfo info;
6695 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6696 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6698 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6700 inputHandle->Allocate();
6701 outputHandle->Allocate();
6703 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
6705 workload->PostAllocationConfigure();
6706 workload->Execute();
6708 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
6713 template<armnn::DataType ArmnnType, typename T>
6714 LayerTestResult<T, 3> Pad3dTestCommon(
6715 armnn::IWorkloadFactory& workloadFactory,
6716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6720 const armnn::TensorShape inputShape{ 2, 2, 2 };
6721 const armnn::TensorShape outputShape{ 3, 5, 6 };
6723 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6724 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6726 std::vector<T> inputValues(
6727 QuantizedVector<T>(qScale,qOffset,
6729 // Channel 0, Height (2) x Width (2)
6733 // Channel 1, Height (2) x Width (2)
6738 std::vector<T> expectedOutputValues(
6739 QuantizedVector<T>(qScale,qOffset,
6762 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(inputValues));
6764 LayerTestResult<T, 3> result(outputTensorInfo);
6765 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6767 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6768 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6770 armnn::PadQueueDescriptor descriptor;
6772 std::vector<std::pair<unsigned int, unsigned int>> PadList;
6773 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
6774 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
6775 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6777 descriptor.m_Parameters.m_PadList = PadList;
6778 armnn::WorkloadInfo info;
6780 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6781 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6783 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6785 inputHandle->Allocate();
6786 outputHandle->Allocate();
6788 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
6790 workload->PostAllocationConfigure();
6791 workload->Execute();
6793 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
6798 template<armnn::DataType ArmnnType, typename T>
6799 LayerTestResult<T, 4> Pad4dTestCommon(
6800 armnn::IWorkloadFactory& workloadFactory,
6801 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6805 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
6806 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
6808 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6809 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6811 std::vector<T> inputValues(
6812 QuantizedVector<T>(qScale,qOffset,
6814 // Batch 0, Channel 0, Height (3) x Width (2)
6819 // Batch 0, Channel 1, Height (3) x Width (2)
6824 // Batch 1, Channel 0, Height (3) x Width (2)
6829 // Batch 1, Channel 1, Height (3) x Width (2)
6835 std::vector<T> expectedOutputValues(
6836 QuantizedVector<T>(qScale,qOffset,
6999 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(inputValues));
7001 LayerTestResult<T, 4> result(outputTensorInfo);
7002 result.outputExpected = MakeTensor<T, 4>(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>(1,1));
7011 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
7012 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
7013 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
7015 descriptor.m_Parameters.m_PadList = PadList;
7016 armnn::WorkloadInfo info;
7018 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7019 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7021 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
7023 inputHandle->Allocate();
7024 outputHandle->Allocate();
7026 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
7028 workload->PostAllocationConfigure();
7029 workload->Execute();
7031 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7036 LayerTestResult<uint8_t, 2> PadUint82dTest(
7037 armnn::IWorkloadFactory& workloadFactory,
7038 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7040 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7043 LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
7044 armnn::IWorkloadFactory& workloadFactory,
7045 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7047 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0, 1.0f);
7050 LayerTestResult<uint8_t, 3> PadUint83dTest(
7051 armnn::IWorkloadFactory& workloadFactory,
7052 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7054 return Pad3dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7057 LayerTestResult<uint8_t, 4> PadUint84dTest(
7058 armnn::IWorkloadFactory& workloadFactory,
7059 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7061 return Pad4dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7065 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 2>
7066 Pad2dTestCommon<armnn::DataType::QuantisedSymm16>(
7067 armnn::IWorkloadFactory& workloadFactory,
7068 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7071 const float customPaddingValue);
7073 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 3>
7074 Pad3dTestCommon<armnn::DataType::QuantisedSymm16>(
7075 armnn::IWorkloadFactory& workloadFactory,
7076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7080 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
7081 Pad4dTestCommon<armnn::DataType::QuantisedSymm16>(
7082 armnn::IWorkloadFactory& workloadFactory,
7083 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7087 LayerTestResult<float, 2> PadFloat322dTest(
7088 armnn::IWorkloadFactory& workloadFactory,
7089 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7091 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7094 LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
7095 armnn::IWorkloadFactory& workloadFactory,
7096 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7098 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0, 1.0f);
7101 LayerTestResult<float, 3> PadFloat323dTest(
7102 armnn::IWorkloadFactory& workloadFactory,
7103 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7105 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7108 LayerTestResult<float, 4> PadFloat324dTest(
7109 armnn::IWorkloadFactory& workloadFactory,
7110 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7112 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7115 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7116 LayerTestResult<T, 4> L2NormalizationEpsilonTestCommon(
7117 armnn::IWorkloadFactory& workloadFactory,
7118 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7123 const armnn::DataLayout layout,
7130 unsigned int numberOfBatches = 1;
7131 unsigned int numberOfChannels = 3;
7132 unsigned int height = 1;
7133 unsigned int width = 1;
7135 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7136 numberOfBatches, numberOfChannels, height, width, layout);
7138 // 0.0000001^2 + 0.00000002^2 + 0.00000003^2 < 1e-12
7139 std::vector<float> inputValues
7141 // Batch 0, Channel 0, Height (1) x Width (1)
7144 // Batch 0, Channel 1, Height (1) x Width (1)
7147 // Batch 0, Channel 2, Height (1) x Width (1)
7151 const float approxInvL2Norm = 1.f / sqrtf(epsilon);
7152 std::vector<float> expectedOutputValues
7154 // Batch 0, Channel 0, Height (1) x Width (1)
7155 0.00000001f * approxInvL2Norm,
7156 0.00000002f * approxInvL2Norm,
7157 0.00000003f * approxInvL2Norm,
7160 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7161 inputValues, outScale, outOffset, expectedOutputValues, layout,
7166 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7167 LayerTestResult<T, 4> L2Normalization1dTestCommon(
7168 armnn::IWorkloadFactory& workloadFactory,
7169 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7174 const armnn::DataLayout layout)
7180 unsigned int numberOfBatches = 1;
7181 unsigned int numberOfChannels = 10;
7182 unsigned int height = 1;
7183 unsigned int width = 1;
7186 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7187 numberOfBatches, numberOfChannels, height, width, layout);
7188 std::vector<float> inputValues
7190 // Batch 0, Channel 0, Height (1) x Width (1)
7193 // Batch 0, Channel 1, Height (1) x Width (1)
7196 // Batch 0, Channel 2, Height (1) x Width (1)
7199 // Batch 0, Channel 3, Height (1) x Width (1)
7202 // Batch 0, Channel 4, Height (1) x Width (1)
7205 // Batch 0, Channel 5, Height (1) x Width (1)
7208 // Batch 0, Channel 6, Height (1) x Width (1)
7211 // Batch 0, Channel 7, Height (1) x Width (1)
7214 // Batch 0, Channel 8, Height (1) x Width (1)
7217 // Batch 0, Channel 9, Height (1) x Width (1)
7220 const float approxInvL2Norm = 0.050964719f;
7221 std::vector<float> expectedOutputValues
7223 // Batch 0, Channel 0, Height (1) x Width (1)
7224 1.0f * approxInvL2Norm,
7225 2.0f * approxInvL2Norm,
7226 3.0f * approxInvL2Norm,
7227 4.0f * approxInvL2Norm,
7228 5.0f * approxInvL2Norm,
7229 6.0f * approxInvL2Norm,
7230 7.0f * approxInvL2Norm,
7231 8.0f * approxInvL2Norm,
7232 9.0f * approxInvL2Norm,
7233 10.0f * approxInvL2Norm
7237 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7238 inputValues, outScale, outOffset, expectedOutputValues, layout);
7241 LayerTestResult<float, 4> L2NormalizationDefaultEpsilonTest(
7242 armnn::IWorkloadFactory& workloadFactory,
7243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7244 const armnn::DataLayout layout)
7246 // Dummy descriptor to get the default value of epsilon.
7247 armnn::L2NormalizationDescriptor descriptor;
7249 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7250 layout, descriptor.m_Eps);
7253 LayerTestResult<float, 4> L2NormalizationNonDefaultEpsilonTest(
7254 armnn::IWorkloadFactory& workloadFactory,
7255 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7256 const armnn::DataLayout layout)
7258 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7262 LayerTestResult<float, 4> L2Normalization1dTest(
7263 armnn::IWorkloadFactory& workloadFactory,
7264 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7265 const armnn::DataLayout layout)
7267 return L2Normalization1dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,layout);
7270 LayerTestResult<int16_t, 4> L2Normalization1dInt16Test(
7271 armnn::IWorkloadFactory& workloadFactory,
7272 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7273 const armnn::DataLayout layout)
7275 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7279 LayerTestResult<uint8_t, 4> L2Normalization1dUint8Test(
7280 armnn::IWorkloadFactory& workloadFactory,
7281 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7282 const armnn::DataLayout layout)
7284 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7285 1.f/128, 128, layout);
7288 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7289 LayerTestResult<T, 4> L2Normalization2dTestCommon(
7290 armnn::IWorkloadFactory& workloadFactory,
7291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7296 const armnn::DataLayout layout)
7302 unsigned int numberOfBatches = 1;
7303 unsigned int numberOfChannels = 2;
7304 unsigned int height = 1;
7305 unsigned int width = 5;
7307 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7308 numberOfBatches, numberOfChannels, height, width, layout);
7309 std::vector<float> inputValues
7311 // Batch 0, Channel 0, Height (1) x Width (5)
7312 1.0f, 3.0f, 5.0f, 7.0f, 9.0f,
7314 // Batch 0, Channel 1, Height (1) x Width (5)
7315 2.0f, 4.0f, 6.0f, 8.0f, 10.0f
7317 std::vector<float> expectedOutputValues
7319 // Batch 0, Channel 0, Height (1) x Width (5)
7320 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7321 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7322 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7323 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7324 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
7326 // Batch 0, Channel 1, Height (1) x Width (5)
7327 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7328 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7329 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7330 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7331 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
7334 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7335 inputValues, outScale, outOffset, expectedOutputValues, layout);
7338 LayerTestResult<float, 4> L2Normalization2dTest(
7339 armnn::IWorkloadFactory& workloadFactory,
7340 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7341 const armnn::DataLayout layout)
7343 return L2Normalization2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7347 LayerTestResult<int16_t, 4> L2Normalization2dInt16Test(
7348 armnn::IWorkloadFactory& workloadFactory,
7349 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7350 const armnn::DataLayout layout)
7352 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7356 LayerTestResult<uint8_t, 4> L2Normalization2dUint8Test(
7357 armnn::IWorkloadFactory& workloadFactory,
7358 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7359 const armnn::DataLayout layout)
7361 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7362 1.f/128, 128, layout);
7365 LayerTestResult<float, 2> L2Normalization2dShapeTest(
7366 armnn::IWorkloadFactory& workloadFactory,
7367 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7369 const armnn::DataLayout layout = armnn::DataLayout::NHWC;
7370 const armnn::TensorShape inputOutputTensorShape = armnn::TensorShape({ 5, 2 });
7372 std::vector<float> inputData
7374 1.f, 2.f, 3.f, 4.f, 5.f, 6.f, 7.f, 8.f, 9.f, 10.f
7376 std::vector<float> expectedOutputData
7378 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7379 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7380 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7381 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7382 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7383 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7384 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7385 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7386 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
7387 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
7390 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32, 0.f, 0);
7391 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32, 0.f, 0);
7393 auto inputTensor = MakeTensor<float, 2>(inputTensorInfo, QuantizedVector<float>(
7394 inputTensorInfo.GetQuantizationScale(),
7395 inputTensorInfo.GetQuantizationOffset(),
7398 LayerTestResult<float, 2> result(outputTensorInfo);
7399 result.outputExpected = MakeTensor<float, 2>(outputTensorInfo, QuantizedVector<float>(
7400 outputTensorInfo.GetQuantizationScale(),
7401 outputTensorInfo.GetQuantizationOffset(),
7402 expectedOutputData));
7404 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7405 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7407 armnn::L2NormalizationQueueDescriptor descriptor;
7408 descriptor.m_Parameters.m_Eps = 1e-12f;
7409 descriptor.m_Parameters.m_DataLayout = layout;
7410 armnn::WorkloadInfo info;
7412 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7413 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7415 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
7417 inputHandle->Allocate();
7418 outputHandle->Allocate();
7420 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
7422 workload->PostAllocationConfigure();
7423 ExecuteWorkload(*workload, memoryManager);
7425 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
7430 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7431 LayerTestResult<T, 4> L2Normalization3dTestCommon(
7432 armnn::IWorkloadFactory& workloadFactory,
7433 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7438 const armnn::DataLayout layout)
7444 unsigned int numberOfBatches = 1;
7445 unsigned int numberOfChannels = 2;
7446 unsigned int height = 4;
7447 unsigned int width = 3;
7449 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7450 numberOfBatches, numberOfChannels, height, width, layout);
7451 std::vector<float> inputValues
7453 // Batch 0, Channel 0, Height (4) x Width (3)
7454 119.0f, 21.0f, 150.0f,
7455 149.0f, 32.0f, 179.0f,
7456 15.0f, 227.0f, 141.0f,
7457 147.0f, 199.0f, 220.0f,
7459 // Batch 0, Channel 1, Height (4) x Width (3)
7460 110.0f, 140.0f, 73.0f,
7461 211.0f, 212.0f, 89.0f,
7462 24.0f, 138.0f, 188.0f,
7463 162.0f, 12.0f, 161.0f
7465 std::vector<float> expectedOutputValues
7467 // Batch 0, Channel 0, Height (4) x Width (3)
7468 119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7469 21.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7470 150.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7471 149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7472 32.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7473 179.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7474 15.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7475 227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7476 141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7477 147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7478 199.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7479 220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
7481 // Batch 0, Channel 1, Height (4) x Width (3)
7482 110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7483 140.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7484 73.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7485 211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7486 212.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7487 89.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7488 24.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7489 138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7490 188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7491 162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7492 12.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7493 161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
7496 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7497 inputValues, outScale, outOffset, expectedOutputValues, layout);
7500 LayerTestResult<float, 4> L2Normalization3dTest(
7501 armnn::IWorkloadFactory& workloadFactory,
7502 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7503 const armnn::DataLayout layout)
7505 return L2Normalization3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7509 LayerTestResult<int16_t, 4> L2Normalization3dInt16Test(
7510 armnn::IWorkloadFactory& workloadFactory,
7511 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7512 const armnn::DataLayout layout)
7514 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7518 LayerTestResult<uint8_t, 4> L2Normalization3dUint8Test(
7519 armnn::IWorkloadFactory& workloadFactory,
7520 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7521 const armnn::DataLayout layout)
7523 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7524 1.f/128, 128, layout);
7527 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7528 LayerTestResult<T, 4> L2Normalization4dTestCommon(
7529 armnn::IWorkloadFactory& workloadFactory,
7530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7535 const armnn::DataLayout layout)
7541 unsigned int numberOfBatches = 2;
7542 unsigned int numberOfChannels = 3;
7543 unsigned int height = 4;
7544 unsigned int width = 3;
7546 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7547 numberOfBatches, numberOfChannels, height, width, layout);
7548 std::vector<float> inputValues
7550 // Batch 0, Channel 0, Height (4) x Width (3)
7551 235.0f, 46.0f, 178.0f,
7552 100.0f, 123.0f, 19.0f,
7553 172.0f, 74.0f, 250.0f,
7554 6.0f, 195.0f, 80.0f,
7556 // Batch 0, Channel 1, Height (4) x Width (3)
7557 113.0f, 95.0f, 202.0f,
7558 77.0f, 114.0f, 71.0f,
7559 122.0f, 246.0f, 166.0f,
7560 82.0f, 28.0f, 37.0f,
7562 // Batch 0, Channel 2, Height (4) x Width (3)
7563 56.0f, 170.0f, 162.0f,
7564 194.0f, 89.0f, 254.0f,
7565 12.0f, 209.0f, 200.0f,
7568 // Batch 1, Channel 0, Height (4) x Width (3)
7569 67.0f, 90.0f, 49.0f,
7570 7.0f, 163.0f, 18.0f,
7571 25.0f, 117.0f, 103.0f,
7572 247.0f, 59.0f, 189.0f,
7574 // Batch 1, Channel 1, Height (4) x Width (3)
7575 239.0f, 104.0f, 199.0f,
7576 17.0f, 124.0f, 153.0f,
7577 222.0f, 217.0f, 75.0f,
7578 32.0f, 126.0f, 21.0f,
7580 // Batch 1, Channel 2, Height (4) x Width (3)
7581 97.0f, 145.0f, 215.0f,
7582 115.0f, 116.0f, 238.0f,
7583 226.0f, 16.0f, 132.0f,
7584 92.0f, 125.0f, 88.0f
7586 std::vector<float> expectedOutputValues
7588 // Batch 0, Channel 0, Height (4) x Width (3)
7589 235.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7590 46.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7591 178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7592 100.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7593 123.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7594 19.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7595 172.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7596 74.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7597 250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7598 6.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7599 195.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7600 80.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7602 // Batch 0, Channel 1, Height (4) x Width (3)
7603 113.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7604 95.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7605 202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7606 77.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7607 114.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7608 71.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7609 122.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7610 246.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7611 166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7612 82.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7613 28.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7614 37.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7616 // Batch 0, Channel 2, Height (4) x Width (3)
7617 56.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7618 170.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7619 162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7620 194.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7621 89.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7622 254.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7623 12.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7624 209.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7625 200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7626 1.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7627 64.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7628 54.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7630 // Batch 1, Channel 0, Height (4) x Width (3)
7631 67.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7632 90.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7633 49.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7634 7.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7635 163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7636 18.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7637 25.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7638 117.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7639 103.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7640 247.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7641 59.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7642 189.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7644 // Batch 1, Channel 1, Height (4) x Width (3)
7645 239.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7646 104.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7647 199.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7648 17.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7649 124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7650 153.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7651 222.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7652 217.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7653 75.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7654 32.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7655 126.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7656 21.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7658 // Batch 1, Channel 2, Height (4) x Width (3)
7659 97.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7660 145.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7661 215.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7662 115.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7663 116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7664 238.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7665 226.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7666 16.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7667 132.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7668 92.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7669 125.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7670 88.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f })
7673 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7674 inputValues, outScale, outOffset, expectedOutputValues, layout);
7677 LayerTestResult<float, 4> L2Normalization4dTest(
7678 armnn::IWorkloadFactory& workloadFactory,
7679 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7680 const armnn::DataLayout layout)
7682 return L2Normalization4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7686 LayerTestResult<int16_t, 4> L2Normalization4dInt16Test(
7687 armnn::IWorkloadFactory& workloadFactory,
7688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7689 const armnn::DataLayout layout)
7691 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7695 LayerTestResult<uint8_t, 4> L2Normalization4dUint8Test(
7696 armnn::IWorkloadFactory& workloadFactory,
7697 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7698 const armnn::DataLayout layout)
7700 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7701 1.f/128, 128, layout);
7704 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7705 LayerTestResult<T, 4> ConstantTestImpl(
7706 armnn::IWorkloadFactory& workloadFactory,
7707 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7711 constexpr unsigned int inputWidth = 3;
7712 constexpr unsigned int inputHeight = 4;
7713 constexpr unsigned int inputChannels = 3;
7714 constexpr unsigned int inputBatchSize = 2;
7716 constexpr unsigned int outputWidth = inputWidth;
7717 constexpr unsigned int outputHeight = inputHeight;
7718 constexpr unsigned int outputChannels = inputChannels;
7719 constexpr unsigned int outputBatchSize = inputBatchSize;
7721 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7722 ArmnnType, qScale, qOffset);
7724 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7725 ArmnnType, qScale, qOffset);
7727 // Set quantization parameters if the requested type is a quantized type.
7728 if(armnn::IsQuantizedType<T>())
7730 inputTensorInfo.SetQuantizationScale(qScale);
7731 inputTensorInfo.SetQuantizationOffset(qOffset);
7732 outputTensorInfo.SetQuantizationScale(qScale);
7733 outputTensorInfo.SetQuantizationOffset(qOffset);
7736 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
7737 QuantizedVector<T>(qScale, qOffset, {
7738 // Batch 0, Channel 0
7739 235.0f, 46.0f, 178.0f,
7740 100.0f, 123.0f, 19.0f,
7741 172.0f, 74.0f, 250.0f,
7742 6.0f, 195.0f, 80.0f,
7744 // Batch 0, Channel 1
7745 113.0f, 95.0f, 202.0f,
7746 77.0f, 114.0f, 71.0f,
7747 122.0f, 246.0f, 166.0f,
7748 82.0f, 28.0f, 37.0f,
7750 // Batch 0, Channel 2
7751 56.0f, 170.0f, 162.0f,
7752 194.0f, 89.0f, 254.0f,
7753 12.0f, 209.0f, 200.0f,
7756 // Batch 1, Channel 0
7757 67.0f, 90.0f, 49.0f,
7758 7.0f, 163.0f, 18.0f,
7759 25.0f, 117.0f, 103.0f,
7760 247.0f, 59.0f, 189.0f,
7762 // Batch 1, Channel 1
7763 239.0f, 104.0f, 199.0f,
7764 17.0f, 124.0f, 153.0f,
7765 222.0f, 217.0f, 75.0f,
7766 32.0f, 126.0f, 21.0f,
7768 // Batch 1, Channel 2
7769 97.0f, 145.0f, 215.0f,
7770 115.0f, 116.0f, 238.0f,
7771 226.0f, 16.0f, 132.0f,
7772 92.0f, 125.0f, 88.0f,
7775 LayerTestResult<T, 4> result(outputTensorInfo);
7776 result.outputExpected = input;
7778 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7780 armnn::ScopedCpuTensorHandle constantTensor(inputTensorInfo);
7781 AllocateAndCopyDataToITensorHandle(&constantTensor, &input[0][0][0][0]);
7783 armnn::ConstantQueueDescriptor descriptor;
7784 descriptor.m_LayerOutput = &constantTensor;
7786 armnn::WorkloadInfo info;
7787 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7789 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConstant(descriptor, info);
7791 outputHandle->Allocate();
7793 workload->PostAllocationConfigure();
7794 workload->Execute();
7796 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7800 LayerTestResult<float, 4> ConstantTest(
7801 armnn::IWorkloadFactory& workloadFactory,
7802 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7804 return ConstantTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7807 LayerTestResult<int16_t, 4> ConstantInt16SimpleQuantizationScaleNoOffsetTest(
7808 armnn::IWorkloadFactory& workloadFactory,
7809 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7811 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
7814 LayerTestResult<uint8_t, 4> ConstantUint8SimpleQuantizationScaleNoOffsetTest(
7815 armnn::IWorkloadFactory& workloadFactory,
7816 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7818 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7821 LayerTestResult<uint8_t, 3> ConcatUint8DifferentQParamsTest(
7822 armnn::IWorkloadFactory& workloadFactory,
7823 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7825 unsigned int outputWidth = 3;
7826 unsigned int outputHeight = 6;
7827 unsigned int outputChannels = 3;
7829 unsigned int inputWidth1 = 3;
7830 unsigned int inputHeight1 = 6;
7831 unsigned int inputChannels1 = 2;
7833 unsigned int inputWidth2 = 3;
7834 unsigned int inputHeight2 = 6;
7835 unsigned int inputChannels2 = 1;
7837 // Defines the tensor descriptors.
7838 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
7839 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
7840 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
7842 // Quantized input1 tensor. Range [-3, 1]
7843 const float inputScale1 = 0.015686f;
7844 const int32_t inputOffset1 = 192;
7846 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
7864 // Quatized input2 tensor. Range [-1, 4]
7865 const float inputScale2 = 0.019608f;
7866 const int32_t inputOffset2 = 50;
7868 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
7879 // Output has the same quantization parameters than input1,
7880 // so that only the requantization of input2 is required
7881 const float outputScale = 0.015686f;
7882 const int32_t outputOffset = 192;
7884 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
7886 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
7911 outputTensorInfo.SetQuantizationScale(outputScale);
7912 outputTensorInfo.SetQuantizationOffset(outputOffset);
7913 inputTensorInfo1.SetQuantizationScale(inputScale1);
7914 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
7915 inputTensorInfo2.SetQuantizationScale(inputScale2);
7916 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
7918 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
7919 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
7921 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
7922 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
7924 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7926 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
7928 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
7929 subTensorsSupported ?
7930 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
7931 workloadFactory.CreateTensorHandle(inputTensorInfo1);
7933 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
7934 subTensorsSupported ?
7935 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
7936 workloadFactory.CreateTensorHandle(inputTensorInfo2);
7938 armnn::ConcatQueueDescriptor data;
7939 armnn::WorkloadInfo info;
7940 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
7941 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
7942 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
7944 data.m_ViewOrigins.push_back(window1);
7945 data.m_ViewOrigins.push_back(window2);
7947 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
7949 inputHandle1->Allocate();
7950 inputHandle2->Allocate();
7951 outputHandle->Allocate();
7953 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
7954 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
7956 workload->PostAllocationConfigure();
7957 workload->Execute();
7959 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
7964 LayerTestResult<uint8_t, 3> ConcatUint8Test(
7965 armnn::IWorkloadFactory& workloadFactory,
7966 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7968 unsigned int outputWidth = 3;
7969 unsigned int outputHeight = 6;
7970 unsigned int outputChannels = 3;
7972 unsigned int inputWidth1 = 3;
7973 unsigned int inputHeight1 = 6;
7974 unsigned int inputChannels1 = 2;
7976 unsigned int inputWidth2 = 3;
7977 unsigned int inputHeight2 = 6;
7978 unsigned int inputChannels2 = 1;
7980 // Defines the tensor descriptors.
7981 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
7982 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
7983 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
7985 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
7986 const float scale = 0.13497836f;
7987 const int32_t offset = -7;
7989 outputTensorInfo.SetQuantizationScale(scale);
7990 outputTensorInfo.SetQuantizationOffset(offset);
7991 inputTensorInfo1.SetQuantizationScale(scale);
7992 inputTensorInfo1.SetQuantizationOffset(offset);
7993 inputTensorInfo2.SetQuantizationScale(scale);
7994 inputTensorInfo2.SetQuantizationOffset(offset);
7996 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
7998 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
8023 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
8041 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
8052 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
8053 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
8055 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
8056 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
8059 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8061 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
8063 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
8064 subTensorsSupported ?
8065 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
8066 workloadFactory.CreateTensorHandle(inputTensorInfo1);
8068 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
8069 subTensorsSupported ?
8070 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
8071 workloadFactory.CreateTensorHandle(inputTensorInfo2);
8074 armnn::ConcatQueueDescriptor data;
8075 armnn::WorkloadInfo info;
8076 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8077 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
8078 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8080 data.m_ViewOrigins.push_back(window1);
8081 data.m_ViewOrigins.push_back(window2);
8083 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
8085 inputHandle1->Allocate();
8086 inputHandle2->Allocate();
8087 outputHandle->Allocate();
8089 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
8090 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
8092 workload->PostAllocationConfigure();
8093 workload->Execute();
8095 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
8100 LayerTestResult<uint16_t, 3> ConcatUint16Test(
8101 armnn::IWorkloadFactory& workloadFactory,
8102 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8104 unsigned int outputWidth = 3;
8105 unsigned int outputHeight = 6;
8106 unsigned int outputChannels = 3;
8108 unsigned int inputWidth1 = 3;
8109 unsigned int inputHeight1 = 6;
8110 unsigned int inputChannels1 = 2;
8112 unsigned int inputWidth2 = 3;
8113 unsigned int inputHeight2 = 6;
8114 unsigned int inputChannels2 = 1;
8116 // Defines the tensor descriptors.
8117 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedSymm16);
8118 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedSymm16);
8119 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedSymm16);
8121 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
8122 const float scale = 0.13497836f;
8123 const int32_t offset = -7;
8125 outputTensorInfo.SetQuantizationScale(scale);
8126 outputTensorInfo.SetQuantizationOffset(offset);
8127 inputTensorInfo1.SetQuantizationScale(scale);
8128 inputTensorInfo1.SetQuantizationOffset(offset);
8129 inputTensorInfo2.SetQuantizationScale(scale);
8130 inputTensorInfo2.SetQuantizationOffset(offset);
8132 LayerTestResult<uint16_t, 3> ret(outputTensorInfo);
8134 ret.outputExpected = MakeTensor<uint16_t, 3>(outputTensorInfo, std::vector<uint16_t>(
8158 auto input1 = MakeTensor<uint16_t, 3>(inputTensorInfo1, std::vector<uint16_t>(
8175 auto input2 = MakeTensor<uint16_t, 3>(inputTensorInfo2, std::vector<uint16_t>(
8185 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
8186 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
8188 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
8189 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
8192 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8194 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
8196 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
8197 subTensorsSupported ?
8198 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
8199 workloadFactory.CreateTensorHandle(inputTensorInfo1);
8201 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
8202 subTensorsSupported ?
8203 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
8204 workloadFactory.CreateTensorHandle(inputTensorInfo2);
8207 armnn::ConcatQueueDescriptor data;
8208 armnn::WorkloadInfo info;
8209 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8210 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
8211 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8213 data.m_ViewOrigins.push_back(window1);
8214 data.m_ViewOrigins.push_back(window2);
8216 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
8218 inputHandle1->Allocate();
8219 inputHandle2->Allocate();
8220 outputHandle->Allocate();
8222 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
8223 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
8225 workload->PostAllocationConfigure();
8226 workload->Execute();
8228 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
8235 template <typename T>
8236 LayerTestResult<T, 4> AdditionQuantizeTestHelper(
8237 armnn::IWorkloadFactory& workloadFactory,
8238 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8239 const unsigned int shape0[4],
8240 const std::vector<T>& values0,
8243 const unsigned int shape1[4],
8244 const std::vector<T> & values1,
8247 const unsigned int outShape[4],
8248 const std::vector<T> & outValues,
8252 auto dataType = (std::is_same<T, uint8_t>::value ?
8253 armnn::DataType::QuantisedAsymm8 :
8254 armnn::DataType::QuantisedSymm16);
8256 armnn::TensorInfo inputTensorInfo0(4, shape0, dataType);
8257 armnn::TensorInfo inputTensorInfo1(4, shape1, dataType);
8258 armnn::TensorInfo outputTensorInfo(4, outShape, dataType);
8260 inputTensorInfo0.SetQuantizationScale(scale0);
8261 inputTensorInfo0.SetQuantizationOffset(offset0);
8263 inputTensorInfo1.SetQuantizationScale(scale1);
8264 inputTensorInfo1.SetQuantizationOffset(offset1);
8266 outputTensorInfo.SetQuantizationScale(outScale);
8267 outputTensorInfo.SetQuantizationOffset(outOffset);
8269 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8270 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8272 LayerTestResult<T, 4> result(outputTensorInfo);
8273 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8275 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8276 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8277 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8279 armnn::AdditionQueueDescriptor data;
8280 armnn::WorkloadInfo info;
8281 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8282 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8283 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8285 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
8287 inputHandle0->Allocate();
8288 inputHandle1->Allocate();
8289 outputHandle->Allocate();
8291 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8292 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8294 workload->PostAllocationConfigure();
8295 workload->Execute();
8297 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8301 } // anonymous namespace
8303 LayerTestResult<uint8_t, 4> AdditionUint8Test(
8304 armnn::IWorkloadFactory& workloadFactory,
8305 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8307 const unsigned int shape0[] = { 1, 2, 2, 3 };
8308 const unsigned int shape1[] = { 1, 2, 2, 3 };
8310 std::vector<uint8_t> input0(
8312 63, 35, 77, 70, 56, 112, // 420, 224, 518, 469, 371, 763
8313 203, 28, 252, 168, 245, 91 // 1400, 175, 1743, 1155, 1694, 616
8316 std::vector<uint8_t> input1(
8318 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8319 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8322 std::vector<uint8_t> output(
8324 81, 39, 249, 255, 228, 255, // 546, 252, 1722, 2065(clamped), 1575, 2212(clamped)
8325 255, 186, 255, 186, 255, 214, // 2261(clamped), 1281, 2163(clamped), 1281, 2408(clamped), 1477
8328 return AdditionQuantizeTestHelper(workloadFactory,
8330 shape0, input0, 7.0f, 3,
8331 shape1, input1, 7.0f, 3,
8332 shape0, output, 7.0f, 3);
8335 LayerTestResult<int16_t, 4> AdditionInt16Test(
8336 armnn::IWorkloadFactory& workloadFactory,
8337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8339 const unsigned int shape0[] = { 1, 2, 2, 3 };
8340 const unsigned int shape1[] = { 1, 2, 2, 3 };
8342 std::vector<int16_t> input0(
8344 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
8345 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
8348 std::vector<int16_t> input1(
8350 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8351 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8354 std::vector<int16_t> output(
8356 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
8357 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
8360 return AdditionQuantizeTestHelper(workloadFactory,
8362 shape0, input0, 7.0f, 0,
8363 shape1, input1, 7.0f, 0,
8364 shape0, output, 7.0f, 0);
8369 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8370 LayerTestResult<T, 4> MultiplicationQuantizeTestHelper(
8371 armnn::IWorkloadFactory& workloadFactory,
8372 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8373 const unsigned int shape0[4],
8374 const std::vector<T> & values0,
8377 const unsigned int shape1[4],
8378 const std::vector<T> & values1,
8381 const unsigned int outShape[4],
8382 const std::vector<T> & outValues,
8386 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8387 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8388 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8390 inputTensorInfo0.SetQuantizationScale(scale0);
8391 inputTensorInfo0.SetQuantizationOffset(offset0);
8393 inputTensorInfo1.SetQuantizationScale(scale1);
8394 inputTensorInfo1.SetQuantizationOffset(offset1);
8396 outputTensorInfo.SetQuantizationScale(outScale);
8397 outputTensorInfo.SetQuantizationOffset(outOffset);
8399 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8400 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8402 LayerTestResult<T, 4> result(outputTensorInfo);
8403 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8405 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8406 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8407 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8409 armnn::MultiplicationQueueDescriptor data;
8410 armnn::WorkloadInfo info;
8411 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8412 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8413 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8415 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
8417 inputHandle0->Allocate();
8418 inputHandle1->Allocate();
8419 outputHandle->Allocate();
8421 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8422 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8424 workload->PostAllocationConfigure();
8425 workload->Execute();
8427 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8431 } // anonymous namespace
8433 LayerTestResult<uint8_t, 4> MultiplicationUint8Test(
8434 armnn::IWorkloadFactory& workloadFactory,
8435 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8437 unsigned int batchSize = 1;
8438 unsigned int channels = 2;
8439 unsigned int height = 2;
8440 unsigned int width = 3;
8441 const unsigned int shape[] = { batchSize, channels, height, width };
8443 // See dequantized values to the right.
8444 std::vector<uint8_t> input0({
8445 62, 37, 3, 172, 13, 111, // 244, 144, 8, 684, 48, 440,
8446 188, 20, 73, 31, 23, 31 // 748, 76, 288, 120, 88, 120
8449 // See dequantized values to the right.
8450 std::vector<uint8_t> input1({
8451 126, 240, 252, 183, 121, 247, // 384, 726, 762, 555, 369, 747,
8452 48, 115, 151, 79, 78, 97 // 150, 351, 459, 243, 240, 297
8455 // See dequantized values to the right.
8456 std::vector<uint8_t> output(
8458 64, 72, 0, 255, 8, 236, // 93696, 104544, 6096(clamped), 379620(clamped), 17712, 328680,
8459 77, 15, 92, 16, 10, 21, // 112200, 26676, 132192, 29160, 21120, 35640
8462 // Scale/offset chosen to have output values out of range.
8463 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8479 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1ElementUint8Test(
8480 armnn::IWorkloadFactory& workloadFactory,
8481 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8483 const unsigned int shape0[] = { 1, 2, 2, 3 };
8484 const unsigned int shape1[] = { 1, 1, 1, 1 };
8486 std::vector<uint8_t> input0({
8491 std::vector<uint8_t> input1({2});
8493 std::vector<uint8_t> output({
8495 14, 16, 18, 20, 22, 24
8498 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8514 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1DVectorUint8Test(
8515 armnn::IWorkloadFactory& workloadFactory,
8516 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8518 const unsigned int shape0[] = { 1, 2, 2, 3 };
8519 const unsigned int shape1[] = { 1, 1, 1, 3 };
8521 std::vector<uint8_t> input0({
8526 std::vector<uint8_t> input1({1, 2, 3});
8528 std::vector<uint8_t> output({
8530 7, 16, 27, 10, 22, 36
8533 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8549 LayerTestResult<int16_t, 4> MultiplicationInt16Test(
8550 armnn::IWorkloadFactory& workloadFactory,
8551 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8553 const unsigned int shape[] = { 1, 2, 2, 3 };
8555 std::vector<int16_t> input0(
8558 12, 13, 14, 15, 16, 17
8561 std::vector<int16_t> input1(
8567 std::vector<int16_t> output(
8569 6, 14, 24, 36, 50, 66,
8570 84, 104, 126, 150, 176, 204
8573 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8589 LayerTestResult<int16_t, 4> MultiplicationBroadcast1ElementInt16Test(
8590 armnn::IWorkloadFactory& workloadFactory,
8591 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8593 const unsigned int shape0[] = { 1, 2, 2, 3 };
8594 const unsigned int shape1[] = { 1, 1, 1, 1 };
8596 std::vector<int16_t> input0(
8602 std::vector<int16_t> input1({2});
8604 std::vector<int16_t> output(
8607 14, 16, 18, 20, 22, 24
8610 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8626 LayerTestResult<int16_t, 4> MultiplicationBroadcast1DVectorInt16Test(
8627 armnn::IWorkloadFactory& workloadFactory,
8628 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8630 const unsigned int shape0[] = { 1, 2, 2, 3 };
8631 const unsigned int shape1[] = { 1, 1, 1, 3 };
8633 std::vector<int16_t> input0(
8639 std::vector<int16_t> input1({1, 2, 3});
8641 std::vector<int16_t> output(
8644 7, 16, 27, 10, 22, 36
8647 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8665 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8666 LayerTestResult<T, 4> SubtractionTestHelper(
8667 armnn::IWorkloadFactory& workloadFactory,
8668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8669 const unsigned int shape0[4],
8670 const std::vector<T>& values0,
8673 const unsigned int shape1[4],
8674 const std::vector<T> & values1,
8677 const unsigned int outShape[4],
8678 const std::vector<T> & outValues,
8682 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8683 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8684 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8686 inputTensorInfo0.SetQuantizationScale(scale0);
8687 inputTensorInfo0.SetQuantizationOffset(offset0);
8689 inputTensorInfo1.SetQuantizationScale(scale1);
8690 inputTensorInfo1.SetQuantizationOffset(offset1);
8692 outputTensorInfo.SetQuantizationScale(outScale);
8693 outputTensorInfo.SetQuantizationOffset(outOffset);
8695 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8696 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8698 LayerTestResult<T, 4> result(outputTensorInfo);
8699 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8701 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8702 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8703 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8705 armnn::SubtractionQueueDescriptor data;
8706 armnn::WorkloadInfo info;
8707 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8708 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8709 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8711 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSubtraction(data, info);
8713 inputHandle0->Allocate();
8714 inputHandle1->Allocate();
8715 outputHandle->Allocate();
8717 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8718 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8720 workload->PostAllocationConfigure();
8721 workload->Execute();
8723 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8727 } // anonymous namespace
8729 LayerTestResult<uint8_t, 4> SubtractionUint8Test(
8730 armnn::IWorkloadFactory& workloadFactory,
8731 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8733 const unsigned int shape0[] = { 1, 1, 2, 2 };
8734 const unsigned int shape1[] = { 1, 1, 2, 2 };
8736 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8737 std::vector<uint8_t> input1({ 1, 2, 1, 2 });
8738 std::vector<uint8_t> output({ 3, 3, 5, 5 });
8740 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8742 shape0, input0, 0.5f, 2,
8743 shape1, input1, 1.0f, 0,
8744 shape0, output, 1.0f, 0);
8747 LayerTestResult<uint8_t, 4> SubtractionBroadcast1ElementUint8Test(
8748 armnn::IWorkloadFactory& workloadFactory,
8749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8751 const unsigned int shape0[] = { 1, 1, 2, 2 };
8752 const unsigned int shape1[] = { 1, 1, 1, 1 };
8754 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8755 std::vector<uint8_t> input1({ 2 });
8756 std::vector<uint8_t> output({ 5, 6, 7, 8 });
8758 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8760 shape0, input0, 0.5f, 2,
8761 shape1, input1, 1.0f, 0,
8762 shape0, output, 1.0f, 3);
8765 LayerTestResult<uint8_t, 4> SubtractionBroadcastUint8Test(
8766 armnn::IWorkloadFactory& workloadFactory,
8767 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8769 const unsigned int shape0[] = { 1, 1, 2, 2 };
8770 const unsigned int shape1[] = { 1, 1, 2, 1 };
8772 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8773 std::vector<uint8_t> input1({ 2, 1 });
8774 std::vector<uint8_t> output({ 8, 11, 12, 15 });
8776 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8778 shape0, input0, 1.0f, 0,
8779 shape1, input1, 1.0f, 0,
8780 shape0, output, 1.0f, 0);
8783 LayerTestResult<float, 4> SubtractionTest(
8784 armnn::IWorkloadFactory& workloadFactory,
8785 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8787 const unsigned int shape0[] = { 1, 1, 2, 2 };
8788 const unsigned int shape1[] = { 1, 1, 2, 2 };
8790 std::vector<float> input0({ 1, 2, 3, 4 });
8791 std::vector<float> input1({ 1, -1, 0, 2 });
8792 std::vector<float> output({ 0, 3, 3, 2 });
8794 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8796 shape0, input0, 1.0f, 0,
8797 shape1, input1, 1.0f, 0,
8798 shape0, output, 1.0f, 0);
8801 LayerTestResult<float, 4> SubtractionBroadcast1ElementTest(
8802 armnn::IWorkloadFactory& workloadFactory,
8803 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8805 const unsigned int shape0[] = { 1, 1, 2, 2 };
8806 const unsigned int shape1[] = { 1, 1, 1, 1 };
8808 std::vector<float> input0({ 1, 2, 3, 4 });
8809 std::vector<float> input1({ 10 });
8810 std::vector<float> output({ -9, -8, -7, -6 });
8812 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8814 shape0, input0, 1.0f, 0,
8815 shape1, input1, 1.0f, 0,
8816 shape0, output, 1.0f, 0);
8819 LayerTestResult<float, 4> SubtractionBroadcastTest(
8820 armnn::IWorkloadFactory& workloadFactory,
8821 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8823 const unsigned int shape0[] = { 1, 1, 2, 2 };
8824 const unsigned int shape1[] = { 1, 1, 1, 2 };
8826 std::vector<float> input0({ 1, 2, 3, 4 });
8827 std::vector<float> input1({ 10, -5 });
8828 std::vector<float> output({ -9, 7, -7, 9 });
8830 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8832 shape0, input0, 1.0f, 0,
8833 shape1, input1, 1.0f, 0,
8834 shape0, output, 1.0f, 0);
8837 LayerTestResult<int16_t, 4> SubtractionInt16Test(
8838 armnn::IWorkloadFactory& workloadFactory,
8839 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8841 const unsigned int shape0[] = { 1, 1, 2, 2 };
8842 const unsigned int shape1[] = { 1, 1, 2, 2 };
8844 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8845 std::vector<int16_t> input1({ 1, 2, 1, 2 });
8846 std::vector<int16_t> output({ 3, 3, 5, 5 });
8848 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8850 shape0, input0, 0.5f, 0,
8851 shape1, input1, 1.0f, 0,
8852 shape0, output, 1.0f, 0);
8855 LayerTestResult<int16_t, 4> SubtractionBroadcast1ElementInt16Test(
8856 armnn::IWorkloadFactory& workloadFactory,
8857 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8859 const unsigned int shape0[] = { 1, 1, 2, 2 };
8860 const unsigned int shape1[] = { 1, 1, 1, 1 };
8862 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8863 std::vector<int16_t> input1({ 2 });
8864 std::vector<int16_t> output({ 3, 4, 5, 6 });
8866 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8868 shape0, input0, 0.5f, 0,
8869 shape1, input1, 1.0f, 0,
8870 shape0, output, 1.0f, 0);
8873 LayerTestResult<int16_t, 4> SubtractionBroadcastInt16Test(
8874 armnn::IWorkloadFactory& workloadFactory,
8875 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8877 const unsigned int shape0[] = { 1, 1, 2, 2 };
8878 const unsigned int shape1[] = { 1, 1, 2, 1 };
8880 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8881 std::vector<int16_t> input1({ 2, 1 });
8882 std::vector<int16_t> output({ 8, 11, 12, 15 });
8884 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8886 shape0, input0, 1.0f, 0,
8887 shape1, input1, 1.0f, 0,
8888 shape0, output, 1.0f, 0);
8891 LayerTestResult<float, 4> BatchNormTest(
8892 armnn::IWorkloadFactory& workloadFactory,
8893 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8900 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
8901 std::vector<float> inputValues
8903 // Batch 0, Channel 0, Height (3) x Width (2)
8908 // Batch 0, Channel 1, Height (3) x Width (2)
8913 std::vector<float> expectedOutputValues
8915 // Batch 0, Channel 0, Height (3) x Width (2)
8920 // Batch 0, Channel 1, Height (3) x Width (2)
8926 return BatchNormTestImpl<armnn::DataType::Float32>(
8927 workloadFactory, memoryManager,
8928 inputOutputShape, inputValues, expectedOutputValues,
8929 0.f, 0, armnn::DataLayout::NCHW);
8932 LayerTestResult<float, 4> BatchNormNhwcTest(
8933 armnn::IWorkloadFactory& workloadFactory,
8934 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8941 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
8942 std::vector<float> inputValues
8944 // Batch 0, Height 0, Width (2) x Channel (2)
8948 // Batch 0, Height 1, Width (2) x Channel (2)
8952 // Batch 0, Height 2, Width (2) x Channel (2)
8956 std::vector<float> expectedOutputValues
8958 // Batch 0, Height 0, Width (2) x Channel (2)
8962 // Batch 0, Height 1, Width (2) x Channel (2)
8966 // Batch 0, Height 2, Width (2) x Channel (2)
8971 return BatchNormTestImpl<armnn::DataType::Float32>(
8972 workloadFactory, memoryManager,
8973 inputOutputShape, inputValues, expectedOutputValues,
8974 0.f, 0, armnn::DataLayout::NHWC);
8977 LayerTestResult<uint8_t, 4> BatchNormUint8Test(
8978 armnn::IWorkloadFactory& workloadFactory,
8979 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8986 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
8987 std::vector<float> inputValues
8989 // Batch 0, Channel 0, Height (3) x Width (2)
8994 // Batch 0, Channel 1, Height (3) x Width (2)
8999 std::vector<float> expectedOutputValues
9001 // Batch 0, Channel 0, Height (3) x Width (2)
9006 // Batch 0, Channel 1, Height (3) x Width (2)
9012 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>(
9013 workloadFactory, memoryManager,
9014 inputOutputShape, inputValues, expectedOutputValues,
9015 1.f/20.f, 50, armnn::DataLayout::NCHW);
9018 LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest(
9019 armnn::IWorkloadFactory& workloadFactory,
9020 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9027 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
9028 std::vector<float> inputValues
9030 // Batch 0, Height 0, Width (2) x Channel (2)
9034 // Batch 0, Height 1, Width (2) x Channel (2)
9038 // Batch 0, Height 2, Width (2) x Channel (2)
9042 std::vector<float> expectedOutputValues
9044 // Batch 0, Height 0, Width (2) x Channel (2)
9048 // Batch 0, Height 1, Width (2) x Channel (2)
9052 // Batch 0, Height 2, Width (2) x Channel (2)
9057 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>
9058 (workloadFactory, memoryManager,
9059 inputOutputShape, inputValues, expectedOutputValues,
9060 1.f/20.f, 50, armnn::DataLayout::NHWC);
9063 LayerTestResult<int16_t, 4> BatchNormInt16Test(
9064 armnn::IWorkloadFactory& workloadFactory,
9065 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9072 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
9073 std::vector<float> inputValues
9075 // Batch 0, Channel 0, Height (3) x Width (2)
9080 // Batch 0, Channel 1, Height (3) x Width (2)
9085 std::vector<float> expectedOutputValues
9087 // Batch 0, Channel 0, Height (3) x Width (2)
9092 // Batch 0, Channel 1, Height (3) x Width (2)
9098 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>(
9099 workloadFactory, memoryManager,
9100 inputOutputShape, inputValues, expectedOutputValues,
9101 1.f/20.f, 50, armnn::DataLayout::NCHW);
9104 LayerTestResult<int16_t, 4> BatchNormInt16NhwcTest(
9105 armnn::IWorkloadFactory& workloadFactory,
9106 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9113 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
9114 std::vector<float> inputValues
9116 // Batch 0, Height 0, Width (2) x Channel (2)
9120 // Batch 0, Height 1, Width (2) x Channel (2)
9124 // Batch 0, Height 2, Width (2) x Channel (2)
9128 std::vector<float> expectedOutputValues
9130 // Batch 0, Height 0, Width (2) x Channel (2)
9134 // Batch 0, Height 1, Width (2) x Channel (2)
9138 // Batch 0, Height 2, Width (2) x Channel (2)
9143 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>
9144 (workloadFactory, memoryManager,
9145 inputOutputShape, inputValues, expectedOutputValues,
9146 1.f/20.f, 50, armnn::DataLayout::NHWC);
9149 LayerTestResult<uint8_t, 4> ConstantUint8CustomQuantizationScaleAndOffsetTest(
9150 armnn::IWorkloadFactory& workloadFactory,
9151 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9153 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 2e-6f, 1);
9156 LayerTestResult<int16_t, 4> ConstantInt16CustomQuantizationScaleAndOffsetTest(
9157 armnn::IWorkloadFactory& workloadFactory,
9158 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9160 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 2e-6f, 1);
9163 LayerTestResult<uint8_t, 1> Concatenation1dUint8Test(
9164 armnn::IWorkloadFactory& workloadFactory,
9165 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9167 return Concatenation1dTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9170 LayerTestResult<uint8_t, 2> Concatenation2dDim0Uint8Test(
9171 armnn::IWorkloadFactory& workloadFactory,
9172 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9174 return Concatenation2dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9177 LayerTestResult<uint8_t, 2> Concatenation2dDim1Uint8Test(
9178 armnn::IWorkloadFactory& workloadFactory,
9179 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9181 return Concatenation2dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9184 LayerTestResult<uint8_t, 2> Concatenation2dDim0DiffInputDimsUint8Test(
9185 armnn::IWorkloadFactory& workloadFactory,
9186 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9188 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9189 workloadFactory, memoryManager, 0.5f, -1);
9192 LayerTestResult<uint8_t, 2> Concatenation2dDim1DiffInputDimsUint8Test(
9193 armnn::IWorkloadFactory& workloadFactory,
9194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9196 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9197 workloadFactory, memoryManager, 0.5f, -1);
9200 LayerTestResult<uint8_t, 3> Concatenation3dDim0Uint8Test(
9201 armnn::IWorkloadFactory& workloadFactory,
9202 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9204 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9207 LayerTestResult<uint8_t, 3> Concatenation3dDim1Uint8Test(
9208 armnn::IWorkloadFactory& workloadFactory,
9209 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9211 return Concatenation3dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9214 LayerTestResult<uint8_t, 3> Concatenation3dDim2Uint8Test(
9215 armnn::IWorkloadFactory& workloadFactory,
9216 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9219 return Concatenation3dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
9220 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
9223 LayerTestResult<uint8_t, 3> Concatenation3dDim0DiffInputDimsUint8Test(
9224 armnn::IWorkloadFactory& workloadFactory,
9225 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9227 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9230 LayerTestResult<uint8_t, 3> Concatenation3dDim1DiffInputDimsUint8Test(
9231 armnn::IWorkloadFactory& workloadFactory,
9232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9234 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9235 workloadFactory, memoryManager, 0.5f, -1);
9238 LayerTestResult<uint8_t, 3> Concatenation3dDim2DiffInputDimsUint8Test(
9239 armnn::IWorkloadFactory& workloadFactory,
9240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9243 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
9244 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
9247 LayerTestResult<uint8_t, 4> Concatenation4dDim0Uint8Test(
9248 armnn::IWorkloadFactory& workloadFactory,
9249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9251 return Concatenation4dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9254 LayerTestResult<uint8_t, 4> Concatenation4dDim1Uint8Test(
9255 armnn::IWorkloadFactory& workloadFactory,
9256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9258 return Concatenation4dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9261 LayerTestResult<uint8_t, 4> Concatenation4dDim2Uint8Test(
9262 armnn::IWorkloadFactory& workloadFactory,
9263 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9265 return Concatenation4dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9268 LayerTestResult<uint8_t, 4> Concatenation4dDim3Uint8Test(
9269 armnn::IWorkloadFactory& workloadFactory,
9270 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, bool useSubtensor)
9272 return Concatenation4dDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9273 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9276 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim0Uint8Test(
9277 armnn::IWorkloadFactory& workloadFactory,
9278 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9280 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::QuantisedAsymm8>(
9281 workloadFactory, memoryManager, 0.5f, -1);
9284 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim1Uint8Test(
9285 armnn::IWorkloadFactory& workloadFactory,
9286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9288 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::QuantisedAsymm8>(
9289 workloadFactory, memoryManager, 0.5f, -1);
9292 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim2Uint8Test(
9293 armnn::IWorkloadFactory& workloadFactory,
9294 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9296 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
9297 workloadFactory, memoryManager, 0.5f, -1);
9300 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim3Uint8Test(
9301 armnn::IWorkloadFactory& workloadFactory,
9302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9305 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9306 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9309 LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
9310 armnn::IWorkloadFactory& workloadFactory,
9311 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9312 bool forceNoPadding)
9314 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
9315 workloadFactory, memoryManager, forceNoPadding);
9318 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
9319 armnn::IWorkloadFactory& workloadFactory,
9320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9321 bool forceNoPadding)
9323 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedAsymm8>(
9324 workloadFactory, memoryManager, forceNoPadding, 3.0f, -5);
9327 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
9328 armnn::IWorkloadFactory& workloadFactory,
9329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9330 bool forceNoPadding)
9332 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedSymm16>(
9333 workloadFactory, memoryManager, forceNoPadding);
9336 LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
9337 armnn::IWorkloadFactory& workloadFactory,
9338 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9339 bool forceNoPadding)
9341 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
9342 workloadFactory, memoryManager, forceNoPadding);
9345 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
9346 armnn::IWorkloadFactory& workloadFactory,
9347 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9348 bool forceNoPadding)
9350 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedAsymm8>(
9351 workloadFactory, memoryManager, forceNoPadding, 0.1f, 128);
9354 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
9355 armnn::IWorkloadFactory& workloadFactory,
9356 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9357 bool forceNoPadding)
9359 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedSymm16>(
9360 workloadFactory, memoryManager, forceNoPadding);
9363 LayerTestResult<float, 4> SimpleMaxPooling2dTest(
9364 armnn::IWorkloadFactory& workloadFactory,
9365 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9366 const armnn::DataLayout dataLayout)
9368 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9371 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
9372 armnn::IWorkloadFactory& workloadFactory,
9373 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9374 const armnn::DataLayout dataLayout)
9376 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9379 LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
9380 armnn::IWorkloadFactory& workloadFactory,
9381 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9382 const armnn::DataLayout dataLayout)
9384 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9386 LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
9387 armnn::IWorkloadFactory& workloadFactory,
9388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9390 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9393 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
9394 armnn::IWorkloadFactory& workloadFactory,
9395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9397 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9398 workloadFactory, memoryManager, 1.0f, -5);
9401 LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
9402 armnn::IWorkloadFactory& workloadFactory,
9403 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9405 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9406 workloadFactory, memoryManager);
9409 LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
9410 armnn::IWorkloadFactory& workloadFactory,
9411 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9413 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9416 LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
9417 armnn::IWorkloadFactory& workloadFactory,
9418 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9420 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9421 workloadFactory, memoryManager, 1.0f, -5);
9424 LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
9425 armnn::IWorkloadFactory& workloadFactory,
9426 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9428 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9429 workloadFactory, memoryManager);
9432 LayerTestResult<float, 4> SimpleAveragePooling2dTest(
9433 armnn::IWorkloadFactory& workloadFactory,
9434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9435 const armnn::DataLayout dataLayout)
9437 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9440 LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
9441 armnn::IWorkloadFactory& workloadFactory,
9442 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9443 const armnn::DataLayout dataLayout)
9445 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9446 workloadFactory, memoryManager, dataLayout, 0.5, -1);
9449 LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
9450 armnn::IWorkloadFactory& workloadFactory,
9451 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9452 const armnn::DataLayout dataLayout)
9454 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9455 workloadFactory, memoryManager, dataLayout);
9458 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
9459 armnn::IWorkloadFactory& workloadFactory,
9460 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9461 bool forceNoPadding)
9463 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
9464 workloadFactory, memoryManager, forceNoPadding);
9467 LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
9468 armnn::IWorkloadFactory& workloadFactory,
9469 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9471 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9474 LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
9475 armnn::IWorkloadFactory& workloadFactory,
9476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9478 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9479 workloadFactory, memoryManager, 0.5, -1);
9482 LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
9483 armnn::IWorkloadFactory& workloadFactory,
9484 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9486 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9487 workloadFactory, memoryManager);
9489 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
9490 armnn::IWorkloadFactory& workloadFactory,
9491 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9493 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9496 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
9497 armnn::IWorkloadFactory& workloadFactory,
9498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9500 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9501 workloadFactory, memoryManager);
9504 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
9505 armnn::IWorkloadFactory& workloadFactory,
9506 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9508 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9509 workloadFactory, memoryManager);
9512 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
9513 armnn::IWorkloadFactory& workloadFactory,
9514 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9516 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
9517 workloadFactory, memoryManager);
9520 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
9521 armnn::IWorkloadFactory& workloadFactory,
9522 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9524 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedAsymm8>(
9525 workloadFactory, memoryManager);
9528 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
9529 armnn::IWorkloadFactory& workloadFactory,
9530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9532 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedSymm16>(
9533 workloadFactory, memoryManager);
9536 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
9537 armnn::IWorkloadFactory& workloadFactory,
9538 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9540 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9543 LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
9544 armnn::IWorkloadFactory& workloadFactory,
9545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9547 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9548 workloadFactory, memoryManager);
9551 LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
9552 armnn::IWorkloadFactory& workloadFactory,
9553 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9555 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9556 workloadFactory, memoryManager);
9559 LayerTestResult<float, 4> SimpleL2Pooling2dTest(
9560 armnn::IWorkloadFactory& workloadFactory,
9561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9562 const armnn::DataLayout dataLayout)
9564 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9567 LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
9568 armnn::IWorkloadFactory& workloadFactory,
9569 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9570 const armnn::DataLayout dataLayout)
9572 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9575 LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
9576 armnn::IWorkloadFactory& workloadFactory,
9577 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9578 const armnn::DataLayout dataLayout)
9580 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9583 LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
9584 armnn::IWorkloadFactory& workloadFactory,
9585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9587 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9590 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
9591 armnn::IWorkloadFactory& workloadFactory,
9592 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9594 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9597 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
9598 armnn::IWorkloadFactory& workloadFactory,
9599 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9601 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9604 LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
9605 armnn::IWorkloadFactory& workloadFactory,
9606 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9608 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9611 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
9612 armnn::IWorkloadFactory& workloadFactory,
9613 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9615 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9618 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
9619 armnn::IWorkloadFactory& workloadFactory,
9620 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9622 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9624 LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
9625 armnn::IWorkloadFactory& workloadFactory,
9626 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9628 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9631 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
9632 armnn::IWorkloadFactory& workloadFactory,
9633 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9635 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9638 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
9639 armnn::IWorkloadFactory& workloadFactory,
9640 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9642 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9645 LayerTestResult<float, 4> L2Pooling2dSize7Test(
9646 armnn::IWorkloadFactory& workloadFactory,
9647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9649 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9652 LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
9653 armnn::IWorkloadFactory& workloadFactory,
9654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9656 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9659 LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
9660 armnn::IWorkloadFactory& workloadFactory,
9661 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9663 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9666 LayerTestResult<float, 4> L2Pooling2dSize9Test(
9667 armnn::IWorkloadFactory& workloadFactory,
9668 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9670 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9673 LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
9674 armnn::IWorkloadFactory& workloadFactory,
9675 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9677 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9680 LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
9681 armnn::IWorkloadFactory& workloadFactory,
9682 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9684 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9686 LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
9687 armnn::IWorkloadFactory& workloadFactory,
9688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9690 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9693 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
9694 armnn::IWorkloadFactory& workloadFactory,
9695 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9697 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9700 LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
9701 armnn::IWorkloadFactory& workloadFactory,
9702 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9704 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9707 LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
9708 armnn::IWorkloadFactory& workloadFactory,
9709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9711 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9714 LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
9715 armnn::IWorkloadFactory& workloadFactory,
9716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9718 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9721 LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
9722 armnn::IWorkloadFactory& workloadFactory,
9723 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9725 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9728 LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
9729 armnn::IWorkloadFactory& workloadFactory,
9730 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9732 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9735 LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
9736 armnn::IWorkloadFactory& workloadFactory,
9737 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9739 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9742 LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
9743 armnn::IWorkloadFactory& workloadFactory,
9744 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9746 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9749 LayerTestResult<float, 4> ComparePooling2dTest(
9750 armnn::IWorkloadFactory& workloadFactory,
9751 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9752 armnn::IWorkloadFactory& refWorkloadFactory,
9753 armnn::PoolingAlgorithm poolingType)
9755 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
9756 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
9759 LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
9760 armnn::IWorkloadFactory& workloadFactory,
9761 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9762 armnn::IWorkloadFactory& refWorkloadFactory,
9763 armnn::PoolingAlgorithm poolingType)
9765 return ComparePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9766 workloadFactory, memoryManager, refWorkloadFactory, poolingType, 0.1f, 128);
9769 LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
9770 armnn::IWorkloadFactory& workloadFactory,
9771 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9772 armnn::IWorkloadFactory& refWorkloadFactory,
9773 armnn::PoolingAlgorithm poolingType)
9775 return ComparePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9776 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
9779 LayerTestResult<float, 2> FullyConnectedLargeTest(
9780 armnn::IWorkloadFactory& workloadFactory,
9781 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9782 bool transposeWeights)
9784 return FullyConnectedLargeTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, transposeWeights);
9787 LayerTestResult<float, 4> AdditionAfterMaxPoolTest(
9788 armnn::IWorkloadFactory& workloadFactory,
9789 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9791 // Create Initial Tensor
9796 armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::DataType::Float32);
9797 armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::DataType::Float32);
9799 boost::multi_array<float, 4> poolingInput = MakeTensor<float,4>(poolingInputTensorInfo,
9805 std::unique_ptr<armnn::ITensorHandle> poolingInputHandle =
9806 workloadFactory.CreateTensorHandle(poolingInputTensorInfo);
9807 std::unique_ptr<armnn::ITensorHandle> poolingOutputHandle =
9808 workloadFactory.CreateTensorHandle(poolingOutputTensorInfo);
9810 // Apply MaxPool poolSize = 1x1, stride=2x2
9814 armnn::Pooling2dDescriptor descriptor;
9815 descriptor.m_PoolHeight = 1;
9816 descriptor.m_PoolWidth = 1;
9817 descriptor.m_StrideX = 2;
9818 descriptor.m_StrideY = 2;
9819 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
9821 armnn::Pooling2dQueueDescriptor queueDescriptor;
9822 queueDescriptor.m_Parameters = descriptor;
9823 armnn::WorkloadInfo workloadInfo;
9824 AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get());
9825 AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get());
9827 // Create the MaxPool
9828 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
9830 //LayerTestResult<float, 4> result(poolingOutputTensorInfo);
9831 auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo));
9832 boost::multi_array<float, 4> resultMaxPool;
9833 resultMaxPool.resize(shape);
9836 // Create addition with another tensor the same size
9837 // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1
9838 // with the initial tensor.
9842 armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
9843 armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
9845 boost::multi_array<float, 4> addInput = MakeTensor<float,4>(addInputTensorInfo,
9850 // Expected output tensor after MaxPool and Addition.
9851 LayerTestResult<float,4> addRet(addOutputTensorInfo);
9852 addRet.outputExpected = MakeTensor<float, 4>(addOutputTensorInfo, std::vector<float>(
9858 std::unique_ptr<armnn::ITensorHandle> addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo);
9859 std::unique_ptr<armnn::ITensorHandle> addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo);
9861 armnn::AdditionQueueDescriptor data;
9862 armnn::WorkloadInfo info;
9864 // Add the output of the MaxPool and the new tensor
9865 AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get());
9866 AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get());
9867 AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get());
9869 std::unique_ptr<armnn::IWorkload> addWorkload = workloadFactory.CreateAddition(data, info);
9871 poolingInputHandle->Allocate();
9872 poolingOutputHandle->Allocate();
9873 addInputHandle->Allocate();
9874 addOutputHandle->Allocate();
9876 CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]);
9877 CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get());
9879 CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]);
9880 CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]);
9882 workload->PostAllocationConfigure();
9883 workload->Execute();
9884 addWorkload->PostAllocationConfigure();
9885 addWorkload->Execute();
9887 CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
9892 LayerTestResult<float, 4> SpaceToBatchNdSimpleFloat32Test(
9893 armnn::IWorkloadFactory& workloadFactory,
9894 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9896 return SpaceToBatchNdSimpleTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9899 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsFloat32Test(
9900 armnn::IWorkloadFactory& workloadFactory,
9901 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9903 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9906 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockFloat32Test(
9907 armnn::IWorkloadFactory& workloadFactory,
9908 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9910 return SpaceToBatchNdMultiBlockTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9913 LayerTestResult<float, 4> SpaceToBatchNdPaddingFloat32Test(
9914 armnn::IWorkloadFactory& workloadFactory,
9915 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9917 return SpaceToBatchNdPaddingTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9920 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleUint8Test(
9921 armnn::IWorkloadFactory& workloadFactory,
9922 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9924 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9927 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsUint8Test(
9928 armnn::IWorkloadFactory& workloadFactory,
9929 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9931 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9934 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockUint8Test(
9935 armnn::IWorkloadFactory& workloadFactory,
9936 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9938 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9941 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingUint8Test(
9942 armnn::IWorkloadFactory& workloadFactory,
9943 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9945 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9948 LayerTestResult<float, 4> SpaceToBatchNdSimpleNHWCFloat32Test(
9949 armnn::IWorkloadFactory& workloadFactory,
9950 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9952 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9955 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsNHWCFloat32Test(
9956 armnn::IWorkloadFactory& workloadFactory,
9957 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9959 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9962 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockNHWCFloat32Test(
9963 armnn::IWorkloadFactory& workloadFactory,
9964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9966 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9969 LayerTestResult<float, 4> SpaceToBatchNdPaddingNHWCFloat32Test(
9970 armnn::IWorkloadFactory& workloadFactory,
9971 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9973 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9976 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleNHWCUint8Test(
9977 armnn::IWorkloadFactory& workloadFactory,
9978 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9980 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9983 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsNHWCUint8Test(
9984 armnn::IWorkloadFactory& workloadFactory,
9985 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9987 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9990 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockNHWCUint8Test(
9991 armnn::IWorkloadFactory& workloadFactory,
9992 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9994 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9997 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingNHWCUint8Test(
9998 armnn::IWorkloadFactory& workloadFactory,
9999 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10001 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10004 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleUint16Test(
10005 armnn::IWorkloadFactory& workloadFactory,
10006 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10008 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10011 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsUint16Test(
10012 armnn::IWorkloadFactory& workloadFactory,
10013 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10015 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10018 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockUint16Test(
10019 armnn::IWorkloadFactory& workloadFactory,
10020 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10022 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10025 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingUint16Test(
10026 armnn::IWorkloadFactory& workloadFactory,
10027 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10029 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10032 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleNHWCUint16Test(
10033 armnn::IWorkloadFactory& workloadFactory,
10034 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10036 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10039 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsNHWCUint16Test(
10040 armnn::IWorkloadFactory& workloadFactory,
10041 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10043 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10046 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockNHWCUint16Test(
10047 armnn::IWorkloadFactory& workloadFactory,
10048 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10050 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10053 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingNHWCUint16Test(
10054 armnn::IWorkloadFactory& workloadFactory,
10055 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10057 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10060 LayerTestResult<uint8_t, 4> SpaceToDepthNHWCAsymmQ8Test(
10061 armnn::IWorkloadFactory& workloadFactory,
10062 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10064 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
10069 LayerTestResult<uint8_t, 4> SpaceToDepthNCHWAsymmQ8Test(
10070 armnn::IWorkloadFactory& workloadFactory,
10071 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10073 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
10076 armnn::DataLayout::NCHW);
10079 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test1(
10080 armnn::IWorkloadFactory& workloadFactory,
10081 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10083 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
10088 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test1(
10089 armnn::IWorkloadFactory& workloadFactory,
10090 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10092 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
10095 armnn::DataLayout::NCHW);
10098 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test2(
10099 armnn::IWorkloadFactory& workloadFactory,
10100 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10102 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
10107 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test2(
10108 armnn::IWorkloadFactory& workloadFactory,
10109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10111 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
10114 armnn::DataLayout::NCHW);
10117 LayerTestResult<int16_t, 4> SpaceToDepthNHWCQSymm16Test(
10118 armnn::IWorkloadFactory& workloadFactory,
10119 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10121 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
10126 LayerTestResult<int16_t, 4> SpaceToDepthNCHWQSymm16Test(
10127 armnn::IWorkloadFactory& workloadFactory,
10128 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10130 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
10133 armnn::DataLayout::NCHW);
10138 } // anonymous namespace
10140 LayerTestResult<float, 4> StridedSlice4DFloat32Test(
10141 armnn::IWorkloadFactory& workloadFactory,
10142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10144 return StridedSlice4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10147 LayerTestResult<float, 4> StridedSlice4DReverseFloat32Test(
10148 armnn::IWorkloadFactory& workloadFactory,
10149 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10151 return StridedSlice4DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10154 LayerTestResult<float, 4> StridedSliceSimpleStrideFloat32Test(
10155 armnn::IWorkloadFactory& workloadFactory,
10156 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10158 return StridedSliceSimpleStrideTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10161 LayerTestResult<float, 4> StridedSliceSimpleRangeMaskFloat32Test(
10162 armnn::IWorkloadFactory& workloadFactory,
10163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10165 return StridedSliceSimpleRangeMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10168 LayerTestResult<float, 2> StridedSliceShrinkAxisMaskFloat32Test(
10169 armnn::IWorkloadFactory& workloadFactory,
10170 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10172 return StridedSliceShrinkAxisMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10175 LayerTestResult<float, 3> StridedSlice3DFloat32Test(
10176 armnn::IWorkloadFactory& workloadFactory,
10177 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10179 return StridedSlice3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10182 LayerTestResult<float, 3> StridedSlice3DReverseFloat32Test(
10183 armnn::IWorkloadFactory& workloadFactory,
10184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10186 return StridedSlice3DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10189 LayerTestResult<float, 2> StridedSlice2DFloat32Test(
10190 armnn::IWorkloadFactory& workloadFactory,
10191 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10193 return StridedSlice2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10196 LayerTestResult<float, 2> StridedSlice2DReverseFloat32Test(
10197 armnn::IWorkloadFactory& workloadFactory,
10198 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10200 return StridedSlice2DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10203 LayerTestResult<uint8_t, 4> StridedSlice4DUint8Test(
10204 armnn::IWorkloadFactory& workloadFactory,
10205 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10207 return StridedSlice4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10210 LayerTestResult<uint8_t, 4> StridedSlice4DReverseUint8Test(
10211 armnn::IWorkloadFactory& workloadFactory,
10212 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10214 return StridedSlice4DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10217 LayerTestResult<uint8_t, 4> StridedSliceSimpleStrideUint8Test(
10218 armnn::IWorkloadFactory& workloadFactory,
10219 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10221 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10224 LayerTestResult<uint8_t, 4> StridedSliceSimpleRangeMaskUint8Test(
10225 armnn::IWorkloadFactory& workloadFactory,
10226 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10228 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10231 LayerTestResult<uint8_t, 2> StridedSliceShrinkAxisMaskUint8Test(
10232 armnn::IWorkloadFactory& workloadFactory,
10233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10235 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10238 LayerTestResult<uint8_t, 3> StridedSlice3DUint8Test(
10239 armnn::IWorkloadFactory& workloadFactory,
10240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10242 return StridedSlice3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10245 LayerTestResult<uint8_t, 3> StridedSlice3DReverseUint8Test(
10246 armnn::IWorkloadFactory& workloadFactory,
10247 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10249 return StridedSlice3DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10252 LayerTestResult<uint8_t, 2> StridedSlice2DUint8Test(
10253 armnn::IWorkloadFactory& workloadFactory,
10254 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10256 return StridedSlice2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10259 LayerTestResult<uint8_t, 2> StridedSlice2DReverseUint8Test(
10260 armnn::IWorkloadFactory& workloadFactory,
10261 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10263 return StridedSlice2DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10266 LayerTestResult<int16_t, 4> StridedSlice4DInt16Test(
10267 armnn::IWorkloadFactory& workloadFactory,
10268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10270 return StridedSlice4DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10273 LayerTestResult<int16_t, 4> StridedSlice4DReverseInt16Test(
10274 armnn::IWorkloadFactory& workloadFactory,
10275 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10277 return StridedSlice4DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10280 LayerTestResult<int16_t, 4> StridedSliceSimpleStrideInt16Test(
10281 armnn::IWorkloadFactory& workloadFactory,
10282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10284 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10287 LayerTestResult<int16_t, 4> StridedSliceSimpleRangeMaskInt16Test(
10288 armnn::IWorkloadFactory& workloadFactory,
10289 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10291 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10294 LayerTestResult<int16_t, 2> StridedSliceShrinkAxisMaskInt16Test(
10295 armnn::IWorkloadFactory& workloadFactory,
10296 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10298 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10301 LayerTestResult<int16_t, 3> StridedSlice3DInt16Test(
10302 armnn::IWorkloadFactory& workloadFactory,
10303 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10305 return StridedSlice3DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10308 LayerTestResult<int16_t, 3> StridedSlice3DReverseInt16Test(
10309 armnn::IWorkloadFactory& workloadFactory,
10310 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10312 return StridedSlice3DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10315 LayerTestResult<int16_t, 2> StridedSlice2DInt16Test(
10316 armnn::IWorkloadFactory& workloadFactory,
10317 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10319 return StridedSlice2DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10322 LayerTestResult<int16_t, 2> StridedSlice2DReverseInt16Test(
10323 armnn::IWorkloadFactory& workloadFactory,
10324 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10326 return StridedSlice2DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10329 LayerTestResult<float, 4> Debug4DFloat32Test(
10330 armnn::IWorkloadFactory& workloadFactory,
10331 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10333 return Debug4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10336 LayerTestResult<float, 3> Debug3DFloat32Test(
10337 armnn::IWorkloadFactory& workloadFactory,
10338 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10340 return Debug3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10343 LayerTestResult<float, 2> Debug2DFloat32Test(
10344 armnn::IWorkloadFactory& workloadFactory,
10345 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10347 return Debug2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10350 LayerTestResult<float, 1> Debug1DFloat32Test(
10351 armnn::IWorkloadFactory& workloadFactory,
10352 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10354 return Debug1DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10357 LayerTestResult<uint8_t, 4> Debug4DUint8Test(
10358 armnn::IWorkloadFactory& workloadFactory,
10359 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10361 return Debug4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10364 LayerTestResult<uint8_t, 3> Debug3DUint8Test(
10365 armnn::IWorkloadFactory& workloadFactory,
10366 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10368 return Debug3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10371 LayerTestResult<uint8_t, 2> Debug2DUint8Test(
10372 armnn::IWorkloadFactory& workloadFactory,
10373 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10375 return Debug2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10378 LayerTestResult<uint8_t, 1> Debug1DUint8Test(
10379 armnn::IWorkloadFactory& workloadFactory,
10380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10382 return Debug1DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10385 LayerTestResult<float, 1> Gather1DParamsFloatTest(
10386 armnn::IWorkloadFactory& workloadFactory,
10387 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10389 return Gather1DParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10392 LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test(
10393 armnn::IWorkloadFactory& workloadFactory,
10394 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10396 return Gather1DParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10399 LayerTestResult<int16_t, 1> Gather1DParamsInt16Test(
10400 armnn::IWorkloadFactory& workloadFactory,
10401 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10403 return Gather1DParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10406 LayerTestResult<float, 2> GatherMultiDimParamsFloatTest(
10407 armnn::IWorkloadFactory& workloadFactory,
10408 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10410 return GatherMultiDimParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10413 LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test(
10414 armnn::IWorkloadFactory& workloadFactory,
10415 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10417 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10420 LayerTestResult<int16_t, 2> GatherMultiDimParamsInt16Test(
10421 armnn::IWorkloadFactory& workloadFactory,
10422 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10424 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10427 LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest(
10428 armnn::IWorkloadFactory& workloadFactory,
10429 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10431 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10434 LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test(
10435 armnn::IWorkloadFactory& workloadFactory,
10436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10438 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedAsymm8>(
10439 workloadFactory, memoryManager);
10442 LayerTestResult<int16_t, 4> GatherMultiDimParamsMultiDimIndicesInt16Test(
10443 armnn::IWorkloadFactory& workloadFactory,
10444 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10446 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedSymm16>(
10447 workloadFactory, memoryManager);
10450 LayerTestResult<float, 4> DequantizeSimpleUint8Test(
10451 armnn::IWorkloadFactory& workloadFactory,
10452 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10454 return DequantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10457 LayerTestResult<float, 4> DequantizeOffsetUint8Test(
10458 armnn::IWorkloadFactory& workloadFactory,
10459 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10461 return DequantizeOffsetTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10464 LayerTestResult<float, 4> DequantizeSimpleInt16Test(
10465 armnn::IWorkloadFactory& workloadFactory,
10466 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10468 return DequantizeSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10471 LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
10472 armnn::IWorkloadFactory& workloadFactory,
10473 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10475 return QuantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10478 LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
10479 armnn::IWorkloadFactory& workloadFactory,
10480 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10482 return QuantizeClampTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10485 LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
10486 armnn::IWorkloadFactory& workloadFactory,
10487 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10489 return QuantizeClampTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);