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>
23 #include <reference/workloads/RefWorkloads.hpp>
26 #include <boost/cast.hpp>
28 #include "WorkloadTestUtils.hpp"
29 #include "Conv2dTestImpl.hpp"
30 #include "BatchNormTestImpl.hpp"
31 #include "ActivationTestImpl.hpp"
32 #include "Pooling2dTestImpl.hpp"
33 #include "FullyConnectedTestImpl.hpp"
34 #include "GatherTestImpl.hpp"
35 #include "SpaceToBatchNdTestImpl.hpp"
36 #include "SpaceToDepthTestImpl.hpp"
37 #include "SplitterTestImpl.hpp"
38 #include "SoftmaxTestImpl.hpp"
39 #include "StridedSliceTestImpl.hpp"
40 #include "NormTestImpl.hpp"
41 #include "LstmTestImpl.hpp"
42 #include "ConvertFp16ToFp32TestImpl.hpp"
43 #include "ConvertFp32ToFp16TestImpl.hpp"
44 #include "DebugTestImpl.hpp"
45 #include "DequantizeTestImpl.hpp"
46 #include "QuantizeTestImpl.hpp"
47 #include "TransposeConvolution2dTestImpl.hpp"
49 // 3-channel 16x8 image used as common input data for a number of Conv2d tests.
50 static std::vector<float> ConvInput3x8x16({
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.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,
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.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,
58 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,
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 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
66 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
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,
73 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
74 -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1
77 // 2-channel bias used by a number of Conv2d tests.
78 static std::vector<float> Bias2({0, 2});
80 struct Simple3dSoftmaxOutputData
82 const std::vector<float> outputData =
84 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
85 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f
88 const armnn::TensorShape inputShape{ 1, 8, 1 };
90 const std::vector<float> inputData =
97 struct Simple4dSoftmaxData
99 const armnn::TensorShape inputShape{ 1, 8, 1, 1 };
101 const std::vector<float> outputData = { 0.0964599f, 0.26220518f, 0.0964599f, 0.0964599f,
102 0.15903549f, 0.0964599f, 0.0964599f, 0.0964599f };
103 const std::vector<float> inputData =
110 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
111 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
112 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale)
116 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias2.size())}, ArmnnType);
117 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, 0.0f, Bias2));
122 return boost::multi_array<T, 1>();
126 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
127 LayerTestResult<T, 4> SimpleConvolution2d3x5TestCommon(
128 armnn::IWorkloadFactory& workloadFactory,
129 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
133 const armnn::DataLayout layout)
135 // Use common single-batch 3-channel 16x8 image.
136 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
137 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
139 // Use a 2-element batch with 3-channel 3x5 kernels.
140 armnn::TensorInfo kernelDesc({2, 3, 5, 3}, ArmnnType);
141 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
142 QuantizedVector<T>(qScale, qOffset, {
181 // Expected output is 2 batch elements of a 1-channel 14x4 image.
182 armnn::TensorInfo outputDesc({1, 2, 4, 14}, ArmnnType);
183 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
184 QuantizedVector<T>(qScale, qOffset, {
185 -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
186 -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
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,
189 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
190 -23.5f, -23.5f, -23.5f,
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,
194 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
195 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
198 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
203 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
210 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
211 typename T = armnn::ResolveType<ArmnnType>>
212 LayerTestResult<T, 4> SimpleConvolution2d3x3TestCommon(
213 armnn::IWorkloadFactory& workloadFactory,
214 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
218 const armnn::DataLayout layout)
220 // Use a 3x3 kernel, which exercises ArmCompute's direct convolution path.
222 // Use common single-batch 3-channel 16x8 image.
223 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
224 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
226 // Use a 2-element batch of 3-channel 3x3 kernels.
227 armnn::TensorInfo kernelDesc({2, 3, 3, 3}, ArmnnType);
228 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
229 QuantizedVector<T>(qScale, qOffset, {
256 // Expected output is 1 batch of a 2-channel 14x6 image.
257 armnn::TensorInfo outputDesc({1, 2, 6, 14}, ArmnnType);
258 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
259 QuantizedVector<T>(qScale, qOffset, {
260 -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
261 -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
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,
264 -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 -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,
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,
271 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
272 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
275 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
280 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
287 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
288 LayerTestResult<T, 4> SimpleConvolution2d3x3NhwcTestCommon(
289 armnn::IWorkloadFactory& workloadFactory,
290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
294 armnn::DataLayout dataLayout)
296 // Use common single-batch 5x5 image.
298 armnn::TensorInfo inputDesc({1, 3, 4, 1}, ArmnnType);
299 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
307 // Use a 2-element batch of 3-channel 3x3 kernels.
308 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
309 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, {
315 // Expected output is 1 batch of a 5x5 image.
316 armnn::TensorInfo outputDesc({1, 3, 4, 1}, ArmnnType);
318 const std::vector<float> outputData =
325 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
327 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
332 boost::multi_array<T, 1>(),
339 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
340 LayerTestResult<T, 4> SimpleConvolution2d3x3Stride2x2TestCommon(
341 armnn::IWorkloadFactory& workloadFactory,
342 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
346 const armnn::DataLayout& dataLayout)
348 // Input is a single-batch, 1 channel, 5x5 image.
349 armnn::TensorInfo inputDesc({1, 5, 5, 1}, ArmnnType);
350 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
360 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
361 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc,
368 // Expected output is a single-batch, 1 channel, 3x3 image.
369 armnn::TensorInfo outputDesc({1, 3, 3, 1}, ArmnnType);
371 const std::vector<T> outputData =
378 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
380 uint32_t padLeft = 1;
382 uint32_t padRight = 1;
383 uint32_t padBottom = 1;
384 uint32_t strideX = 2;
385 uint32_t strideY = 2;
387 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
392 boost::multi_array<T, 1>(),
405 LayerTestResult<float, 4> SimpleConvolution2d3x5Test(
406 armnn::IWorkloadFactory& workloadFactory,
407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
409 const armnn::DataLayout layout)
411 return SimpleConvolution2d3x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
412 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
415 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x5Uint8Test(
416 armnn::IWorkloadFactory& workloadFactory,
417 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
419 const armnn::DataLayout layout)
421 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
422 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
425 LayerTestResult<float, 4> SimpleConvolution2d3x3Test(
426 armnn::IWorkloadFactory& workloadFactory,
427 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
429 const armnn::DataLayout layout)
431 return SimpleConvolution2d3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
432 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
435 LayerTestResult<float, 4> SimpleConvolution2d3x3NhwcTest(
436 armnn::IWorkloadFactory& workloadFactory,
437 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
440 return SimpleConvolution2d3x3NhwcTestCommon<armnn::DataType::Float32>(
446 armnn::DataLayout::NHWC);
449 LayerTestResult<float, 4> SimpleConvolution2d3x3Stride2x2Test(
450 armnn::IWorkloadFactory& workloadFactory,
451 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
453 const armnn::DataLayout layout)
455 return SimpleConvolution2d3x3Stride2x2TestCommon<armnn::DataType::Float32>(
464 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x3Uint8Test(
465 armnn::IWorkloadFactory& workloadFactory,
466 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
468 const armnn::DataLayout layout)
470 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
471 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
474 LayerTestResult<int16_t, 4> SimpleConvolution2d3x5QSymm16Test(
475 armnn::IWorkloadFactory& workloadFactory,
476 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
478 const armnn::DataLayout layout)
480 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
481 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
484 LayerTestResult<int16_t, 4> SimpleConvolution2d3x3QSymm16Test(
485 armnn::IWorkloadFactory& workloadFactory,
486 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
488 const armnn::DataLayout layout)
490 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
491 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
494 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
495 typename T = armnn::ResolveType<ArmnnType>>
496 LayerTestResult<T, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon(
497 armnn::IWorkloadFactory& workloadFactory,
498 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
499 const armnn::DataLayout layout,
503 // Use a single-batch 1-channel 3x3 image as input.
504 armnn::TensorInfo inputDesc({1, 1, 3, 3}, ArmnnType);
505 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
506 QuantizedVector<T>(qScale, qOffset, {
512 // Use 1 batch of a 1-channel 2x2 kernel.
513 armnn::TensorInfo kernelDesc({1, 1, 2, 2}, ArmnnType);
514 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
515 QuantizedVector<T>(qScale, qOffset, {
520 // Expected output is 1 batch of a 1-channel 6x8 image.
521 // Manually calculated like this:
522 //[-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 ..]
523 //[-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 ..]
524 //[-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 ..]
525 //[-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 ..]
526 //[-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 ..]
527 //[-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 ..]
528 //[..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ..]
529 armnn::TensorInfo outputDesc({1, 1, 8, 6}, ArmnnType);
530 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
531 QuantizedVector<T>(qScale, qOffset, {
533 -242, -594, -934, -372, 0, 0,
534 -495, -1190, -1850, -725, 0, 0,
535 -538, -1256, -1916, -748, 0, 0,
536 -273, -626, -946, -363, 0, 0,
542 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
547 GetBias2<ArmnnBType>(false, qScale * qScale),
555 4); // Padding bottom.
558 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
559 typename T = armnn::ResolveType<ArmnnType>>
560 LayerTestResult<T, 4> SimpleConvolution2dAsymmetricPaddingTestCommon(
561 armnn::IWorkloadFactory& workloadFactory,
562 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
563 const armnn::DataLayout layout,
567 // Use a single-batch 1-channel 5x5 image as input.
568 armnn::TensorInfo inputDesc({ 1, 1, 5, 5 }, ArmnnType);
569 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
570 QuantizedVector<T>(qScale, qOffset, {
578 // Use 1 batch of a 1-channel 4x4 kernel.
579 armnn::TensorInfo kernelDesc({ 1, 1, 4, 4 }, ArmnnType);
580 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
581 QuantizedVector<T>(qScale, qOffset, {
588 // Expected output is 1 batch of a 1-channel 5x5 image.
589 armnn::TensorInfo outputDesc({ 1, 1, 5, 5 }, ArmnnType);
590 std::vector<T> myVec(outputDesc.GetNumElements(), 0);
591 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
592 QuantizedVector<T>(qScale, qOffset, {
593 -7140, -10580, -13940, -9300, -5230,
594 -9590, -14120, -18520, -12290, -6860,
595 -9980, -14560, -18960, -12560, -7000,
596 -7518, -10904, -14144, -9318, -5152,
597 -5032, -7256, -9376, -6142, -3368,
600 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
605 GetBias2<ArmnnBType>(false, qScale * qScale),
613 2); // Padding bottom.
616 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingTest(
617 armnn::IWorkloadFactory& workloadFactory,
618 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
619 armnn::DataLayout layout)
621 return SimpleConvolution2dAsymmetricPaddingTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
622 workloadFactory, memoryManager, layout, 0.0f, 0);
625 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest(
626 armnn::IWorkloadFactory& workloadFactory,
627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
628 armnn::DataLayout layout)
630 return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon
631 <armnn::DataType::Float32, armnn::DataType::Float32>(
632 workloadFactory, memoryManager, layout, 0.0f, 0);
635 LayerTestResult<float, 4> Convolution1dTest(
636 armnn::IWorkloadFactory& workloadFactory,
637 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
640 return Convolution1dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
641 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
644 LayerTestResult<uint8_t, 4> Convolution1dUint8Test(
645 armnn::IWorkloadFactory& workloadFactory,
646 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
649 return Convolution1dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
650 workloadFactory, memoryManager, 0.1f, 128, biasEnabled);
653 LayerTestResult<float,4> CompareConvolution2dTest(
654 armnn::IWorkloadFactory& workloadFactory,
655 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
656 armnn::IWorkloadFactory& refWorkloadFactory)
658 return CompareConvolution2dTestImpl<armnn::DataType::Float32>(
659 workloadFactory, memoryManager, refWorkloadFactory);
662 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
663 LayerTestResult<T, 4> Convolution2d3x3DilationTestCommon(
664 armnn::IWorkloadFactory& workloadFactory,
665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
666 const std::vector<float>& inputNoQuantizedValues,
667 armnn::TensorInfo& inputTensorInfo,
668 const std::vector<float>& kernelNoQuantizedValues,
669 armnn::TensorInfo& kernelTensorInfo,
670 const std::vector<float>& outputExpectedNoQuantizedValues,
671 armnn::TensorInfo& outputTensorInfo,
674 armnn::DataLayout layout = armnn::DataLayout::NCHW,
675 uint32_t padLeft = 0,
677 uint32_t padRight = 0,
678 uint32_t padBottom = 0,
679 uint32_t strideX = 1,
680 uint32_t strideY = 1,
681 bool biasEnabled = false
688 case armnn::DataType::QuantisedAsymm8:
694 case armnn::DataType::QuantisedSymm16:
700 case armnn::DataType::Float32:
709 inputTensorInfo.SetQuantizationScale(qScale);
710 inputTensorInfo.SetQuantizationOffset(qOffset);
711 kernelTensorInfo.SetQuantizationScale(qScale);
712 kernelTensorInfo.SetQuantizationOffset(qOffset);
713 outputTensorInfo.SetQuantizationScale(qScale);
714 outputTensorInfo.SetQuantizationOffset(qOffset);
716 auto input = MakeTensor<T, 4>(inputTensorInfo,
717 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
718 inputTensorInfo.GetQuantizationOffset(),
719 inputNoQuantizedValues)));
720 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
721 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
722 kernelTensorInfo.GetQuantizationOffset(),
723 kernelNoQuantizedValues)));
724 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
725 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
726 outputTensorInfo.GetQuantizationOffset(),
727 outputExpectedNoQuantizedValues)));
729 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
734 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
749 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
750 LayerTestResult<T, 4> Convolution2d3x3Dilation3x3Test(
751 armnn::IWorkloadFactory& workloadFactory,
752 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
754 const armnn::DataLayout layout)
756 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
757 std::vector<float> inputNoQuantizedValues =
759 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
760 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
761 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
762 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
763 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
764 0, 0, 0, 0, 1, 1, 1, 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,
767 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
768 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
771 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
772 std::vector<float> kernelNoQuantizedValues =
779 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
780 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
781 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
782 std::vector<float> outputExpectedNoQuantizedValues =
790 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
793 inputNoQuantizedValues,
795 kernelNoQuantizedValues,
797 outputExpectedNoQuantizedValues,
805 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
806 LayerTestResult<T, 4> Convolution2d2x3x3Dilation3x3Test(
807 armnn::IWorkloadFactory& workloadFactory,
808 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
810 const armnn::DataLayout layout)
812 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
813 std::vector<float> inputNoQuantizedValues =
815 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
816 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
817 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
818 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
819 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
820 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
821 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
822 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
823 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
824 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, 0, 0, 0, 0, 0, 0,
828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
829 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
830 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
831 0, 0, 0, 0, 1, 1, 1, 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,
834 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
835 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
838 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
839 std::vector<float> kernelNoQuantizedValues =
850 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
851 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
852 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
853 std::vector<float> outputExpectedNoQuantizedValues =
861 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
864 inputNoQuantizedValues,
866 kernelNoQuantizedValues,
868 outputExpectedNoQuantizedValues,
876 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
877 LayerTestResult<T, 4> Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test(
878 armnn::IWorkloadFactory &workloadFactory,
879 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
881 const armnn::DataLayout layout)
883 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
884 std::vector<float> inputNoQuantizedValues =
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,
894 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
895 1, 1, 1, 1, 1, 1, 1, 1, 1, 1
898 armnn::TensorInfo kernelTensorInfo({ 1, 1, 2, 2}, ArmnnType);
899 std::vector<float> kernelNoQuantizedValues =
905 // 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,
906 // therefore the output will be 4x4: (I − K + 2P)/S +1 => trunc ( (10 - 3 + 2x2 ) / 3 + 1 )
907 // where, dilation size = d = 2; kernel size = K = 2; input size = I = 10; padding size = P = 2; stride = S = 3
908 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
909 std::vector<float> outputExpectedNoQuantizedValues =
916 uint32_t padLeft = 1;
918 uint32_t padRight = 1;
919 uint32_t padBottom = 1;
921 return Convolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
924 inputNoQuantizedValues,
926 kernelNoQuantizedValues,
928 outputExpectedNoQuantizedValues,
943 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
944 Convolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
945 armnn::IWorkloadFactory&,
946 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
950 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
951 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
952 armnn::IWorkloadFactory&,
953 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
957 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
958 Convolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
959 armnn::IWorkloadFactory&,
960 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
964 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
965 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
966 armnn::IWorkloadFactory&,
967 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
971 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
972 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
973 armnn::IWorkloadFactory&,
974 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
978 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
979 Convolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
980 armnn::IWorkloadFactory&,
981 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
985 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
986 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
987 armnn::IWorkloadFactory &workloadFactory,
988 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
990 const armnn::DataLayout layout);
992 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
993 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
994 armnn::IWorkloadFactory &workloadFactory,
995 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
997 const armnn::DataLayout layout);
999 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1000 Convolution2d2x2Dilation2x2Padding2x2Stride3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1001 armnn::IWorkloadFactory &workloadFactory,
1002 const armnn::IBackendInternal::IMemoryManagerSharedPtr &memoryManager,
1004 const armnn::DataLayout layout);
1006 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1007 typename T = armnn::ResolveType<ArmnnType>>
1008 LayerTestResult<T, 4> DepthwiseConvolution2dAsymmetricTestCommon(
1009 armnn::IWorkloadFactory& workloadFactory,
1010 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1014 const armnn::DataLayout layout)
1016 // Use a single-batch 2-channel 5x5 image as input.
1017 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1018 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1019 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1034 // Use a depth multiplier of 1 on a 2-channel 4x4 kernel.
1035 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1036 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1037 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1050 // Expected output is 1 batch of a 2-channel 5x5 image.
1051 // Calculated using the python tensorflow library with strideX=1, strideY=1.
1052 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
1053 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1054 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1056 1062, 1580, 1850, 1530, 1117,
1057 2140, 3108, 3500, 2842, 2042,
1058 3580, 5068, 5460, 4342, 3062,
1059 3618, 5072, 5390, 4248, 2971,
1060 3074, 4282, 4510, 3533, 2457,
1062 1550, 2284, 2362, 1955, 1428,
1063 2910, 4206, 4342, 3528, 2536,
1064 3390, 4886, 5022, 4068, 2916,
1065 3566, 5056, 5182, 4133, 2922,
1066 3100, 4352, 4452, 3517, 2465
1069 return DepthwiseConvolution2dAsymmetricTestImpl<ArmnnType, ArmnnBType>(
1074 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1081 2, // Padding right.
1082 2, // Padding bottom.
1087 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1088 typename T = armnn::ResolveType<ArmnnType>>
1089 LayerTestResult<T, 4> DepthwiseConvolution2dNhwcTestCommon(
1090 armnn::IWorkloadFactory& workloadFactory,
1091 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1096 auto layout = armnn::DataLayout::NHWC;
1098 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1099 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1100 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1115 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
1116 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1117 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1130 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5}, ArmnnType);
1131 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1132 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1134 1062, 1580, 1850, 1530, 1117,
1135 2140, 3108, 3500, 2842, 2042,
1136 3580, 5068, 5460, 4342, 3062,
1137 3618, 5072, 5390, 4248, 2971,
1138 3074, 4282, 4510, 3533, 2457,
1140 1550, 2284, 2362, 1955, 1428,
1141 2910, 4206, 4342, 3528, 2536,
1142 3390, 4886, 5022, 4068, 2916,
1143 3566, 5056, 5182, 4133, 2922,
1144 3100, 4352, 4452, 3517, 2465
1147 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1152 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1159 2, // Padding right.
1160 2, // Padding bottom.
1165 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
1166 typename T = armnn::ResolveType<ArmnnType>>
1167 LayerTestResult<T, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon(
1168 armnn::IWorkloadFactory& workloadFactory,
1169 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1174 auto layout = armnn::DataLayout::NHWC;
1176 armnn::TensorInfo inputTensorInfo({ 1, 1, 9, 9}, ArmnnType);
1177 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
1178 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(),
1180 0, 0, 0, 0, 0, 0, 0, 0, 0,
1181 0, 0, 0, 0, 0, 0, 0, 0, 0,
1182 0, 0, 0, 0, 0, 0, 0, 0, 0,
1183 0, 0, 0, 1, 1, 1, 0, 0, 0,
1184 0, 0, 0, 1, 1, 1, 0, 0, 0,
1185 0, 0, 0, 1, 1, 1, 0, 0, 0,
1186 0, 0, 0, 0, 0, 0, 0, 0, 0,
1187 0, 0, 0, 0, 0, 0, 0, 0, 0,
1188 0, 0, 0, 0, 0, 0, 0, 0, 0
1191 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1192 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
1193 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(),
1200 uint32_t padLeft = 0;
1201 uint32_t padTop = 0;
1202 uint32_t padRight = 0;
1203 uint32_t padBottom = 0;
1204 uint32_t strideX = 1;
1205 uint32_t strideY = 1;
1206 uint32_t dilationX = 3;
1207 uint32_t dilationY = 3;
1209 // Since the dilation rate is 3 this will reduce the size of the output from 9x9 to 3x3 of all 5s.
1210 armnn::TensorInfo outputTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1211 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
1212 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(),
1219 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1224 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1240 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
1241 LayerTestResult<T, 4> DepthwiseConvolution2d3x3DilationTestCommon(
1242 armnn::IWorkloadFactory& workloadFactory,
1243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1244 const std::vector<float>& inputNoQuantizedValues,
1245 armnn::TensorInfo& inputTensorInfo,
1246 const std::vector<float>& kernelNoQuantizedValues,
1247 armnn::TensorInfo& kernelTensorInfo,
1248 const std::vector<float>& outputExpectedNoQuantizedValues,
1249 armnn::TensorInfo& outputTensorInfo,
1252 armnn::DataLayout layout = armnn::DataLayout::NCHW,
1253 bool biasEnabled = false)
1259 case armnn::DataType::QuantisedAsymm8:
1265 case armnn::DataType::QuantisedSymm16:
1271 case armnn::DataType::Float32:
1280 inputTensorInfo.SetQuantizationScale(qScale);
1281 inputTensorInfo.SetQuantizationOffset(qOffset);
1282 kernelTensorInfo.SetQuantizationScale(qScale);
1283 kernelTensorInfo.SetQuantizationOffset(qOffset);
1284 outputTensorInfo.SetQuantizationScale(qScale);
1285 outputTensorInfo.SetQuantizationOffset(qOffset);
1287 auto input = MakeTensor<T, 4>(inputTensorInfo,
1288 std::vector<T>(QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(),
1289 inputTensorInfo.GetQuantizationOffset(),
1290 inputNoQuantizedValues)));
1291 auto kernel = MakeTensor<T, 4>(kernelTensorInfo,
1292 std::vector<T>(QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(),
1293 kernelTensorInfo.GetQuantizationOffset(),
1294 kernelNoQuantizedValues)));
1295 auto expectedOutput = MakeTensor<T, 4>(outputTensorInfo,
1296 std::vector<T>(QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(),
1297 outputTensorInfo.GetQuantizationOffset(),
1298 outputExpectedNoQuantizedValues)));
1300 uint32_t padLeft = 0;
1301 uint32_t padTop = 0;
1302 uint32_t padRight = 0;
1303 uint32_t padBottom = 0;
1304 uint32_t strideX = 1;
1305 uint32_t strideY = 1;
1307 return DepthwiseConvolution2dTestImpl<ArmnnType, ArmnnBType>(
1312 GetBias2<ArmnnBType>(biasEnabled, qScale * qScale),
1327 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1328 LayerTestResult<T, 4> DepthwiseConvolution2d3x3Dilation3x3Test(
1329 armnn::IWorkloadFactory& workloadFactory,
1330 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1332 const armnn::DataLayout layout)
1334 armnn::TensorInfo inputTensorInfo({1, 1, 10, 10}, ArmnnType);
1335 std::vector<float> inputNoQuantizedValues =
1337 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1338 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1339 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1340 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1341 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1342 0, 0, 0, 0, 1, 1, 1, 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,
1345 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1346 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1349 armnn::TensorInfo kernelTensorInfo({ 1, 1, 3, 3}, ArmnnType);
1350 std::vector<float> kernelNoQuantizedValues =
1357 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1358 // therefore the output will be 4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1359 armnn::TensorInfo outputTensorInfo({ 1, 1, 4, 4}, ArmnnType);
1360 std::vector<float> outputExpectedNoQuantizedValues =
1368 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1371 inputNoQuantizedValues,
1373 kernelNoQuantizedValues,
1375 outputExpectedNoQuantizedValues,
1383 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T>
1384 LayerTestResult<T, 4> DepthwiseConvolution2d2x3x3Dilation3x3Test(
1385 armnn::IWorkloadFactory& workloadFactory,
1386 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1388 const armnn::DataLayout layout)
1390 armnn::TensorInfo inputTensorInfo({1, 2, 10, 10}, ArmnnType);
1391 std::vector<float> inputNoQuantizedValues =
1393 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1394 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1395 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1396 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1397 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1398 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1399 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1400 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1401 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1402 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, 0, 0, 0, 0, 0, 0,
1406 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1407 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1408 0, 0, 0, 0, 1, 1, 1, 0, 0, 0,
1409 0, 0, 0, 0, 1, 1, 1, 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,
1412 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
1413 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
1416 armnn::TensorInfo kernelTensorInfo({ 1, 2, 3, 3}, ArmnnType);
1417 std::vector<float> kernelNoQuantizedValues =
1428 // Since the dilation rate is 3 this will dilate the kernel to be like 7x7,
1429 // therefore the output will be 2x4x4: (I−K+2P)/S +1 => (10-7 +0)/1 +1
1430 armnn::TensorInfo outputTensorInfo({ 1, 2, 4, 4}, ArmnnType);
1431 std::vector<float> outputExpectedNoQuantizedValues =
1444 return DepthwiseConvolution2d3x3DilationTestCommon<ArmnnType, ArmnnBType>(
1447 inputNoQuantizedValues,
1449 kernelNoQuantizedValues,
1451 outputExpectedNoQuantizedValues,
1460 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1461 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1462 armnn::IWorkloadFactory&,
1463 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1467 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1468 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1469 armnn::IWorkloadFactory&,
1470 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1474 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1475 DepthwiseConvolution2d3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1476 armnn::IWorkloadFactory&,
1477 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1481 template LayerTestResult<armnn::ResolveType<armnn::DataType::Float32>, 4>
1482 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::Float32, armnn::DataType::Float32>(
1483 armnn::IWorkloadFactory&,
1484 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1488 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedAsymm8>, 4>
1489 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1490 armnn::IWorkloadFactory&,
1491 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1495 template LayerTestResult<armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
1496 DepthwiseConvolution2d2x3x3Dilation3x3Test<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1497 armnn::IWorkloadFactory&,
1498 const armnn::IBackendInternal::IMemoryManagerSharedPtr&,
1502 LayerTestResult<float, 4> DepthwiseConvolution2dTest(
1503 armnn::IWorkloadFactory& workloadFactory,
1504 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1506 const armnn::DataLayout layout)
1508 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1509 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1512 LayerTestResult<float, 4> DepthwiseConvolution2dDepthNhwcTest(
1513 armnn::IWorkloadFactory& workloadFactory,
1514 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1517 return DepthwiseConvolution2dNhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1518 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
1521 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul1Test(
1522 armnn::IWorkloadFactory& workloadFactory,
1523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1525 const armnn::DataLayout layout)
1527 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1528 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1531 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul64Test(
1532 armnn::IWorkloadFactory& workloadFactory,
1533 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1535 armnn::TensorInfo inputTensorInfo({ 1, 1, 2, 2 }, armnn::DataType::Float32);
1536 auto input = MakeTensor<float, 4>(inputTensorInfo, { 1.f, 2.f, 3.f, 4.f });
1538 std::vector<float> kernelData;
1539 std::vector<float> singleDepthKernel{ 1.f, -1.f, -1.f, 1.f };
1540 for (unsigned int i = 0; i < 64; ++i)
1542 kernelData.insert(kernelData.end(), singleDepthKernel.begin(), singleDepthKernel.end());
1544 armnn::TensorInfo kernelTensorInfo({ 64, 1, 2, 2 }, armnn::DataType::Float32);
1545 auto kernel = MakeTensor<float, 4>(kernelTensorInfo, kernelData);
1547 std::vector<float> expectedOutputData(64, 0.f);
1548 armnn::TensorInfo outputTensorInfo({ 1, 64, 1, 1 }, armnn::DataType::Float32);
1549 auto expectedOutput = MakeTensor<float, 4>(outputTensorInfo, expectedOutputData);
1551 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
1556 boost::multi_array<float, 1>(),
1560 armnn::DataLayout::NCHW);
1563 LayerTestResult<float, 4> DepthwiseConvolution2dAsymmetricTest(
1564 armnn::IWorkloadFactory& workloadFactory,
1565 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1567 const armnn::DataLayout layout)
1569 return DepthwiseConvolution2dAsymmetricTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1570 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
1573 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dUint8Test(
1574 armnn::IWorkloadFactory& workloadFactory,
1575 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1577 const armnn::DataLayout layout)
1579 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1580 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1583 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dDepthMul1Uint8Test(
1584 armnn::IWorkloadFactory& workloadFactory,
1585 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1587 const armnn::DataLayout layout)
1589 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
1590 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1593 LayerTestResult<float, 4> SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTest(
1594 armnn::IWorkloadFactory& workloadFactory,
1595 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1597 return SimpleDepthwiseConvolution2d3x3Dilation3x3NhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
1605 LayerTestResult<int16_t, 4> DepthwiseConvolution2dInt16Test(
1606 armnn::IWorkloadFactory& workloadFactory,
1607 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1609 const armnn::DataLayout layout)
1611 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1612 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1615 LayerTestResult<int16_t, 4> DepthwiseConvolution2dDepthMul1Int16Test(
1616 armnn::IWorkloadFactory& workloadFactory,
1617 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1619 const armnn::DataLayout layout)
1621 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
1622 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
1625 LayerTestResult<float, 4> CompareDepthwiseConvolution2dFloatTest(
1626 armnn::IWorkloadFactory& workloadFactory,
1627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1628 armnn::IWorkloadFactory& refWorkloadFactory,
1629 const armnn::DataLayout layout)
1631 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::Float32>(
1632 workloadFactory, memoryManager, refWorkloadFactory, layout);
1635 LayerTestResult<uint8_t, 4> CompareDepthwiseConvolution2dUint8Test(
1636 armnn::IWorkloadFactory& workloadFactory,
1637 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1638 armnn::IWorkloadFactory& refWorkloadFactory,
1639 const armnn::DataLayout layout)
1641 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8>(
1642 workloadFactory, memoryManager, refWorkloadFactory, layout);
1645 LayerTestResult<float,4> SimpleNormalizationAcrossTest(
1646 armnn::IWorkloadFactory& workloadFactory,
1647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1649 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1650 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1651 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1654 LayerTestResult<float,4> SimpleNormalizationWithinTest(
1655 armnn::IWorkloadFactory& workloadFactory,
1656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1658 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1659 auto normChannel = armnn::NormalizationAlgorithmChannel::Within;
1660 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1663 LayerTestResult<float,4> SimpleNormalizationAcrossNhwcTest(
1664 armnn::IWorkloadFactory& workloadFactory,
1665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1667 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
1668 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
1669 return SimpleNormalizationNhwcTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
1672 LayerTestResult<float,2> SimpleSoftmaxTest(
1673 armnn::IWorkloadFactory& workloadFactory,
1674 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1677 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
1680 LayerTestResult<float,2> SimpleAxisSoftmaxTest(
1681 armnn::IWorkloadFactory& workloadFactory,
1682 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1686 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, axis);
1689 LayerTestResult<float,3> Simple3dSoftmaxTest(
1690 armnn::IWorkloadFactory& workloadFactory,
1691 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1694 Simple3dSoftmaxOutputData data;
1695 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
1696 data.inputShape, data.outputData, data.inputData);
1699 LayerTestResult<float,3> Simple3dAxisSoftmaxTest(
1700 armnn::IWorkloadFactory& workloadFactory,
1701 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1705 armnn::TensorShape inputShape;
1706 std::vector<float> inputData;
1707 std::vector<float> outputData;
1713 inputShape = {5, 2, 2};
1717 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1719 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
1724 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1726 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1729 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1731 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1732 7.246299848982885e-08f
1739 inputShape = {2, 5, 2};
1743 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1745 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
1750 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1752 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1753 7.246299848982885e-08f,
1755 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1757 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1758 7.246299848982885e-08f
1765 inputShape = {2, 2, 5};
1769 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1770 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
1775 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1776 7.246299848982885e-08f,
1777 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1778 7.246299848982885e-08f,
1780 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1781 7.246299848982885e-08f,
1782 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1783 7.246299848982885e-08f
1789 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta,
1790 inputShape, outputData, inputData, axis);
1793 LayerTestResult<float,4> Simple4dSoftmaxTest(
1794 armnn::IWorkloadFactory& workloadFactory,
1795 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1798 Simple4dSoftmaxData data;
1799 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, data.inputShape,
1800 data.outputData, data.inputData);
1803 LayerTestResult<float,4> Simple4dAxisSoftmaxTest(
1804 armnn::IWorkloadFactory& workloadFactory,
1805 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1809 armnn::TensorShape inputShape;
1810 std::vector<float> inputData;
1811 std::vector<float> outputData;
1817 inputShape = {5, 2, 2, 2};
1821 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f,
1822 16.0f, -2.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f, 15.0f, -3.0f,
1823 15.0f, -3.0f, 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 14.0f, -4.0f,
1824 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f, 1.0f, -17.0f
1829 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1831 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.236882800924671f,
1833 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.236882800924671f,
1835 0.236882800924671f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
1838 0.087144312427294f, 0.087144312427294f, 0.087144312427294f, 0.087144312427294f,
1840 0.032058600957022f, 0.032058600957022f, 0.032058600957022f, 0.032058600957022f,
1842 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1843 7.246299848982885e-08f,
1844 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1845 7.246299848982885e-08f, 7.246299848982885e-08f
1852 inputShape = {2, 5, 2, 2};
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,
1858 17.0f, -1.0f, 17.0f, -1.0f, 16.0f, -2.0f, 16.0f, -2.0f, 15.0f, -3.0f,
1859 15.0f, -3.0f, 14.0f, -4.0f, 14.0f, -4.0f, 1.0f, -17.0f, 1.0f, -17.0f
1864 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1866 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1868 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1870 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1871 7.246299848982885e-08f,
1874 0.643914213228014f, 0.643914213228014f, 0.643914213228014f, 0.643914213228014f,
1876 0.236882800924671f, 0.236882800924671f, 0.236882800924671f, 0.087144312427294f,
1878 0.087144312427294f, 0.087144312427294f, 0.032058600957022f, 0.032058600957022f,
1880 0.032058600957022f, 7.246299848982885e-08f, 7.246299848982885e-08f, 7.246299848982885e-08f,
1881 7.246299848982885e-08f
1888 inputShape = {2, 2, 5, 2};
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,
1894 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f,
1895 17.0f, -1.0f, 16.0f, -2.0f, 15.0f, -3.0f, 14.0f, -4.0f, 1.0f, -17.0f
1900 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1902 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1903 7.246299848982885e-08f,
1904 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1906 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1907 7.246299848982885e-08f,
1909 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1911 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1912 7.246299848982885e-08f,
1913 0.643914213228014f, 0.643914213228014f, 0.236882800924671f, 0.236882800924671f,
1915 0.087144312427294f, 0.032058600957022f, 0.032058600957022f, 7.246299848982885e-08f,
1916 7.246299848982885e-08f
1923 inputShape = {2, 2, 2, 5};
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,
1929 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f,
1930 17.0f, 16.0f, 15.0f, 14.0f, 1.0f, -1.0f, -2.0f, -3.0f, -4.0f, -17.0f
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,
1941 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1942 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,
1950 0.643914213228014f, 0.236882800924671f, 0.087144312427294f, 0.032058600957022f,
1951 7.246299848982885e-08f
1957 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta, inputShape,
1958 outputData, inputData, axis);
1961 LayerTestResult<uint8_t,2> SimpleSoftmaxUint8Test(
1962 armnn::IWorkloadFactory& workloadFactory,
1963 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1966 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
1969 LayerTestResult<uint8_t,3> Simple3dSoftmaxUint8Test(
1970 armnn::IWorkloadFactory& workloadFactory,
1971 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1974 Simple3dSoftmaxOutputData data;
1975 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
1976 data.inputShape, data.outputData, data.inputData);
1979 LayerTestResult<uint8_t,4> Simple4dSoftmaxUint8Test(
1980 armnn::IWorkloadFactory& workloadFactory,
1981 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1984 Simple4dSoftmaxData data;
1986 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta,
1987 data.inputShape, data.outputData, data.inputData);
1990 LayerTestResult<int16_t,2> SimpleSoftmaxUint16Test(
1991 armnn::IWorkloadFactory& workloadFactory,
1992 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1995 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta);
1998 LayerTestResult<int16_t,3> Simple3dSoftmaxUint16Test(
1999 armnn::IWorkloadFactory& workloadFactory,
2000 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2003 Simple3dSoftmaxOutputData data;
2004 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2005 data.inputShape, data.outputData, data.inputData);
2008 LayerTestResult<int16_t,4> Simple4dSoftmaxUint16Test(
2009 armnn::IWorkloadFactory& workloadFactory,
2010 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2013 Simple4dSoftmaxData data;
2015 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, beta,
2016 data.inputShape, data.outputData, data.inputData);
2019 LayerTestResult<float,4> CompareNormalizationTest(
2020 armnn::IWorkloadFactory& workloadFactory,
2021 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2022 armnn::IWorkloadFactory& refWorkloadFactory,
2023 armnn::NormalizationAlgorithmChannel normChannel,
2024 armnn::NormalizationAlgorithmMethod normMethod)
2026 return CompareNormalizationTestImpl(workloadFactory, memoryManager, refWorkloadFactory, normChannel, normMethod);
2029 LayerTestResult<float,2> CompareSoftmaxTest(
2030 armnn::IWorkloadFactory& workloadFactory,
2031 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2032 armnn::IWorkloadFactory& refWorkloadFactory,
2035 return CompareSoftmaxTestImpl<armnn::DataType::Float32>(
2036 workloadFactory, memoryManager, refWorkloadFactory, beta);
2039 LayerTestResult<uint8_t,2> CompareSoftmaxUint8Test(
2040 armnn::IWorkloadFactory& workloadFactory,
2041 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2042 armnn::IWorkloadFactory& refWorkloadFactory,
2045 return CompareSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(
2046 workloadFactory, memoryManager, refWorkloadFactory, beta);
2049 std::vector<LayerTestResult<float,3>> SplitterTest(
2050 armnn::IWorkloadFactory& workloadFactory,
2051 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2053 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
2056 std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
2057 armnn::IWorkloadFactory& workloadFactory,
2058 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2060 return SplitterTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2063 std::vector<LayerTestResult<int16_t,3>> SplitterInt16Test(
2064 armnn::IWorkloadFactory& workloadFactory,
2065 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2067 return SplitterTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2070 LayerTestResult<float, 3> CopyViaSplitterTest(
2071 armnn::IWorkloadFactory& workloadFactory,
2072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2074 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
2077 LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
2078 armnn::IWorkloadFactory& workloadFactory,
2079 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2081 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
2084 LayerTestResult<int16_t, 3> CopyViaSplitterInt16Test(
2085 armnn::IWorkloadFactory& workloadFactory,
2086 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2088 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
2091 void LstmUtilsZeroVectorTest()
2093 armnn::TensorInfo inputDesc({4}, armnn::DataType::Float32);
2094 boost::multi_array<float, 1> input = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2097 boost::multi_array<float, 1> expectedOutput = MakeTensor<float, 1>(inputDesc, std::vector<float>(
2100 return LstmUtilsZeroVectorTestImpl<armnn::DataType::Float32>(input, 4, expectedOutput);
2103 void LstmUtilsMeanStddevNormalizationNoneZeroInputTest()
2105 uint32_t batchSize = 2;
2106 uint32_t vecSize = 4;
2107 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2108 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2109 { 0.1f, 0.2f, 0.3f, 0.4f, //batch 0
2110 0.9f, 1.0f, 1.1f, 1.2f })); //batch 1
2112 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2113 { -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f, //batch 0
2114 -1.34163153f, -0.447210163f, 0.447211236f, 1.3416326f })); //batch 1
2116 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2117 vecSize, batchSize, expectedOutput);
2120 void LstmUtilsMeanStddevNormalizationAllZeroInputTest()
2122 uint32_t batchSize = 2;
2123 uint32_t vecSize = 4;
2124 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2125 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2126 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2127 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2129 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2130 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2131 0.0f, 0.0f, 0.0f, 0.0f })); //batch 1
2133 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2134 vecSize, batchSize, expectedOutput);
2137 void LstmUtilsMeanStddevNormalizationMixedZeroInputTest()
2139 uint32_t batchSize = 2;
2140 uint32_t vecSize = 4;
2141 armnn::TensorInfo inputDesc({batchSize, vecSize}, armnn::DataType::Float32);
2142 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2143 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2144 0.1f, 0.2f, 0.3f, 0.4f })); //batch 1
2146 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2147 { 0.0f, 0.0f, 0.0f, 0.0f, //batch 0
2148 -1.34164071f, -0.447213531f, 0.44721365f, 1.34164071f })); //batch 1
2150 return LstmUtilsMeanStddevNormalizationTestImpl<armnn::DataType::Float32>(input,
2151 vecSize, batchSize, expectedOutput);
2155 void LstmUtilsVectorBatchVectorCwiseProductTest()
2157 uint32_t batchSize = 4;
2158 uint32_t vecSize = 29;
2159 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2160 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2161 { 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2162 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2163 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f}));
2165 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2166 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2168 1.1f, 2.2f, 3.3f, 4.4f, 5.5f, 6.6f, 7.7f, 8.8f, 9.9f, 10.1f,
2169 11.11f, 12.12f, 13.13f, 14.14f, 15.15f, 16.16f, 17.17f, 18.18f, 19.19f, 20.2f,
2170 21.21f, 22.22f, 23.23f, 24.24f, 25.25f, 26.26f, 27.27f, 28.28f, 0.0f,
2172 -1.1f, -2.2f, -3.3f, -4.4f, -5.5f, -6.6f, -7.7f, -8.8f, -9.9f, -10.1f,
2173 -11.11f, -12.12f, -13.13f, -14.14f, -15.15f, -16.16f, -17.17f, -18.18f, -19.19f, -20.2f,
2174 -21.21f, -22.22f, -23.23f, -24.24f, -25.25f, -26.26f, -27.27f, -28.28f, 0.0f,
2176 1.1f, -2.2f, 3.3f, -4.4f, 5.5f, -6.6f, 7.7f, -8.8f, 9.9f, -10.1f,
2177 11.11f, -12.12f, 13.13f, -14.14f, 15.15f, -16.16f, 17.17f, -18.18f, 19.19f, -20.2f,
2178 21.21f, -22.22f, 23.23f, -24.24f, 25.25f, -26.26f, 27.27f, -28.28f, 0.0f,
2180 -1.1f, 2.2f, -3.3f, 4.4f, -5.5f, 6.6f, -7.7f, 8.8f, -9.9f, 10.1f,
2181 -11.11f, 12.12f, -13.13f, 14.14f, -15.15f, 16.16f, -17.17f, 18.18f, -19.19f, 20.2f,
2182 -21.21f, 22.22f, -23.23f, 24.24f, -25.25f, 26.26f, -27.27f, 28.28f, 0.0f}));
2184 // Expect output = input * output + output.
2185 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2187 1.210000f, 4.840000f, 10.889999f, 19.360001f, 30.250000f, 43.559998f,
2188 59.289997f, 77.440002f, 98.009995f, 102.010010f, 123.432091f, 146.894394f,
2189 172.396896f, 199.939606f, 229.522491f, 261.145599f, 294.808899f, 330.512421f,
2190 368.256134f, 408.040039f, 449.864075f, 493.728363f, 539.632874f, 587.577576f,
2191 637.562500f, 689.587585f, 743.652954f, 799.758423f, 0.000000f,
2193 -1.210000f, -4.840000f, -10.889999f, -19.360001f, -30.250000f, -43.559998f,
2194 -59.289997f, -77.440002f, -98.009995f, -102.010010f, -123.432091f, -146.894394f,
2195 -172.396896f, -199.939606f, -229.522491f, -261.145599f, -294.808899f, -330.512421f,
2196 -368.256134f, -408.040039f, -449.864075f, -493.728363f, -539.632874f, -587.577576f,
2197 -637.562500f, -689.587585f, -743.652954f, -799.758423f, 0.000000f,
2199 1.210000f, -4.840000f, 10.889999f, -19.360001f, 30.250000f, -43.559998f,
2200 59.289997f, -77.440002f, 98.009995f, -102.010010f, 123.432091f, -146.894394f,
2201 172.396896f, -199.939606f, 229.522491f, -261.145599f, 294.808899f, -330.512421f,
2202 368.256134f, -408.040039f, 449.864075f, -493.728363f, 539.632874f, -587.577576f,
2203 637.562500f, -689.587585f, 743.652954f, -799.758423f, 0.000000f,
2205 -1.210000f, 4.840000f, -10.889999f, 19.360001f, -30.250000f, 43.559998f,
2206 -59.289997f, 77.440002f, -98.009995f, 102.010010f, -123.432091f, 146.894394f,
2207 -172.396896f, 199.939606f, -229.522491f, 261.145599f, -294.808899f, 330.512421f,
2208 -368.256134f, 408.040039f, -449.864075f, 493.728363f, -539.632874f, 587.577576f,
2209 -637.562500f, 689.587585f, -743.652954f, 799.758423f, 0.000000f}));
2211 return LstmUtilsVectorBatchVectorCwiseProductTestImpl<armnn::DataType::Float32>(vector, batchVector,
2212 vecSize, batchSize, expectedOutput);
2216 void LstmUtilsVectorBatchVectorAddTest()
2218 uint32_t batchSize = 2;
2219 uint32_t vecSize = 3;
2220 armnn::TensorInfo vecDesc({vecSize}, armnn::DataType::Float32);
2221 boost::multi_array<float, 1> vector = MakeTensor<float, 1>(vecDesc, std::vector<float>(
2222 { 0.0f, -0.5f, 1.0f}));
2224 armnn::TensorInfo batchVecDesc({batchSize, vecSize}, armnn::DataType::Float32);
2225 boost::multi_array<float, 2> batchVector = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2226 { 1.0f, 2.0f, 3.0f, //batch 0
2227 4.0f, 5.0f, 6.0f})); //batch 1
2229 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(batchVecDesc, std::vector<float>(
2231 4.0f, 4.5f, 7.0f}));
2233 return LstmUtilsVectorBatchVectorAddTestImpl<armnn::DataType::Float32>(vector, batchVector,
2234 vecSize, batchSize, expectedOutput);
2238 LayerTestResult<float, 2> LstmLayerFloat32WithCifgWithPeepholeNoProjectionTest(
2239 armnn::IWorkloadFactory& workloadFactory,
2240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2242 armnn::TensorInfo inputDesc({ 2, 2 }, armnn::DataType::Float32);
2243 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2244 { 2., 3., 3., 4. }));
2246 armnn::TensorInfo outputDesc({ 2, 4 }, armnn::DataType::Float32);
2247 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2248 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2249 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f}));
2250 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2251 workloadFactory, memoryManager, input, expectedOutput);
2254 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(
2255 armnn::IWorkloadFactory& workloadFactory,
2256 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2258 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2259 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2260 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2261 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f}));
2263 armnn::TensorInfo outputDesc({ 2, 16 }, armnn::DataType::Float32);
2264 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2265 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2266 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2267 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2268 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2269 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2270 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f,
2272 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<armnn::DataType::Float32>(
2273 workloadFactory, memoryManager, input, expectedOutput);
2276 LayerTestResult<float, 2> LstmLayerFloat32NoCifgNoPeepholeNoProjectionTest(
2277 armnn::IWorkloadFactory& workloadFactory,
2278 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2280 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::Float32);
2281 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2285 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::Float32);
2286 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2287 {{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2288 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}}));
2290 return LstmNoCifgNoPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
2291 workloadFactory, memoryManager, input, expectedOutput);
2295 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionWithLayerNormTest(
2296 armnn::IWorkloadFactory& workloadFactory,
2297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2299 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
2300 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
2301 {0.7f, 0.8f, 0.1f, 0.2f, 0.3f, //batch 0
2302 0.3f, 0.2f, 0.9f, 0.8f, 0.1f})); //batch 1
2304 armnn::TensorInfo outputDesc({ 2, 3 }, armnn::DataType::Float32);
2305 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
2306 { 0.0244077f, 0.128027f, -0.00170918f, //batch 0
2307 -0.00692428f, 0.0848741f, 0.063445f})); //batch 1
2308 return LstmLayerNoCifgWithPeepholeWithProjectionWithLayerNormTestImpl<armnn::DataType::Float32>(
2309 workloadFactory, memoryManager, input, expectedOutput);
2313 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionTest(
2314 armnn::IWorkloadFactory& workloadFactory,
2315 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2317 const float qScale = 1.0f;
2318 const int32_t qOffset = 0;
2320 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2321 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2323 armnn::TensorInfo inputDesc({2, 2}, datatype);
2324 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2325 std::vector<float>{2., 3., 3., 4.}));
2327 armnn::TensorInfo outputDesc({2, 4}, datatype);
2328 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2329 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2330 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2332 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2333 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2337 LayerTestResult<int16_t, 2> LstmLayerInt16WithCifgWithPeepholeNoProjectionTest(
2338 armnn::IWorkloadFactory& workloadFactory,
2339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2341 const float qScale = 1.0f;
2342 const int32_t qOffset = 0;
2344 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2345 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2347 armnn::TensorInfo inputDesc({ 2, 2 }, datatype);
2348 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
2349 std::vector<float>({ 2., 3., 3., 4. })));
2351 armnn::TensorInfo outputDesc({ 2, 4 }, datatype);
2352 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2353 qOffset, std::vector<float>(
2354 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
2355 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f})));
2357 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<datatype>(
2358 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2361 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgWithPeepholeWithProjectionTest(
2362 armnn::IWorkloadFactory& workloadFactory,
2363 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2365 const float qScale = 2.0f;
2366 const int32_t qOffset = 0;
2368 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
2369 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
2371 armnn::TensorInfo inputDesc({ 2, 5 }, datatype);
2372 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2373 qOffset, std::vector<float>(
2374 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
2375 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f})));
2377 armnn::TensorInfo outputDesc({ 2, 16 }, datatype);
2378 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2379 qOffset, std::vector<float>(
2380 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
2381 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
2382 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
2383 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
2384 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
2385 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f, 0.02168f})));
2387 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<datatype>(
2388 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
2391 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionInt16ConstantTest(
2392 armnn::IWorkloadFactory& workloadFactory,
2393 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2395 const float qScale = 1.0f;
2396 const int32_t qOffset = 0;
2398 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16; // datatype & constants set to QSymm16
2400 armnn::TensorInfo inputDesc({2, 2}, datatype);
2401 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale,
2402 qOffset, std::vector<float>{2., 3., 3., 4.}));
2404 armnn::TensorInfo outputDesc({2, 4}, datatype);
2405 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
2406 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
2407 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
2409 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
2410 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, datatype);
2413 LayerTestResult<float,3> ConcatTest(
2414 armnn::IWorkloadFactory& workloadFactory,
2415 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2417 unsigned int outputWidth = 3;
2418 unsigned int outputHeight = 6;
2419 unsigned int outputChannels = 3;
2421 unsigned int inputWidth1 = 3;
2422 unsigned int inputHeight1 = 6;
2423 unsigned int inputChannels1 = 2;
2425 unsigned int inputWidth2 = 3;
2426 unsigned int inputHeight2 = 6;
2427 unsigned int inputChannels2 = 1;
2429 // Define the tensor descriptors.
2430 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::Float32);
2431 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::Float32);
2432 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::Float32);
2434 LayerTestResult<float,3> ret(outputTensorInfo);
2436 ret.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float>(
2441 10.0f, 11.0f, 12.0f,
2442 13.0f, 14.0f, 15.0f,
2443 16.0f, 17.0f, 18.0f,
2445 19.0f, 20.0f, 21.0f,
2446 22.0f, 23.0f, 24.0f,
2447 25.0f, 26.0f, 27.0f,
2448 28.0f, 29.0f, 30.0f,
2449 31.0f, 32.0f, 33.0f,
2450 34.0f, 35.0f, 36.0f,
2452 37.0f, 38.0f, 39.0f,
2453 40.0f, 41.0f, 42.0f,
2454 43.0f, 44.0f, 45.0f,
2455 46.0f, 47.0f, 48.0f,
2456 49.0f, 50.0f, 51.0f,
2457 52.0f, 53.0f, 54.0f,
2461 auto input1 = MakeTensor<float, 3>(inputTensorInfo1, std::vector<float>(
2466 10.0f, 11.0f, 12.0f,
2467 13.0f, 14.0f, 15.0f,
2468 16.0f, 17.0f, 18.0f,
2470 19.0f, 20.0f, 21.0f,
2471 22.0f, 23.0f, 24.0f,
2472 25.0f, 26.0f, 27.0f,
2473 28.0f, 29.0f, 30.0f,
2474 31.0f, 32.0f, 33.0f,
2475 34.0f, 35.0f, 36.0f,
2479 auto input2 = MakeTensor<float, 3>(inputTensorInfo2, std::vector<float>(
2481 37.0f, 38.0f, 39.0f,
2482 40.0f, 41.0f, 42.0f,
2483 43.0f, 44.0f, 45.0f,
2484 46.0f, 47.0f, 48.0f,
2485 49.0f, 50.0f, 51.0f,
2486 52.0f, 53.0f, 54.0f,
2490 std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of input[0].
2491 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
2493 std::vector<unsigned int> wOrigin2 = {2, 0, 0}; //Extent of the window is defined by size of input[1].
2494 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
2496 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2498 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
2500 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
2501 subTensorsSupported ?
2502 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
2503 workloadFactory.CreateTensorHandle(inputTensorInfo1);
2505 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
2506 subTensorsSupported ?
2507 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
2508 workloadFactory.CreateTensorHandle(inputTensorInfo2);
2510 armnn::ConcatQueueDescriptor data;
2511 armnn::WorkloadInfo info;
2512 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2513 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2514 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2516 data.m_ViewOrigins.push_back(window1);
2517 data.m_ViewOrigins.push_back(window2);
2519 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
2521 inputHandle1->Allocate();
2522 inputHandle2->Allocate();
2523 outputHandle->Allocate();
2525 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
2526 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
2528 workload->PostAllocationConfigure();
2529 workload->Execute();
2531 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
2536 LayerTestResult<float,4> AdditionTest(
2537 armnn::IWorkloadFactory& workloadFactory,
2538 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2540 unsigned int batchSize = 2;
2541 unsigned int channels = 2;
2542 unsigned int height = 2;
2543 unsigned int width = 3;
2545 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2546 armnn::TensorInfo outputTensorInfo;
2548 unsigned int shape[] = {batchSize, channels, height, width};
2550 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2551 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2552 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2555 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, std::vector<float>(
2570 auto input2 = MakeTensor<float, 4>(inputTensorInfo2, std::vector<float>(
2585 LayerTestResult<float,4> ret(outputTensorInfo);
2586 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, std::vector<float>(
2601 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2602 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2603 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2605 armnn::AdditionQueueDescriptor data;
2606 armnn::WorkloadInfo info;
2607 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2608 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2609 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2611 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2613 inputHandle1->Allocate();
2614 inputHandle2->Allocate();
2615 outputHandle->Allocate();
2617 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2618 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2620 workload->PostAllocationConfigure();
2621 workload->Execute();
2623 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2628 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2629 LayerTestResult<T, 4> AdditionBroadcastTestImpl(
2630 armnn::IWorkloadFactory& workloadFactory,
2631 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2635 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 1}, ArmnnType);
2636 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 2, 3}, ArmnnType);
2637 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2639 if (armnn::IsQuantizedType<T>())
2641 inputTensorInfo1.SetQuantizationScale(qScale);
2642 inputTensorInfo1.SetQuantizationOffset(qOffset);
2643 inputTensorInfo2.SetQuantizationScale(qScale);
2644 inputTensorInfo2.SetQuantizationOffset(qOffset);
2645 outputTensorInfo.SetQuantizationScale(qScale);
2646 outputTensorInfo.SetQuantizationOffset(qOffset);
2649 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
2661 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
2667 LayerTestResult<T,4> ret(outputTensorInfo);
2668 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
2680 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2681 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2682 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2684 armnn::AdditionQueueDescriptor data;
2685 armnn::WorkloadInfo info;
2686 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2687 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2688 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2690 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2692 inputHandle1->Allocate();
2693 inputHandle2->Allocate();
2694 outputHandle->Allocate();
2696 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2697 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2699 workload->PostAllocationConfigure();
2700 workload->Execute();
2702 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2707 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2708 LayerTestResult<T, 4> AdditionBroadcast1ElementTestImpl(
2709 armnn::IWorkloadFactory& workloadFactory,
2710 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2714 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2715 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 1, 1}, ArmnnType);
2716 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
2718 if (armnn::IsQuantizedType<T>())
2720 inputTensorInfo1.SetQuantizationScale(qScale);
2721 inputTensorInfo1.SetQuantizationOffset(qOffset);
2722 inputTensorInfo2.SetQuantizationScale(qScale);
2723 inputTensorInfo2.SetQuantizationOffset(qOffset);
2724 outputTensorInfo.SetQuantizationScale(qScale);
2725 outputTensorInfo.SetQuantizationOffset(qOffset);
2728 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
2734 12.0f, 13.0f, 14.0f,
2735 15.0f, 16.0f, 17.0f,
2738 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
2743 LayerTestResult<T,4> ret(outputTensorInfo);
2744 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
2750 12.5f, 13.5f, 14.5f,
2751 15.5f, 16.5f, 17.5f,
2754 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2755 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2756 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2758 armnn::AdditionQueueDescriptor data;
2759 armnn::WorkloadInfo info;
2760 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2761 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2762 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2764 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2766 inputHandle1->Allocate();
2767 inputHandle2->Allocate();
2768 outputHandle->Allocate();
2770 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2771 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2773 workload->PostAllocationConfigure();
2774 workload->Execute();
2776 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2781 LayerTestResult<float, 4> AdditionBroadcastTest(
2782 armnn::IWorkloadFactory& workloadFactory,
2783 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2785 return AdditionBroadcastTestImpl<armnn::DataType::Float32>(
2786 workloadFactory, memoryManager, 0.0f, 0);
2789 LayerTestResult<uint8_t, 4> AdditionBroadcastUint8Test(
2790 armnn::IWorkloadFactory& workloadFactory,
2791 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2793 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedAsymm8>(
2794 workloadFactory, memoryManager, 2.f, 0);
2797 LayerTestResult<int16_t, 4> AdditionBroadcastInt16Test(
2798 armnn::IWorkloadFactory& workloadFactory,
2799 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2801 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedSymm16>(
2802 workloadFactory, memoryManager, 2.f, 0);
2805 LayerTestResult<float, 4> AdditionBroadcast1ElementTest(
2806 armnn::IWorkloadFactory& workloadFactory,
2807 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2809 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Float32>(
2810 workloadFactory, memoryManager, 0.0f, 0);
2813 LayerTestResult<uint8_t, 4> AdditionBroadcast1ElementUint8Test(
2814 armnn::IWorkloadFactory& workloadFactory,
2815 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2817 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedAsymm8>(
2818 workloadFactory, memoryManager, 0.1333333f, 128);
2821 LayerTestResult<int16_t, 4> AdditionBroadcast1ElementInt16Test(
2822 armnn::IWorkloadFactory& workloadFactory,
2823 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2825 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedSymm16>(
2826 workloadFactory, memoryManager, 0.1333333f, 0);
2829 LayerTestResult<float,4> CompareAdditionTest(
2830 armnn::IWorkloadFactory& workloadFactory,
2831 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2832 armnn::IWorkloadFactory& refWorkloadFactory)
2834 unsigned int batchSize = 4;
2835 unsigned int channels = 1;
2836 unsigned int height = 2;
2837 unsigned int width = 3;
2839 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
2840 armnn::TensorInfo outputTensorInfo;
2842 unsigned int shape[] = {batchSize, channels, height, width};
2844 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2845 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2846 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2848 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 1232);
2849 auto input2 = MakeRandomTensor<float, 4>(inputTensorInfo2, 456);
2851 LayerTestResult<float,4> ret(outputTensorInfo);
2853 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2854 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
2855 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2857 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
2858 std::unique_ptr<armnn::ITensorHandle> inputHandle2Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo2);
2859 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
2861 armnn::AdditionQueueDescriptor data;
2862 armnn::WorkloadInfo info;
2863 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2864 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
2865 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2867 armnn::AdditionQueueDescriptor refData = data;
2868 armnn::WorkloadInfo refInfo = info;
2869 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo1, inputHandle1Ref.get());
2870 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo2, inputHandle2Ref.get());
2871 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
2873 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
2874 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateAddition(refData, refInfo);
2876 inputHandle1->Allocate();
2877 inputHandle2->Allocate();
2878 outputHandle->Allocate();
2879 inputHandle1Ref->Allocate();
2880 inputHandle2Ref->Allocate();
2881 outputHandleRef->Allocate();
2883 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2884 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
2885 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
2886 CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
2888 workload->PostAllocationConfigure();
2889 workload->Execute();
2890 workloadRef->PostAllocationConfigure();
2891 workloadRef->Execute();
2893 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2894 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
2900 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
2901 LayerTestResult<T, 4> DivisionTestHelper(
2902 armnn::IWorkloadFactory& workloadFactory,
2903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2904 const unsigned int shape0[4],
2905 const std::vector<T>& values0,
2908 const unsigned int shape1[4],
2909 const std::vector<T> & values1,
2912 const unsigned int outShape[4],
2913 const std::vector<T> & outValues,
2917 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
2918 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
2919 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
2921 inputTensorInfo0.SetQuantizationScale(scale0);
2922 inputTensorInfo0.SetQuantizationOffset(offset0);
2924 inputTensorInfo1.SetQuantizationScale(scale1);
2925 inputTensorInfo1.SetQuantizationOffset(offset1);
2927 outputTensorInfo.SetQuantizationScale(outScale);
2928 outputTensorInfo.SetQuantizationOffset(outOffset);
2930 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
2931 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
2933 LayerTestResult<T, 4> result(outputTensorInfo);
2934 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
2936 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
2937 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2938 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2940 armnn::DivisionQueueDescriptor data;
2941 armnn::WorkloadInfo info;
2942 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
2943 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2944 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2946 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDivision(data, info);
2948 inputHandle0->Allocate();
2949 inputHandle1->Allocate();
2950 outputHandle->Allocate();
2952 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
2953 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2955 workload->PostAllocationConfigure();
2956 workload->Execute();
2958 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
2962 } // anonymous namespace
2964 LayerTestResult<float,4> DivisionByZeroTest(
2965 armnn::IWorkloadFactory& workloadFactory,
2966 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2968 const unsigned int width = 2;
2969 const unsigned int height = 2;
2970 const unsigned int channelCount = 2;
2971 const unsigned int batchSize = 2;
2973 unsigned int shape[] = { batchSize, channelCount, height, width };
2975 std::vector<float> input0({
2976 1.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f,
2977 -1.f, -1.f, -1.f, -1.f, 5.f, 5.f, 5.f, 5.f });
2979 std::vector<float> input1({
2980 0.f, 0.f, -0.f, -0.f, 0.f, 0.f, -0.f, -0.f,
2981 0.f, 0.f, -0.f, -0.f, 5.f, 5.f, 5.f, 5.f });
2983 std::vector<float> output({
2984 INFINITY, INFINITY, -INFINITY, -INFINITY, NAN, NAN, -NAN, -NAN,
2985 -INFINITY, -INFINITY, INFINITY, INFINITY, 1, 1, 1, 1 });
2987 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
2989 shape, input0, 1.0f, 0,
2990 shape, input1, 1.0f, 0,
2991 shape, output, 1.0f, 0);
2994 LayerTestResult<float,4> DivisionTest(
2995 armnn::IWorkloadFactory& workloadFactory,
2996 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2998 const unsigned int width = 2;
2999 const unsigned int height = 2;
3000 const unsigned int channelCount = 2;
3001 const unsigned int batchSize = 2;
3003 unsigned int shape[] = { batchSize, channelCount, height, width };
3005 std::vector<float> input0({
3006 2, 2, 2, 2, 3, 3, 3, 3,
3007 4, 4, 4, 4, 5, 5, 5, 5 });
3009 std::vector<float> input1({
3010 1, 1, 1, 1, 2, 2, 2, 2,
3011 4, 4, 4, 4, 4, 4, 4, 4 });
3013 std::vector<float> output({
3014 2, 2, 2, 2, 1.5, 1.5, 1.5, 1.5,
3015 1, 1, 1, 1, 1.25, 1.25, 1.25, 1.25 });
3018 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3020 shape, input0, 1.0f, 0,
3021 shape, input1, 1.0f, 0,
3022 shape, output, 1.0f, 0);
3025 LayerTestResult<float, 4> DivisionBroadcast1ElementTest(
3026 armnn::IWorkloadFactory& workloadFactory,
3027 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3029 unsigned int shape0[] = { 1, 2, 2, 2 };
3030 std::vector<float> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3032 unsigned int shape1[] = { 1, 1, 1, 1 };
3033 std::vector<float> input1({ 2 });
3035 std::vector<float> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3038 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3040 shape0, input0, 1.0f, 0,
3041 shape1, input1, 1.0f, 0,
3042 shape0, output, 1.0f, 0);
3045 LayerTestResult<float, 4> DivisionBroadcast1DVectorTest(
3046 armnn::IWorkloadFactory& workloadFactory,
3047 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3049 unsigned int shape0[] = { 1, 3, 3, 2 };
3050 std::vector<float> input0({
3052 7, 16, 9, 20, 11, 24,
3053 13, 28, 15, 32, 17, 36});
3055 unsigned int shape1[] = { 1, 1, 1, 2 };
3056 std::vector<float> input1({ 1, 2 });
3058 std::vector<float> output({
3060 7, 8, 9, 10, 11, 12,
3061 13, 14, 15, 16, 17, 18});
3063 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
3065 shape0, input0, 1.0f, 0,
3066 shape1, input1, 1.0f, 0,
3067 shape0, output, 1.0f, 0);
3070 LayerTestResult<uint8_t,4> DivisionUint8Test(
3071 armnn::IWorkloadFactory& workloadFactory,
3072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3074 const unsigned int width = 2;
3075 const unsigned int height = 2;
3076 const unsigned int channelCount = 2;
3077 const unsigned int batchSize = 2;
3079 unsigned int shape[] = { batchSize, channelCount, height, width };
3081 std::vector<uint8_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3082 4, 4, 4, 4, 5, 5, 5, 5 });
3084 std::vector<uint8_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3085 4, 4, 4, 4, 4, 4, 4, 4 });
3087 std::vector<uint8_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3088 4, 4, 4, 4, 5, 5, 5, 5});
3091 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3093 shape, input0, 1.0f, 0,
3094 shape, input1, 1.0f, 0,
3095 shape, output, 0.25f, 0);
3098 LayerTestResult<uint8_t, 4> DivisionBroadcast1ElementUint8Test(
3099 armnn::IWorkloadFactory& workloadFactory,
3100 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3102 unsigned int shape0[] = { 1, 2, 2, 2 };
3103 std::vector<uint8_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3105 unsigned int shape1[] = { 1, 1, 1, 1 };
3106 std::vector<uint8_t> input1({ 2 });
3108 std::vector<uint8_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3110 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3112 shape0, input0, 1.0f, 0,
3113 shape1, input1, 1.0f, 0,
3114 shape0, output, 1.0f, 0);
3117 LayerTestResult<uint8_t, 4> DivisionBroadcast1DVectorUint8Test(
3118 armnn::IWorkloadFactory& workloadFactory,
3119 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3121 unsigned int shape0[] = { 1, 3, 3, 2 };
3122 std::vector<uint8_t> input0({1, 4, 3, 8, 5, 12,
3123 7, 16, 9, 20, 11, 24,
3124 13, 28, 15, 32, 17, 36});
3126 unsigned int shape1[] = { 1, 1, 1, 2 };
3127 std::vector<uint8_t> input1({ 1, 2 });
3129 std::vector<uint8_t> output({1, 2, 3, 4, 5, 6,
3130 7, 8, 9, 10, 11, 12,
3131 13, 14, 15, 16, 17, 18});
3133 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
3135 shape0, input0, 1.0f, 0,
3136 shape1, input1, 1.0f, 0,
3137 shape0, output, 1.0f, 0);
3140 LayerTestResult<int16_t,4> DivisionInt16Test(
3141 armnn::IWorkloadFactory& workloadFactory,
3142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3144 unsigned int shape[] = { 2, 2, 2, 2 };
3146 std::vector<int16_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
3147 4, 4, 4, 4, 5, 5, 5, 5 });
3149 std::vector<int16_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
3150 4, 4, 4, 4, 4, 4, 4, 4 });
3152 std::vector<int16_t> output({8, 8, 8, 8, 6, 6, 6, 6,
3153 4, 4, 4, 4, 5, 5, 5, 5});
3156 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3158 shape, input0, 1.0f, 0,
3159 shape, input1, 1.0f, 0,
3160 shape, output, 0.25f, 0);
3163 LayerTestResult<int16_t, 4> DivisionBroadcast1ElementInt16Test(
3164 armnn::IWorkloadFactory& workloadFactory,
3165 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3167 unsigned int shape0[] = { 1, 2, 2, 2 };
3168 std::vector<int16_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
3170 unsigned int shape1[] = { 1, 1, 1, 1 };
3171 std::vector<int16_t> input1({ 2 });
3173 std::vector<int16_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
3175 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3177 shape0, input0, 1.0f, 0,
3178 shape1, input1, 1.0f, 0,
3179 shape0, output, 1.0f, 0);
3182 LayerTestResult<int16_t, 4> DivisionBroadcast1DVectorInt16Test(
3183 armnn::IWorkloadFactory& workloadFactory,
3184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3186 unsigned int shape0[] = { 1, 3, 3, 2 };
3187 std::vector<int16_t> input0({1, 4, 3, 8, 5, 12,
3188 7, 16, 9, 20, 11, 24,
3189 13, 28, 15, 32, 17, 36});
3191 unsigned int shape1[] = { 1, 1, 1, 2 };
3192 std::vector<int16_t> input1({ 1, 2 });
3194 std::vector<int16_t> output({1, 2, 3, 4, 5, 6,
3195 7, 8, 9, 10, 11, 12,
3196 13, 14, 15, 16, 17, 18});
3198 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
3200 shape0, input0, 1.0f, 0,
3201 shape1, input1, 1.0f, 0,
3202 shape0, output, 1.0f, 0);
3205 template<typename DescriptorType>
3206 std::unique_ptr<armnn::IWorkload> CreateWorkload(
3207 const armnn::IWorkloadFactory& workloadFactory,
3208 const armnn::WorkloadInfo& info,
3209 const DescriptorType& descriptor)
3211 return CreateWorkload(workloadFactory, info, descriptor);
3215 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MaximumQueueDescriptor>(
3216 const armnn::IWorkloadFactory& workloadFactory,
3217 const armnn::WorkloadInfo& info,
3218 const armnn::MaximumQueueDescriptor& descriptor)
3220 return workloadFactory.CreateMaximum(descriptor, info);
3224 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MinimumQueueDescriptor>(
3225 const armnn::IWorkloadFactory& workloadFactory,
3226 const armnn::WorkloadInfo& info,
3227 const armnn::MinimumQueueDescriptor& descriptor)
3229 return workloadFactory.CreateMinimum(descriptor, info);
3233 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::EqualQueueDescriptor>(
3234 const armnn::IWorkloadFactory& workloadFactory,
3235 const armnn::WorkloadInfo& info,
3236 const armnn::EqualQueueDescriptor& descriptor)
3238 return workloadFactory.CreateEqual(descriptor, info);
3242 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::GreaterQueueDescriptor>(
3243 const armnn::IWorkloadFactory& workloadFactory,
3244 const armnn::WorkloadInfo& info,
3245 const armnn::GreaterQueueDescriptor& descriptor)
3247 return workloadFactory.CreateGreater(descriptor, info);
3252 template <typename Descriptor,
3253 armnn::DataType ArmnnTypeInput,
3254 armnn::DataType ArmnnTypeOutput,
3255 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
3256 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
3257 LayerTestResult<TOutput, 4> ElementwiseTestHelper(
3258 armnn::IWorkloadFactory & workloadFactory,
3259 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3260 const unsigned int shape0[4], std::vector<TInput> values0,
3261 const unsigned int shape1[4], std::vector<TInput> values1,
3262 const unsigned int outShape[4], std::vector<TOutput> outValues,
3263 float qScale = 0.0f, int qOffset = 0)
3265 const uint32_t dimensionCount = 4;
3266 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, ArmnnTypeInput};
3267 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, ArmnnTypeInput};
3268 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, ArmnnTypeOutput};
3270 auto input0 = MakeTensor<TInput, 4>(inputTensorInfo0, values0);
3271 auto input1 = MakeTensor<TInput, 4>(inputTensorInfo1, values1);
3273 if (armnn::IsQuantizedType<TInput>())
3275 inputTensorInfo0.SetQuantizationScale(qScale);
3276 inputTensorInfo0.SetQuantizationOffset(qOffset);
3278 inputTensorInfo1.SetQuantizationScale(qScale);
3279 inputTensorInfo1.SetQuantizationOffset(qOffset);
3281 outputTensorInfo.SetQuantizationScale(qScale);
3282 outputTensorInfo.SetQuantizationOffset(qOffset);
3285 LayerTestResult<TOutput,4> ret(outputTensorInfo);
3287 if(ArmnnTypeOutput == armnn::DataType::Boolean)
3289 ret.compareBoolean = true;
3292 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3293 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3294 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3297 armnn::WorkloadInfo info;
3298 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3299 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3300 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3301 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
3303 inputHandle0->Allocate();
3304 inputHandle1->Allocate();
3305 outputHandle->Allocate();
3307 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3308 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3310 workload->PostAllocationConfigure();
3311 ExecuteWorkload(*workload, memoryManager);
3313 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3315 ret.outputExpected = MakeTensor<TOutput, 4>(outputTensorInfo, outValues);
3319 template <typename Descriptor, armnn::DataType ArmnnT, typename T = armnn::ResolveType<ArmnnT>>
3320 LayerTestResult<T, 4> ElementwiseTestHelper(
3321 armnn::IWorkloadFactory & workloadFactory,
3322 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
3323 const unsigned int shape0[4], std::vector<T> values0,
3324 const unsigned int shape1[4], std::vector<T> values1,
3325 const unsigned int outShape[4], std::vector<T> outValues,
3326 float qScale = 0.0f, int qOffset = 0)
3328 return ElementwiseTestHelper<Descriptor, ArmnnT, ArmnnT>
3342 LayerTestResult<uint8_t, 4> EqualSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3345 const unsigned int width = 2;
3346 const unsigned int height = 2;
3347 const unsigned int channelCount = 2;
3348 const unsigned int batchSize = 2;
3350 unsigned int shape[] = { batchSize, channelCount, height, width };
3352 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3353 3, 3, 3, 3, 4, 4, 4, 4 });
3355 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3356 5, 5, 5, 5, 4, 4, 4, 4 });
3358 std::vector<uint8_t> output({ 1, 1, 1, 1, 0, 0, 0, 0,
3359 0, 0, 0, 0, 1, 1, 1, 1 });
3361 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3372 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementTest(
3373 armnn::IWorkloadFactory& workloadFactory,
3374 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3376 unsigned int shape0[] = { 1, 2, 2, 2 };
3377 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3379 unsigned int shape1[] = { 1, 1, 1, 1 };
3380 std::vector<float> input1({ 1 });
3382 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0, 0, 0});
3384 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3395 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorTest(
3396 armnn::IWorkloadFactory& workloadFactory,
3397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3399 const unsigned int shape0[] = { 1, 2, 2, 3 };
3400 const unsigned int shape1[] = { 1, 1, 1, 3 };
3402 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
3403 7, 8, 9, 10, 11, 12 });
3405 std::vector<float> input1({ 1, 2, 3});
3407 std::vector<uint8_t> output({ 1, 1, 1, 0, 0, 0,
3408 0, 0, 0, 0, 0, 0 });
3410 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3421 LayerTestResult<uint8_t, 4> EqualUint8Test(
3422 armnn::IWorkloadFactory& workloadFactory,
3423 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3425 unsigned int shape[] = { 2, 2, 2, 2 };
3427 // See dequantized values to the right.
3428 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3429 3, 3, 3, 3, 7, 7, 7, 7 });
3431 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3432 3, 3, 3, 3, 5, 5, 5, 5 });
3434 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3435 1, 1, 1, 1, 0, 0, 0, 0 });
3437 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3438 armnn::DataType::QuantisedAsymm8,
3439 armnn::DataType::Boolean>(
3452 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementUint8Test(
3453 armnn::IWorkloadFactory& workloadFactory,
3454 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3456 const unsigned int shape0[] = { 1, 2, 2, 3 };
3457 const unsigned int shape1[] = { 1, 1, 1, 1 };
3459 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3460 7, 8, 9, 10, 11, 12 });
3462 std::vector<uint8_t> input1({ 1 });
3464 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0,
3465 0, 0, 0, 0, 0, 0 });
3467 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3468 armnn::DataType::QuantisedAsymm8,
3469 armnn::DataType::Boolean>(
3482 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorUint8Test(
3483 armnn::IWorkloadFactory& workloadFactory,
3484 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3486 const unsigned int shape0[] = { 1, 2, 2, 3 };
3487 const unsigned int shape1[] = { 1, 1, 1, 3 };
3489 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3490 7, 8, 9, 10, 11, 12 });
3492 std::vector<uint8_t> input1({ 1, 1, 3});
3494 std::vector<uint8_t> output({ 1, 0, 1, 0, 0, 0,
3495 0, 0, 0, 0, 0, 0 });
3497 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
3498 armnn::DataType::QuantisedAsymm8,
3499 armnn::DataType::Boolean>(
3512 LayerTestResult<uint8_t, 4> GreaterSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3513 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3515 const unsigned int width = 2;
3516 const unsigned int height = 2;
3517 const unsigned int channelCount = 2;
3518 const unsigned int batchSize = 2;
3520 unsigned int shape[] = { batchSize, channelCount, height, width };
3522 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3523 3, 3, 3, 3, 4, 4, 4, 4 });
3525 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
3526 5, 5, 5, 5, 4, 4, 4, 4 });
3528 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
3529 0, 0, 0, 0, 0, 0, 0, 0 });
3531 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3542 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementTest(
3543 armnn::IWorkloadFactory& workloadFactory,
3544 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3546 unsigned int shape0[] = { 1, 2, 2, 2 };
3547 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3549 unsigned int shape1[] = { 1, 1, 1, 1 };
3550 std::vector<float> input1({ 1 });
3552 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1, 1, 1});
3554 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3565 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorTest(
3566 armnn::IWorkloadFactory& workloadFactory,
3567 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3569 const unsigned int shape0[] = { 1, 2, 2, 3 };
3570 const unsigned int shape1[] = { 1, 1, 1, 3 };
3572 std::vector<float> input0({ 1, 2.9f, 2.1f, 4, 5, 6,
3573 7, 8, 9, 10, 11, 12 });
3575 std::vector<float> input1({ 1, 3, 2});
3577 std::vector<uint8_t> output({ 0, 0, 1, 1, 1, 1,
3578 1, 1, 1, 1, 1, 1 });
3580 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
3591 LayerTestResult<uint8_t, 4> GreaterUint8Test(
3592 armnn::IWorkloadFactory& workloadFactory,
3593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3595 unsigned int shape[] = { 2, 2, 2, 2 };
3597 // See dequantized values to the right.
3598 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3599 3, 3, 3, 3, 5, 5, 5, 5 });
3601 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
3602 2, 2, 2, 2, 5, 5, 5, 5 });
3604 std::vector<uint8_t> output({ 0, 0, 0, 0, 0, 0, 0, 0,
3605 1, 1, 1, 1, 0, 0, 0, 0 });
3607 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3608 armnn::DataType::QuantisedAsymm8,
3609 armnn::DataType::Boolean>(
3622 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementUint8Test(
3623 armnn::IWorkloadFactory& workloadFactory,
3624 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3626 const unsigned int shape0[] = { 1, 2, 2, 3 };
3627 const unsigned int shape1[] = { 1, 1, 1, 1 };
3629 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3630 7, 8, 9, 10, 11, 12 });
3632 std::vector<uint8_t> input1({ 1 });
3634 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1,
3635 1, 1, 1, 1, 1, 1 });
3637 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3638 armnn::DataType::QuantisedAsymm8,
3639 armnn::DataType::Boolean>(
3652 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorUint8Test(
3653 armnn::IWorkloadFactory& workloadFactory,
3654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3656 const unsigned int shape0[] = { 1, 2, 2, 3 };
3657 const unsigned int shape1[] = { 1, 1, 1, 3 };
3659 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3660 7, 8, 9, 10, 11, 12 });
3662 std::vector<uint8_t> input1({ 1, 1, 3});
3664 std::vector<uint8_t> output({ 0, 1, 0, 1, 1, 1,
3665 1, 1, 1, 1, 1, 1 });
3667 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
3668 armnn::DataType::QuantisedAsymm8,
3669 armnn::DataType::Boolean>(
3682 LayerTestResult<float, 4> MaximumSimpleTest(armnn::IWorkloadFactory& workloadFactory,
3683 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3685 const unsigned int width = 2;
3686 const unsigned int height = 2;
3687 const unsigned int channelCount = 2;
3688 const unsigned int batchSize = 2;
3690 unsigned int shape[] = { batchSize, channelCount, height, width };
3692 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
3693 3, 3, 3, 3, 4, 4, 4, 4 });
3695 std::vector<float> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3696 4, 4, 4, 4, 5, 5, 5, 5 });
3698 std::vector<float> output({ 2, 2, 2, 2, 5, 5, 5, 5,
3699 4, 4, 4, 4, 5, 5, 5, 5 });
3701 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3712 LayerTestResult<float, 4> MaximumBroadcast1ElementTest(
3713 armnn::IWorkloadFactory& workloadFactory,
3714 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3716 unsigned int shape0[] = { 1, 2, 2, 2 };
3717 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3719 unsigned int shape1[] = { 1, 1, 1, 1 };
3720 std::vector<float> input1({ 2 });
3722 std::vector<float> output({ 2, 2, 3, 4, 5, 6, 7, 8});
3724 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3735 LayerTestResult<float, 4> MaximumBroadcast1DVectorTest(
3736 armnn::IWorkloadFactory& workloadFactory,
3737 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3739 const unsigned int shape0[] = { 1, 2, 2, 3 };
3740 const unsigned int shape1[] = { 1, 1, 1, 3 };
3742 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
3743 7, 8, 9, 10, 11, 12 });
3745 std::vector<float> input1({ 1, 2, 3});
3747 std::vector<float> output({ 1, 2, 3, 4, 5, 6,
3748 7, 8, 9, 10, 11, 12 });
3750 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
3761 LayerTestResult<uint8_t, 4> MaximumUint8Test(
3762 armnn::IWorkloadFactory& workloadFactory,
3763 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3765 unsigned int shape[] = { 2, 2, 2, 2 };
3767 // See dequantized values to the right.
3768 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3769 3, 3, 3, 3, 4, 4, 4, 4 });
3771 std::vector<uint8_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3772 4, 4, 4, 4, 5, 5, 5, 5 });
3774 std::vector<uint8_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
3775 4, 4, 4, 4, 5, 5, 5, 5 });
3777 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3790 LayerTestResult<uint8_t, 4> MaximumBroadcast1ElementUint8Test(
3791 armnn::IWorkloadFactory& workloadFactory,
3792 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3794 const unsigned int shape0[] = { 1, 2, 2, 3 };
3795 const unsigned int shape1[] = { 1, 1, 1, 1 };
3797 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3798 7, 8, 9, 10, 11, 12 });
3800 std::vector<uint8_t> input1({2});
3802 std::vector<uint8_t> output({ 2, 2, 3, 4, 5, 6,
3803 7, 8, 9, 10, 11, 12 });
3805 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3818 LayerTestResult<uint8_t, 4> MaximumBroadcast1DVectorUint8Test(
3819 armnn::IWorkloadFactory& workloadFactory,
3820 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3822 const unsigned int shape0[] = { 1, 2, 2, 3 };
3823 const unsigned int shape1[] = { 1, 1, 1, 3 };
3825 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
3826 7, 8, 9, 10, 11, 12 });
3828 std::vector<uint8_t> input1({ 1, 10, 3});
3830 std::vector<uint8_t> output({ 1, 10, 3, 4, 10, 6,
3831 7, 10, 9, 10, 11, 12 });
3833 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
3846 LayerTestResult<int16_t, 4> MaximumInt16Test(
3847 armnn::IWorkloadFactory& workloadFactory,
3848 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3850 unsigned int shape[] = { 2, 2, 2, 2 };
3852 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
3853 3, 3, 3, 3, 4, 4, 4, 4 });
3855 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
3856 4, 4, 4, 4, 5, 5, 5, 5 });
3858 std::vector<int16_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
3859 4, 4, 4, 4, 5, 5, 5, 5 });
3861 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
3874 LayerTestResult<int16_t, 4> MaximumBroadcast1ElementInt16Test(
3875 armnn::IWorkloadFactory& workloadFactory,
3876 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3878 const unsigned int shape0[] = { 1, 2, 2, 3 };
3879 const unsigned int shape1[] = { 1, 1, 1, 1 };
3881 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
3882 7, 8, 9, 10, 11, 12 });
3884 std::vector<int16_t> input1({2});
3886 std::vector<int16_t> output({ 2, 2, 3, 4, 5, 6,
3887 7, 8, 9, 10, 11, 12 });
3889 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
3902 LayerTestResult<int16_t, 4> MaximumBroadcast1DVectorInt16Test(
3903 armnn::IWorkloadFactory& workloadFactory,
3904 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3906 const unsigned int shape0[] = { 1, 2, 2, 3 };
3907 const unsigned int shape1[] = { 1, 1, 1, 3 };
3909 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
3910 7, 8, 9, 10, 11, 12 });
3912 std::vector<int16_t> input1({ 1, 10, 3});
3914 std::vector<int16_t> output({ 1, 10, 3, 4, 10, 6,
3915 7, 10, 9, 10, 11, 12 });
3917 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
3930 LayerTestResult<float, 4> MinimumBroadcast1ElementTest1(
3931 armnn::IWorkloadFactory& workloadFactory,
3932 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3934 unsigned int shape0[] = { 1, 2, 2, 2 };
3935 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
3937 unsigned int shape1[] = { 1, 1, 1, 1 };
3938 std::vector<float> input1({ 2 });
3940 std::vector<float> output({ 1, 2, 2, 2, 2, 2, 2, 2});
3942 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
3954 LayerTestResult<float, 4> MinimumBroadcast1ElementTest2(
3955 armnn::IWorkloadFactory& workloadFactory,
3956 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3958 unsigned int shape0[] = { 1, 2, 2, 2 };
3959 std::vector<float> input0({ 1, 6, 3, 2, 8, 9, 1, 10});
3961 unsigned int shape1[] = { 1, 1, 1, 1 };
3962 std::vector<float> input1({ 5 });
3964 std::vector<float> output({ 1, 5, 3, 2, 5, 5, 1, 5});
3966 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
3977 LayerTestResult<uint8_t, 4> MinimumBroadcast1DVectorUint8Test(
3978 armnn::IWorkloadFactory & workloadFactory,
3979 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)
3981 const unsigned int shape0[] = { 1, 2, 2, 3 };
3982 const unsigned int shape1[] = { 1, 1, 1, 3 };
3984 std::vector<uint8_t> input0({ 1, 2, 3, 3, 2, 1,
3985 7, 1, 2, 3, 4, 5 });
3987 std::vector<uint8_t> input1({ 1, 2, 3});
3989 std::vector<uint8_t> output({ 1, 2, 3, 1, 2, 1,
3990 1, 1, 2, 1, 2, 3 });
3992 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
4005 LayerTestResult<int16_t, 4> MinimumInt16Test(
4006 armnn::IWorkloadFactory& workloadFactory,
4007 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4009 unsigned int shape[] = { 2, 2, 2, 2 };
4011 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
4012 3, 3, 3, 3, 4, 4, 4, 4 });
4014 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
4015 4, 4, 4, 4, 5, 5, 5, 5 });
4017 std::vector<int16_t> output({ 1, 1, 1, 1, 3, 3, 3, 3,
4018 3, 3, 3, 3, 4, 4, 4, 4 });
4020 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4033 LayerTestResult<int16_t, 4> MinimumBroadcast1ElementInt16Test(
4034 armnn::IWorkloadFactory& workloadFactory,
4035 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4037 const unsigned int shape0[] = { 1, 2, 2, 3 };
4038 const unsigned int shape1[] = { 1, 1, 1, 1 };
4040 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4041 7, 8, 9, 10, 11, 12 });
4043 std::vector<int16_t> input1({2});
4045 std::vector<int16_t> output({ 1, 2, 2, 2, 2, 2,
4046 2, 2, 2, 2, 2, 2 });
4048 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4061 LayerTestResult<int16_t, 4> MinimumBroadcast1DVectorInt16Test(
4062 armnn::IWorkloadFactory& workloadFactory,
4063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4065 const unsigned int shape0[] = { 1, 2, 2, 3 };
4066 const unsigned int shape1[] = { 1, 1, 1, 3 };
4068 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
4069 7, 8, 9, 10, 11, 12 });
4071 std::vector<int16_t> input1({ 1, 10, 3});
4073 std::vector<int16_t> output({ 1, 2, 3, 1, 5, 3,
4074 1, 8, 3, 1, 10, 3 });
4076 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
4090 LayerTestResult<float,4> MultiplicationTestHelper(
4091 armnn::IWorkloadFactory& workloadFactory,
4092 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4093 const unsigned int shape0[4],
4094 const std::vector<float> & values0,
4095 const unsigned int shape1[4],
4096 const std::vector<float> & values1,
4097 const unsigned int outShape[4],
4098 const std::vector<float> & outValues)
4100 const uint32_t dimensionCount = 4;
4101 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, armnn::DataType::Float32};
4102 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, armnn::DataType::Float32};
4103 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, armnn::DataType::Float32};
4105 auto input0 = MakeTensor<float, 4>(inputTensorInfo0, values0);
4106 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, values1);
4108 LayerTestResult<float,4> ret(outputTensorInfo);
4110 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4111 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4112 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4114 armnn::MultiplicationQueueDescriptor data;
4115 armnn::WorkloadInfo info;
4116 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4117 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4118 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4120 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4122 inputHandle0->Allocate();
4123 inputHandle1->Allocate();
4124 outputHandle->Allocate();
4126 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
4127 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
4129 workload->PostAllocationConfigure();
4130 workload->Execute();
4132 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
4134 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outValues);
4137 } // anonymous namespace
4140 LayerTestResult<float,4> MultiplicationTest(
4141 armnn::IWorkloadFactory& workloadFactory,
4142 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4144 const unsigned int width = 2;
4145 const unsigned int height = 2;
4146 const unsigned int channelCount = 2;
4147 const unsigned int batchSize = 2;
4149 unsigned int shape[] = { batchSize, channelCount, height, width };
4151 std::vector<float> input0({
4152 1, 1, 1, 1, 2, 2, 2, 2,
4153 3, 3, 3, 3, 4, 4, 4, 4 });
4155 std::vector<float> input1({
4156 2, 2, 2, 2, 3, 3, 3, 3,
4157 4, 4, 4, 4, 5, 5, 5, 5 });
4159 std::vector<float> output({
4160 2, 2, 2, 2, 6, 6, 6, 6,
4161 12, 12, 12, 12, 20, 20, 20, 20 });
4163 return MultiplicationTestHelper(workloadFactory,
4173 LayerTestResult<float, 4> MultiplicationBroadcast1ElementTest(
4174 armnn::IWorkloadFactory& workloadFactory,
4175 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4177 unsigned int shape0[] = { 1, 2, 2, 2 };
4178 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
4180 unsigned int shape1[] = { 1, 1, 1, 1 };
4181 std::vector<float> input1({ 2 });
4183 std::vector<float> output({ 2, 4, 6, 8, 10, 12, 14, 16});
4185 return MultiplicationTestHelper(workloadFactory,
4195 LayerTestResult<float, 4> MultiplicationBroadcast1DVectorTest(
4196 armnn::IWorkloadFactory& workloadFactory,
4197 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4199 unsigned int shape0[] = { 1, 3, 3, 2 };
4200 std::vector<float> input0({
4202 7, 8, 9, 10, 11, 12,
4203 13, 14, 15, 16, 17, 18});
4205 unsigned int shape1[] = { 1, 1, 1, 2 };
4206 std::vector<float> input1({ 1, 2 });
4208 std::vector<float> output({
4210 7, 16, 9, 20, 11, 24,
4211 13, 28, 15, 32, 17, 36});
4213 return MultiplicationTestHelper(workloadFactory,
4223 LayerTestResult<float,4> CompareMultiplicationTest(
4224 armnn::IWorkloadFactory& workloadFactory,
4225 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4226 armnn::IWorkloadFactory& refWorkloadFactory)
4228 const unsigned int width = 16;
4229 const unsigned int height = 32;
4230 const unsigned int channelCount = 2;
4231 const unsigned int batchSize = 5;
4233 armnn::TensorInfo inputTensorInfo0;
4234 armnn::TensorInfo inputTensorInfo1;
4235 armnn::TensorInfo outputTensorInfo;
4237 constexpr unsigned int shape[] = { batchSize, channelCount, height, width };
4239 inputTensorInfo0 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4240 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4241 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4243 LayerTestResult<float,4> comparisonResult(outputTensorInfo);
4245 auto input0 = MakeRandomTensor<float, 4>(inputTensorInfo0, 803506992);
4246 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 54902257);
4248 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
4249 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
4250 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4252 std::unique_ptr<armnn::ITensorHandle> inputHandle0Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo0);
4253 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
4254 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4256 armnn::MultiplicationQueueDescriptor data;
4257 armnn::WorkloadInfo info;
4258 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
4259 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
4260 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4262 armnn::MultiplicationQueueDescriptor refData = data;
4263 armnn::WorkloadInfo refInfo = info;
4264 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo0, inputHandle0Ref.get());
4265 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo1, inputHandle1Ref.get());
4266 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4268 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
4269 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateMultiplication(refData, refInfo);
4271 inputHandle0->Allocate();
4272 inputHandle1->Allocate();
4273 outputHandle->Allocate();
4274 inputHandle0Ref->Allocate();
4275 inputHandle1Ref->Allocate();
4276 outputHandleRef->Allocate();
4278 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
4279 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
4280 CopyDataToITensorHandle(inputHandle0Ref.get(), &input0[0][0][0][0]);
4281 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
4283 workload->PostAllocationConfigure();
4284 workload->Execute();
4285 workloadRef->PostAllocationConfigure();
4286 workloadRef->Execute();
4287 CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
4288 CopyDataFromITensorHandle(&comparisonResult.outputExpected[0][0][0][0], outputHandleRef.get());
4290 return comparisonResult;
4293 LayerTestResult<float,4> CompareBatchNormTest(
4294 armnn::IWorkloadFactory& workloadFactory,
4295 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4296 armnn::IWorkloadFactory& refWorkloadFactory)
4298 const unsigned int width = 2;
4299 const unsigned int height = 3;
4300 const unsigned int channels = 5;
4301 const unsigned int batchSize = 3;
4303 armnn::TensorInfo inputTensorInfo;
4304 armnn::TensorInfo outputTensorInfo;
4305 armnn::TensorInfo tensorInfo;
4307 constexpr unsigned int shape[] = {batchSize, channels, height, width};
4308 constexpr unsigned int tensorShape[] = {channels};
4310 inputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4311 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
4312 tensorInfo = armnn::TensorInfo(1, tensorShape, armnn::DataType::Float32);
4314 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 21312);
4316 auto mean = MakeRandomTensor<float, 1>(tensorInfo, 123);
4317 auto variance = MakeRandomTensor<float, 1>(tensorInfo, 234, 0.0f);
4318 auto beta = MakeRandomTensor<float, 1>(tensorInfo, 123);
4319 auto gamma = MakeRandomTensor<float, 1>(tensorInfo, 345);
4321 LayerTestResult<float,4> ret(outputTensorInfo);
4323 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4324 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4326 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.CreateTensorHandle(inputTensorInfo);
4327 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
4329 armnn::BatchNormalizationQueueDescriptor data;
4330 armnn::WorkloadInfo info;
4331 armnn::ScopedCpuTensorHandle meanTensor(tensorInfo);
4332 armnn::ScopedCpuTensorHandle varianceTensor(tensorInfo);
4333 armnn::ScopedCpuTensorHandle betaTensor(tensorInfo);
4334 armnn::ScopedCpuTensorHandle gammaTensor(tensorInfo);
4336 AllocateAndCopyDataToITensorHandle(&meanTensor, &mean[0]);
4337 AllocateAndCopyDataToITensorHandle(&varianceTensor, &variance[0]);
4338 AllocateAndCopyDataToITensorHandle(&betaTensor, &beta[0]);
4339 AllocateAndCopyDataToITensorHandle(&gammaTensor, &gamma[0]);
4341 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
4342 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
4343 data.m_Mean = &meanTensor;
4344 data.m_Variance = &varianceTensor;
4345 data.m_Beta = &betaTensor;
4346 data.m_Gamma = &gammaTensor;
4347 data.m_Parameters.m_Eps = 0.01f;
4349 armnn::BatchNormalizationQueueDescriptor refData = data;
4350 armnn::WorkloadInfo refInfo = info;
4351 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
4352 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
4354 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateBatchNormalization(data, info);
4355 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateBatchNormalization(refData, refInfo);
4357 inputHandle->Allocate();
4358 outputHandle->Allocate();
4359 inputHandleRef->Allocate();
4360 outputHandleRef->Allocate();
4362 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
4363 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
4365 workload->PostAllocationConfigure();
4366 workload->Execute();
4367 workloadRef->PostAllocationConfigure();
4368 workloadRef->Execute();
4370 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
4371 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
4376 template<typename T>
4377 void PermuteTensorData(
4378 armnn::IWorkloadFactory& workloadFactory,
4379 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4380 const armnn::PermutationVector& mappings,
4381 armnn::TensorInfo & inputTensorInfo,
4382 const T * inputData,
4383 std::vector<T>& outputData)
4385 BOOST_ASSERT_MSG(inputData != nullptr, "inputData must not be null");
4386 if (inputData == nullptr)
4388 // Nullptr is an error in the test. By returning without doing the concatenation
4389 // I expect the caller to fail the test. It still makes sense to report this as
4390 // an assert for Debug builds.
4394 armnn::TensorInfo outputTensorInfo = armnnUtils::Permuted(inputTensorInfo, mappings);
4396 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
4397 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4399 armnn::PermuteQueueDescriptor queueDescriptor;
4400 queueDescriptor.m_Parameters = armnn::PermuteDescriptor{mappings};
4401 armnn::WorkloadInfo workloadInfo;
4402 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
4403 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
4405 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(queueDescriptor, workloadInfo);
4407 inputHandle->Allocate();
4408 outputHandle->Allocate();
4410 CopyDataToITensorHandle(inputHandle.get(), inputData);
4412 workload->PostAllocationConfigure();
4413 workload->Execute();
4415 outputData.resize(outputTensorInfo.GetNumElements());
4416 CopyDataFromITensorHandle(&outputData[0], outputHandle.get());
4417 inputTensorInfo = outputTensorInfo;
4420 armnn::OriginsDescriptor CreateDescriptorForConcatenation(
4421 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4422 unsigned int concatDim)
4424 std::vector<armnn::TensorShape> shapes;
4425 shapes.reserve(inputTensorInfos.size());
4426 for (const armnn::TensorInfo& it: inputTensorInfos)
4428 shapes.push_back(it.GetShape());
4431 return armnn::CreateDescriptorForConcatenation(shapes.begin(),
4437 // Concatenation is only supported for N and C dimensions for NCHW and the inner most dimension
4438 // In case of <4 dimensions we need to make sure that the concat dimensions are at least
4439 // the 3rd slowest iterating one or the inner most dimension.
4442 bool NeedPermuteForConcat(
4443 const std::vector<armnn::TensorInfo> & inputTensorInfos,
4444 unsigned int concatDim)
4446 // See note above. Additionally we expect the input shapes to have the
4447 // same number of dimensions.
4448 unsigned int nDimensions = 0;
4450 // Determine the number of dimensions as well as sanity check them
4451 // agains test implementation issues.
4452 for (auto && tensorInfo : inputTensorInfos)
4456 nDimensions = tensorInfo.GetShape().GetNumDimensions();
4460 BOOST_ASSERT_MSG(nDimensions == tensorInfo.GetShape().GetNumDimensions(),
4461 "Input shapes must have the same number of dimensions");
4465 return (nDimensions < 3 || (nDimensions == 3 && (nDimensions-concatDim) < 3 && (nDimensions-concatDim) != 1));
4468 armnn::TensorShape ExpandTensorShapeTo3dForPermute(const armnn::TensorShape & inputShape)
4470 unsigned int numDims = inputShape.GetNumDimensions();
4473 // Nothing to do if the inputShape has at least 3 dimensions.
4477 std::vector<unsigned int> newDims(size_t(3), 1u);
4478 unsigned int expandedBy = 3 - numDims;
4479 for (unsigned int i=0; i<numDims; ++i)
4481 newDims[expandedBy+i] = inputShape[i];
4483 return armnn::TensorShape(3u, &newDims[0]);
4486 void Generate3dPermuteVectorForConcat(
4487 unsigned int numDimensions,
4488 unsigned int & concatDim,
4489 std::pair<armnn::PermutationVector, armnn::PermutationVector> & permutations)
4491 BOOST_ASSERT_MSG(numDimensions <= 3,
4492 "Only dimensions 1,2 and 3 are supported by this helper");
4493 unsigned int expandedBy = 3 - numDimensions;
4494 unsigned int expandedConcatAxis = concatDim + expandedBy;
4496 if (expandedConcatAxis == 2)
4499 armnn::PermutationVector forwardPermutation({1, 2, 0});
4500 armnn::PermutationVector reversePermutation({2, 0, 1});
4501 permutations = std::make_pair(forwardPermutation, reversePermutation);
4503 else if (expandedConcatAxis == 1)
4506 armnn::PermutationVector forwardPermutation({2, 0, 1});
4507 armnn::PermutationVector reversePermutation({1, 2, 0});
4508 permutations = std::make_pair(forwardPermutation, reversePermutation);
4512 BOOST_ASSERT(expandedConcatAxis == 0);
4518 // Permute the input tensors so we can do a supported concatenation.
4519 // Also treat lower than 3d tensors as 3d by adding dummy 1 dimensions
4520 // at the front. Finally this function tells what the output shape
4521 // of the permuted concatenated tensor is going to be.
4523 template <typename T>
4524 void PermuteInputsForConcat(
4525 armnn::IWorkloadFactory& workloadFactory,
4526 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4527 std::vector<armnn::TensorInfo> & inputTensorInfos,
4528 std::vector<T *> & inputData,
4529 std::vector<std::vector<T>> & inputDataStorage,
4530 armnn::PermutationVector & permuteVector,
4531 unsigned int & concatDim,
4532 armnn::TensorInfo & outputTensorInfo)
4534 BOOST_ASSERT_MSG(inputTensorInfos.size() > 1,
4535 "Expecting more than one tensor to be concatenated here");
4537 unsigned int numDims = 0;
4538 unsigned int nthInput = 0;
4539 const armnn::PermutationVector identity({0, 1, 2});
4541 std::pair<armnn::PermutationVector, armnn::PermutationVector> permutations =
4542 std::make_pair(identity, identity);
4544 inputDataStorage.resize(inputData.size());
4546 for (auto && tensorInfo : inputTensorInfos)
4550 numDims = tensorInfo.GetShape().GetNumDimensions();
4551 Generate3dPermuteVectorForConcat(numDims, concatDim, permutations);
4553 // Store the reverese permutation.
4554 permuteVector = permutations.second;
4555 BOOST_ASSERT_MSG(!permuteVector.IsEqual(identity),
4556 "Test logic error, we don't need permutation, so we shouldn't arrive here");
4560 BOOST_ASSERT_MSG(numDims == tensorInfo.GetShape().GetNumDimensions(),
4561 "All inputs must have the same number of dimensions");
4564 armnn::TensorInfo newTensorInfo = tensorInfo;
4565 newTensorInfo.SetShape(ExpandTensorShapeTo3dForPermute(tensorInfo.GetShape()));
4567 PermuteTensorData<T>(workloadFactory,
4571 inputData[nthInput],
4572 inputDataStorage[nthInput]);
4574 inputData[nthInput] = inputDataStorage[nthInput].data();
4575 inputTensorInfos[nthInput] = newTensorInfo;
4580 outputTensorInfo.SetShape(
4581 armnnUtils::Permuted(
4582 ExpandTensorShapeTo3dForPermute(outputTensorInfo.GetShape()),
4583 permutations.first));
4588 // This is the pair of PermuteInputsForConcat(...) which permutes back
4589 // the output of the concatenation so we can check it against an expected
4592 template <typename T>
4593 void PermuteOutputForConcat(
4594 armnn::IWorkloadFactory& workloadFactory,
4595 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4596 const armnn::TensorInfo & tensorInfo,
4597 const armnn::PermutationVector & permuteVector,
4598 std::unique_ptr<armnn::ITensorHandle> && inputDataHandle,
4601 BOOST_ASSERT_MSG(data != nullptr, "data must not be null");
4602 if (data == nullptr)
4604 // Nullptr is an error in the test. By returning without doing the permutation
4605 // I expect the caller to fail the test. It still makes sense to report this as
4606 // an assert for Debug builds.
4610 armnn::TensorInfo resultTensorInfo = tensorInfo;
4611 std::vector<T> inputData(tensorInfo.GetNumElements());
4612 std::vector<T> outputData;
4614 CopyDataFromITensorHandle(&inputData[0], inputDataHandle.get());
4616 PermuteTensorData<T>(workloadFactory,
4623 ::memcpy(data, &outputData[0], sizeof(T)*outputData.size());
4626 template <typename T>
4628 armnn::IWorkloadFactory& workloadFactory,
4629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4630 std::initializer_list<const armnn::TensorInfo> inputTensorInfosOrig,
4631 std::initializer_list<T *> inputsOrig,
4632 const armnn::TensorInfo& outputTensorInfoOrig,
4634 unsigned int concatDim,
4637 BOOST_ASSERT_MSG(output != nullptr, "output must not be null");
4638 if (output == nullptr)
4640 // Nullptr is an error in the test. By returning without doing the permutation
4641 // I expect the caller to fail the test. It still makes sense to report this as
4642 // an assert for Debug builds.
4646 // Saves a copy of the parameters which we might need to change.
4647 std::vector<armnn::TensorInfo> inputTensorInfos(inputTensorInfosOrig.begin(), inputTensorInfosOrig.end());
4648 std::vector<T *> inputs = inputsOrig;
4649 armnn::TensorInfo outputTensorInfo = outputTensorInfoOrig;
4651 armnn::PermutationVector permuteVector{0, 1, 2};
4653 // Holds and automatically releases memory for the reshaped input data.
4654 std::vector<std::vector<T>> tmpInputDataStorage;
4656 const size_t inputCount = inputTensorInfos.size();
4658 bool needPermuteForConcat = NeedPermuteForConcat(inputTensorInfos, concatDim);
4660 if (needPermuteForConcat)
4663 // We need to permute the inputs, because concatenation along
4664 // the requested axis is not supported.
4666 PermuteInputsForConcat<T>(workloadFactory,
4670 tmpInputDataStorage,
4676 armnn::WorkloadInfo workloadInfo;
4678 std::vector<std::unique_ptr<armnn::ITensorHandle>> inputHandles;
4679 inputHandles.reserve(inputCount);
4681 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4683 armnn::ConcatQueueDescriptor queueDescriptor;
4684 armnn::OriginsDescriptor viewsDescriptor = CreateDescriptorForConcatenation(inputTensorInfos, concatDim);
4685 queueDescriptor.m_Parameters = viewsDescriptor;
4689 queueDescriptor.m_ViewOrigins.reserve(viewsDescriptor.GetNumViews());
4690 for (unsigned int i = 0; i < viewsDescriptor.GetNumViews(); ++i)
4692 queueDescriptor.m_ViewOrigins.emplace_back(std::vector<unsigned int>(viewsDescriptor.GetViewOrigin(i),
4693 viewsDescriptor.GetViewOrigin(i) + viewsDescriptor.GetNumDimensions()));
4696 outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
4698 const bool subTensorsSupported = workloadFactory.SupportsSubTensors();
4699 for (unsigned int i = 0; i < inputCount; ++i)
4701 const armnn::TensorInfo& inputTensorInfo = inputTensorInfos[i];
4702 std::unique_ptr<armnn::ITensorHandle> inputHandle =
4703 subTensorsSupported ?
4704 workloadFactory.CreateSubTensorHandle(*outputHandle,
4705 inputTensorInfo.GetShape(),
4706 queueDescriptor.m_ViewOrigins[i].m_Origin.data()) :
4707 workloadFactory.CreateTensorHandle(inputTensorInfo);
4709 inputHandles.emplace_back(std::move(inputHandle));
4715 for (unsigned int i = 0; i < inputCount; ++i)
4717 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfos[i]);
4718 inputHandles.emplace_back(std::move(inputHandle));
4722 for (unsigned int i = 0; i < inputCount; ++i)
4724 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfos[i], inputHandles[i].get());
4727 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
4729 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(queueDescriptor, workloadInfo);
4731 for (auto& inputHandle : inputHandles)
4733 inputHandle->Allocate();
4736 outputHandle->Allocate();
4738 unsigned int nextInputId = 0;
4739 for (auto& inputHandle : inputHandles)
4741 CopyDataToITensorHandle(inputHandle.get(), inputs[nextInputId]);
4745 workload->PostAllocationConfigure();
4746 workload->Execute();
4748 if (needPermuteForConcat)
4750 PermuteOutputForConcat<T>(workloadFactory,
4754 std::move(outputHandle),
4759 CopyDataFromITensorHandle(output, outputHandle.get());
4763 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4764 LayerTestResult<T, 1> Concatenation1dTestImpl(
4765 armnn::IWorkloadFactory& workloadFactory,
4766 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4770 armnn::TensorInfo inputTensorInfo({ 3 }, ArmnnType, qScale, qOffset);
4772 auto input0 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 1.0f, 2.0f, 3.0f }));
4773 auto input1 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 4.0f, 5.0f, 6.0f }));
4774 auto input2 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 7.0f, 8.0f, 9.0f }));
4776 armnn::TensorInfo outputTensorInfo({ 9 }, ArmnnType, qScale, qOffset);
4778 LayerTestResult<T, 1> result(outputTensorInfo);
4780 std::vector<T> output;
4781 output.resize(outputTensorInfo.GetNumElements());
4782 Concatenate<T>(workloadFactory, memoryManager,
4783 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
4784 { input0.data(), input1.data(), input2.data() },
4790 result.output = MakeTensor<T, 1>(outputTensorInfo, output);
4791 result.outputExpected = MakeTensor<T, 1>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4792 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
4798 LayerTestResult<float, 1> Concatenation1dTest(
4799 armnn::IWorkloadFactory& workloadFactory,
4800 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4802 return Concatenation1dTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4805 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4806 LayerTestResult<T, 2> Concatenation2dTestImpl(
4807 armnn::IWorkloadFactory& workloadFactory,
4808 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4809 const armnn::TensorInfo& outputTensorInfo,
4810 unsigned int dimension,
4812 const int32_t qOffset)
4814 armnn::TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
4816 auto input0 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4821 10.0f, 11.0f, 12.0f,
4824 auto input1 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4829 13.0f, 14.0f, 15.0f,
4832 auto input2 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4837 16.0f, 17.0f, 18.0f,
4840 LayerTestResult<T, 2> result(outputTensorInfo);
4842 std::vector<T> output;
4843 output.resize(outputTensorInfo.GetNumElements());
4844 Concatenate<T>(workloadFactory, memoryManager,
4845 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
4846 { input0.data(), input1.data(), input2.data() },
4852 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
4856 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4857 LayerTestResult<T, 2> Concatenation2dDim0TestImpl(
4858 armnn::IWorkloadFactory& workloadFactory,
4859 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4863 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
4865 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
4866 workloadFactory, memoryManager, outputTensorInfo, 0, qScale, qOffset);
4868 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4873 10.0f, 11.0f, 12.0f,
4879 13.0f, 14.0f, 15.0f,
4885 16.0f, 17.0f, 18.0f,
4891 LayerTestResult<float, 2> Concatenation2dDim0Test(
4892 armnn::IWorkloadFactory& workloadFactory,
4893 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4895 return Concatenation2dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4898 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4899 LayerTestResult<T, 2> Concatenation2dDim1TestImpl(
4900 armnn::IWorkloadFactory& workloadFactory,
4901 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4905 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
4907 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
4908 workloadFactory, memoryManager, outputTensorInfo, 1, qScale, qOffset);
4910 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4912 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
4915 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
4921 LayerTestResult<float, 2> Concatenation2dDim1Test(
4922 armnn::IWorkloadFactory& workloadFactory,
4923 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4925 return Concatenation2dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4928 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4929 LayerTestResult<T, 2> Concatenation2dDim0DiffInputDimsTestImpl(
4930 armnn::IWorkloadFactory& workloadFactory,
4931 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4935 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
4936 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4941 10.0f, 11.0f, 12.0f,
4944 armnn::TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType, qScale, qOffset);
4945 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4950 13.0f, 14.0f, 15.0f,
4956 armnn::TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType, qScale, qOffset);
4957 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4959 16.0f, 17.0f, 18.0f,
4962 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType, qScale, qOffset);
4963 LayerTestResult<T, 2> result(outputTensorInfo);
4965 std::vector<T> output;
4966 output.resize(outputTensorInfo.GetNumElements());
4967 Concatenate<T>(workloadFactory, memoryManager,
4968 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
4969 { input0.data(), input1.data(), input2.data() },
4975 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
4976 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4981 10.0f, 11.0f, 12.0f,
4987 13.0f, 14.0f, 15.0f,
4993 16.0f, 17.0f, 18.0f,
4999 LayerTestResult<float, 2> Concatenation2dDim0DiffInputDimsTest(
5000 armnn::IWorkloadFactory& workloadFactory,
5001 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5003 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5004 workloadFactory, memoryManager, 0.0f, 0);
5007 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5008 LayerTestResult<T, 2> Concatenation2dDim1DiffInputDimsTestImpl(
5009 armnn::IWorkloadFactory& workloadFactory,
5010 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5014 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType, qScale, qOffset);
5015 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5020 10.0f, 11.0f, 12.0f,
5023 armnn::TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType, qScale, qOffset);
5024 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5026 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
5029 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
5032 armnn::TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType, qScale, qOffset);
5033 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5041 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType, qScale, qOffset);
5042 LayerTestResult<T, 2> result(outputTensorInfo);
5044 std::vector<T> output;
5045 output.resize(outputTensorInfo.GetNumElements());
5046 Concatenate<T>(workloadFactory, memoryManager,
5047 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5048 { input0.data(), input1.data(), input2.data() },
5054 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
5055 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5057 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
5060 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
5066 LayerTestResult<float, 2> Concatenation2dDim1DiffInputDimsTest(
5067 armnn::IWorkloadFactory& workloadFactory,
5068 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5070 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
5071 workloadFactory, memoryManager, 0.0f, 0);
5074 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5075 LayerTestResult<T, 3> Concatenation3dTestImpl(
5076 armnn::IWorkloadFactory& workloadFactory,
5077 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5078 const armnn::TensorInfo& outputTensorInfo,
5079 unsigned int dimension,
5084 armnn::TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5086 auto input0 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5087 // Batch 0, Channel 0
5090 // Batch 0, Channel 1
5093 // Batch 0, Channel 2
5096 // Batch 1, Channel 0
5099 // Batch 1, Channel 1
5102 // Batch 1, Channel 2
5106 auto input1 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5107 // Batch 0, Channel 0
5110 // Batch 0, Channel 1
5113 // Batch 0, Channel 2
5116 // Batch 1, Channel 0
5119 // Batch 1, Channel 1
5122 // Batch 1, Channel 2
5126 auto input2 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5127 // Batch 0, Channel 0
5130 // Batch 0, Channel 1
5133 // Batch 0, Channel 2
5136 // Batch 1, Channel 0
5139 // Batch 1, Channel 1
5142 // Batch 1, Channel 2
5146 LayerTestResult<T, 3> result(outputTensorInfo);
5148 std::vector<T> output;
5149 output.resize(outputTensorInfo.GetNumElements());
5150 Concatenate<T>(workloadFactory, memoryManager,
5151 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
5152 { input0.data(), input1.data(), input2.data() },
5158 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5162 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5163 LayerTestResult<T, 3> Concatenation3dDim0TestImpl(
5164 armnn::IWorkloadFactory& workloadFactory,
5165 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5169 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType, qScale, qOffset);
5171 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5172 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
5174 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5175 // Batch 0, Channel 0
5178 // Batch 0, Channel 1
5181 // Batch 0, Channel 2
5184 // Batch 1, Channel 0
5187 // Batch 1, Channel 1
5190 // Batch 1, Channel 2
5193 // Batch 2, Channel 0
5196 // Batch 2, Channel 1
5199 // Batch 2, Channel 2
5202 // Batch 3, Channel 0
5205 // Batch 3, Channel 1
5208 // Batch 3, Channel 2
5211 // Batch 4, Channel 0
5214 // Batch 4, Channel 1
5217 // Batch 4, Channel 2
5220 // Batch 5, Channel 0
5223 // Batch 5, Channel 1
5226 // Batch 5, Channel 2
5233 LayerTestResult<float, 3> Concatenation3dDim0Test(
5234 armnn::IWorkloadFactory& workloadFactory,
5235 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5237 return Concatenation3dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5240 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5241 LayerTestResult<T, 3> Concatenation3dDim1TestImpl(
5242 armnn::IWorkloadFactory& workloadFactory,
5243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5247 armnn::TensorInfo outputTensorInfo({ 2, 9, 2 }, ArmnnType, qScale, qOffset);
5249 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5250 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
5252 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5253 // Batch 0, Channel 0
5256 // Batch 0, Channel 1
5259 // Batch 0, Channel 2
5262 // Batch 0, Channel 3
5265 // Batch 0, Channel 4
5268 // Batch 0, Channel 5
5271 // Batch 0, Channel 6
5274 // Batch 0, Channel 7
5277 // Batch 0, Channel 8
5280 // Batch 1, Channel 0
5283 // Batch 1, Channel 1
5286 // Batch 1, Channel 2
5289 // Batch 1, Channel 3
5292 // Batch 1, Channel 4
5295 // Batch 1, Channel 5
5298 // Batch 1, Channel 6
5301 // Batch 1, Channel 7
5304 // Batch 1, Channel 8
5311 LayerTestResult<float, 3> Concatenation3dDim1Test(
5312 armnn::IWorkloadFactory& workloadFactory,
5313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5315 return Concatenation3dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5318 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5319 LayerTestResult<T, 3> Concatenation3dDim2TestImpl(
5320 armnn::IWorkloadFactory& workloadFactory,
5321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5326 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
5328 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
5329 workloadFactory, memoryManager, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
5331 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5332 // Batch 0, Channel 0
5333 1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
5335 // Batch 0, Channel 1
5336 3.0f, 4.0f, 9.0f, 10.0f, 15.0f, 16.0f,
5338 // Batch 0, Channel 2
5339 5.0f, 6.0f, 11.0f, 12.0f, 17.0f, 18.0f,
5341 // Batch 1, Channel 0
5342 19.0f, 20.0f, 25.0f, 26.0f, 31.0f, 32.0f,
5344 // Batch 1, Channel 1
5345 21.0f, 22.0f, 27.0f, 28.0f, 33.0f, 34.0f,
5347 // Batch 1, Channel 2
5348 23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
5354 LayerTestResult<float, 3> Concatenation3dDim2Test(
5355 armnn::IWorkloadFactory& workloadFactory,
5356 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5359 return Concatenation3dDim2TestImpl<armnn::DataType::Float32>(
5360 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
5363 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5364 LayerTestResult<T, 3> Concatenation3dDim0DiffInputDimsTestImpl(
5365 armnn::IWorkloadFactory& workloadFactory,
5366 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5370 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
5371 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5372 // Batch 0, Channel 0
5375 // Batch 0, Channel 1
5378 // Batch 0, Channel 2
5381 // Batch 1, Channel 0
5384 // Batch 1, Channel 1
5387 // Batch 1, Channel 2
5391 armnn::TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
5392 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5393 // Batch 0, Channel 0
5396 // Batch 0, Channel 1
5399 // Batch 0, Channel 2
5403 armnn::TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
5404 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5405 // Batch 0, Channel 0
5408 // Batch 0, Channel 1
5411 // Batch 0, Channel 2
5414 // Batch 1, Channel 0
5417 // Batch 1, Channel 1
5420 // Batch 1, Channel 2
5423 // Batch 2, Channel 0
5426 // Batch 2, Channel 1
5429 // Batch 2, Channel 2
5433 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
5434 LayerTestResult<T, 3> result(outputTensorInfo);
5436 std::vector<T> output;
5437 output.resize(outputTensorInfo.GetNumElements());
5438 Concatenate<T>(workloadFactory, memoryManager,
5439 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5440 { input0.data(), input1.data(), input2.data() },
5446 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5447 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5448 // Batch 0, Channel 0
5451 // Batch 0, Channel 1
5454 // Batch 0, Channel 2
5457 // Batch 1, Channel 0
5460 // Batch 1, Channel 1
5463 // Batch 1, Channel 2
5466 // Batch 2, Channel 0
5469 // Batch 2, Channel 1
5472 // Batch 2, Channel 2
5475 // Batch 3, Channel 0
5478 // Batch 3, Channel 1
5481 // Batch 3, Channel 2
5484 // Batch 4, Channel 0
5487 // Batch 4, Channel 1
5490 // Batch 4, Channel 2
5493 // Batch 5, Channel 0
5496 // Batch 5, Channel 1
5499 // Batch 5, Channel 2
5506 LayerTestResult<float, 3> Concatenation3dDim0DiffInputDimsTest(
5507 armnn::IWorkloadFactory& workloadFactory,
5508 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5510 return Concatenation3dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
5511 workloadFactory, memoryManager, 0.0f, 0);
5514 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5515 LayerTestResult<T, 3> Concatenation3dDim1DiffInputDimsTestImpl(
5516 armnn::IWorkloadFactory& workloadFactory,
5517 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5521 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5522 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5523 // Batch 0, Channel 0
5526 // Batch 0, Channel 1
5529 // Batch 0, Channel 2
5532 // Batch 1, Channel 0
5535 // Batch 1, Channel 1
5538 // Batch 1, Channel 2
5542 armnn::TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType, qScale, qOffset);
5543 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5544 // Batch 0, Channel 0
5547 // Batch 0, Channel 1
5550 // Batch 0, Channel 2
5553 // Batch 0, Channel 3
5556 // Batch 1, Channel 0
5559 // Batch 1, Channel 1
5562 // Batch 1, Channel 2
5565 // Batch 1, Channel 3
5569 armnn::TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType, qScale, qOffset);
5570 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5571 // Batch 0, Channel 0
5574 // Batch 1, Channel 0
5578 armnn::TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType, qScale, qOffset);
5579 LayerTestResult<T, 3> result(outputTensorInfo);
5581 std::vector<T> output;
5582 output.resize(outputTensorInfo.GetNumElements());
5583 Concatenate<T>(workloadFactory, memoryManager,
5584 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5585 { input0.data(), input1.data(), input2.data() },
5591 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5592 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5593 // Batch 0, Channel 0
5596 // Batch 0, Channel 1
5599 // Batch 0, Channel 2
5602 // Batch 0, Channel 3
5605 // Batch 0, Channel 4
5608 // Batch 0, Channel 5
5611 // Batch 0, Channel 6
5614 // Batch 0, Channel 7
5617 // Batch 1, Channel 0
5620 // Batch 1, Channel 1
5623 // Batch 1, Channel 2
5626 // Batch 1, Channel 3
5629 // Batch 1, Channel 4
5632 // Batch 1, Channel 5
5635 // Batch 1, Channel 6
5638 // Batch 1, Channel 7
5645 LayerTestResult<float, 3> Concatenation3dDim1DiffInputDimsTest(
5646 armnn::IWorkloadFactory& workloadFactory,
5647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5649 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
5650 workloadFactory, memoryManager, 0.0f, 0);
5653 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5654 LayerTestResult<T, 3> Concatenation3dDim2DiffInputDimsTestImpl(
5655 armnn::IWorkloadFactory& workloadFactory,
5656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5661 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType, qScale, qOffset);
5662 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5663 // Batch 0, Channel 0
5666 // Batch 0, Channel 1
5669 // Batch 0, Channel 2
5672 // Batch 1, Channel 0
5675 // Batch 1, Channel 1
5678 // Batch 1, Channel 2
5682 armnn::TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType, qScale, qOffset);
5683 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5684 // Batch 0, Channel 0
5687 // Batch 0, Channel 1
5690 // Batch 0, Channel 2
5693 // Batch 1, Channel 0
5696 // Batch 1, Channel 1
5699 // Batch 1, Channel 2
5703 armnn::TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType, qScale, qOffset);
5704 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
5705 // Batch 0, Channel 0
5706 13.0f, 14.0f, 50.0f,
5708 // Batch 0, Channel 1
5709 15.0f, 16.0f, 51.0f,
5711 // Batch 0, Channel 2
5712 17.0f, 18.0f, 52.0f,
5714 // Batch 1, Channel 0
5715 31.0f, 32.0f, 53.0f,
5717 // Batch 1, Channel 1
5718 33.0f, 34.0f, 54.0f,
5720 // Batch 1, Channel 2
5721 35.0f, 36.0f, 55.0f,
5724 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType, qScale, qOffset);
5725 LayerTestResult<T, 3> result(outputTensorInfo);
5727 std::vector<T> output;
5728 output.resize(outputTensorInfo.GetNumElements());
5729 Concatenate<T>(workloadFactory, memoryManager,
5730 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
5731 { input0.data(), input1.data(), input2.data() },
5737 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
5738 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5739 // Batch 0, Channel 0
5740 1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
5742 // Batch 0, Channel 1
5743 3.0f, 4.0f, 9.0f, 15.0f, 16.0f, 51.0f,
5745 // Batch 0, Channel 2
5746 5.0f, 6.0f, 11.0f, 17.0f, 18.0f, 52.0f,
5748 // Batch 1, Channel 0
5749 19.0f, 20.0f, 25.0f, 31.0f, 32.0f, 53.0f,
5751 // Batch 1, Channel 1
5752 21.0f, 22.0f, 27.0f, 33.0f, 34.0f, 54.0f,
5754 // Batch 1, Channel 2
5755 23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
5761 LayerTestResult<float, 3> Concatenation3dDim2DiffInputDimsTest(
5762 armnn::IWorkloadFactory& workloadFactory,
5763 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5766 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::Float32>(
5767 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
5770 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5771 LayerTestResult<T, 4> Concatenation4dTestImpl(
5772 armnn::IWorkloadFactory& workloadFactory,
5773 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5774 const armnn::TensorInfo& outputTensorInfo,
5775 unsigned int dimension,
5780 armnn::TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
5782 auto input0 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5791 auto input1 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5800 auto input2 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5809 LayerTestResult<T, 4> result(outputTensorInfo);
5811 std::vector<T> output;
5812 output.resize(outputTensorInfo.GetNumElements());
5814 Concatenate<T>(workloadFactory,
5816 {inputTensorInfo, inputTensorInfo, inputTensorInfo},
5817 {input0.data(), input1.data(), input2.data()},
5823 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
5827 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5828 LayerTestResult<T, 4> Concatenation4dDim0TestImpl(
5829 armnn::IWorkloadFactory& workloadFactory,
5830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5834 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
5836 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
5837 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
5839 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5864 LayerTestResult<float, 4> Concatenation4dDim0Test(
5865 armnn::IWorkloadFactory& workloadFactory,
5866 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5868 return Concatenation4dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5871 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5872 LayerTestResult<T, 4> Concatenation4dDim1TestImpl(
5873 armnn::IWorkloadFactory& workloadFactory,
5874 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5878 armnn::TensorInfo outputTensorInfo({ 1, 9, 2, 2 }, ArmnnType, qScale, qOffset);
5880 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
5881 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
5883 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5909 LayerTestResult<float, 4> Concatenation4dDim1Test(
5910 armnn::IWorkloadFactory& workloadFactory,
5911 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5913 return Concatenation4dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5916 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5917 LayerTestResult<T, 4> Concatenation4dDim2TestImpl(
5918 armnn::IWorkloadFactory& workloadFactory,
5919 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5923 armnn::TensorInfo outputTensorInfo({ 1, 3, 6, 2 }, ArmnnType, qScale, qOffset);
5925 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
5926 workloadFactory, memoryManager, outputTensorInfo, 2, true, qScale, qOffset);
5928 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5954 LayerTestResult<float, 4> Concatenation4dDim2Test(
5955 armnn::IWorkloadFactory& workloadFactory,
5956 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5958 return Concatenation4dDim2TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5961 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5962 LayerTestResult<T, 4> Concatenation4dDim3TestImpl(
5963 armnn::IWorkloadFactory& workloadFactory,
5964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5969 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 6 }, ArmnnType, qScale, qOffset);
5971 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
5972 workloadFactory, memoryManager, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
5974 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6000 LayerTestResult<float, 4> Concatenation4dDim3Test(
6001 armnn::IWorkloadFactory& workloadFactory,
6002 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6005 return Concatenation4dDim3TestImpl<armnn::DataType::Float32>(
6006 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6009 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6010 LayerTestResult<T, 4> Concatenation4dDiffShapeDim0TestImpl(
6011 armnn::IWorkloadFactory& workloadFactory,
6012 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6016 unsigned int dimension = 0;
6017 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6019 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6028 armnn::TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6030 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6047 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6049 LayerTestResult<T, 4> result(outputTensorInfo);
6051 std::vector<T> output;
6052 output.resize(outputTensorInfo.GetNumElements());
6053 Concatenate<T>(workloadFactory,
6055 {inputTensorInfo0, inputTensorInfo1},
6056 {input0.data(), input1.data()},
6062 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6063 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6089 LayerTestResult<float, 4> Concatenation4dDiffShapeDim0Test(
6090 armnn::IWorkloadFactory& workloadFactory,
6091 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6093 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::Float32>(
6094 workloadFactory, memoryManager, 0.0f, 0);
6097 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6098 LayerTestResult<T, 4> Concatenation4dDiffShapeDim1TestImpl(
6099 armnn::IWorkloadFactory& workloadFactory,
6100 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6104 unsigned int dimension = 1;
6105 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6107 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6116 armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType, qScale, qOffset);
6118 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6126 armnn::TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType, qScale, qOffset);
6128 LayerTestResult<T, 4> result(outputTensorInfo);
6130 std::vector<T> output;
6131 output.resize(outputTensorInfo.GetNumElements());
6132 Concatenate<T>(workloadFactory,
6134 {inputTensorInfo0, inputTensorInfo1},
6135 {input0.data(), input1.data()},
6141 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6142 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6158 LayerTestResult<float, 4> Concatenation4dDiffShapeDim1Test(
6159 armnn::IWorkloadFactory& workloadFactory,
6160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6162 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::Float32>(
6163 workloadFactory, memoryManager, 0.0f, 0);
6166 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6167 LayerTestResult<T, 4> Concatenation4dDiffShapeDim2TestImpl(
6168 armnn::IWorkloadFactory& workloadFactory,
6169 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6173 unsigned int dimension = 2;
6174 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6176 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6185 armnn::TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType, qScale, qOffset);
6187 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6199 armnn::TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType, qScale, qOffset);
6201 LayerTestResult<T, 4> result(outputTensorInfo);
6203 std::vector<T> output;
6204 output.resize(outputTensorInfo.GetNumElements());
6205 Concatenate<T>(workloadFactory,
6207 {inputTensorInfo0, inputTensorInfo1},
6208 {input0.data(), input1.data()},
6214 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6215 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6238 LayerTestResult<float, 4> Concatenation4dDiffShapeDim2Test(
6239 armnn::IWorkloadFactory& workloadFactory,
6240 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6242 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::Float32>(
6243 workloadFactory, memoryManager, 0.0f, 0);
6246 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6247 LayerTestResult<T, 4> Concatenation4dDiffShapeDim3TestImpl(
6248 armnn::IWorkloadFactory& workloadFactory,
6249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6254 unsigned int dimension = 3;
6255 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType, qScale, qOffset);
6257 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
6266 armnn::TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType, qScale, qOffset);
6268 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
6269 11.0f, 12.0f, 13.0f,
6270 14.0f, 15.0f, 16.0f,
6272 17.0f, 18.0f, 19.0f,
6273 20.0f, 21.0f, 22.0f,
6275 23.0f, 24.0f, 25.0f,
6279 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType, qScale, qOffset);
6281 LayerTestResult<T, 4> result(outputTensorInfo);
6283 std::vector<T> output;
6284 output.resize(outputTensorInfo.GetNumElements());
6285 Concatenate<T>(workloadFactory,
6287 {inputTensorInfo0, inputTensorInfo1},
6288 {input0.data(), input1.data()},
6294 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
6295 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
6296 1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
6297 3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
6298 5.0f, 6.0f, 17.0f, 18.0f, 19.0f,
6299 7.0f, 8.0f, 20.0f, 21.0f, 22.0f,
6300 9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
6301 11.0f, 12.0f, 26.0f, 27.0f, 28.0f
6307 LayerTestResult<float, 4> Concatenation4dDiffShapeDim3Test(
6308 armnn::IWorkloadFactory& workloadFactory,
6309 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6312 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::Float32>(
6313 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
6316 LayerTestResult<float, 2> FakeQuantizationTest(
6317 armnn::IWorkloadFactory& workloadFactory,
6318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6320 constexpr unsigned int width = 2;
6321 constexpr unsigned int height = 3;
6323 const armnn::TensorInfo tensorInfo({height, width },
6324 armnn::DataType::Float32);
6325 auto input = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6331 LayerTestResult<float, 2> ret(tensorInfo);
6333 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6335 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
6337 armnn::FakeQuantizationQueueDescriptor data;
6338 armnn::WorkloadInfo info;
6340 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
6341 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
6345 data.m_Parameters.m_Min = min;
6346 data.m_Parameters.m_Max = max;
6348 armnn::PassthroughCpuTensorHandle refHandle(tensorInfo, &ret.outputExpected[0][0]);
6349 armnn::FakeQuantizationQueueDescriptor refData = data;
6350 armnn::WorkloadInfo refInfo = info;
6351 SetWorkloadOutput(refData, refInfo, 0, tensorInfo, &refHandle);
6353 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateFakeQuantization(data, info);
6355 inputHandle->Allocate();
6356 outputHandle->Allocate();
6358 CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
6360 workload->PostAllocationConfigure();
6361 workload->Execute();
6363 CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
6365 ret.outputExpected = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
6375 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6376 LayerTestResult<T, 4> L2NormalizationTestImpl(
6377 armnn::IWorkloadFactory& workloadFactory,
6378 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6379 const armnn::TensorShape& inputOutputTensorShape,
6382 const std::vector<float>& inputValues,
6385 const std::vector<float>& expectedOutputValues,
6386 const armnn::DataLayout layout,
6387 float epsilon = 1e-12f)
6389 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, ArmnnType, scale, offset);
6390 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, ArmnnType, outScale, outOffset);
6392 // at this point if we require it permute the input data
6393 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
6394 std::vector<float> inputData = inputValues;
6395 if (layout == armnn::DataLayout::NHWC)
6397 std::vector<float> tmp(inputData.size());
6398 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
6402 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(
6403 inputTensorInfo.GetQuantizationScale(),
6404 inputTensorInfo.GetQuantizationOffset(),
6407 std::vector<float> expectedOutputData = expectedOutputValues;
6408 if (layout == armnn::DataLayout::NHWC)
6410 std::vector<float> tmp(expectedOutputData.size());
6411 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, expectedOutputData.data(), tmp.data(),
6413 expectedOutputData = tmp;
6416 LayerTestResult<T, 4> result(outputTensorInfo);
6417 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(
6418 outputTensorInfo.GetQuantizationScale(),
6419 outputTensorInfo.GetQuantizationOffset(),
6420 expectedOutputData));
6422 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6423 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6425 armnn::L2NormalizationQueueDescriptor descriptor;
6426 descriptor.m_Parameters.m_Eps = epsilon;
6427 descriptor.m_Parameters.m_DataLayout = layout;
6428 armnn::WorkloadInfo info;
6430 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6431 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6433 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
6435 inputHandle->Allocate();
6436 outputHandle->Allocate();
6438 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
6440 workload->PostAllocationConfigure();
6441 ExecuteWorkload(*workload, memoryManager);
6443 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6448 float CalcInvL2Norm(std::initializer_list<float> elements)
6450 const float reduction = std::accumulate(elements.begin(), elements.end(), 0.0f,
6451 [](float acc, float element) { return acc + element * element; });
6452 return 1.0f / sqrtf(reduction);
6455 } // anonymous namespace
6457 template<armnn::DataType ArmnnType, typename T>
6458 LayerTestResult<T, 2> Pad2dTestCommon(
6459 armnn::IWorkloadFactory& workloadFactory,
6460 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6463 const float customPaddingValue)
6465 const armnn::TensorShape inputShape{ 3, 3 };
6466 const armnn::TensorShape outputShape{ 7, 7 };
6468 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6469 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6471 std::vector<T> inputValues(
6472 QuantizedVector<T>(qScale, qOffset,
6474 // Height (3) x Width (3)
6480 auto p = customPaddingValue;
6481 std::vector<T> expectedOutputValues;
6482 expectedOutputValues = (
6483 QuantizedVector<T>(qScale, qOffset,
6485 p, p, p, p, p, p, p,
6486 p, p, p, p, p, p, p,
6487 p, p, 4, 8, 6, p, p,
6488 p, p, 7, 4, 4, p, p,
6489 p, p, 3, 2, 4, p, p,
6490 p, p, p, p, p, p, p,
6494 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
6496 LayerTestResult<T, 2> result(outputTensorInfo);
6497 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6499 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6500 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6502 armnn::PadQueueDescriptor descriptor;
6504 std::vector<std::pair<unsigned int, unsigned int>> padList;
6505 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6506 padList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6508 descriptor.m_Parameters.m_PadList = padList;
6509 descriptor.m_Parameters.m_PadValue = customPaddingValue;
6510 armnn::WorkloadInfo info;
6512 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6513 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6515 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6517 inputHandle->Allocate();
6518 outputHandle->Allocate();
6520 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
6522 workload->PostAllocationConfigure();
6523 workload->Execute();
6525 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
6530 template<armnn::DataType ArmnnType, typename T>
6531 LayerTestResult<T, 3> Pad3dTestCommon(
6532 armnn::IWorkloadFactory& workloadFactory,
6533 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6537 const armnn::TensorShape inputShape{ 2, 2, 2 };
6538 const armnn::TensorShape outputShape{ 3, 5, 6 };
6540 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6541 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6543 std::vector<T> inputValues(
6544 QuantizedVector<T>(qScale,qOffset,
6546 // Channel 0, Height (2) x Width (2)
6550 // Channel 1, Height (2) x Width (2)
6555 std::vector<T> expectedOutputValues(
6556 QuantizedVector<T>(qScale,qOffset,
6579 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(inputValues));
6581 LayerTestResult<T, 3> result(outputTensorInfo);
6582 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6584 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6585 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6587 armnn::PadQueueDescriptor descriptor;
6589 std::vector<std::pair<unsigned int, unsigned int>> PadList;
6590 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
6591 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
6592 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
6594 descriptor.m_Parameters.m_PadList = PadList;
6595 armnn::WorkloadInfo info;
6597 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6598 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6600 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6602 inputHandle->Allocate();
6603 outputHandle->Allocate();
6605 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
6607 workload->PostAllocationConfigure();
6608 workload->Execute();
6610 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
6615 template<armnn::DataType ArmnnType, typename T>
6616 LayerTestResult<T, 4> Pad4dTestCommon(
6617 armnn::IWorkloadFactory& workloadFactory,
6618 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6622 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
6623 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
6625 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType, qScale, qOffset);
6626 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType, qScale, qOffset);
6628 std::vector<T> inputValues(
6629 QuantizedVector<T>(qScale,qOffset,
6631 // Batch 0, Channel 0, Height (3) x Width (2)
6636 // Batch 0, Channel 1, Height (3) x Width (2)
6641 // Batch 1, Channel 0, Height (3) x Width (2)
6646 // Batch 1, Channel 1, Height (3) x Width (2)
6652 std::vector<T> expectedOutputValues(
6653 QuantizedVector<T>(qScale,qOffset,
6816 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(inputValues));
6818 LayerTestResult<T, 4> result(outputTensorInfo);
6819 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(expectedOutputValues));
6821 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
6822 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6824 armnn::PadQueueDescriptor descriptor;
6826 std::vector<std::pair<unsigned int, unsigned int>> PadList;
6827 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
6828 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
6829 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
6830 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
6832 descriptor.m_Parameters.m_PadList = PadList;
6833 armnn::WorkloadInfo info;
6835 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
6836 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6838 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
6840 inputHandle->Allocate();
6841 outputHandle->Allocate();
6843 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
6845 workload->PostAllocationConfigure();
6846 workload->Execute();
6848 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6853 LayerTestResult<uint8_t, 2> PadUint82dTest(
6854 armnn::IWorkloadFactory& workloadFactory,
6855 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6857 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
6860 LayerTestResult<uint8_t, 2> PadUint82dCustomPaddingTest(
6861 armnn::IWorkloadFactory& workloadFactory,
6862 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6864 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0, 1.0f);
6867 LayerTestResult<uint8_t, 3> PadUint83dTest(
6868 armnn::IWorkloadFactory& workloadFactory,
6869 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6871 return Pad3dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
6874 LayerTestResult<uint8_t, 4> PadUint84dTest(
6875 armnn::IWorkloadFactory& workloadFactory,
6876 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6878 return Pad4dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
6882 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 2>
6883 Pad2dTestCommon<armnn::DataType::QuantisedSymm16>(
6884 armnn::IWorkloadFactory& workloadFactory,
6885 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6888 const float customPaddingValue);
6890 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 3>
6891 Pad3dTestCommon<armnn::DataType::QuantisedSymm16>(
6892 armnn::IWorkloadFactory& workloadFactory,
6893 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6897 template LayerTestResult<typename armnn::ResolveType<armnn::DataType::QuantisedSymm16>, 4>
6898 Pad4dTestCommon<armnn::DataType::QuantisedSymm16>(
6899 armnn::IWorkloadFactory& workloadFactory,
6900 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6904 LayerTestResult<float, 2> PadFloat322dTest(
6905 armnn::IWorkloadFactory& workloadFactory,
6906 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6908 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6911 LayerTestResult<float, 2> PadFloat322dCustomPaddingTest(
6912 armnn::IWorkloadFactory& workloadFactory,
6913 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6915 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0, 1.0f);
6918 LayerTestResult<float, 3> PadFloat323dTest(
6919 armnn::IWorkloadFactory& workloadFactory,
6920 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6922 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6925 LayerTestResult<float, 4> PadFloat324dTest(
6926 armnn::IWorkloadFactory& workloadFactory,
6927 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6929 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6932 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6933 LayerTestResult<T, 4> L2NormalizationEpsilonTestCommon(
6934 armnn::IWorkloadFactory& workloadFactory,
6935 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6940 const armnn::DataLayout layout,
6947 unsigned int numberOfBatches = 1;
6948 unsigned int numberOfChannels = 3;
6949 unsigned int height = 1;
6950 unsigned int width = 1;
6952 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
6953 numberOfBatches, numberOfChannels, height, width, layout);
6955 // 0.0000001^2 + 0.00000002^2 + 0.00000003^2 < 1e-12
6956 std::vector<float> inputValues
6958 // Batch 0, Channel 0, Height (1) x Width (1)
6961 // Batch 0, Channel 1, Height (1) x Width (1)
6964 // Batch 0, Channel 2, Height (1) x Width (1)
6968 const float approxInvL2Norm = 1.f / sqrtf(epsilon);
6969 std::vector<float> expectedOutputValues
6971 // Batch 0, Channel 0, Height (1) x Width (1)
6972 0.00000001f * approxInvL2Norm,
6973 0.00000002f * approxInvL2Norm,
6974 0.00000003f * approxInvL2Norm,
6977 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
6978 inputValues, outScale, outOffset, expectedOutputValues, layout,
6983 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6984 LayerTestResult<T, 4> L2Normalization1dTestCommon(
6985 armnn::IWorkloadFactory& workloadFactory,
6986 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6991 const armnn::DataLayout layout)
6997 unsigned int numberOfBatches = 1;
6998 unsigned int numberOfChannels = 10;
6999 unsigned int height = 1;
7000 unsigned int width = 1;
7003 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7004 numberOfBatches, numberOfChannels, height, width, layout);
7005 std::vector<float> inputValues
7007 // Batch 0, Channel 0, Height (1) x Width (1)
7010 // Batch 0, Channel 1, Height (1) x Width (1)
7013 // Batch 0, Channel 2, Height (1) x Width (1)
7016 // Batch 0, Channel 3, Height (1) x Width (1)
7019 // Batch 0, Channel 4, Height (1) x Width (1)
7022 // Batch 0, Channel 5, Height (1) x Width (1)
7025 // Batch 0, Channel 6, Height (1) x Width (1)
7028 // Batch 0, Channel 7, Height (1) x Width (1)
7031 // Batch 0, Channel 8, Height (1) x Width (1)
7034 // Batch 0, Channel 9, Height (1) x Width (1)
7037 const float approxInvL2Norm = 0.050964719f;
7038 std::vector<float> expectedOutputValues
7040 // Batch 0, Channel 0, Height (1) x Width (1)
7041 1.0f * approxInvL2Norm,
7042 2.0f * approxInvL2Norm,
7043 3.0f * approxInvL2Norm,
7044 4.0f * approxInvL2Norm,
7045 5.0f * approxInvL2Norm,
7046 6.0f * approxInvL2Norm,
7047 7.0f * approxInvL2Norm,
7048 8.0f * approxInvL2Norm,
7049 9.0f * approxInvL2Norm,
7050 10.0f * approxInvL2Norm
7054 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7055 inputValues, outScale, outOffset, expectedOutputValues, layout);
7058 LayerTestResult<float, 4> L2NormalizationDefaultEpsilonTest(
7059 armnn::IWorkloadFactory& workloadFactory,
7060 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7061 const armnn::DataLayout layout)
7063 // Dummy descriptor to get the default value of epsilon.
7064 armnn::L2NormalizationDescriptor descriptor;
7066 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7067 layout, descriptor.m_Eps);
7070 LayerTestResult<float, 4> L2NormalizationNonDefaultEpsilonTest(
7071 armnn::IWorkloadFactory& workloadFactory,
7072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7073 const armnn::DataLayout layout)
7075 return L2NormalizationEpsilonTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7079 LayerTestResult<float, 4> L2Normalization1dTest(
7080 armnn::IWorkloadFactory& workloadFactory,
7081 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7082 const armnn::DataLayout layout)
7084 return L2Normalization1dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,layout);
7087 LayerTestResult<int16_t, 4> L2Normalization1dInt16Test(
7088 armnn::IWorkloadFactory& workloadFactory,
7089 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7090 const armnn::DataLayout layout)
7092 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7096 LayerTestResult<uint8_t, 4> L2Normalization1dUint8Test(
7097 armnn::IWorkloadFactory& workloadFactory,
7098 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7099 const armnn::DataLayout layout)
7101 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7102 1.f/128, 128, layout);
7105 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7106 LayerTestResult<T, 4> L2Normalization2dTestCommon(
7107 armnn::IWorkloadFactory& workloadFactory,
7108 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7113 const armnn::DataLayout layout)
7119 unsigned int numberOfBatches = 1;
7120 unsigned int numberOfChannels = 2;
7121 unsigned int height = 1;
7122 unsigned int width = 5;
7124 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7125 numberOfBatches, numberOfChannels, height, width, layout);
7126 std::vector<float> inputValues
7128 // Batch 0, Channel 0, Height (1) x Width (5)
7129 1.0f, 3.0f, 5.0f, 7.0f, 9.0f,
7131 // Batch 0, Channel 1, Height (1) x Width (5)
7132 2.0f, 4.0f, 6.0f, 8.0f, 10.0f
7134 std::vector<float> expectedOutputValues
7136 // Batch 0, Channel 0, Height (1) x Width (5)
7137 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7138 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7139 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7140 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7141 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
7143 // Batch 0, Channel 1, Height (1) x Width (5)
7144 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
7145 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
7146 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
7147 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
7148 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
7151 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7152 inputValues, outScale, outOffset, expectedOutputValues, layout);
7155 LayerTestResult<float, 4> L2Normalization2dTest(
7156 armnn::IWorkloadFactory& workloadFactory,
7157 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7158 const armnn::DataLayout layout)
7160 return L2Normalization2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7164 LayerTestResult<int16_t, 4> L2Normalization2dInt16Test(
7165 armnn::IWorkloadFactory& workloadFactory,
7166 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7167 const armnn::DataLayout layout)
7169 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7173 LayerTestResult<uint8_t, 4> L2Normalization2dUint8Test(
7174 armnn::IWorkloadFactory& workloadFactory,
7175 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7176 const armnn::DataLayout layout)
7178 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7179 1.f/128, 128, layout);
7182 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7183 LayerTestResult<T, 4> L2Normalization3dTestCommon(
7184 armnn::IWorkloadFactory& workloadFactory,
7185 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7190 const armnn::DataLayout layout)
7196 unsigned int numberOfBatches = 1;
7197 unsigned int numberOfChannels = 2;
7198 unsigned int height = 4;
7199 unsigned int width = 3;
7201 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7202 numberOfBatches, numberOfChannels, height, width, layout);
7203 std::vector<float> inputValues
7205 // Batch 0, Channel 0, Height (4) x Width (3)
7206 119.0f, 21.0f, 150.0f,
7207 149.0f, 32.0f, 179.0f,
7208 15.0f, 227.0f, 141.0f,
7209 147.0f, 199.0f, 220.0f,
7211 // Batch 0, Channel 1, Height (4) x Width (3)
7212 110.0f, 140.0f, 73.0f,
7213 211.0f, 212.0f, 89.0f,
7214 24.0f, 138.0f, 188.0f,
7215 162.0f, 12.0f, 161.0f
7217 std::vector<float> expectedOutputValues
7219 // Batch 0, Channel 0, Height (4) x Width (3)
7220 119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7221 21.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7222 150.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7223 149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7224 32.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7225 179.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7226 15.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7227 227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7228 141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7229 147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7230 199.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7231 220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
7233 // Batch 0, Channel 1, Height (4) x Width (3)
7234 110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
7235 140.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
7236 73.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
7237 211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
7238 212.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
7239 89.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
7240 24.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
7241 138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
7242 188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
7243 162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
7244 12.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
7245 161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
7248 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7249 inputValues, outScale, outOffset, expectedOutputValues, layout);
7252 LayerTestResult<float, 4> L2Normalization3dTest(
7253 armnn::IWorkloadFactory& workloadFactory,
7254 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7255 const armnn::DataLayout layout)
7257 return L2Normalization3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7261 LayerTestResult<int16_t, 4> L2Normalization3dInt16Test(
7262 armnn::IWorkloadFactory& workloadFactory,
7263 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7264 const armnn::DataLayout layout)
7266 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7270 LayerTestResult<uint8_t, 4> L2Normalization3dUint8Test(
7271 armnn::IWorkloadFactory& workloadFactory,
7272 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7273 const armnn::DataLayout layout)
7275 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7276 1.f/128, 128, layout);
7279 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7280 LayerTestResult<T, 4> L2Normalization4dTestCommon(
7281 armnn::IWorkloadFactory& workloadFactory,
7282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7287 const armnn::DataLayout layout)
7293 unsigned int numberOfBatches = 2;
7294 unsigned int numberOfChannels = 3;
7295 unsigned int height = 4;
7296 unsigned int width = 3;
7298 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
7299 numberOfBatches, numberOfChannels, height, width, layout);
7300 std::vector<float> inputValues
7302 // Batch 0, Channel 0, Height (4) x Width (3)
7303 235.0f, 46.0f, 178.0f,
7304 100.0f, 123.0f, 19.0f,
7305 172.0f, 74.0f, 250.0f,
7306 6.0f, 195.0f, 80.0f,
7308 // Batch 0, Channel 1, Height (4) x Width (3)
7309 113.0f, 95.0f, 202.0f,
7310 77.0f, 114.0f, 71.0f,
7311 122.0f, 246.0f, 166.0f,
7312 82.0f, 28.0f, 37.0f,
7314 // Batch 0, Channel 2, Height (4) x Width (3)
7315 56.0f, 170.0f, 162.0f,
7316 194.0f, 89.0f, 254.0f,
7317 12.0f, 209.0f, 200.0f,
7320 // Batch 1, Channel 0, Height (4) x Width (3)
7321 67.0f, 90.0f, 49.0f,
7322 7.0f, 163.0f, 18.0f,
7323 25.0f, 117.0f, 103.0f,
7324 247.0f, 59.0f, 189.0f,
7326 // Batch 1, Channel 1, Height (4) x Width (3)
7327 239.0f, 104.0f, 199.0f,
7328 17.0f, 124.0f, 153.0f,
7329 222.0f, 217.0f, 75.0f,
7330 32.0f, 126.0f, 21.0f,
7332 // Batch 1, Channel 2, Height (4) x Width (3)
7333 97.0f, 145.0f, 215.0f,
7334 115.0f, 116.0f, 238.0f,
7335 226.0f, 16.0f, 132.0f,
7336 92.0f, 125.0f, 88.0f
7338 std::vector<float> expectedOutputValues
7340 // Batch 0, Channel 0, Height (4) x Width (3)
7341 235.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7342 46.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7343 178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7344 100.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7345 123.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7346 19.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7347 172.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7348 74.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7349 250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7350 6.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7351 195.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7352 80.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7354 // Batch 0, Channel 1, Height (4) x Width (3)
7355 113.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7356 95.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7357 202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7358 77.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7359 114.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7360 71.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7361 122.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7362 246.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7363 166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7364 82.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7365 28.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7366 37.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7368 // Batch 0, Channel 2, Height (4) x Width (3)
7369 56.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
7370 170.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
7371 162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
7372 194.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
7373 89.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
7374 254.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
7375 12.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
7376 209.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
7377 200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
7378 1.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
7379 64.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
7380 54.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
7382 // Batch 1, Channel 0, Height (4) x Width (3)
7383 67.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7384 90.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7385 49.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7386 7.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7387 163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7388 18.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7389 25.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7390 117.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7391 103.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7392 247.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7393 59.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7394 189.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7396 // Batch 1, Channel 1, Height (4) x Width (3)
7397 239.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7398 104.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7399 199.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7400 17.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7401 124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7402 153.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7403 222.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7404 217.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7405 75.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7406 32.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7407 126.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7408 21.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
7410 // Batch 1, Channel 2, Height (4) x Width (3)
7411 97.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
7412 145.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
7413 215.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
7414 115.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
7415 116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
7416 238.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
7417 226.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
7418 16.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
7419 132.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
7420 92.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
7421 125.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
7422 88.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f })
7425 return L2NormalizationTestImpl<ArmnnType>(workloadFactory, memoryManager, inputOutputShape, scale, offset,
7426 inputValues, outScale, outOffset, expectedOutputValues, layout);
7429 LayerTestResult<float, 4> L2Normalization4dTest(
7430 armnn::IWorkloadFactory& workloadFactory,
7431 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7432 const armnn::DataLayout layout)
7434 return L2Normalization4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.f, 0, 0.f, 0,
7438 LayerTestResult<int16_t, 4> L2Normalization4dInt16Test(
7439 armnn::IWorkloadFactory& workloadFactory,
7440 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7441 const armnn::DataLayout layout)
7443 return L2Normalization1dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.f, 0, 1.f, 0,
7447 LayerTestResult<uint8_t, 4> L2Normalization4dUint8Test(
7448 armnn::IWorkloadFactory& workloadFactory,
7449 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7450 const armnn::DataLayout layout)
7452 return L2Normalization1dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.f, 0,
7453 1.f/128, 128, layout);
7456 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7457 LayerTestResult<T, 4> ConstantTestImpl(
7458 armnn::IWorkloadFactory& workloadFactory,
7459 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7463 constexpr unsigned int inputWidth = 3;
7464 constexpr unsigned int inputHeight = 4;
7465 constexpr unsigned int inputChannels = 3;
7466 constexpr unsigned int inputBatchSize = 2;
7468 constexpr unsigned int outputWidth = inputWidth;
7469 constexpr unsigned int outputHeight = inputHeight;
7470 constexpr unsigned int outputChannels = inputChannels;
7471 constexpr unsigned int outputBatchSize = inputBatchSize;
7473 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7474 ArmnnType, qScale, qOffset);
7476 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7477 ArmnnType, qScale, qOffset);
7479 // Set quantization parameters if the requested type is a quantized type.
7480 if(armnn::IsQuantizedType<T>())
7482 inputTensorInfo.SetQuantizationScale(qScale);
7483 inputTensorInfo.SetQuantizationOffset(qOffset);
7484 outputTensorInfo.SetQuantizationScale(qScale);
7485 outputTensorInfo.SetQuantizationOffset(qOffset);
7488 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
7489 QuantizedVector<T>(qScale, qOffset, {
7490 // Batch 0, Channel 0
7491 235.0f, 46.0f, 178.0f,
7492 100.0f, 123.0f, 19.0f,
7493 172.0f, 74.0f, 250.0f,
7494 6.0f, 195.0f, 80.0f,
7496 // Batch 0, Channel 1
7497 113.0f, 95.0f, 202.0f,
7498 77.0f, 114.0f, 71.0f,
7499 122.0f, 246.0f, 166.0f,
7500 82.0f, 28.0f, 37.0f,
7502 // Batch 0, Channel 2
7503 56.0f, 170.0f, 162.0f,
7504 194.0f, 89.0f, 254.0f,
7505 12.0f, 209.0f, 200.0f,
7508 // Batch 1, Channel 0
7509 67.0f, 90.0f, 49.0f,
7510 7.0f, 163.0f, 18.0f,
7511 25.0f, 117.0f, 103.0f,
7512 247.0f, 59.0f, 189.0f,
7514 // Batch 1, Channel 1
7515 239.0f, 104.0f, 199.0f,
7516 17.0f, 124.0f, 153.0f,
7517 222.0f, 217.0f, 75.0f,
7518 32.0f, 126.0f, 21.0f,
7520 // Batch 1, Channel 2
7521 97.0f, 145.0f, 215.0f,
7522 115.0f, 116.0f, 238.0f,
7523 226.0f, 16.0f, 132.0f,
7524 92.0f, 125.0f, 88.0f,
7527 LayerTestResult<T, 4> result(outputTensorInfo);
7528 result.outputExpected = input;
7530 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7532 armnn::ScopedCpuTensorHandle constantTensor(inputTensorInfo);
7533 AllocateAndCopyDataToITensorHandle(&constantTensor, &input[0][0][0][0]);
7535 armnn::ConstantQueueDescriptor descriptor;
7536 descriptor.m_LayerOutput = &constantTensor;
7538 armnn::WorkloadInfo info;
7539 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7541 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConstant(descriptor, info);
7543 outputHandle->Allocate();
7545 workload->PostAllocationConfigure();
7546 workload->Execute();
7548 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7552 LayerTestResult<float, 4> ConstantTest(
7553 armnn::IWorkloadFactory& workloadFactory,
7554 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7556 return ConstantTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
7559 LayerTestResult<int16_t, 4> ConstantInt16SimpleQuantizationScaleNoOffsetTest(
7560 armnn::IWorkloadFactory& workloadFactory,
7561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7563 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 1.0f, 0);
7566 LayerTestResult<uint8_t, 4> ConstantUint8SimpleQuantizationScaleNoOffsetTest(
7567 armnn::IWorkloadFactory& workloadFactory,
7568 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7570 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
7573 LayerTestResult<uint8_t, 3> ConcatUint8DifferentQParamsTest(
7574 armnn::IWorkloadFactory& workloadFactory,
7575 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7577 unsigned int outputWidth = 3;
7578 unsigned int outputHeight = 6;
7579 unsigned int outputChannels = 3;
7581 unsigned int inputWidth1 = 3;
7582 unsigned int inputHeight1 = 6;
7583 unsigned int inputChannels1 = 2;
7585 unsigned int inputWidth2 = 3;
7586 unsigned int inputHeight2 = 6;
7587 unsigned int inputChannels2 = 1;
7589 // Defines the tensor descriptors.
7590 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
7591 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
7592 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
7594 // Quantized input1 tensor. Range [-3, 1]
7595 const float inputScale1 = 0.015686f;
7596 const int32_t inputOffset1 = 192;
7598 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
7616 // Quatized input2 tensor. Range [-1, 4]
7617 const float inputScale2 = 0.019608f;
7618 const int32_t inputOffset2 = 50;
7620 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
7631 // Output has the same quantization parameters than input1,
7632 // so that only the requantization of input2 is required
7633 const float outputScale = 0.015686f;
7634 const int32_t outputOffset = 192;
7636 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
7638 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
7663 outputTensorInfo.SetQuantizationScale(outputScale);
7664 outputTensorInfo.SetQuantizationOffset(outputOffset);
7665 inputTensorInfo1.SetQuantizationScale(inputScale1);
7666 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
7667 inputTensorInfo2.SetQuantizationScale(inputScale2);
7668 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
7670 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
7671 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
7673 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
7674 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
7676 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7678 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
7680 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
7681 subTensorsSupported ?
7682 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
7683 workloadFactory.CreateTensorHandle(inputTensorInfo1);
7685 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
7686 subTensorsSupported ?
7687 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
7688 workloadFactory.CreateTensorHandle(inputTensorInfo2);
7690 armnn::ConcatQueueDescriptor data;
7691 armnn::WorkloadInfo info;
7692 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
7693 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
7694 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
7696 data.m_ViewOrigins.push_back(window1);
7697 data.m_ViewOrigins.push_back(window2);
7699 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
7701 inputHandle1->Allocate();
7702 inputHandle2->Allocate();
7703 outputHandle->Allocate();
7705 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
7706 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
7708 workload->PostAllocationConfigure();
7709 workload->Execute();
7711 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
7716 LayerTestResult<uint8_t, 3> ConcatUint8Test(
7717 armnn::IWorkloadFactory& workloadFactory,
7718 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7720 unsigned int outputWidth = 3;
7721 unsigned int outputHeight = 6;
7722 unsigned int outputChannels = 3;
7724 unsigned int inputWidth1 = 3;
7725 unsigned int inputHeight1 = 6;
7726 unsigned int inputChannels1 = 2;
7728 unsigned int inputWidth2 = 3;
7729 unsigned int inputHeight2 = 6;
7730 unsigned int inputChannels2 = 1;
7732 // Defines the tensor descriptors.
7733 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
7734 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
7735 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
7737 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
7738 const float scale = 0.13497836f;
7739 const int32_t offset = -7;
7741 outputTensorInfo.SetQuantizationScale(scale);
7742 outputTensorInfo.SetQuantizationOffset(offset);
7743 inputTensorInfo1.SetQuantizationScale(scale);
7744 inputTensorInfo1.SetQuantizationOffset(offset);
7745 inputTensorInfo2.SetQuantizationScale(scale);
7746 inputTensorInfo2.SetQuantizationOffset(offset);
7748 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
7750 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
7775 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
7793 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
7804 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
7805 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
7807 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
7808 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
7811 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7813 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
7815 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
7816 subTensorsSupported ?
7817 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
7818 workloadFactory.CreateTensorHandle(inputTensorInfo1);
7820 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
7821 subTensorsSupported ?
7822 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
7823 workloadFactory.CreateTensorHandle(inputTensorInfo2);
7826 armnn::ConcatQueueDescriptor data;
7827 armnn::WorkloadInfo info;
7828 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
7829 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
7830 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
7832 data.m_ViewOrigins.push_back(window1);
7833 data.m_ViewOrigins.push_back(window2);
7835 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
7837 inputHandle1->Allocate();
7838 inputHandle2->Allocate();
7839 outputHandle->Allocate();
7841 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
7842 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
7844 workload->PostAllocationConfigure();
7845 workload->Execute();
7847 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
7852 LayerTestResult<uint16_t, 3> ConcatUint16Test(
7853 armnn::IWorkloadFactory& workloadFactory,
7854 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7856 unsigned int outputWidth = 3;
7857 unsigned int outputHeight = 6;
7858 unsigned int outputChannels = 3;
7860 unsigned int inputWidth1 = 3;
7861 unsigned int inputHeight1 = 6;
7862 unsigned int inputChannels1 = 2;
7864 unsigned int inputWidth2 = 3;
7865 unsigned int inputHeight2 = 6;
7866 unsigned int inputChannels2 = 1;
7868 // Defines the tensor descriptors.
7869 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedSymm16);
7870 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedSymm16);
7871 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedSymm16);
7873 // Arbitrary scale and offsets. They don't really matter as the Concat operator doesn't dequantize/quantize them.
7874 const float scale = 0.13497836f;
7875 const int32_t offset = -7;
7877 outputTensorInfo.SetQuantizationScale(scale);
7878 outputTensorInfo.SetQuantizationOffset(offset);
7879 inputTensorInfo1.SetQuantizationScale(scale);
7880 inputTensorInfo1.SetQuantizationOffset(offset);
7881 inputTensorInfo2.SetQuantizationScale(scale);
7882 inputTensorInfo2.SetQuantizationOffset(offset);
7884 LayerTestResult<uint16_t, 3> ret(outputTensorInfo);
7886 ret.outputExpected = MakeTensor<uint16_t, 3>(outputTensorInfo, std::vector<uint16_t>(
7910 auto input1 = MakeTensor<uint16_t, 3>(inputTensorInfo1, std::vector<uint16_t>(
7927 auto input2 = MakeTensor<uint16_t, 3>(inputTensorInfo2, std::vector<uint16_t>(
7937 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
7938 armnn::ConcatQueueDescriptor::ViewOrigin window1(wOrigin1);
7940 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
7941 armnn::ConcatQueueDescriptor::ViewOrigin window2(wOrigin2);
7944 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7946 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
7948 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
7949 subTensorsSupported ?
7950 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
7951 workloadFactory.CreateTensorHandle(inputTensorInfo1);
7953 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
7954 subTensorsSupported ?
7955 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
7956 workloadFactory.CreateTensorHandle(inputTensorInfo2);
7959 armnn::ConcatQueueDescriptor data;
7960 armnn::WorkloadInfo info;
7961 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
7962 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
7963 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
7965 data.m_ViewOrigins.push_back(window1);
7966 data.m_ViewOrigins.push_back(window2);
7968 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConcat(data, info);
7970 inputHandle1->Allocate();
7971 inputHandle2->Allocate();
7972 outputHandle->Allocate();
7974 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
7975 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
7977 workload->PostAllocationConfigure();
7978 workload->Execute();
7980 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
7987 template <typename T>
7988 LayerTestResult<T, 4> AdditionQuantizeTestHelper(
7989 armnn::IWorkloadFactory& workloadFactory,
7990 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7991 const unsigned int shape0[4],
7992 const std::vector<T>& values0,
7995 const unsigned int shape1[4],
7996 const std::vector<T> & values1,
7999 const unsigned int outShape[4],
8000 const std::vector<T> & outValues,
8004 auto dataType = (std::is_same<T, uint8_t>::value ?
8005 armnn::DataType::QuantisedAsymm8 :
8006 armnn::DataType::QuantisedSymm16);
8008 armnn::TensorInfo inputTensorInfo0(4, shape0, dataType);
8009 armnn::TensorInfo inputTensorInfo1(4, shape1, dataType);
8010 armnn::TensorInfo outputTensorInfo(4, outShape, dataType);
8012 inputTensorInfo0.SetQuantizationScale(scale0);
8013 inputTensorInfo0.SetQuantizationOffset(offset0);
8015 inputTensorInfo1.SetQuantizationScale(scale1);
8016 inputTensorInfo1.SetQuantizationOffset(offset1);
8018 outputTensorInfo.SetQuantizationScale(outScale);
8019 outputTensorInfo.SetQuantizationOffset(outOffset);
8021 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8022 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8024 LayerTestResult<T, 4> result(outputTensorInfo);
8025 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8027 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8028 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8029 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8031 armnn::AdditionQueueDescriptor data;
8032 armnn::WorkloadInfo info;
8033 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8034 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8035 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8037 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
8039 inputHandle0->Allocate();
8040 inputHandle1->Allocate();
8041 outputHandle->Allocate();
8043 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8044 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8046 workload->PostAllocationConfigure();
8047 workload->Execute();
8049 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8053 } // anonymous namespace
8055 LayerTestResult<uint8_t, 4> AdditionUint8Test(
8056 armnn::IWorkloadFactory& workloadFactory,
8057 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8059 const unsigned int shape0[] = { 1, 2, 2, 3 };
8060 const unsigned int shape1[] = { 1, 2, 2, 3 };
8062 std::vector<uint8_t> input0(
8064 63, 35, 77, 70, 56, 112, // 420, 224, 518, 469, 371, 763
8065 203, 28, 252, 168, 245, 91 // 1400, 175, 1743, 1155, 1694, 616
8068 std::vector<uint8_t> input1(
8070 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8071 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8074 std::vector<uint8_t> output(
8076 81, 39, 249, 255, 228, 255, // 546, 252, 1722, 2065(clamped), 1575, 2212(clamped)
8077 255, 186, 255, 186, 255, 214, // 2261(clamped), 1281, 2163(clamped), 1281, 2408(clamped), 1477
8080 return AdditionQuantizeTestHelper(workloadFactory,
8082 shape0, input0, 7.0f, 3,
8083 shape1, input1, 7.0f, 3,
8084 shape0, output, 7.0f, 3);
8087 LayerTestResult<int16_t, 4> AdditionInt16Test(
8088 armnn::IWorkloadFactory& workloadFactory,
8089 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8091 const unsigned int shape0[] = { 1, 2, 2, 3 };
8092 const unsigned int shape1[] = { 1, 2, 2, 3 };
8094 std::vector<int16_t> input0(
8096 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
8097 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
8100 std::vector<int16_t> input1(
8102 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
8103 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
8106 std::vector<int16_t> output(
8108 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
8109 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
8112 return AdditionQuantizeTestHelper(workloadFactory,
8114 shape0, input0, 7.0f, 0,
8115 shape1, input1, 7.0f, 0,
8116 shape0, output, 7.0f, 0);
8121 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8122 LayerTestResult<T, 4> MultiplicationQuantizeTestHelper(
8123 armnn::IWorkloadFactory& workloadFactory,
8124 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8125 const unsigned int shape0[4],
8126 const std::vector<T> & values0,
8129 const unsigned int shape1[4],
8130 const std::vector<T> & values1,
8133 const unsigned int outShape[4],
8134 const std::vector<T> & outValues,
8138 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8139 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8140 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8142 inputTensorInfo0.SetQuantizationScale(scale0);
8143 inputTensorInfo0.SetQuantizationOffset(offset0);
8145 inputTensorInfo1.SetQuantizationScale(scale1);
8146 inputTensorInfo1.SetQuantizationOffset(offset1);
8148 outputTensorInfo.SetQuantizationScale(outScale);
8149 outputTensorInfo.SetQuantizationOffset(outOffset);
8151 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8152 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8154 LayerTestResult<T, 4> result(outputTensorInfo);
8155 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8157 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8158 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8159 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8161 armnn::MultiplicationQueueDescriptor data;
8162 armnn::WorkloadInfo info;
8163 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8164 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8165 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8167 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
8169 inputHandle0->Allocate();
8170 inputHandle1->Allocate();
8171 outputHandle->Allocate();
8173 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8174 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8176 workload->PostAllocationConfigure();
8177 workload->Execute();
8179 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8183 } // anonymous namespace
8185 LayerTestResult<uint8_t, 4> MultiplicationUint8Test(
8186 armnn::IWorkloadFactory& workloadFactory,
8187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8189 unsigned int batchSize = 1;
8190 unsigned int channels = 2;
8191 unsigned int height = 2;
8192 unsigned int width = 3;
8193 const unsigned int shape[] = { batchSize, channels, height, width };
8195 // See dequantized values to the right.
8196 std::vector<uint8_t> input0({
8197 62, 37, 3, 172, 13, 111, // 244, 144, 8, 684, 48, 440,
8198 188, 20, 73, 31, 23, 31 // 748, 76, 288, 120, 88, 120
8201 // See dequantized values to the right.
8202 std::vector<uint8_t> input1({
8203 126, 240, 252, 183, 121, 247, // 384, 726, 762, 555, 369, 747,
8204 48, 115, 151, 79, 78, 97 // 150, 351, 459, 243, 240, 297
8207 // See dequantized values to the right.
8208 std::vector<uint8_t> output(
8210 64, 72, 0, 255, 8, 236, // 93696, 104544, 6096(clamped), 379620(clamped), 17712, 328680,
8211 77, 15, 92, 16, 10, 21, // 112200, 26676, 132192, 29160, 21120, 35640
8214 // Scale/offset chosen to have output values out of range.
8215 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8231 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1ElementUint8Test(
8232 armnn::IWorkloadFactory& workloadFactory,
8233 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8235 const unsigned int shape0[] = { 1, 2, 2, 3 };
8236 const unsigned int shape1[] = { 1, 1, 1, 1 };
8238 std::vector<uint8_t> input0({
8243 std::vector<uint8_t> input1({2});
8245 std::vector<uint8_t> output({
8247 14, 16, 18, 20, 22, 24
8250 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8266 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1DVectorUint8Test(
8267 armnn::IWorkloadFactory& workloadFactory,
8268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8270 const unsigned int shape0[] = { 1, 2, 2, 3 };
8271 const unsigned int shape1[] = { 1, 1, 1, 3 };
8273 std::vector<uint8_t> input0({
8278 std::vector<uint8_t> input1({1, 2, 3});
8280 std::vector<uint8_t> output({
8282 7, 16, 27, 10, 22, 36
8285 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8301 LayerTestResult<int16_t, 4> MultiplicationInt16Test(
8302 armnn::IWorkloadFactory& workloadFactory,
8303 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8305 const unsigned int shape[] = { 1, 2, 2, 3 };
8307 std::vector<int16_t> input0(
8310 12, 13, 14, 15, 16, 17
8313 std::vector<int16_t> input1(
8319 std::vector<int16_t> output(
8321 6, 14, 24, 36, 50, 66,
8322 84, 104, 126, 150, 176, 204
8325 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8341 LayerTestResult<int16_t, 4> MultiplicationBroadcast1ElementInt16Test(
8342 armnn::IWorkloadFactory& workloadFactory,
8343 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8345 const unsigned int shape0[] = { 1, 2, 2, 3 };
8346 const unsigned int shape1[] = { 1, 1, 1, 1 };
8348 std::vector<int16_t> input0(
8354 std::vector<int16_t> input1({2});
8356 std::vector<int16_t> output(
8359 14, 16, 18, 20, 22, 24
8362 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8378 LayerTestResult<int16_t, 4> MultiplicationBroadcast1DVectorInt16Test(
8379 armnn::IWorkloadFactory& workloadFactory,
8380 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8382 const unsigned int shape0[] = { 1, 2, 2, 3 };
8383 const unsigned int shape1[] = { 1, 1, 1, 3 };
8385 std::vector<int16_t> input0(
8391 std::vector<int16_t> input1({1, 2, 3});
8393 std::vector<int16_t> output(
8396 7, 16, 27, 10, 22, 36
8399 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8417 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
8418 LayerTestResult<T, 4> SubtractionTestHelper(
8419 armnn::IWorkloadFactory& workloadFactory,
8420 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8421 const unsigned int shape0[4],
8422 const std::vector<T>& values0,
8425 const unsigned int shape1[4],
8426 const std::vector<T> & values1,
8429 const unsigned int outShape[4],
8430 const std::vector<T> & outValues,
8434 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
8435 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
8436 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
8438 inputTensorInfo0.SetQuantizationScale(scale0);
8439 inputTensorInfo0.SetQuantizationOffset(offset0);
8441 inputTensorInfo1.SetQuantizationScale(scale1);
8442 inputTensorInfo1.SetQuantizationOffset(offset1);
8444 outputTensorInfo.SetQuantizationScale(outScale);
8445 outputTensorInfo.SetQuantizationOffset(outOffset);
8447 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
8448 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
8450 LayerTestResult<T, 4> result(outputTensorInfo);
8451 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
8453 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
8454 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
8455 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8457 armnn::SubtractionQueueDescriptor data;
8458 armnn::WorkloadInfo info;
8459 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
8460 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
8461 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8463 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSubtraction(data, info);
8465 inputHandle0->Allocate();
8466 inputHandle1->Allocate();
8467 outputHandle->Allocate();
8469 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
8470 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
8472 workload->PostAllocationConfigure();
8473 workload->Execute();
8475 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8479 } // anonymous namespace
8481 LayerTestResult<uint8_t, 4> SubtractionUint8Test(
8482 armnn::IWorkloadFactory& workloadFactory,
8483 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8485 const unsigned int shape0[] = { 1, 1, 2, 2 };
8486 const unsigned int shape1[] = { 1, 1, 2, 2 };
8488 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8489 std::vector<uint8_t> input1({ 1, 2, 1, 2 });
8490 std::vector<uint8_t> output({ 3, 3, 5, 5 });
8492 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8494 shape0, input0, 0.5f, 2,
8495 shape1, input1, 1.0f, 0,
8496 shape0, output, 1.0f, 0);
8499 LayerTestResult<uint8_t, 4> SubtractionBroadcast1ElementUint8Test(
8500 armnn::IWorkloadFactory& workloadFactory,
8501 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8503 const unsigned int shape0[] = { 1, 1, 2, 2 };
8504 const unsigned int shape1[] = { 1, 1, 1, 1 };
8506 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8507 std::vector<uint8_t> input1({ 2 });
8508 std::vector<uint8_t> output({ 5, 6, 7, 8 });
8510 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8512 shape0, input0, 0.5f, 2,
8513 shape1, input1, 1.0f, 0,
8514 shape0, output, 1.0f, 3);
8517 LayerTestResult<uint8_t, 4> SubtractionBroadcastUint8Test(
8518 armnn::IWorkloadFactory& workloadFactory,
8519 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8521 const unsigned int shape0[] = { 1, 1, 2, 2 };
8522 const unsigned int shape1[] = { 1, 1, 2, 1 };
8524 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
8525 std::vector<uint8_t> input1({ 2, 1 });
8526 std::vector<uint8_t> output({ 8, 11, 12, 15 });
8528 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
8530 shape0, input0, 1.0f, 0,
8531 shape1, input1, 1.0f, 0,
8532 shape0, output, 1.0f, 0);
8535 LayerTestResult<float, 4> SubtractionTest(
8536 armnn::IWorkloadFactory& workloadFactory,
8537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8539 const unsigned int shape0[] = { 1, 1, 2, 2 };
8540 const unsigned int shape1[] = { 1, 1, 2, 2 };
8542 std::vector<float> input0({ 1, 2, 3, 4 });
8543 std::vector<float> input1({ 1, -1, 0, 2 });
8544 std::vector<float> output({ 0, 3, 3, 2 });
8546 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8548 shape0, input0, 1.0f, 0,
8549 shape1, input1, 1.0f, 0,
8550 shape0, output, 1.0f, 0);
8553 LayerTestResult<float, 4> SubtractionBroadcast1ElementTest(
8554 armnn::IWorkloadFactory& workloadFactory,
8555 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8557 const unsigned int shape0[] = { 1, 1, 2, 2 };
8558 const unsigned int shape1[] = { 1, 1, 1, 1 };
8560 std::vector<float> input0({ 1, 2, 3, 4 });
8561 std::vector<float> input1({ 10 });
8562 std::vector<float> output({ -9, -8, -7, -6 });
8564 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8566 shape0, input0, 1.0f, 0,
8567 shape1, input1, 1.0f, 0,
8568 shape0, output, 1.0f, 0);
8571 LayerTestResult<float, 4> SubtractionBroadcastTest(
8572 armnn::IWorkloadFactory& workloadFactory,
8573 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8575 const unsigned int shape0[] = { 1, 1, 2, 2 };
8576 const unsigned int shape1[] = { 1, 1, 1, 2 };
8578 std::vector<float> input0({ 1, 2, 3, 4 });
8579 std::vector<float> input1({ 10, -5 });
8580 std::vector<float> output({ -9, 7, -7, 9 });
8582 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
8584 shape0, input0, 1.0f, 0,
8585 shape1, input1, 1.0f, 0,
8586 shape0, output, 1.0f, 0);
8589 LayerTestResult<int16_t, 4> SubtractionInt16Test(
8590 armnn::IWorkloadFactory& workloadFactory,
8591 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8593 const unsigned int shape0[] = { 1, 1, 2, 2 };
8594 const unsigned int shape1[] = { 1, 1, 2, 2 };
8596 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8597 std::vector<int16_t> input1({ 1, 2, 1, 2 });
8598 std::vector<int16_t> output({ 3, 3, 5, 5 });
8600 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8602 shape0, input0, 0.5f, 0,
8603 shape1, input1, 1.0f, 0,
8604 shape0, output, 1.0f, 0);
8607 LayerTestResult<int16_t, 4> SubtractionBroadcast1ElementInt16Test(
8608 armnn::IWorkloadFactory& workloadFactory,
8609 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8611 const unsigned int shape0[] = { 1, 1, 2, 2 };
8612 const unsigned int shape1[] = { 1, 1, 1, 1 };
8614 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8615 std::vector<int16_t> input1({ 2 });
8616 std::vector<int16_t> output({ 3, 4, 5, 6 });
8618 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8620 shape0, input0, 0.5f, 0,
8621 shape1, input1, 1.0f, 0,
8622 shape0, output, 1.0f, 0);
8625 LayerTestResult<int16_t, 4> SubtractionBroadcastInt16Test(
8626 armnn::IWorkloadFactory& workloadFactory,
8627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8629 const unsigned int shape0[] = { 1, 1, 2, 2 };
8630 const unsigned int shape1[] = { 1, 1, 2, 1 };
8632 std::vector<int16_t> input0({ 10, 12, 14, 16 });
8633 std::vector<int16_t> input1({ 2, 1 });
8634 std::vector<int16_t> output({ 8, 11, 12, 15 });
8636 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
8638 shape0, input0, 1.0f, 0,
8639 shape1, input1, 1.0f, 0,
8640 shape0, output, 1.0f, 0);
8643 LayerTestResult<float, 4> BatchNormTest(
8644 armnn::IWorkloadFactory& workloadFactory,
8645 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8652 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
8653 std::vector<float> inputValues
8655 // Batch 0, Channel 0, Height (3) x Width (2)
8660 // Batch 0, Channel 1, Height (3) x Width (2)
8665 std::vector<float> expectedOutputValues
8667 // Batch 0, Channel 0, Height (3) x Width (2)
8672 // Batch 0, Channel 1, Height (3) x Width (2)
8678 return BatchNormTestImpl<armnn::DataType::Float32>(
8679 workloadFactory, memoryManager,
8680 inputOutputShape, inputValues, expectedOutputValues,
8681 0.f, 0, armnn::DataLayout::NCHW);
8684 LayerTestResult<float, 4> BatchNormNhwcTest(
8685 armnn::IWorkloadFactory& workloadFactory,
8686 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8693 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
8694 std::vector<float> inputValues
8696 // Batch 0, Height 0, Width (2) x Channel (2)
8700 // Batch 0, Height 1, Width (2) x Channel (2)
8704 // Batch 0, Height 2, Width (2) x Channel (2)
8708 std::vector<float> expectedOutputValues
8710 // Batch 0, Height 0, Width (2) x Channel (2)
8714 // Batch 0, Height 1, Width (2) x Channel (2)
8718 // Batch 0, Height 2, Width (2) x Channel (2)
8723 return BatchNormTestImpl<armnn::DataType::Float32>(
8724 workloadFactory, memoryManager,
8725 inputOutputShape, inputValues, expectedOutputValues,
8726 0.f, 0, armnn::DataLayout::NHWC);
8729 LayerTestResult<uint8_t, 4> BatchNormUint8Test(
8730 armnn::IWorkloadFactory& workloadFactory,
8731 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8738 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
8739 std::vector<float> inputValues
8741 // Batch 0, Channel 0, Height (3) x Width (2)
8746 // Batch 0, Channel 1, Height (3) x Width (2)
8751 std::vector<float> expectedOutputValues
8753 // Batch 0, Channel 0, Height (3) x Width (2)
8758 // Batch 0, Channel 1, Height (3) x Width (2)
8764 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>(
8765 workloadFactory, memoryManager,
8766 inputOutputShape, inputValues, expectedOutputValues,
8767 1.f/20.f, 50, armnn::DataLayout::NCHW);
8770 LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest(
8771 armnn::IWorkloadFactory& workloadFactory,
8772 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8779 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
8780 std::vector<float> inputValues
8782 // Batch 0, Height 0, Width (2) x Channel (2)
8786 // Batch 0, Height 1, Width (2) x Channel (2)
8790 // Batch 0, Height 2, Width (2) x Channel (2)
8794 std::vector<float> expectedOutputValues
8796 // Batch 0, Height 0, Width (2) x Channel (2)
8800 // Batch 0, Height 1, Width (2) x Channel (2)
8804 // Batch 0, Height 2, Width (2) x Channel (2)
8809 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>
8810 (workloadFactory, memoryManager,
8811 inputOutputShape, inputValues, expectedOutputValues,
8812 1.f/20.f, 50, armnn::DataLayout::NHWC);
8815 LayerTestResult<int16_t, 4> BatchNormInt16Test(
8816 armnn::IWorkloadFactory& workloadFactory,
8817 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8824 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
8825 std::vector<float> inputValues
8827 // Batch 0, Channel 0, Height (3) x Width (2)
8832 // Batch 0, Channel 1, Height (3) x Width (2)
8837 std::vector<float> expectedOutputValues
8839 // Batch 0, Channel 0, Height (3) x Width (2)
8844 // Batch 0, Channel 1, Height (3) x Width (2)
8850 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>(
8851 workloadFactory, memoryManager,
8852 inputOutputShape, inputValues, expectedOutputValues,
8853 1.f/20.f, 50, armnn::DataLayout::NCHW);
8856 LayerTestResult<int16_t, 4> BatchNormInt16NhwcTest(
8857 armnn::IWorkloadFactory& workloadFactory,
8858 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8865 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
8866 std::vector<float> inputValues
8868 // Batch 0, Height 0, Width (2) x Channel (2)
8872 // Batch 0, Height 1, Width (2) x Channel (2)
8876 // Batch 0, Height 2, Width (2) x Channel (2)
8880 std::vector<float> expectedOutputValues
8882 // Batch 0, Height 0, Width (2) x Channel (2)
8886 // Batch 0, Height 1, Width (2) x Channel (2)
8890 // Batch 0, Height 2, Width (2) x Channel (2)
8895 return BatchNormTestImpl<armnn::DataType::QuantisedSymm16>
8896 (workloadFactory, memoryManager,
8897 inputOutputShape, inputValues, expectedOutputValues,
8898 1.f/20.f, 50, armnn::DataLayout::NHWC);
8901 LayerTestResult<uint8_t, 4> ConstantUint8CustomQuantizationScaleAndOffsetTest(
8902 armnn::IWorkloadFactory& workloadFactory,
8903 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8905 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 2e-6f, 1);
8908 LayerTestResult<int16_t, 4> ConstantInt16CustomQuantizationScaleAndOffsetTest(
8909 armnn::IWorkloadFactory& workloadFactory,
8910 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8912 return ConstantTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, 2e-6f, 1);
8915 LayerTestResult<uint8_t, 1> Concatenation1dUint8Test(
8916 armnn::IWorkloadFactory& workloadFactory,
8917 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8919 return Concatenation1dTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8922 LayerTestResult<uint8_t, 2> Concatenation2dDim0Uint8Test(
8923 armnn::IWorkloadFactory& workloadFactory,
8924 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8926 return Concatenation2dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8929 LayerTestResult<uint8_t, 2> Concatenation2dDim1Uint8Test(
8930 armnn::IWorkloadFactory& workloadFactory,
8931 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8933 return Concatenation2dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8936 LayerTestResult<uint8_t, 2> Concatenation2dDim0DiffInputDimsUint8Test(
8937 armnn::IWorkloadFactory& workloadFactory,
8938 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8940 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8941 workloadFactory, memoryManager, 0.5f, -1);
8944 LayerTestResult<uint8_t, 2> Concatenation2dDim1DiffInputDimsUint8Test(
8945 armnn::IWorkloadFactory& workloadFactory,
8946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8948 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8949 workloadFactory, memoryManager, 0.5f, -1);
8952 LayerTestResult<uint8_t, 3> Concatenation3dDim0Uint8Test(
8953 armnn::IWorkloadFactory& workloadFactory,
8954 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8956 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8959 LayerTestResult<uint8_t, 3> Concatenation3dDim1Uint8Test(
8960 armnn::IWorkloadFactory& workloadFactory,
8961 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8963 return Concatenation3dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8966 LayerTestResult<uint8_t, 3> Concatenation3dDim2Uint8Test(
8967 armnn::IWorkloadFactory& workloadFactory,
8968 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8971 return Concatenation3dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
8972 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
8975 LayerTestResult<uint8_t, 3> Concatenation3dDim0DiffInputDimsUint8Test(
8976 armnn::IWorkloadFactory& workloadFactory,
8977 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8979 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8982 LayerTestResult<uint8_t, 3> Concatenation3dDim1DiffInputDimsUint8Test(
8983 armnn::IWorkloadFactory& workloadFactory,
8984 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8986 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8987 workloadFactory, memoryManager, 0.5f, -1);
8990 LayerTestResult<uint8_t, 3> Concatenation3dDim2DiffInputDimsUint8Test(
8991 armnn::IWorkloadFactory& workloadFactory,
8992 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8995 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8996 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
8999 LayerTestResult<uint8_t, 4> Concatenation4dDim0Uint8Test(
9000 armnn::IWorkloadFactory& workloadFactory,
9001 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9003 return Concatenation4dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9006 LayerTestResult<uint8_t, 4> Concatenation4dDim1Uint8Test(
9007 armnn::IWorkloadFactory& workloadFactory,
9008 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9010 return Concatenation4dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9013 LayerTestResult<uint8_t, 4> Concatenation4dDim2Uint8Test(
9014 armnn::IWorkloadFactory& workloadFactory,
9015 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9017 return Concatenation4dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
9020 LayerTestResult<uint8_t, 4> Concatenation4dDim3Uint8Test(
9021 armnn::IWorkloadFactory& workloadFactory,
9022 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, bool useSubtensor)
9024 return Concatenation4dDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9025 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9028 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim0Uint8Test(
9029 armnn::IWorkloadFactory& workloadFactory,
9030 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9032 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::QuantisedAsymm8>(
9033 workloadFactory, memoryManager, 0.5f, -1);
9036 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim1Uint8Test(
9037 armnn::IWorkloadFactory& workloadFactory,
9038 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9040 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::QuantisedAsymm8>(
9041 workloadFactory, memoryManager, 0.5f, -1);
9044 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim2Uint8Test(
9045 armnn::IWorkloadFactory& workloadFactory,
9046 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9048 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
9049 workloadFactory, memoryManager, 0.5f, -1);
9052 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim3Uint8Test(
9053 armnn::IWorkloadFactory& workloadFactory,
9054 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9057 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
9058 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
9061 LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
9062 armnn::IWorkloadFactory& workloadFactory,
9063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9064 bool forceNoPadding)
9066 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
9067 workloadFactory, memoryManager, forceNoPadding);
9070 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
9071 armnn::IWorkloadFactory& workloadFactory,
9072 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9073 bool forceNoPadding)
9075 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedAsymm8>(
9076 workloadFactory, memoryManager, forceNoPadding, 3.0f, -5);
9079 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Int16Test(
9080 armnn::IWorkloadFactory& workloadFactory,
9081 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9082 bool forceNoPadding)
9084 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedSymm16>(
9085 workloadFactory, memoryManager, forceNoPadding);
9088 LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
9089 armnn::IWorkloadFactory& workloadFactory,
9090 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9091 bool forceNoPadding)
9093 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
9094 workloadFactory, memoryManager, forceNoPadding);
9097 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
9098 armnn::IWorkloadFactory& workloadFactory,
9099 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9100 bool forceNoPadding)
9102 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedAsymm8>(
9103 workloadFactory, memoryManager, forceNoPadding, 0.1f, 128);
9106 LayerTestResult<int16_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Int16Test(
9107 armnn::IWorkloadFactory& workloadFactory,
9108 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9109 bool forceNoPadding)
9111 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedSymm16>(
9112 workloadFactory, memoryManager, forceNoPadding);
9115 LayerTestResult<float, 4> SimpleMaxPooling2dTest(
9116 armnn::IWorkloadFactory& workloadFactory,
9117 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9118 const armnn::DataLayout dataLayout)
9120 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9123 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
9124 armnn::IWorkloadFactory& workloadFactory,
9125 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9126 const armnn::DataLayout dataLayout)
9128 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9131 LayerTestResult<int16_t, 4> SimpleMaxPooling2dInt16Test(
9132 armnn::IWorkloadFactory& workloadFactory,
9133 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9134 const armnn::DataLayout dataLayout)
9136 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9138 LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
9139 armnn::IWorkloadFactory& workloadFactory,
9140 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9142 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9145 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
9146 armnn::IWorkloadFactory& workloadFactory,
9147 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9149 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9150 workloadFactory, memoryManager, 1.0f, -5);
9153 LayerTestResult<int16_t, 4> IgnorePaddingSimpleMaxPooling2dInt16Test(
9154 armnn::IWorkloadFactory& workloadFactory,
9155 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9157 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9158 workloadFactory, memoryManager);
9161 LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
9162 armnn::IWorkloadFactory& workloadFactory,
9163 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9165 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9168 LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
9169 armnn::IWorkloadFactory& workloadFactory,
9170 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9172 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9173 workloadFactory, memoryManager, 1.0f, -5);
9176 LayerTestResult<int16_t, 4> IgnorePaddingMaxPooling2dSize3Int16Test(
9177 armnn::IWorkloadFactory& workloadFactory,
9178 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9180 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9181 workloadFactory, memoryManager);
9184 LayerTestResult<float, 4> SimpleAveragePooling2dTest(
9185 armnn::IWorkloadFactory& workloadFactory,
9186 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9187 const armnn::DataLayout dataLayout)
9189 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9192 LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
9193 armnn::IWorkloadFactory& workloadFactory,
9194 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9195 const armnn::DataLayout dataLayout)
9197 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9198 workloadFactory, memoryManager, dataLayout, 0.5, -1);
9201 LayerTestResult<int16_t, 4> SimpleAveragePooling2dInt16Test(
9202 armnn::IWorkloadFactory& workloadFactory,
9203 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9204 const armnn::DataLayout dataLayout)
9206 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9207 workloadFactory, memoryManager, dataLayout);
9210 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
9211 armnn::IWorkloadFactory& workloadFactory,
9212 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9213 bool forceNoPadding)
9215 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
9216 workloadFactory, memoryManager, forceNoPadding);
9219 LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
9220 armnn::IWorkloadFactory& workloadFactory,
9221 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9223 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9226 LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
9227 armnn::IWorkloadFactory& workloadFactory,
9228 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9230 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9231 workloadFactory, memoryManager, 0.5, -1);
9234 LayerTestResult<int16_t, 4> LargeTensorsAveragePooling2dInt16Test(
9235 armnn::IWorkloadFactory& workloadFactory,
9236 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9238 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9239 workloadFactory, memoryManager);
9241 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
9242 armnn::IWorkloadFactory& workloadFactory,
9243 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9245 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9248 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
9249 armnn::IWorkloadFactory& workloadFactory,
9250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9252 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9253 workloadFactory, memoryManager);
9256 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dInt16Test(
9257 armnn::IWorkloadFactory& workloadFactory,
9258 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9260 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9261 workloadFactory, memoryManager);
9264 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
9265 armnn::IWorkloadFactory& workloadFactory,
9266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9268 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
9269 workloadFactory, memoryManager);
9272 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
9273 armnn::IWorkloadFactory& workloadFactory,
9274 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9276 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedAsymm8>(
9277 workloadFactory, memoryManager);
9280 LayerTestResult<int16_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingInt16Test(
9281 armnn::IWorkloadFactory& workloadFactory,
9282 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9284 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedSymm16>(
9285 workloadFactory, memoryManager);
9288 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
9289 armnn::IWorkloadFactory& workloadFactory,
9290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9292 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9295 LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
9296 armnn::IWorkloadFactory& workloadFactory,
9297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9299 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
9300 workloadFactory, memoryManager);
9303 LayerTestResult<int16_t, 4> IgnorePaddingAveragePooling2dSize3Int16Test(
9304 armnn::IWorkloadFactory& workloadFactory,
9305 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9307 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(
9308 workloadFactory, memoryManager);
9311 LayerTestResult<float, 4> SimpleL2Pooling2dTest(
9312 armnn::IWorkloadFactory& workloadFactory,
9313 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9314 const armnn::DataLayout dataLayout)
9316 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
9319 LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
9320 armnn::IWorkloadFactory& workloadFactory,
9321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9322 const armnn::DataLayout dataLayout)
9324 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
9327 LayerTestResult<int16_t, 4> SimpleL2Pooling2dInt16Test(
9328 armnn::IWorkloadFactory& workloadFactory,
9329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9330 const armnn::DataLayout dataLayout)
9332 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager, dataLayout);
9335 LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
9336 armnn::IWorkloadFactory& workloadFactory,
9337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9339 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9342 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
9343 armnn::IWorkloadFactory& workloadFactory,
9344 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9346 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9349 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride1Int16Test(
9350 armnn::IWorkloadFactory& workloadFactory,
9351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9353 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9356 LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
9357 armnn::IWorkloadFactory& workloadFactory,
9358 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9360 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9363 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
9364 armnn::IWorkloadFactory& workloadFactory,
9365 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9367 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9370 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride3Int16Test(
9371 armnn::IWorkloadFactory& workloadFactory,
9372 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9374 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9376 LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
9377 armnn::IWorkloadFactory& workloadFactory,
9378 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9380 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9383 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
9384 armnn::IWorkloadFactory& workloadFactory,
9385 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9387 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9390 LayerTestResult<int16_t, 4> L2Pooling2dSize3Stride4Int16Test(
9391 armnn::IWorkloadFactory& workloadFactory,
9392 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9394 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9397 LayerTestResult<float, 4> L2Pooling2dSize7Test(
9398 armnn::IWorkloadFactory& workloadFactory,
9399 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9401 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9404 LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
9405 armnn::IWorkloadFactory& workloadFactory,
9406 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9408 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9411 LayerTestResult<int16_t, 4> L2Pooling2dSize7Int16Test(
9412 armnn::IWorkloadFactory& workloadFactory,
9413 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9415 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9418 LayerTestResult<float, 4> L2Pooling2dSize9Test(
9419 armnn::IWorkloadFactory& workloadFactory,
9420 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9422 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9425 LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
9426 armnn::IWorkloadFactory& workloadFactory,
9427 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9429 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9432 LayerTestResult<int16_t, 4> L2Pooling2dSize9Int16Test(
9433 armnn::IWorkloadFactory& workloadFactory,
9434 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9436 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9438 LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
9439 armnn::IWorkloadFactory& workloadFactory,
9440 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9442 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9445 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
9446 armnn::IWorkloadFactory& workloadFactory,
9447 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9449 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9452 LayerTestResult<int16_t, 4> IgnorePaddingSimpleL2Pooling2dInt16Test(
9453 armnn::IWorkloadFactory& workloadFactory,
9454 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9456 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9459 LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
9460 armnn::IWorkloadFactory& workloadFactory,
9461 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9463 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9466 LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
9467 armnn::IWorkloadFactory& workloadFactory,
9468 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9470 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9473 LayerTestResult<int16_t, 4> IgnorePaddingL2Pooling2dSize3Int16Test(
9474 armnn::IWorkloadFactory& workloadFactory,
9475 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9477 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9480 LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
9481 armnn::IWorkloadFactory& workloadFactory,
9482 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9484 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
9487 LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
9488 armnn::IWorkloadFactory& workloadFactory,
9489 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9491 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9494 LayerTestResult<int16_t, 4> AsymmetricNonSquarePooling2dInt16Test(
9495 armnn::IWorkloadFactory& workloadFactory,
9496 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9498 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9501 LayerTestResult<float, 4> ComparePooling2dTest(
9502 armnn::IWorkloadFactory& workloadFactory,
9503 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9504 armnn::IWorkloadFactory& refWorkloadFactory,
9505 armnn::PoolingAlgorithm poolingType)
9507 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
9508 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
9511 LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
9512 armnn::IWorkloadFactory& workloadFactory,
9513 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9514 armnn::IWorkloadFactory& refWorkloadFactory,
9515 armnn::PoolingAlgorithm poolingType)
9517 return ComparePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
9518 workloadFactory, memoryManager, refWorkloadFactory, poolingType, 0.1f, 128);
9521 LayerTestResult<int16_t, 4> ComparePooling2dInt16Test(
9522 armnn::IWorkloadFactory& workloadFactory,
9523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9524 armnn::IWorkloadFactory& refWorkloadFactory,
9525 armnn::PoolingAlgorithm poolingType)
9527 return ComparePooling2dTestCommon<armnn::DataType::QuantisedSymm16>(
9528 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
9531 LayerTestResult<float, 2> FullyConnectedLargeTest(
9532 armnn::IWorkloadFactory& workloadFactory,
9533 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
9534 bool transposeWeights)
9536 return FullyConnectedLargeTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, transposeWeights);
9539 LayerTestResult<float, 4> AdditionAfterMaxPoolTest(
9540 armnn::IWorkloadFactory& workloadFactory,
9541 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9543 // Create Initial Tensor
9548 armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::DataType::Float32);
9549 armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::DataType::Float32);
9551 boost::multi_array<float, 4> poolingInput = MakeTensor<float,4>(poolingInputTensorInfo,
9557 std::unique_ptr<armnn::ITensorHandle> poolingInputHandle =
9558 workloadFactory.CreateTensorHandle(poolingInputTensorInfo);
9559 std::unique_ptr<armnn::ITensorHandle> poolingOutputHandle =
9560 workloadFactory.CreateTensorHandle(poolingOutputTensorInfo);
9562 // Apply MaxPool poolSize = 1x1, stride=2x2
9566 armnn::Pooling2dDescriptor descriptor;
9567 descriptor.m_PoolHeight = 1;
9568 descriptor.m_PoolWidth = 1;
9569 descriptor.m_StrideX = 2;
9570 descriptor.m_StrideY = 2;
9571 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
9573 armnn::Pooling2dQueueDescriptor queueDescriptor;
9574 queueDescriptor.m_Parameters = descriptor;
9575 armnn::WorkloadInfo workloadInfo;
9576 AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get());
9577 AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get());
9579 // Create the MaxPool
9580 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
9582 //LayerTestResult<float, 4> result(poolingOutputTensorInfo);
9583 auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo));
9584 boost::multi_array<float, 4> resultMaxPool;
9585 resultMaxPool.resize(shape);
9588 // Create addition with another tensor the same size
9589 // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1
9590 // with the initial tensor.
9594 armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
9595 armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
9597 boost::multi_array<float, 4> addInput = MakeTensor<float,4>(addInputTensorInfo,
9602 // Expected output tensor after MaxPool and Addition.
9603 LayerTestResult<float,4> addRet(addOutputTensorInfo);
9604 addRet.outputExpected = MakeTensor<float, 4>(addOutputTensorInfo, std::vector<float>(
9610 std::unique_ptr<armnn::ITensorHandle> addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo);
9611 std::unique_ptr<armnn::ITensorHandle> addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo);
9613 armnn::AdditionQueueDescriptor data;
9614 armnn::WorkloadInfo info;
9616 // Add the output of the MaxPool and the new tensor
9617 AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get());
9618 AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get());
9619 AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get());
9621 std::unique_ptr<armnn::IWorkload> addWorkload = workloadFactory.CreateAddition(data, info);
9623 poolingInputHandle->Allocate();
9624 poolingOutputHandle->Allocate();
9625 addInputHandle->Allocate();
9626 addOutputHandle->Allocate();
9628 CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]);
9629 CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get());
9631 CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]);
9632 CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]);
9634 workload->PostAllocationConfigure();
9635 workload->Execute();
9636 addWorkload->PostAllocationConfigure();
9637 addWorkload->Execute();
9639 CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
9644 LayerTestResult<float, 4> SpaceToBatchNdSimpleFloat32Test(
9645 armnn::IWorkloadFactory& workloadFactory,
9646 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9648 return SpaceToBatchNdSimpleTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9651 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsFloat32Test(
9652 armnn::IWorkloadFactory& workloadFactory,
9653 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9655 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9658 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockFloat32Test(
9659 armnn::IWorkloadFactory& workloadFactory,
9660 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9662 return SpaceToBatchNdMultiBlockTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9665 LayerTestResult<float, 4> SpaceToBatchNdPaddingFloat32Test(
9666 armnn::IWorkloadFactory& workloadFactory,
9667 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9669 return SpaceToBatchNdPaddingTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9672 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleUint8Test(
9673 armnn::IWorkloadFactory& workloadFactory,
9674 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9676 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9679 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsUint8Test(
9680 armnn::IWorkloadFactory& workloadFactory,
9681 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9683 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9686 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockUint8Test(
9687 armnn::IWorkloadFactory& workloadFactory,
9688 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9690 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9693 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingUint8Test(
9694 armnn::IWorkloadFactory& workloadFactory,
9695 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9697 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9700 LayerTestResult<float, 4> SpaceToBatchNdSimpleNHWCFloat32Test(
9701 armnn::IWorkloadFactory& workloadFactory,
9702 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9704 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9707 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsNHWCFloat32Test(
9708 armnn::IWorkloadFactory& workloadFactory,
9709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9711 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9714 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockNHWCFloat32Test(
9715 armnn::IWorkloadFactory& workloadFactory,
9716 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9718 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9721 LayerTestResult<float, 4> SpaceToBatchNdPaddingNHWCFloat32Test(
9722 armnn::IWorkloadFactory& workloadFactory,
9723 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9725 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9728 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleNHWCUint8Test(
9729 armnn::IWorkloadFactory& workloadFactory,
9730 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9732 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9735 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsNHWCUint8Test(
9736 armnn::IWorkloadFactory& workloadFactory,
9737 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9739 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9742 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockNHWCUint8Test(
9743 armnn::IWorkloadFactory& workloadFactory,
9744 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9746 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9749 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingNHWCUint8Test(
9750 armnn::IWorkloadFactory& workloadFactory,
9751 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9753 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9756 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleUint16Test(
9757 armnn::IWorkloadFactory& workloadFactory,
9758 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9760 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9763 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsUint16Test(
9764 armnn::IWorkloadFactory& workloadFactory,
9765 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9767 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9770 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockUint16Test(
9771 armnn::IWorkloadFactory& workloadFactory,
9772 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9774 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9777 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingUint16Test(
9778 armnn::IWorkloadFactory& workloadFactory,
9779 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9781 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9784 LayerTestResult<int16_t, 4> SpaceToBatchNdSimpleNHWCUint16Test(
9785 armnn::IWorkloadFactory& workloadFactory,
9786 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9788 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9791 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiChannelsNHWCUint16Test(
9792 armnn::IWorkloadFactory& workloadFactory,
9793 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9795 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9798 LayerTestResult<int16_t, 4> SpaceToBatchNdMultiBlockNHWCUint16Test(
9799 armnn::IWorkloadFactory& workloadFactory,
9800 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9802 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9805 LayerTestResult<int16_t, 4> SpaceToBatchNdPaddingNHWCUint16Test(
9806 armnn::IWorkloadFactory& workloadFactory,
9807 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9809 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9812 LayerTestResult<uint8_t, 4> SpaceToDepthNHWCAsymmQ8Test(
9813 armnn::IWorkloadFactory& workloadFactory,
9814 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9816 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
9821 LayerTestResult<uint8_t, 4> SpaceToDepthNCHWAsymmQ8Test(
9822 armnn::IWorkloadFactory& workloadFactory,
9823 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9825 return SpaceToDepthSimpleTest1<armnn::DataType::QuantisedAsymm8>(
9828 armnn::DataLayout::NCHW);
9831 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test1(
9832 armnn::IWorkloadFactory& workloadFactory,
9833 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9835 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
9840 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test1(
9841 armnn::IWorkloadFactory& workloadFactory,
9842 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9844 return SpaceToDepthSimpleTest1<armnn::DataType::Float32>(
9847 armnn::DataLayout::NCHW);
9850 LayerTestResult<float, 4> SpaceToDepthNHWCFloat32Test2(
9851 armnn::IWorkloadFactory& workloadFactory,
9852 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9854 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
9859 LayerTestResult<float, 4> SpaceToDepthNCHWFloat32Test2(
9860 armnn::IWorkloadFactory& workloadFactory,
9861 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9863 return SpaceToDepthSimpleTest2<armnn::DataType::Float32>(
9866 armnn::DataLayout::NCHW);
9869 LayerTestResult<int16_t, 4> SpaceToDepthNHWCQSymm16Test(
9870 armnn::IWorkloadFactory& workloadFactory,
9871 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9873 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
9878 LayerTestResult<int16_t, 4> SpaceToDepthNCHWQSymm16Test(
9879 armnn::IWorkloadFactory& workloadFactory,
9880 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9882 return SpaceToDepthSimpleTest2<armnn::DataType::QuantisedSymm16>(
9885 armnn::DataLayout::NCHW);
9890 } // anonymous namespace
9892 LayerTestResult<float, 4> StridedSlice4DFloat32Test(
9893 armnn::IWorkloadFactory& workloadFactory,
9894 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9896 return StridedSlice4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9899 LayerTestResult<float, 4> StridedSlice4DReverseFloat32Test(
9900 armnn::IWorkloadFactory& workloadFactory,
9901 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9903 return StridedSlice4DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9906 LayerTestResult<float, 4> StridedSliceSimpleStrideFloat32Test(
9907 armnn::IWorkloadFactory& workloadFactory,
9908 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9910 return StridedSliceSimpleStrideTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9913 LayerTestResult<float, 4> StridedSliceSimpleRangeMaskFloat32Test(
9914 armnn::IWorkloadFactory& workloadFactory,
9915 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9917 return StridedSliceSimpleRangeMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9920 LayerTestResult<float, 2> StridedSliceShrinkAxisMaskFloat32Test(
9921 armnn::IWorkloadFactory& workloadFactory,
9922 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9924 return StridedSliceShrinkAxisMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9927 LayerTestResult<float, 3> StridedSlice3DFloat32Test(
9928 armnn::IWorkloadFactory& workloadFactory,
9929 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9931 return StridedSlice3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9934 LayerTestResult<float, 3> StridedSlice3DReverseFloat32Test(
9935 armnn::IWorkloadFactory& workloadFactory,
9936 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9938 return StridedSlice3DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9941 LayerTestResult<float, 2> StridedSlice2DFloat32Test(
9942 armnn::IWorkloadFactory& workloadFactory,
9943 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9945 return StridedSlice2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9948 LayerTestResult<float, 2> StridedSlice2DReverseFloat32Test(
9949 armnn::IWorkloadFactory& workloadFactory,
9950 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9952 return StridedSlice2DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9955 LayerTestResult<uint8_t, 4> StridedSlice4DUint8Test(
9956 armnn::IWorkloadFactory& workloadFactory,
9957 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9959 return StridedSlice4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9962 LayerTestResult<uint8_t, 4> StridedSlice4DReverseUint8Test(
9963 armnn::IWorkloadFactory& workloadFactory,
9964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9966 return StridedSlice4DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9969 LayerTestResult<uint8_t, 4> StridedSliceSimpleStrideUint8Test(
9970 armnn::IWorkloadFactory& workloadFactory,
9971 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9973 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9976 LayerTestResult<uint8_t, 4> StridedSliceSimpleRangeMaskUint8Test(
9977 armnn::IWorkloadFactory& workloadFactory,
9978 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9980 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9983 LayerTestResult<uint8_t, 2> StridedSliceShrinkAxisMaskUint8Test(
9984 armnn::IWorkloadFactory& workloadFactory,
9985 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9987 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9990 LayerTestResult<uint8_t, 3> StridedSlice3DUint8Test(
9991 armnn::IWorkloadFactory& workloadFactory,
9992 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9994 return StridedSlice3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9997 LayerTestResult<uint8_t, 3> StridedSlice3DReverseUint8Test(
9998 armnn::IWorkloadFactory& workloadFactory,
9999 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10001 return StridedSlice3DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10004 LayerTestResult<uint8_t, 2> StridedSlice2DUint8Test(
10005 armnn::IWorkloadFactory& workloadFactory,
10006 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10008 return StridedSlice2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10011 LayerTestResult<uint8_t, 2> StridedSlice2DReverseUint8Test(
10012 armnn::IWorkloadFactory& workloadFactory,
10013 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10015 return StridedSlice2DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10018 LayerTestResult<int16_t, 4> StridedSlice4DInt16Test(
10019 armnn::IWorkloadFactory& workloadFactory,
10020 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10022 return StridedSlice4DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10025 LayerTestResult<int16_t, 4> StridedSlice4DReverseInt16Test(
10026 armnn::IWorkloadFactory& workloadFactory,
10027 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10029 return StridedSlice4DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10032 LayerTestResult<int16_t, 4> StridedSliceSimpleStrideInt16Test(
10033 armnn::IWorkloadFactory& workloadFactory,
10034 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10036 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10039 LayerTestResult<int16_t, 4> StridedSliceSimpleRangeMaskInt16Test(
10040 armnn::IWorkloadFactory& workloadFactory,
10041 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10043 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10046 LayerTestResult<int16_t, 2> StridedSliceShrinkAxisMaskInt16Test(
10047 armnn::IWorkloadFactory& workloadFactory,
10048 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10050 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10053 LayerTestResult<int16_t, 3> StridedSlice3DInt16Test(
10054 armnn::IWorkloadFactory& workloadFactory,
10055 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10057 return StridedSlice3DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10060 LayerTestResult<int16_t, 3> StridedSlice3DReverseInt16Test(
10061 armnn::IWorkloadFactory& workloadFactory,
10062 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10064 return StridedSlice3DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10067 LayerTestResult<int16_t, 2> StridedSlice2DInt16Test(
10068 armnn::IWorkloadFactory& workloadFactory,
10069 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10071 return StridedSlice2DTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10074 LayerTestResult<int16_t, 2> StridedSlice2DReverseInt16Test(
10075 armnn::IWorkloadFactory& workloadFactory,
10076 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10078 return StridedSlice2DReverseTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10081 LayerTestResult<float, 4> Debug4DFloat32Test(
10082 armnn::IWorkloadFactory& workloadFactory,
10083 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10085 return Debug4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10088 LayerTestResult<float, 3> Debug3DFloat32Test(
10089 armnn::IWorkloadFactory& workloadFactory,
10090 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10092 return Debug3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10095 LayerTestResult<float, 2> Debug2DFloat32Test(
10096 armnn::IWorkloadFactory& workloadFactory,
10097 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10099 return Debug2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10102 LayerTestResult<float, 1> Debug1DFloat32Test(
10103 armnn::IWorkloadFactory& workloadFactory,
10104 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10106 return Debug1DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
10109 LayerTestResult<uint8_t, 4> Debug4DUint8Test(
10110 armnn::IWorkloadFactory& workloadFactory,
10111 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10113 return Debug4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10116 LayerTestResult<uint8_t, 3> Debug3DUint8Test(
10117 armnn::IWorkloadFactory& workloadFactory,
10118 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10120 return Debug3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10123 LayerTestResult<uint8_t, 2> Debug2DUint8Test(
10124 armnn::IWorkloadFactory& workloadFactory,
10125 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10127 return Debug2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10130 LayerTestResult<uint8_t, 1> Debug1DUint8Test(
10131 armnn::IWorkloadFactory& workloadFactory,
10132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10134 return Debug1DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10137 LayerTestResult<float, 1> Gather1DParamsFloatTest(
10138 armnn::IWorkloadFactory& workloadFactory,
10139 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10141 return Gather1DParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10144 LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test(
10145 armnn::IWorkloadFactory& workloadFactory,
10146 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10148 return Gather1DParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10151 LayerTestResult<int16_t, 1> Gather1DParamsInt16Test(
10152 armnn::IWorkloadFactory& workloadFactory,
10153 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10155 return Gather1DParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10158 LayerTestResult<float, 2> GatherMultiDimParamsFloatTest(
10159 armnn::IWorkloadFactory& workloadFactory,
10160 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10162 return GatherMultiDimParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10165 LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test(
10166 armnn::IWorkloadFactory& workloadFactory,
10167 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10169 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10172 LayerTestResult<int16_t, 2> GatherMultiDimParamsInt16Test(
10173 armnn::IWorkloadFactory& workloadFactory,
10174 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10176 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10179 LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest(
10180 armnn::IWorkloadFactory& workloadFactory,
10181 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10183 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
10186 LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test(
10187 armnn::IWorkloadFactory& workloadFactory,
10188 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10190 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedAsymm8>(
10191 workloadFactory, memoryManager);
10194 LayerTestResult<int16_t, 4> GatherMultiDimParamsMultiDimIndicesInt16Test(
10195 armnn::IWorkloadFactory& workloadFactory,
10196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10198 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedSymm16>(
10199 workloadFactory, memoryManager);
10202 LayerTestResult<float, 4> DequantizeSimpleUint8Test(
10203 armnn::IWorkloadFactory& workloadFactory,
10204 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10206 return DequantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10209 LayerTestResult<float, 4> DequantizeOffsetUint8Test(
10210 armnn::IWorkloadFactory& workloadFactory,
10211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10213 return DequantizeOffsetTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10216 LayerTestResult<float, 4> DequantizeSimpleInt16Test(
10217 armnn::IWorkloadFactory& workloadFactory,
10218 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10220 return DequantizeSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10223 LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
10224 armnn::IWorkloadFactory& workloadFactory,
10225 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10227 return QuantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10230 LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
10231 armnn::IWorkloadFactory& workloadFactory,
10232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10234 return QuantizeClampTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
10237 LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
10238 armnn::IWorkloadFactory& workloadFactory,
10239 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10241 return QuantizeClampTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
10245 // TransposeConvolution2d
10249 LayerTestResult<float, 4> SimpleTransposeConvolution2dFloatNchwTest(
10250 armnn::IWorkloadFactory& workloadFactory,
10251 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10253 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10257 armnn::DataLayout::NCHW);
10260 LayerTestResult<float, 4> SimpleTransposeConvolution2dFloatNhwcTest(
10261 armnn::IWorkloadFactory& workloadFactory,
10262 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10264 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10268 armnn::DataLayout::NHWC);
10271 LayerTestResult<uint8_t, 4> SimpleTransposeConvolution2dUint8NchwTest(
10272 armnn::IWorkloadFactory& workloadFactory,
10273 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10275 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10279 armnn::DataLayout::NCHW);
10282 LayerTestResult<uint8_t, 4> SimpleTransposeConvolution2dUint8NhwcTest(
10283 armnn::IWorkloadFactory& workloadFactory,
10284 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10286 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10290 armnn::DataLayout::NHWC);
10293 LayerTestResult<int16_t, 4> SimpleTransposeConvolution2dInt16NchwTest(
10294 armnn::IWorkloadFactory& workloadFactory,
10295 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10297 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10301 armnn::DataLayout::NCHW);
10304 LayerTestResult<int16_t, 4> SimpleTransposeConvolution2dInt16NhwcTest(
10305 armnn::IWorkloadFactory& workloadFactory,
10306 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10308 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10312 armnn::DataLayout::NHWC);
10316 LayerTestResult<float, 4> UnbiasedSimpleTransposeConvolution2dFloatNchwTest(
10317 armnn::IWorkloadFactory& workloadFactory,
10318 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10320 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10324 armnn::DataLayout::NCHW);
10327 LayerTestResult<float, 4> UnbiasedSimpleTransposeConvolution2dFloatNhwcTest(
10328 armnn::IWorkloadFactory& workloadFactory,
10329 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10331 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10335 armnn::DataLayout::NHWC);
10338 LayerTestResult<uint8_t, 4> UnbiasedSimpleTransposeConvolution2dUint8NchwTest(
10339 armnn::IWorkloadFactory& workloadFactory,
10340 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10342 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10346 armnn::DataLayout::NCHW);
10349 LayerTestResult<uint8_t, 4> UnbiasedSimpleTransposeConvolution2dUint8NhwcTest(
10350 armnn::IWorkloadFactory& workloadFactory,
10351 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10353 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10357 armnn::DataLayout::NHWC);
10360 LayerTestResult<int16_t, 4> UnbiasedSimpleTransposeConvolution2dInt16NchwTest(
10361 armnn::IWorkloadFactory& workloadFactory,
10362 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10364 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10368 armnn::DataLayout::NCHW);
10371 LayerTestResult<int16_t, 4> UnbiasedSimpleTransposeConvolution2dInt16NhwcTest(
10372 armnn::IWorkloadFactory& workloadFactory,
10373 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10375 return SimpleTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10379 armnn::DataLayout::NHWC);
10383 LayerTestResult<float, 4> PaddedTransposeConvolution2dFloatNchwTest(
10384 armnn::IWorkloadFactory& workloadFactory,
10385 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10387 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10391 armnn::DataLayout::NCHW);
10394 LayerTestResult<float, 4> PaddedTransposeConvolution2dFloatNhwcTest(
10395 armnn::IWorkloadFactory& workloadFactory,
10396 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10398 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10402 armnn::DataLayout::NHWC);
10405 LayerTestResult<uint8_t, 4> PaddedTransposeConvolution2dUint8NchwTest(
10406 armnn::IWorkloadFactory& workloadFactory,
10407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10409 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10413 armnn::DataLayout::NCHW);
10416 LayerTestResult<uint8_t, 4> PaddedTransposeConvolution2dUint8NhwcTest(
10417 armnn::IWorkloadFactory& workloadFactory,
10418 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10420 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10424 armnn::DataLayout::NHWC);
10427 LayerTestResult<int16_t, 4> PaddedTransposeConvolution2dInt16NchwTest(
10428 armnn::IWorkloadFactory& workloadFactory,
10429 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10431 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10435 armnn::DataLayout::NCHW);
10438 LayerTestResult<int16_t, 4> PaddedTransposeConvolution2dInt16NhwcTest(
10439 armnn::IWorkloadFactory& workloadFactory,
10440 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10442 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10446 armnn::DataLayout::NHWC);
10450 LayerTestResult<float, 4> UnbiasedPaddedTransposeConvolution2dFloatNchwTest(
10451 armnn::IWorkloadFactory& workloadFactory,
10452 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10454 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10458 armnn::DataLayout::NCHW);
10461 LayerTestResult<float, 4> UnbiasedPaddedTransposeConvolution2dFloatNhwcTest(
10462 armnn::IWorkloadFactory& workloadFactory,
10463 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10465 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10469 armnn::DataLayout::NHWC);
10472 LayerTestResult<uint8_t, 4> UnbiasedPaddedTransposeConvolution2dUint8NchwTest(
10473 armnn::IWorkloadFactory& workloadFactory,
10474 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10476 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10480 armnn::DataLayout::NCHW);
10483 LayerTestResult<uint8_t, 4> UnbiasedPaddedTransposeConvolution2dUint8NhwcTest(
10484 armnn::IWorkloadFactory& workloadFactory,
10485 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10487 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10491 armnn::DataLayout::NHWC);
10494 LayerTestResult<int16_t, 4> UnbiasedPaddedTransposeConvolution2dInt16NchwTest(
10495 armnn::IWorkloadFactory& workloadFactory,
10496 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10498 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10502 armnn::DataLayout::NCHW);
10505 LayerTestResult<int16_t, 4> UnbiasedPaddedTransposeConvolution2dInt16NhwcTest(
10506 armnn::IWorkloadFactory& workloadFactory,
10507 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10509 return PaddedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10513 armnn::DataLayout::NHWC);
10517 LayerTestResult<float, 4> StridedTransposeConvolution2dFloatNchwTest(
10518 armnn::IWorkloadFactory& workloadFactory,
10519 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10521 return StridedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10525 armnn::DataLayout::NCHW);
10528 LayerTestResult<float, 4> StridedTransposeConvolution2dFloatNhwcTest(
10529 armnn::IWorkloadFactory& workloadFactory,
10530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10532 return StridedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10536 armnn::DataLayout::NHWC);
10539 LayerTestResult<uint8_t, 4> StridedTransposeConvolution2dUint8NchwTest(
10540 armnn::IWorkloadFactory& workloadFactory,
10541 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10543 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10547 armnn::DataLayout::NCHW);
10550 LayerTestResult<uint8_t, 4> StridedTransposeConvolution2dUint8NhwcTest(
10551 armnn::IWorkloadFactory& workloadFactory,
10552 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10554 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10558 armnn::DataLayout::NHWC);
10561 LayerTestResult<int16_t, 4> StridedTransposeConvolution2dInt16NchwTest(
10562 armnn::IWorkloadFactory& workloadFactory,
10563 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10565 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10569 armnn::DataLayout::NCHW);
10572 LayerTestResult<int16_t, 4> StridedTransposeConvolution2dInt16NhwcTest(
10573 armnn::IWorkloadFactory& workloadFactory,
10574 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10576 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10580 armnn::DataLayout::NHWC);
10583 // Strided unbiased
10584 LayerTestResult<float, 4> UnbiasedStridedTransposeConvolution2dFloatNchwTest(
10585 armnn::IWorkloadFactory& workloadFactory,
10586 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10588 return StridedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10592 armnn::DataLayout::NCHW);
10595 LayerTestResult<float, 4> UnbiasedStridedTransposeConvolution2dFloatNhwcTest(
10596 armnn::IWorkloadFactory& workloadFactory,
10597 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10599 return StridedTransposeConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
10603 armnn::DataLayout::NHWC);
10606 LayerTestResult<uint8_t, 4> UnbiasedStridedTransposeConvolution2dUint8NchwTest(
10607 armnn::IWorkloadFactory& workloadFactory,
10608 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10610 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10614 armnn::DataLayout::NCHW);
10617 LayerTestResult<uint8_t, 4> UnbiasedStridedTransposeConvolution2dUint8NhwcTest(
10618 armnn::IWorkloadFactory& workloadFactory,
10619 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10621 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
10625 armnn::DataLayout::NHWC);
10628 LayerTestResult<int16_t, 4> UnbiasedStridedTransposeConvolution2dInt16NchwTest(
10629 armnn::IWorkloadFactory& workloadFactory,
10630 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10632 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10636 armnn::DataLayout::NCHW);
10639 LayerTestResult<int16_t, 4> UnbiasedStridedTransposeConvolution2dInt16NhwcTest(
10640 armnn::IWorkloadFactory& workloadFactory,
10641 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
10643 return StridedTransposeConvolution2dTestImpl<armnn::DataType::QuantisedSymm16, armnn::DataType::Signed32>(
10647 armnn::DataLayout::NHWC);