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 "ReshapeTestImpl.hpp"
34 #include "FullyConnectedTestImpl.hpp"
35 #include "GatherTestImpl.hpp"
36 #include "SpaceToBatchNdTestImpl.hpp"
37 #include "SplitterTestImpl.hpp"
38 #include "SoftmaxTestImpl.hpp"
39 #include "StridedSliceTestImpl.hpp"
40 #include "NormTestImpl.hpp"
41 #include "PermuteTestImpl.hpp"
42 #include "LstmTestImpl.hpp"
43 #include "ConvertFp16ToFp32TestImpl.hpp"
44 #include "ConvertFp32ToFp16TestImpl.hpp"
45 #include "DebugTestImpl.hpp"
46 #include "DequantizeTestImpl.hpp"
47 #include "QuantizeTestImpl.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 // Helper function that returns either Bias2 or an empty vector depending on whether bias is enabled.
81 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
82 boost::multi_array<T, 1> GetBias2(bool biasEnabled, float qScale, int32_t qOffset)
86 armnn::TensorInfo biasDesc({static_cast<unsigned int>(Bias2.size())}, ArmnnType);
87 boost::multi_array<T, 1> bias = MakeTensor<T, 1>(biasDesc, QuantizedVector<T>(qScale, qOffset, Bias2));
92 return boost::multi_array<T, 1>();
96 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType, typename T = armnn::ResolveType<ArmnnType>>
97 LayerTestResult<T, 4> SimpleConvolution2d3x5TestCommon(
98 armnn::IWorkloadFactory& workloadFactory,
99 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
103 const armnn::DataLayout layout)
105 // Use common single-batch 3-channel 16x8 image.
106 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
107 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
109 // Use a 2-element batch with 3-channel 3x5 kernels.
110 armnn::TensorInfo kernelDesc({2, 3, 5, 3}, ArmnnType);
111 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
112 QuantizedVector<T>(qScale, qOffset, {
151 // Expected output is 2 batch elements of a 1-channel 14x4 image.
152 armnn::TensorInfo outputDesc({1, 2, 4, 14}, ArmnnType);
153 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
154 QuantizedVector<T>(qScale, qOffset, {
155 -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24, -24,
156 -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25, -25,
157 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
158 -23.5f, -23.5f, -23.5f,
159 -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f, -23.5f,
160 -23.5f, -23.5f, -23.5f,
162 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
163 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
164 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
165 5, 5, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
168 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
173 GetBias2<ArmnnBType>(biasEnabled, qScale, qOffset),
180 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
181 typename T = armnn::ResolveType<ArmnnType>>
182 LayerTestResult<T, 4> SimpleConvolution2d3x3TestCommon(
183 armnn::IWorkloadFactory& workloadFactory,
184 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
188 const armnn::DataLayout layout)
190 // Use a 3x3 kernel, which exercises ArmCompute's direct convolution path.
192 // Use common single-batch 3-channel 16x8 image.
193 armnn::TensorInfo inputDesc({1, 3, 8, 16}, ArmnnType);
194 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, QuantizedVector<T>(qScale, qOffset, ConvInput3x8x16));
196 // Use a 2-element batch of 3-channel 3x3 kernels.
197 armnn::TensorInfo kernelDesc({2, 3, 3, 3}, ArmnnType);
198 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
199 QuantizedVector<T>(qScale, qOffset, {
226 // Expected output is 1 batch of a 2-channel 14x6 image.
227 armnn::TensorInfo outputDesc({1, 2, 6, 14}, ArmnnType);
228 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
229 QuantizedVector<T>(qScale, qOffset, {
230 -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15, -15,
231 -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16, -16,
232 -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,
233 -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,
234 -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,
235 -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,
237 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
238 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
239 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
240 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
241 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
242 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
245 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
250 GetBias2<ArmnnBType>(biasEnabled, qScale, qOffset),
257 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
258 LayerTestResult<T, 4> SimpleConvolution2d3x3NhwcTestCommon(
259 armnn::IWorkloadFactory& workloadFactory,
260 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
264 armnn::DataLayout dataLayout)
266 // Use common single-batch 5x5 image.
268 armnn::TensorInfo inputDesc({1, 3, 4, 1}, ArmnnType);
269 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
277 // Use a 2-element batch of 3-channel 3x3 kernels.
278 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
279 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, {
285 // Expected output is 1 batch of a 5x5 image.
286 armnn::TensorInfo outputDesc({1, 3, 4, 1}, ArmnnType);
288 const std::vector<float> outputData =
295 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
297 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
302 boost::multi_array<T, 1>(),
309 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
310 LayerTestResult<T, 4> SimpleConvolution2d3x3Stride2x2TestCommon(
311 armnn::IWorkloadFactory& workloadFactory,
312 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
316 const armnn::DataLayout& dataLayout)
318 // Input is a single-batch, 1 channel, 5x5 image.
319 armnn::TensorInfo inputDesc({1, 5, 5, 1}, ArmnnType);
320 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc,
330 armnn::TensorInfo kernelDesc({1, 3, 3, 1}, ArmnnType);
331 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc,
338 // Expected output is a single-batch, 1 channel, 3x3 image.
339 armnn::TensorInfo outputDesc({1, 3, 3, 1}, ArmnnType);
341 const std::vector<T> outputData =
348 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, outputData);
350 uint32_t padLeft = 1;
352 uint32_t padRight = 1;
353 uint32_t padBottom = 1;
354 uint32_t strideX = 2;
355 uint32_t strideY = 2;
357 return SimpleConvolution2dNhwcTestImpl<ArmnnType, ArmnnType>(
362 boost::multi_array<T, 1>(),
375 LayerTestResult<float, 4> SimpleConvolution2d3x5Test(
376 armnn::IWorkloadFactory& workloadFactory,
377 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
379 const armnn::DataLayout layout)
381 return SimpleConvolution2d3x5TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
382 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
385 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x5Uint8Test(
386 armnn::IWorkloadFactory& workloadFactory,
387 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
389 const armnn::DataLayout layout)
391 return SimpleConvolution2d3x5TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
392 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
395 LayerTestResult<float, 4> SimpleConvolution2d3x3Test(
396 armnn::IWorkloadFactory& workloadFactory,
397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
399 const armnn::DataLayout layout)
401 return SimpleConvolution2d3x3TestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
402 workloadFactory, memoryManager, 0.f, 0, biasEnabled, layout);
405 LayerTestResult<float, 4> SimpleConvolution2d3x3NhwcTest(
406 armnn::IWorkloadFactory& workloadFactory,
407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
410 return SimpleConvolution2d3x3NhwcTestCommon<armnn::DataType::Float32>(
416 armnn::DataLayout::NHWC);
419 LayerTestResult<float, 4> SimpleConvolution2d3x3Stride2x2Test(
420 armnn::IWorkloadFactory& workloadFactory,
421 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
423 const armnn::DataLayout layout)
425 return SimpleConvolution2d3x3Stride2x2TestCommon<armnn::DataType::Float32>(
434 LayerTestResult<uint8_t, 4> SimpleConvolution2d3x3Uint8Test(
435 armnn::IWorkloadFactory& workloadFactory,
436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
438 const armnn::DataLayout layout)
440 return SimpleConvolution2d3x3TestCommon<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
441 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
444 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
445 typename T = armnn::ResolveType<ArmnnType>>
446 LayerTestResult<T, 4> Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon(
447 armnn::IWorkloadFactory& workloadFactory,
448 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
449 const armnn::DataLayout layout,
453 // Use a single-batch 1-channel 3x3 image as input.
454 armnn::TensorInfo inputDesc({1, 1, 3, 3}, ArmnnType);
455 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
456 QuantizedVector<T>(qScale, qOffset, {
462 // Use 1 batch of a 1-channel 2x2 kernel.
463 armnn::TensorInfo kernelDesc({1, 1, 2, 2}, ArmnnType);
464 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
465 QuantizedVector<T>(qScale, qOffset, {
470 // Expected output is 1 batch of a 1-channel 6x8 image.
471 // Manually calculated like this:
472 //[-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 ..]
473 //[-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 ..]
474 //[-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 ..]
475 //[-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 ..]
476 //[-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 ..]
477 //[-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 ..]
478 //[..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ; ..... ..... ..... ..... ..]
479 armnn::TensorInfo outputDesc({1, 1, 8, 6}, ArmnnType);
480 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
481 QuantizedVector<T>(qScale, qOffset, {
483 -242, -594, -934, -372, 0, 0,
484 -495, -1190, -1850, -725, 0, 0,
485 -538, -1256, -1916, -748, 0, 0,
486 -273, -626, -946, -363, 0, 0,
492 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
497 GetBias2<ArmnnBType>(false, qScale, qOffset),
505 4); // Padding bottom.
508 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
509 typename T = armnn::ResolveType<ArmnnType>>
510 LayerTestResult<T, 4> SimpleConvolution2dAsymmetricPaddingTestCommon(
511 armnn::IWorkloadFactory& workloadFactory,
512 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
513 const armnn::DataLayout layout,
517 // Use a single-batch 1-channel 5x5 image as input.
518 armnn::TensorInfo inputDesc({ 1, 1, 5, 5 }, ArmnnType);
519 boost::multi_array<T, 4> input = MakeTensor<T, 4>(inputDesc, std::vector<T>(
520 QuantizedVector<T>(qScale, qOffset, {
528 // Use 1 batch of a 1-channel 4x4 kernel.
529 armnn::TensorInfo kernelDesc({ 1, 1, 4, 4 }, ArmnnType);
530 boost::multi_array<T, 4> kernel = MakeTensor<T, 4>(kernelDesc, std::vector<T>(
531 QuantizedVector<T>(qScale, qOffset, {
538 // Expected output is 1 batch of a 1-channel 5x5 image.
539 armnn::TensorInfo outputDesc({ 1, 1, 5, 5 }, ArmnnType);
540 std::vector<T> myVec(outputDesc.GetNumElements(), 0);
541 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputDesc, std::vector<T>(
542 QuantizedVector<T>(qScale, qOffset, {
543 -7140, -10580, -13940, -9300, -5230,
544 -9590, -14120, -18520, -12290, -6860,
545 -9980, -14560, -18960, -12560, -7000,
546 -7518, -10904, -14144, -9318, -5152,
547 -5032, -7256, -9376, -6142, -3368,
550 return SimpleConvolution2dTestImpl<ArmnnType, ArmnnBType>(
555 GetBias2<ArmnnBType>(false, qScale, qOffset),
563 2); // Padding bottom.
566 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
567 typename T = armnn::ResolveType<ArmnnType>>
568 LayerTestResult<T, 4> DepthwiseConvolution2dAsymmetricTestCommon(
569 armnn::IWorkloadFactory& workloadFactory,
570 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
574 const armnn::DataLayout layout)
576 // Use a single-batch 2-channel 5x5 image as input.
577 armnn::TensorInfo inputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
578 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
579 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(), {
593 // Use a depth multiplier of 1 on a 2-channel 4x4 kernel.
594 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
595 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
596 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(), {
608 // Expected output is 1 batch of a 2-channel 5x5 image.
609 // Calculated using the python tensorflow library with strideX=1, strideY=1.
610 armnn::TensorInfo outputTensorInfo({ 1, 2, 5, 5 }, ArmnnType);
611 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
612 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(), {
613 1062, 1580, 1850, 1530, 1117,
614 2140, 3108, 3500, 2842, 2042,
615 3580, 5068, 5460, 4342, 3062,
616 3618, 5072, 5390, 4248, 2971,
617 3074, 4282, 4510, 3533, 2457,
618 1550, 2284, 2362, 1955, 1428,
619 2910, 4206, 4342, 3528, 2536,
620 3390, 4886, 5022, 4068, 2916,
621 3566, 5056, 5182, 4133, 2922,
622 3100, 4352, 4452, 3517, 2465
625 return DepthwiseConvolution2dAsymmetricTestImpl<ArmnnType, ArmnnBType>(
630 GetBias2<ArmnnBType>(biasEnabled, qScale, qOffset),
638 2, // Padding bottom.
643 template<armnn::DataType ArmnnType, armnn::DataType ArmnnBType,
644 typename T = armnn::ResolveType<ArmnnType>>
645 LayerTestResult<T, 4> DepthwiseConvolution2dNhwcTestCommon(
646 armnn::IWorkloadFactory& workloadFactory,
647 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
652 armnn::TensorInfo inputTensorInfo({ 1, 5, 5, 2}, ArmnnType);
653 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
654 QuantizedVector<T>(inputTensorInfo.GetQuantizationScale(), inputTensorInfo.GetQuantizationOffset(), {
686 armnn::TensorInfo kernelTensorInfo({ 1, 2, 4, 4 }, ArmnnType);
687 auto kernel = MakeTensor<T, 4>(kernelTensorInfo, std::vector<T>(
688 QuantizedVector<T>(kernelTensorInfo.GetQuantizationScale(), kernelTensorInfo.GetQuantizationOffset(), {
700 armnn::TensorInfo outputTensorInfo({ 1, 5, 5, 2}, ArmnnType);
701 boost::multi_array<T, 4> expectedOutput = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(
702 QuantizedVector<T>(outputTensorInfo.GetQuantizationScale(), outputTensorInfo.GetQuantizationOffset(), {
734 return DepthwiseConvolution2dNhwcTestImpl<ArmnnType, ArmnnBType>(
739 GetBias2<ArmnnBType>(biasEnabled, qScale, qOffset),
746 2, // Padding bottom.
751 LayerTestResult<float, 4>
752 Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTest(
753 armnn::IWorkloadFactory& workloadFactory,
754 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
755 const armnn::DataLayout layout)
757 return Convolution2dAsymmetricPaddingLargerThanHalfKernelSizeTestCommon
758 <armnn::DataType::Float32, armnn::DataType::Float32>(
759 workloadFactory, memoryManager, layout, 0.0f, 0);
762 LayerTestResult<float, 4> Convolution2dAsymmetricPaddingTest(
763 armnn::IWorkloadFactory& workloadFactory,
764 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
765 const armnn::DataLayout layout)
767 return SimpleConvolution2dAsymmetricPaddingTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
768 workloadFactory, memoryManager, layout, 0.0f, 0);
771 LayerTestResult<float, 4> DepthwiseConvolution2dTest(
772 armnn::IWorkloadFactory& workloadFactory,
773 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
775 const armnn::DataLayout layout)
777 return DepthwiseConvolution2dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
778 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
781 LayerTestResult<float, 4> DepthwiseConvolution2dDepthNhwcTest(
782 armnn::IWorkloadFactory& workloadFactory,
783 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
786 return DepthwiseConvolution2dNhwcTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
787 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
790 LayerTestResult<float, 4> DepthwiseConvolution2dDepthMul1Test(
791 armnn::IWorkloadFactory& workloadFactory,
792 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
794 const armnn::DataLayout layout)
796 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
797 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
800 LayerTestResult<float, 4> DepthwiseConvolution2dAsymmetricTest(
801 armnn::IWorkloadFactory& workloadFactory,
802 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
804 const armnn::DataLayout layout)
806 return DepthwiseConvolution2dAsymmetricTestCommon<armnn::DataType::Float32, armnn::DataType::Float32>(
807 workloadFactory, memoryManager, 0.0f, 0, biasEnabled, layout);
810 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dUint8Test(
811 armnn::IWorkloadFactory& workloadFactory,
812 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
814 const armnn::DataLayout layout)
816 return DepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
817 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
820 LayerTestResult<uint8_t, 4> DepthwiseConvolution2dDepthMul1Uint8Test(
821 armnn::IWorkloadFactory& workloadFactory,
822 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
824 const armnn::DataLayout layout)
826 return DepthwiseConvolution2dDepthMul1TestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
827 workloadFactory, memoryManager, 0.5f, 50, biasEnabled, layout);
830 LayerTestResult<float, 4> Convolution1dTest(
831 armnn::IWorkloadFactory& workloadFactory,
832 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
835 return Convolution1dTestImpl<armnn::DataType::Float32, armnn::DataType::Float32>(
836 workloadFactory, memoryManager, 0.0f, 0, biasEnabled);
839 LayerTestResult<uint8_t, 4> Convolution1dUint8Test(
840 armnn::IWorkloadFactory& workloadFactory,
841 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
844 return Convolution1dTestImpl<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
845 workloadFactory, memoryManager, 0.1f, 128, biasEnabled);
848 LayerTestResult<float,4> CompareConvolution2dTest(
849 armnn::IWorkloadFactory& workloadFactory,
850 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
851 armnn::IWorkloadFactory& refWorkloadFactory)
853 return CompareConvolution2dTestImpl<armnn::DataType::Float32>(
854 workloadFactory, memoryManager, refWorkloadFactory);
857 LayerTestResult<float, 4> CompareDepthwiseConvolution2dFloatTest(
858 armnn::IWorkloadFactory& workloadFactory,
859 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
860 armnn::IWorkloadFactory& refWorkloadFactory,
861 const armnn::DataLayout layout)
863 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::Float32>(
864 workloadFactory, memoryManager, refWorkloadFactory, layout);
867 LayerTestResult<uint8_t, 4> CompareDepthwiseConvolution2dUint8Test(
868 armnn::IWorkloadFactory& workloadFactory,
869 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
870 armnn::IWorkloadFactory& refWorkloadFactory,
871 const armnn::DataLayout layout)
873 return CompareDepthwiseConvolution2dTestImpl<armnn::DataType::QuantisedAsymm8>(
874 workloadFactory, memoryManager, refWorkloadFactory, layout);
877 LayerTestResult<float,4> SimpleNormalizationAcrossTest(
878 armnn::IWorkloadFactory& workloadFactory,
879 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
881 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
882 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
883 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
886 LayerTestResult<float,4> SimpleNormalizationWithinTest(
887 armnn::IWorkloadFactory& workloadFactory,
888 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
890 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
891 auto normChannel = armnn::NormalizationAlgorithmChannel::Within;
892 return SimpleNormalizationTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
895 LayerTestResult<float,4> SimpleNormalizationAcrossNhwcTest(
896 armnn::IWorkloadFactory& workloadFactory,
897 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
899 auto normMethod = armnn::NormalizationAlgorithmMethod::LocalBrightness;
900 auto normChannel = armnn::NormalizationAlgorithmChannel::Across;
901 return SimpleNormalizationNhwcTestImpl(workloadFactory, memoryManager, normChannel, normMethod);
904 LayerTestResult<float,2> SimpleSoftmaxTest(
905 armnn::IWorkloadFactory& workloadFactory,
906 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
909 return SimpleSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
912 LayerTestResult<float,3> Simple3dSoftmaxTest(
913 armnn::IWorkloadFactory& workloadFactory,
914 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
917 return Simple3dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
920 LayerTestResult<float,4> Simple4dSoftmaxTest(
921 armnn::IWorkloadFactory& workloadFactory,
922 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
925 return Simple4dSoftmaxTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, beta);
928 LayerTestResult<uint8_t,2> SimpleSoftmaxUint8Test(
929 armnn::IWorkloadFactory& workloadFactory,
930 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
933 return SimpleSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
936 LayerTestResult<uint8_t,3> Simple3dSoftmaxUint8Test(
937 armnn::IWorkloadFactory& workloadFactory,
938 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
941 return Simple3dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
944 LayerTestResult<uint8_t,4> Simple4dSoftmaxUint8Test(
945 armnn::IWorkloadFactory& workloadFactory,
946 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
949 return Simple4dSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, beta);
952 LayerTestResult<float,4> CompareNormalizationTest(
953 armnn::IWorkloadFactory& workloadFactory,
954 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
955 armnn::IWorkloadFactory& refWorkloadFactory,
956 armnn::NormalizationAlgorithmChannel normChannel,
957 armnn::NormalizationAlgorithmMethod normMethod)
959 return CompareNormalizationTestImpl(workloadFactory, memoryManager, refWorkloadFactory, normChannel, normMethod);
962 LayerTestResult<float,2> CompareSoftmaxTest(
963 armnn::IWorkloadFactory& workloadFactory,
964 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
965 armnn::IWorkloadFactory& refWorkloadFactory,
968 return CompareSoftmaxTestImpl<armnn::DataType::Float32>(
969 workloadFactory, memoryManager, refWorkloadFactory, beta);
972 LayerTestResult<uint8_t,2> CompareSoftmaxUint8Test(
973 armnn::IWorkloadFactory& workloadFactory,
974 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
975 armnn::IWorkloadFactory& refWorkloadFactory,
978 return CompareSoftmaxTestImpl<armnn::DataType::QuantisedAsymm8>(
979 workloadFactory, memoryManager, refWorkloadFactory, beta);
982 std::vector<LayerTestResult<float,3>> SplitterTest(
983 armnn::IWorkloadFactory& workloadFactory,
984 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
986 return SplitterTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
989 std::vector<LayerTestResult<uint8_t,3>> SplitterUint8Test(
990 armnn::IWorkloadFactory& workloadFactory,
991 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
993 return SplitterTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
996 LayerTestResult<float, 3> CopyViaSplitterTest(
997 armnn::IWorkloadFactory& workloadFactory,
998 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1000 return CopyViaSplitterTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
1003 LayerTestResult<uint8_t, 3> CopyViaSplitterUint8Test(
1004 armnn::IWorkloadFactory& workloadFactory,
1005 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1007 return CopyViaSplitterTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
1010 LayerTestResult<float, 2> LstmLayerFloat32WithCifgWithPeepholeNoProjectionTest(
1011 armnn::IWorkloadFactory& workloadFactory,
1012 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1014 armnn::TensorInfo inputDesc({ 2, 2 }, armnn::DataType::Float32);
1015 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
1016 { 2., 3., 3., 4. }));
1018 armnn::TensorInfo outputDesc({ 2, 4 }, armnn::DataType::Float32);
1019 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
1020 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
1021 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f}));
1022 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
1023 workloadFactory, memoryManager, input, expectedOutput);
1026 LayerTestResult<float, 2> LstmLayerFloat32NoCifgWithPeepholeWithProjectionTest(
1027 armnn::IWorkloadFactory& workloadFactory,
1028 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1030 armnn::TensorInfo inputDesc({ 2, 5 }, armnn::DataType::Float32);
1031 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
1032 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
1033 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f}));
1035 armnn::TensorInfo outputDesc({ 2, 16 }, armnn::DataType::Float32);
1036 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
1037 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
1038 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
1039 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
1040 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
1041 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
1042 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f,
1044 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<armnn::DataType::Float32>(
1045 workloadFactory, memoryManager, input, expectedOutput);
1048 LayerTestResult<float, 2> LstmLayerFloat32NoCifgNoPeepholeNoProjectionTest(
1049 armnn::IWorkloadFactory& workloadFactory,
1050 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1052 armnn::TensorInfo inputDesc({2, 2}, armnn::DataType::Float32);
1053 boost::multi_array<float, 2> input = MakeTensor<float, 2>(inputDesc, std::vector<float>(
1057 armnn::TensorInfo outputDesc({2, 4}, armnn::DataType::Float32);
1058 boost::multi_array<float, 2> expectedOutput = MakeTensor<float, 2>(outputDesc, std::vector<float>(
1059 {{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
1060 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}}));
1062 return LstmNoCifgNoPeepholeNoProjectionTestImpl<armnn::DataType::Float32>(
1063 workloadFactory, memoryManager, input, expectedOutput);
1066 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionTest(
1067 armnn::IWorkloadFactory& workloadFactory,
1068 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1070 const float qScale = 1.0f;
1071 const int32_t qOffset = 0;
1073 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
1074 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
1076 armnn::TensorInfo inputDesc({2, 2}, datatype);
1077 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
1078 std::vector<float>{2., 3., 3., 4.}));
1080 armnn::TensorInfo outputDesc({2, 4}, datatype);
1081 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
1082 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
1083 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
1085 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
1086 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
1090 LayerTestResult<int16_t, 2> LstmLayerInt16WithCifgWithPeepholeNoProjectionTest(
1091 armnn::IWorkloadFactory& workloadFactory,
1092 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1094 const float qScale = 1.0f;
1095 const int32_t qOffset = 0;
1097 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
1098 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
1100 armnn::TensorInfo inputDesc({ 2, 2 }, datatype);
1101 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale, qOffset,
1102 std::vector<float>({ 2., 3., 3., 4. })));
1104 armnn::TensorInfo outputDesc({ 2, 4 }, datatype);
1105 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
1106 qOffset, std::vector<float>(
1107 {-0.36444446f, -0.00352185f, 0.12886585f, -0.05163646f,
1108 -0.42734814f, -0.00478661f, 0.13455015f, -0.03560682f})));
1110 return LstmLayerWithCifgWithPeepholeNoProjectionTestImpl<datatype>(
1111 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
1114 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgWithPeepholeWithProjectionTest(
1115 armnn::IWorkloadFactory& workloadFactory,
1116 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1118 const float qScale = 2.0f;
1119 const int32_t qOffset = 0;
1121 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16;
1122 const armnn::DataType constantDatatype = armnn::DataType::QuantisedAsymm8;
1124 armnn::TensorInfo inputDesc({ 2, 5 }, datatype);
1125 boost::multi_array<int16_t, 2> input = MakeTensor<int16_t, 2>(inputDesc, QuantizedVector<int16_t>(qScale,
1126 qOffset, std::vector<float>(
1127 {0.787926f, 0.151646f, 0.071352f, 0.118426f, 0.458058f,
1128 0.295743f, 0.544053f, 0.690064f, 0.858138f, 0.497181f})));
1130 armnn::TensorInfo outputDesc({ 2, 16 }, datatype);
1131 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
1132 qOffset, std::vector<float>(
1133 {-0.00396806f, 0.029352f, -0.00279226f, 0.0159977f, -0.00835576f,
1134 -0.0211779f, 0.0283512f, -0.0114597f, 0.00907307f, -0.0244004f,
1135 -0.0152191f, -0.0259063f, 0.00914318f, 0.00415118f, 0.017147f,
1136 0.0134203f, -0.013869f, 0.0287268f, -0.00334693f, 0.00733398f, -0.0287926f,
1137 -0.0186926f, 0.0193662f, -0.0115437f, 0.00422612f, -0.0345232f,
1138 0.00223253f, -0.00957321f, 0.0210624f, 0.013331f, 0.0150954f, 0.02168f})));
1140 return LstmLayerNoCifgWithPeepholeWithProjectionTestImpl<datatype>(
1141 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, constantDatatype);
1144 LayerTestResult<int16_t, 2> LstmLayerInt16NoCifgNoPeepholeNoProjectionInt16ConstantTest(
1145 armnn::IWorkloadFactory& workloadFactory,
1146 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1148 const float qScale = 1.0f;
1149 const int32_t qOffset = 0;
1151 const armnn::DataType datatype = armnn::DataType::QuantisedSymm16; // datatype & constants set to QSymm16
1153 armnn::TensorInfo inputDesc({2, 2}, datatype);
1154 boost::multi_array<int16_t , 2> input = MakeTensor<int16_t , 2>(inputDesc, QuantizedVector<int16_t>(qScale,
1155 qOffset, std::vector<float>{2., 3., 3., 4.}));
1157 armnn::TensorInfo outputDesc({2, 4}, datatype);
1158 boost::multi_array<int16_t, 2> expectedOutput = MakeTensor<int16_t, 2>(outputDesc, QuantizedVector<int16_t>(qScale,
1159 qOffset, std::vector<float>({{-0.02973187f, 0.1229473f, 0.20885126f, -0.15358765f,
1160 -0.0185422f, 0.11281417f, 0.24466537f, -0.1826292f}})));
1162 return LstmNoCifgNoPeepholeNoProjectionTestImpl<datatype>(
1163 workloadFactory, memoryManager, input, expectedOutput, qScale, qOffset, datatype);
1166 LayerTestResult<float,3> MergerTest(
1167 armnn::IWorkloadFactory& workloadFactory,
1168 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1170 unsigned int outputWidth = 3;
1171 unsigned int outputHeight = 6;
1172 unsigned int outputChannels = 3;
1174 unsigned int inputWidth1 = 3;
1175 unsigned int inputHeight1 = 6;
1176 unsigned int inputChannels1 = 2;
1178 unsigned int inputWidth2 = 3;
1179 unsigned int inputHeight2 = 6;
1180 unsigned int inputChannels2 = 1;
1182 // Define the tensor descriptors.
1183 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::Float32);
1184 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::Float32);
1185 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::Float32);
1187 LayerTestResult<float,3> ret(outputTensorInfo);
1189 ret.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float>(
1194 10.0f, 11.0f, 12.0f,
1195 13.0f, 14.0f, 15.0f,
1196 16.0f, 17.0f, 18.0f,
1198 19.0f, 20.0f, 21.0f,
1199 22.0f, 23.0f, 24.0f,
1200 25.0f, 26.0f, 27.0f,
1201 28.0f, 29.0f, 30.0f,
1202 31.0f, 32.0f, 33.0f,
1203 34.0f, 35.0f, 36.0f,
1205 37.0f, 38.0f, 39.0f,
1206 40.0f, 41.0f, 42.0f,
1207 43.0f, 44.0f, 45.0f,
1208 46.0f, 47.0f, 48.0f,
1209 49.0f, 50.0f, 51.0f,
1210 52.0f, 53.0f, 54.0f,
1214 auto input1 = MakeTensor<float, 3>(inputTensorInfo1, std::vector<float>(
1219 10.0f, 11.0f, 12.0f,
1220 13.0f, 14.0f, 15.0f,
1221 16.0f, 17.0f, 18.0f,
1223 19.0f, 20.0f, 21.0f,
1224 22.0f, 23.0f, 24.0f,
1225 25.0f, 26.0f, 27.0f,
1226 28.0f, 29.0f, 30.0f,
1227 31.0f, 32.0f, 33.0f,
1228 34.0f, 35.0f, 36.0f,
1232 auto input2 = MakeTensor<float, 3>(inputTensorInfo2, std::vector<float>(
1234 37.0f, 38.0f, 39.0f,
1235 40.0f, 41.0f, 42.0f,
1236 43.0f, 44.0f, 45.0f,
1237 46.0f, 47.0f, 48.0f,
1238 49.0f, 50.0f, 51.0f,
1239 52.0f, 53.0f, 54.0f,
1243 std::vector<unsigned int> wOrigin1 = {0, 0, 0}; //Extent of the window is defined by size of input[0].
1244 armnn::MergerQueueDescriptor::ViewOrigin window1(wOrigin1);
1246 std::vector<unsigned int> wOrigin2 = {2, 0, 0}; //Extent of the window is defined by size of input[1].
1247 armnn::MergerQueueDescriptor::ViewOrigin window2(wOrigin2);
1249 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1251 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
1253 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
1254 subTensorsSupported ?
1255 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
1256 workloadFactory.CreateTensorHandle(inputTensorInfo1);
1258 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
1259 subTensorsSupported ?
1260 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
1261 workloadFactory.CreateTensorHandle(inputTensorInfo2);
1263 armnn::MergerQueueDescriptor data;
1264 armnn::WorkloadInfo info;
1265 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1266 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
1267 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1269 data.m_ViewOrigins.push_back(window1);
1270 data.m_ViewOrigins.push_back(window2);
1272 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMerger(data, info);
1274 inputHandle1->Allocate();
1275 inputHandle2->Allocate();
1276 outputHandle->Allocate();
1278 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
1279 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
1281 workload->PostAllocationConfigure();
1282 workload->Execute();
1284 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
1289 LayerTestResult<float,4> AdditionTest(
1290 armnn::IWorkloadFactory& workloadFactory,
1291 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1293 unsigned int batchSize = 2;
1294 unsigned int channels = 2;
1295 unsigned int height = 2;
1296 unsigned int width = 3;
1298 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
1299 armnn::TensorInfo outputTensorInfo;
1301 unsigned int shape[] = {batchSize, channels, height, width};
1303 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1304 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1305 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1308 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, std::vector<float>(
1323 auto input2 = MakeTensor<float, 4>(inputTensorInfo2, std::vector<float>(
1338 LayerTestResult<float,4> ret(outputTensorInfo);
1339 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, std::vector<float>(
1354 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
1355 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
1356 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1358 armnn::AdditionQueueDescriptor data;
1359 armnn::WorkloadInfo info;
1360 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1361 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
1362 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1364 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
1366 inputHandle1->Allocate();
1367 inputHandle2->Allocate();
1368 outputHandle->Allocate();
1370 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
1371 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
1373 workload->PostAllocationConfigure();
1374 workload->Execute();
1376 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1381 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1382 LayerTestResult<T, 4> AdditionBroadcastTestImpl(
1383 armnn::IWorkloadFactory& workloadFactory,
1384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1388 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 1}, ArmnnType);
1389 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 2, 3}, ArmnnType);
1390 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
1392 if (armnn::IsQuantizedType<T>())
1394 inputTensorInfo1.SetQuantizationScale(qScale);
1395 inputTensorInfo1.SetQuantizationOffset(qOffset);
1396 inputTensorInfo2.SetQuantizationScale(qScale);
1397 inputTensorInfo2.SetQuantizationOffset(qOffset);
1398 outputTensorInfo.SetQuantizationScale(qScale);
1399 outputTensorInfo.SetQuantizationOffset(qOffset);
1402 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
1414 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
1420 LayerTestResult<T,4> ret(outputTensorInfo);
1421 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
1433 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
1434 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
1435 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1437 armnn::AdditionQueueDescriptor data;
1438 armnn::WorkloadInfo info;
1439 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1440 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
1441 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1443 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
1445 inputHandle1->Allocate();
1446 inputHandle2->Allocate();
1447 outputHandle->Allocate();
1449 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
1450 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
1452 workload->PostAllocationConfigure();
1453 workload->Execute();
1455 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1460 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1461 LayerTestResult<T, 4> AdditionBroadcast1ElementTestImpl(
1462 armnn::IWorkloadFactory& workloadFactory,
1463 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1467 armnn::TensorInfo inputTensorInfo1 = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
1468 armnn::TensorInfo inputTensorInfo2 = armnn::TensorInfo({1, 1, 1, 1}, ArmnnType);
1469 armnn::TensorInfo outputTensorInfo = armnn::TensorInfo({1, 3, 2, 3}, ArmnnType);
1471 if (armnn::IsQuantizedType<T>())
1473 inputTensorInfo1.SetQuantizationScale(qScale);
1474 inputTensorInfo1.SetQuantizationOffset(qOffset);
1475 inputTensorInfo2.SetQuantizationScale(qScale);
1476 inputTensorInfo2.SetQuantizationOffset(qOffset);
1477 outputTensorInfo.SetQuantizationScale(qScale);
1478 outputTensorInfo.SetQuantizationOffset(qOffset);
1481 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset,
1487 12.0f, 13.0f, 14.0f,
1488 15.0f, 16.0f, 17.0f,
1491 auto input2 = MakeTensor<T, 4>(inputTensorInfo2, QuantizedVector<T>(qScale, qOffset,
1496 LayerTestResult<T,4> ret(outputTensorInfo);
1497 ret.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset,
1503 12.5f, 13.5f, 14.5f,
1504 15.5f, 16.5f, 17.5f,
1507 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
1508 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
1509 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1511 armnn::AdditionQueueDescriptor data;
1512 armnn::WorkloadInfo info;
1513 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1514 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
1515 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1517 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
1519 inputHandle1->Allocate();
1520 inputHandle2->Allocate();
1521 outputHandle->Allocate();
1523 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
1524 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
1526 workload->PostAllocationConfigure();
1527 workload->Execute();
1529 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1534 LayerTestResult<float, 4> AdditionBroadcastTest(
1535 armnn::IWorkloadFactory& workloadFactory,
1536 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1538 return AdditionBroadcastTestImpl<armnn::DataType::Float32>(
1539 workloadFactory, memoryManager, 0.0f, 0);
1542 LayerTestResult<uint8_t, 4> AdditionBroadcastUint8Test(
1543 armnn::IWorkloadFactory& workloadFactory,
1544 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1546 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedAsymm8>(
1547 workloadFactory, memoryManager, 2.f, 0);
1550 LayerTestResult<int16_t, 4> AdditionBroadcastInt16Test(
1551 armnn::IWorkloadFactory& workloadFactory,
1552 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1554 return AdditionBroadcastTestImpl<armnn::DataType::QuantisedSymm16>(
1555 workloadFactory, memoryManager, 2.f, 0);
1558 LayerTestResult<float, 4> AdditionBroadcast1ElementTest(
1559 armnn::IWorkloadFactory& workloadFactory,
1560 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1562 return AdditionBroadcast1ElementTestImpl<armnn::DataType::Float32>(
1563 workloadFactory, memoryManager, 0.0f, 0);
1566 LayerTestResult<uint8_t, 4> AdditionBroadcast1ElementUint8Test(
1567 armnn::IWorkloadFactory& workloadFactory,
1568 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1570 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedAsymm8>(
1571 workloadFactory, memoryManager, 0.1333333f, 128);
1574 LayerTestResult<int16_t, 4> AdditionBroadcast1ElementInt16Test(
1575 armnn::IWorkloadFactory& workloadFactory,
1576 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1578 return AdditionBroadcast1ElementTestImpl<armnn::DataType::QuantisedSymm16>(
1579 workloadFactory, memoryManager, 0.1333333f, 0);
1582 LayerTestResult<float,4> CompareAdditionTest(
1583 armnn::IWorkloadFactory& workloadFactory,
1584 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1585 armnn::IWorkloadFactory& refWorkloadFactory)
1587 unsigned int batchSize = 4;
1588 unsigned int channels = 1;
1589 unsigned int height = 2;
1590 unsigned int width = 3;
1592 armnn::TensorInfo inputTensorInfo1, inputTensorInfo2;
1593 armnn::TensorInfo outputTensorInfo;
1595 unsigned int shape[] = {batchSize, channels, height, width};
1597 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1598 inputTensorInfo2 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1599 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
1601 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 1232);
1602 auto input2 = MakeRandomTensor<float, 4>(inputTensorInfo2, 456);
1604 LayerTestResult<float,4> ret(outputTensorInfo);
1606 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
1607 std::unique_ptr<armnn::ITensorHandle> inputHandle2 = workloadFactory.CreateTensorHandle(inputTensorInfo2);
1608 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1610 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
1611 std::unique_ptr<armnn::ITensorHandle> inputHandle2Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo2);
1612 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
1614 armnn::AdditionQueueDescriptor data;
1615 armnn::WorkloadInfo info;
1616 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1617 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
1618 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1620 armnn::AdditionQueueDescriptor refData = data;
1621 armnn::WorkloadInfo refInfo = info;
1622 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo1, inputHandle1Ref.get());
1623 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo2, inputHandle2Ref.get());
1624 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
1626 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
1627 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateAddition(refData, refInfo);
1629 inputHandle1->Allocate();
1630 inputHandle2->Allocate();
1631 outputHandle->Allocate();
1632 inputHandle1Ref->Allocate();
1633 inputHandle2Ref->Allocate();
1634 outputHandleRef->Allocate();
1636 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
1637 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0][0]);
1638 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
1639 CopyDataToITensorHandle(inputHandle2Ref.get(), &input2[0][0][0][0]);
1641 workload->PostAllocationConfigure();
1642 workload->Execute();
1643 workloadRef->PostAllocationConfigure();
1644 workloadRef->Execute();
1646 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
1647 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
1653 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
1654 LayerTestResult<T, 4> DivisionTestHelper(
1655 armnn::IWorkloadFactory& workloadFactory,
1656 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
1657 const unsigned int shape0[4],
1658 const std::vector<T>& values0,
1661 const unsigned int shape1[4],
1662 const std::vector<T> & values1,
1665 const unsigned int outShape[4],
1666 const std::vector<T> & outValues,
1670 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
1671 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
1672 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
1674 inputTensorInfo0.SetQuantizationScale(scale0);
1675 inputTensorInfo0.SetQuantizationOffset(offset0);
1677 inputTensorInfo1.SetQuantizationScale(scale1);
1678 inputTensorInfo1.SetQuantizationOffset(offset1);
1680 outputTensorInfo.SetQuantizationScale(outScale);
1681 outputTensorInfo.SetQuantizationOffset(outOffset);
1683 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
1684 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
1686 LayerTestResult<T, 4> result(outputTensorInfo);
1687 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
1689 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
1690 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
1691 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
1693 armnn::DivisionQueueDescriptor data;
1694 armnn::WorkloadInfo info;
1695 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
1696 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
1697 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
1699 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateDivision(data, info);
1701 inputHandle0->Allocate();
1702 inputHandle1->Allocate();
1703 outputHandle->Allocate();
1705 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
1706 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
1708 workload->PostAllocationConfigure();
1709 workload->Execute();
1711 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
1715 } // anonymous namespace
1717 LayerTestResult<float,4> DivisionByZeroTest(
1718 armnn::IWorkloadFactory& workloadFactory,
1719 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1721 const unsigned int width = 2;
1722 const unsigned int height = 2;
1723 const unsigned int channelCount = 2;
1724 const unsigned int batchSize = 2;
1726 unsigned int shape[] = { batchSize, channelCount, height, width };
1728 std::vector<float> input0({
1729 1.f, 1.f, 1.f, 1.f, 0.f, 0.f, 0.f, 0.f,
1730 -1.f, -1.f, -1.f, -1.f, 5.f, 5.f, 5.f, 5.f });
1732 std::vector<float> input1({
1733 0.f, 0.f, -0.f, -0.f, 0.f, 0.f, -0.f, -0.f,
1734 0.f, 0.f, -0.f, -0.f, 5.f, 5.f, 5.f, 5.f });
1736 std::vector<float> output({
1737 INFINITY, INFINITY, -INFINITY, -INFINITY, NAN, NAN, -NAN, -NAN,
1738 -INFINITY, -INFINITY, INFINITY, INFINITY, 1, 1, 1, 1 });
1740 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
1742 shape, input0, 1.0f, 0,
1743 shape, input1, 1.0f, 0,
1744 shape, output, 1.0f, 0);
1747 LayerTestResult<float,4> DivisionTest(
1748 armnn::IWorkloadFactory& workloadFactory,
1749 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1751 const unsigned int width = 2;
1752 const unsigned int height = 2;
1753 const unsigned int channelCount = 2;
1754 const unsigned int batchSize = 2;
1756 unsigned int shape[] = { batchSize, channelCount, height, width };
1758 std::vector<float> input0({
1759 2, 2, 2, 2, 3, 3, 3, 3,
1760 4, 4, 4, 4, 5, 5, 5, 5 });
1762 std::vector<float> input1({
1763 1, 1, 1, 1, 2, 2, 2, 2,
1764 4, 4, 4, 4, 4, 4, 4, 4 });
1766 std::vector<float> output({
1767 2, 2, 2, 2, 1.5, 1.5, 1.5, 1.5,
1768 1, 1, 1, 1, 1.25, 1.25, 1.25, 1.25 });
1771 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
1773 shape, input0, 1.0f, 0,
1774 shape, input1, 1.0f, 0,
1775 shape, output, 1.0f, 0);
1778 LayerTestResult<float, 4> DivisionBroadcast1ElementTest(
1779 armnn::IWorkloadFactory& workloadFactory,
1780 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1782 unsigned int shape0[] = { 1, 2, 2, 2 };
1783 std::vector<float> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
1785 unsigned int shape1[] = { 1, 1, 1, 1 };
1786 std::vector<float> input1({ 2 });
1788 std::vector<float> output({ 1, 2, 3, 4, 5, 6, 7, 8});
1791 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
1793 shape0, input0, 1.0f, 0,
1794 shape1, input1, 1.0f, 0,
1795 shape0, output, 1.0f, 0);
1798 LayerTestResult<float, 4> DivisionBroadcast1DVectorTest(
1799 armnn::IWorkloadFactory& workloadFactory,
1800 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1802 unsigned int shape0[] = { 1, 3, 3, 2 };
1803 std::vector<float> input0({
1805 7, 16, 9, 20, 11, 24,
1806 13, 28, 15, 32, 17, 36});
1808 unsigned int shape1[] = { 1, 1, 1, 2 };
1809 std::vector<float> input1({ 1, 2 });
1811 std::vector<float> output({
1813 7, 8, 9, 10, 11, 12,
1814 13, 14, 15, 16, 17, 18});
1816 return DivisionTestHelper<armnn::DataType::Float32>(workloadFactory,
1818 shape0, input0, 1.0f, 0,
1819 shape1, input1, 1.0f, 0,
1820 shape0, output, 1.0f, 0);
1823 LayerTestResult<uint8_t,4> DivisionUint8Test(
1824 armnn::IWorkloadFactory& workloadFactory,
1825 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1827 const unsigned int width = 2;
1828 const unsigned int height = 2;
1829 const unsigned int channelCount = 2;
1830 const unsigned int batchSize = 2;
1832 unsigned int shape[] = { batchSize, channelCount, height, width };
1834 std::vector<uint8_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
1835 4, 4, 4, 4, 5, 5, 5, 5 });
1837 std::vector<uint8_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
1838 4, 4, 4, 4, 4, 4, 4, 4 });
1840 std::vector<uint8_t> output({8, 8, 8, 8, 6, 6, 6, 6,
1841 4, 4, 4, 4, 5, 5, 5, 5});
1844 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
1846 shape, input0, 1.0f, 0,
1847 shape, input1, 1.0f, 0,
1848 shape, output, 0.25f, 0);
1851 LayerTestResult<uint8_t, 4> DivisionBroadcast1ElementUint8Test(
1852 armnn::IWorkloadFactory& workloadFactory,
1853 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1855 unsigned int shape0[] = { 1, 2, 2, 2 };
1856 std::vector<uint8_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
1858 unsigned int shape1[] = { 1, 1, 1, 1 };
1859 std::vector<uint8_t> input1({ 2 });
1861 std::vector<uint8_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
1863 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
1865 shape0, input0, 1.0f, 0,
1866 shape1, input1, 1.0f, 0,
1867 shape0, output, 1.0f, 0);
1870 LayerTestResult<uint8_t, 4> DivisionBroadcast1DVectorUint8Test(
1871 armnn::IWorkloadFactory& workloadFactory,
1872 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1874 unsigned int shape0[] = { 1, 3, 3, 2 };
1875 std::vector<uint8_t> input0({1, 4, 3, 8, 5, 12,
1876 7, 16, 9, 20, 11, 24,
1877 13, 28, 15, 32, 17, 36});
1879 unsigned int shape1[] = { 1, 1, 1, 2 };
1880 std::vector<uint8_t> input1({ 1, 2 });
1882 std::vector<uint8_t> output({1, 2, 3, 4, 5, 6,
1883 7, 8, 9, 10, 11, 12,
1884 13, 14, 15, 16, 17, 18});
1886 return DivisionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
1888 shape0, input0, 1.0f, 0,
1889 shape1, input1, 1.0f, 0,
1890 shape0, output, 1.0f, 0);
1893 LayerTestResult<int16_t,4> DivisionInt16Test(
1894 armnn::IWorkloadFactory& workloadFactory,
1895 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1897 unsigned int shape[] = { 2, 2, 2, 2 };
1899 std::vector<int16_t> input0({2, 2, 2, 2, 3, 3, 3, 3,
1900 4, 4, 4, 4, 5, 5, 5, 5 });
1902 std::vector<int16_t> input1({1, 1, 1, 1, 2, 2, 2, 2,
1903 4, 4, 4, 4, 4, 4, 4, 4 });
1905 std::vector<int16_t> output({8, 8, 8, 8, 6, 6, 6, 6,
1906 4, 4, 4, 4, 5, 5, 5, 5});
1909 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
1911 shape, input0, 1.0f, 0,
1912 shape, input1, 1.0f, 0,
1913 shape, output, 0.25f, 0);
1916 LayerTestResult<int16_t, 4> DivisionBroadcast1ElementInt16Test(
1917 armnn::IWorkloadFactory& workloadFactory,
1918 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1920 unsigned int shape0[] = { 1, 2, 2, 2 };
1921 std::vector<int16_t> input0({ 2, 4, 6, 8, 10, 12, 14, 16});
1923 unsigned int shape1[] = { 1, 1, 1, 1 };
1924 std::vector<int16_t> input1({ 2 });
1926 std::vector<int16_t> output({ 1, 2, 3, 4, 5, 6, 7, 8});
1928 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
1930 shape0, input0, 1.0f, 0,
1931 shape1, input1, 1.0f, 0,
1932 shape0, output, 1.0f, 0);
1935 LayerTestResult<int16_t, 4> DivisionBroadcast1DVectorInt16Test(
1936 armnn::IWorkloadFactory& workloadFactory,
1937 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
1939 unsigned int shape0[] = { 1, 3, 3, 2 };
1940 std::vector<int16_t> input0({1, 4, 3, 8, 5, 12,
1941 7, 16, 9, 20, 11, 24,
1942 13, 28, 15, 32, 17, 36});
1944 unsigned int shape1[] = { 1, 1, 1, 2 };
1945 std::vector<int16_t> input1({ 1, 2 });
1947 std::vector<int16_t> output({1, 2, 3, 4, 5, 6,
1948 7, 8, 9, 10, 11, 12,
1949 13, 14, 15, 16, 17, 18});
1951 return DivisionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
1953 shape0, input0, 1.0f, 0,
1954 shape1, input1, 1.0f, 0,
1955 shape0, output, 1.0f, 0);
1958 template<typename DescriptorType>
1959 std::unique_ptr<armnn::IWorkload> CreateWorkload(
1960 const armnn::IWorkloadFactory& workloadFactory,
1961 const armnn::WorkloadInfo& info,
1962 const DescriptorType& descriptor)
1964 return CreateWorkload(workloadFactory, info, descriptor);
1968 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MaximumQueueDescriptor>(
1969 const armnn::IWorkloadFactory& workloadFactory,
1970 const armnn::WorkloadInfo& info,
1971 const armnn::MaximumQueueDescriptor& descriptor)
1973 return workloadFactory.CreateMaximum(descriptor, info);
1977 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::MinimumQueueDescriptor>(
1978 const armnn::IWorkloadFactory& workloadFactory,
1979 const armnn::WorkloadInfo& info,
1980 const armnn::MinimumQueueDescriptor& descriptor)
1982 return workloadFactory.CreateMinimum(descriptor, info);
1986 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::EqualQueueDescriptor>(
1987 const armnn::IWorkloadFactory& workloadFactory,
1988 const armnn::WorkloadInfo& info,
1989 const armnn::EqualQueueDescriptor& descriptor)
1991 return workloadFactory.CreateEqual(descriptor, info);
1995 std::unique_ptr<armnn::IWorkload> CreateWorkload<armnn::GreaterQueueDescriptor>(
1996 const armnn::IWorkloadFactory& workloadFactory,
1997 const armnn::WorkloadInfo& info,
1998 const armnn::GreaterQueueDescriptor& descriptor)
2000 return workloadFactory.CreateGreater(descriptor, info);
2005 template <typename Descriptor,
2006 armnn::DataType ArmnnTypeInput,
2007 armnn::DataType ArmnnTypeOutput,
2008 typename TInput = armnn::ResolveType<ArmnnTypeInput>,
2009 typename TOutput = armnn::ResolveType<ArmnnTypeOutput>>
2010 LayerTestResult<TOutput, 4> ElementwiseTestHelper(
2011 armnn::IWorkloadFactory & workloadFactory,
2012 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
2013 const unsigned int shape0[4], std::vector<TInput> values0,
2014 const unsigned int shape1[4], std::vector<TInput> values1,
2015 const unsigned int outShape[4], std::vector<TOutput> outValues,
2016 float qScale = 0.0f, int qOffset = 0)
2018 const size_t dimensionCount = 4;
2019 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, ArmnnTypeInput};
2020 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, ArmnnTypeInput};
2021 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, ArmnnTypeOutput};
2023 auto input0 = MakeTensor<TInput, 4>(inputTensorInfo0, values0);
2024 auto input1 = MakeTensor<TInput, 4>(inputTensorInfo1, values1);
2026 if (armnn::IsQuantizedType<TInput>())
2028 inputTensorInfo0.SetQuantizationScale(qScale);
2029 inputTensorInfo0.SetQuantizationOffset(qOffset);
2031 inputTensorInfo1.SetQuantizationScale(qScale);
2032 inputTensorInfo1.SetQuantizationOffset(qOffset);
2034 outputTensorInfo.SetQuantizationScale(qScale);
2035 outputTensorInfo.SetQuantizationOffset(qOffset);
2038 LayerTestResult<TOutput,4> ret(outputTensorInfo);
2040 if(ArmnnTypeOutput == armnn::DataType::Boolean)
2042 ret.compareBoolean = true;
2045 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
2046 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2047 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2050 armnn::WorkloadInfo info;
2051 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
2052 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2053 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2054 auto workload = CreateWorkload<Descriptor>(workloadFactory, info, data);
2056 inputHandle0->Allocate();
2057 inputHandle1->Allocate();
2058 outputHandle->Allocate();
2060 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
2061 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2063 workload->PostAllocationConfigure();
2064 ExecuteWorkload(*workload, memoryManager);
2066 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2068 ret.outputExpected = MakeTensor<TOutput, 4>(outputTensorInfo, outValues);
2072 template <typename Descriptor, armnn::DataType ArmnnT, typename T = armnn::ResolveType<ArmnnT>>
2073 LayerTestResult<T, 4> ElementwiseTestHelper(
2074 armnn::IWorkloadFactory & workloadFactory,
2075 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager,
2076 const unsigned int shape0[4], std::vector<T> values0,
2077 const unsigned int shape1[4], std::vector<T> values1,
2078 const unsigned int outShape[4], std::vector<T> outValues,
2079 float qScale = 0.0f, int qOffset = 0)
2081 return ElementwiseTestHelper<Descriptor, ArmnnT, ArmnnT>
2095 LayerTestResult<uint8_t, 4> EqualSimpleTest(armnn::IWorkloadFactory& workloadFactory,
2096 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2098 const unsigned int width = 2;
2099 const unsigned int height = 2;
2100 const unsigned int channelCount = 2;
2101 const unsigned int batchSize = 2;
2103 unsigned int shape[] = { batchSize, channelCount, height, width };
2105 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
2106 3, 3, 3, 3, 4, 4, 4, 4 });
2108 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
2109 5, 5, 5, 5, 4, 4, 4, 4 });
2111 std::vector<uint8_t> output({ 1, 1, 1, 1, 0, 0, 0, 0,
2112 0, 0, 0, 0, 1, 1, 1, 1 });
2114 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2125 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementTest(
2126 armnn::IWorkloadFactory& workloadFactory,
2127 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2129 unsigned int shape0[] = { 1, 2, 2, 2 };
2130 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
2132 unsigned int shape1[] = { 1, 1, 1, 1 };
2133 std::vector<float> input1({ 1 });
2135 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0, 0, 0});
2137 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2148 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorTest(
2149 armnn::IWorkloadFactory& workloadFactory,
2150 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2152 const unsigned int shape0[] = { 1, 2, 2, 3 };
2153 const unsigned int shape1[] = { 1, 1, 1, 3 };
2155 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
2156 7, 8, 9, 10, 11, 12 });
2158 std::vector<float> input1({ 1, 2, 3});
2160 std::vector<uint8_t> output({ 1, 1, 1, 0, 0, 0,
2161 0, 0, 0, 0, 0, 0 });
2163 return ElementwiseTestHelper<armnn::EqualQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2174 LayerTestResult<uint8_t, 4> EqualUint8Test(
2175 armnn::IWorkloadFactory& workloadFactory,
2176 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2178 unsigned int shape[] = { 2, 2, 2, 2 };
2180 // See dequantized values to the right.
2181 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
2182 3, 3, 3, 3, 7, 7, 7, 7 });
2184 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
2185 3, 3, 3, 3, 5, 5, 5, 5 });
2187 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
2188 1, 1, 1, 1, 0, 0, 0, 0 });
2190 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
2191 armnn::DataType::QuantisedAsymm8,
2192 armnn::DataType::Boolean>(
2205 LayerTestResult<uint8_t, 4> EqualBroadcast1ElementUint8Test(
2206 armnn::IWorkloadFactory& workloadFactory,
2207 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2209 const unsigned int shape0[] = { 1, 2, 2, 3 };
2210 const unsigned int shape1[] = { 1, 1, 1, 1 };
2212 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2213 7, 8, 9, 10, 11, 12 });
2215 std::vector<uint8_t> input1({ 1 });
2217 std::vector<uint8_t> output({ 1, 0, 0, 0, 0, 0,
2218 0, 0, 0, 0, 0, 0 });
2220 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
2221 armnn::DataType::QuantisedAsymm8,
2222 armnn::DataType::Boolean>(
2235 LayerTestResult<uint8_t, 4> EqualBroadcast1DVectorUint8Test(
2236 armnn::IWorkloadFactory& workloadFactory,
2237 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2239 const unsigned int shape0[] = { 1, 2, 2, 3 };
2240 const unsigned int shape1[] = { 1, 1, 1, 3 };
2242 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2243 7, 8, 9, 10, 11, 12 });
2245 std::vector<uint8_t> input1({ 1, 1, 3});
2247 std::vector<uint8_t> output({ 1, 0, 1, 0, 0, 0,
2248 0, 0, 0, 0, 0, 0 });
2250 return ElementwiseTestHelper<armnn::EqualQueueDescriptor,
2251 armnn::DataType::QuantisedAsymm8,
2252 armnn::DataType::Boolean>(
2265 LayerTestResult<uint8_t, 4> GreaterSimpleTest(armnn::IWorkloadFactory& workloadFactory,
2266 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2268 const unsigned int width = 2;
2269 const unsigned int height = 2;
2270 const unsigned int channelCount = 2;
2271 const unsigned int batchSize = 2;
2273 unsigned int shape[] = { batchSize, channelCount, height, width };
2275 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
2276 3, 3, 3, 3, 4, 4, 4, 4 });
2278 std::vector<float> input1({ 1, 1, 1, 1, 3, 3, 3, 3,
2279 5, 5, 5, 5, 4, 4, 4, 4 });
2281 std::vector<uint8_t> output({ 0, 0, 0, 0, 1, 1, 1, 1,
2282 0, 0, 0, 0, 0, 0, 0, 0 });
2284 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2295 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementTest(
2296 armnn::IWorkloadFactory& workloadFactory,
2297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2299 unsigned int shape0[] = { 1, 2, 2, 2 };
2300 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
2302 unsigned int shape1[] = { 1, 1, 1, 1 };
2303 std::vector<float> input1({ 1 });
2305 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1, 1, 1});
2307 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2318 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorTest(
2319 armnn::IWorkloadFactory& workloadFactory,
2320 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2322 const unsigned int shape0[] = { 1, 2, 2, 3 };
2323 const unsigned int shape1[] = { 1, 1, 1, 3 };
2325 std::vector<float> input0({ 1, 2.9f, 2.1f, 4, 5, 6,
2326 7, 8, 9, 10, 11, 12 });
2328 std::vector<float> input1({ 1, 3, 2});
2330 std::vector<uint8_t> output({ 0, 0, 1, 1, 1, 1,
2331 1, 1, 1, 1, 1, 1 });
2333 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor, armnn::DataType::Float32, armnn::DataType::Boolean>(
2344 LayerTestResult<uint8_t, 4> GreaterUint8Test(
2345 armnn::IWorkloadFactory& workloadFactory,
2346 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2348 unsigned int shape[] = { 2, 2, 2, 2 };
2350 // See dequantized values to the right.
2351 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
2352 3, 3, 3, 3, 5, 5, 5, 5 });
2354 std::vector<uint8_t> input1({ 2, 2, 2, 2, 6, 6, 6, 6,
2355 2, 2, 2, 2, 5, 5, 5, 5 });
2357 std::vector<uint8_t> output({ 0, 0, 0, 0, 0, 0, 0, 0,
2358 1, 1, 1, 1, 0, 0, 0, 0 });
2360 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
2361 armnn::DataType::QuantisedAsymm8,
2362 armnn::DataType::Boolean>(
2375 LayerTestResult<uint8_t, 4> GreaterBroadcast1ElementUint8Test(
2376 armnn::IWorkloadFactory& workloadFactory,
2377 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2379 const unsigned int shape0[] = { 1, 2, 2, 3 };
2380 const unsigned int shape1[] = { 1, 1, 1, 1 };
2382 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2383 7, 8, 9, 10, 11, 12 });
2385 std::vector<uint8_t> input1({ 1 });
2387 std::vector<uint8_t> output({ 0, 1, 1, 1, 1, 1,
2388 1, 1, 1, 1, 1, 1 });
2390 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
2391 armnn::DataType::QuantisedAsymm8,
2392 armnn::DataType::Boolean>(
2405 LayerTestResult<uint8_t, 4> GreaterBroadcast1DVectorUint8Test(
2406 armnn::IWorkloadFactory& workloadFactory,
2407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2409 const unsigned int shape0[] = { 1, 2, 2, 3 };
2410 const unsigned int shape1[] = { 1, 1, 1, 3 };
2412 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2413 7, 8, 9, 10, 11, 12 });
2415 std::vector<uint8_t> input1({ 1, 1, 3});
2417 std::vector<uint8_t> output({ 0, 1, 0, 1, 1, 1,
2418 1, 1, 1, 1, 1, 1 });
2420 return ElementwiseTestHelper<armnn::GreaterQueueDescriptor,
2421 armnn::DataType::QuantisedAsymm8,
2422 armnn::DataType::Boolean>(
2435 LayerTestResult<float, 4> MaximumSimpleTest(armnn::IWorkloadFactory& workloadFactory,
2436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2438 const unsigned int width = 2;
2439 const unsigned int height = 2;
2440 const unsigned int channelCount = 2;
2441 const unsigned int batchSize = 2;
2443 unsigned int shape[] = { batchSize, channelCount, height, width };
2445 std::vector<float> input0({ 1, 1, 1, 1, 5, 5, 5, 5,
2446 3, 3, 3, 3, 4, 4, 4, 4 });
2448 std::vector<float> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
2449 4, 4, 4, 4, 5, 5, 5, 5 });
2451 std::vector<float> output({ 2, 2, 2, 2, 5, 5, 5, 5,
2452 4, 4, 4, 4, 5, 5, 5, 5 });
2454 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
2465 LayerTestResult<float, 4> MaximumBroadcast1ElementTest(
2466 armnn::IWorkloadFactory& workloadFactory,
2467 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2469 unsigned int shape0[] = { 1, 2, 2, 2 };
2470 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
2472 unsigned int shape1[] = { 1, 1, 1, 1 };
2473 std::vector<float> input1({ 2 });
2475 std::vector<float> output({ 2, 2, 3, 4, 5, 6, 7, 8});
2477 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
2488 LayerTestResult<float, 4> MaximumBroadcast1DVectorTest(
2489 armnn::IWorkloadFactory& workloadFactory,
2490 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2492 const unsigned int shape0[] = { 1, 2, 2, 3 };
2493 const unsigned int shape1[] = { 1, 1, 1, 3 };
2495 std::vector<float> input0({ 1, 2, 3, 4, 5, 6,
2496 7, 8, 9, 10, 11, 12 });
2498 std::vector<float> input1({ 1, 2, 3});
2500 std::vector<float> output({ 1, 2, 3, 4, 5, 6,
2501 7, 8, 9, 10, 11, 12 });
2503 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::Float32>(
2514 LayerTestResult<uint8_t, 4> MaximumUint8Test(
2515 armnn::IWorkloadFactory& workloadFactory,
2516 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2518 unsigned int shape[] = { 2, 2, 2, 2 };
2520 // See dequantized values to the right.
2521 std::vector<uint8_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
2522 3, 3, 3, 3, 4, 4, 4, 4 });
2524 std::vector<uint8_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
2525 4, 4, 4, 4, 5, 5, 5, 5 });
2527 std::vector<uint8_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
2528 4, 4, 4, 4, 5, 5, 5, 5 });
2530 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
2543 LayerTestResult<uint8_t, 4> MaximumBroadcast1ElementUint8Test(
2544 armnn::IWorkloadFactory& workloadFactory,
2545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2547 const unsigned int shape0[] = { 1, 2, 2, 3 };
2548 const unsigned int shape1[] = { 1, 1, 1, 1 };
2550 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2551 7, 8, 9, 10, 11, 12 });
2553 std::vector<uint8_t> input1({2});
2555 std::vector<uint8_t> output({ 2, 2, 3, 4, 5, 6,
2556 7, 8, 9, 10, 11, 12 });
2558 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
2571 LayerTestResult<uint8_t, 4> MaximumBroadcast1DVectorUint8Test(
2572 armnn::IWorkloadFactory& workloadFactory,
2573 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2575 const unsigned int shape0[] = { 1, 2, 2, 3 };
2576 const unsigned int shape1[] = { 1, 1, 1, 3 };
2578 std::vector<uint8_t> input0({ 1, 2, 3, 4, 5, 6,
2579 7, 8, 9, 10, 11, 12 });
2581 std::vector<uint8_t> input1({ 1, 10, 3});
2583 std::vector<uint8_t> output({ 1, 10, 3, 4, 10, 6,
2584 7, 10, 9, 10, 11, 12 });
2586 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
2599 LayerTestResult<int16_t, 4> MaximumInt16Test(
2600 armnn::IWorkloadFactory& workloadFactory,
2601 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2603 unsigned int shape[] = { 2, 2, 2, 2 };
2605 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
2606 3, 3, 3, 3, 4, 4, 4, 4 });
2608 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
2609 4, 4, 4, 4, 5, 5, 5, 5 });
2611 std::vector<int16_t> output({ 2, 2, 2, 2, 6, 6, 6, 6,
2612 4, 4, 4, 4, 5, 5, 5, 5 });
2614 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2627 LayerTestResult<int16_t, 4> MaximumBroadcast1ElementInt16Test(
2628 armnn::IWorkloadFactory& workloadFactory,
2629 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2631 const unsigned int shape0[] = { 1, 2, 2, 3 };
2632 const unsigned int shape1[] = { 1, 1, 1, 1 };
2634 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
2635 7, 8, 9, 10, 11, 12 });
2637 std::vector<int16_t> input1({2});
2639 std::vector<int16_t> output({ 2, 2, 3, 4, 5, 6,
2640 7, 8, 9, 10, 11, 12 });
2642 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2655 LayerTestResult<int16_t, 4> MaximumBroadcast1DVectorInt16Test(
2656 armnn::IWorkloadFactory& workloadFactory,
2657 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2659 const unsigned int shape0[] = { 1, 2, 2, 3 };
2660 const unsigned int shape1[] = { 1, 1, 1, 3 };
2662 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
2663 7, 8, 9, 10, 11, 12 });
2665 std::vector<int16_t> input1({ 1, 10, 3});
2667 std::vector<int16_t> output({ 1, 10, 3, 4, 10, 6,
2668 7, 10, 9, 10, 11, 12 });
2670 return ElementwiseTestHelper<armnn::MaximumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2683 LayerTestResult<float, 4> MinimumBroadcast1ElementTest1(
2684 armnn::IWorkloadFactory& workloadFactory,
2685 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2687 unsigned int shape0[] = { 1, 2, 2, 2 };
2688 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
2690 unsigned int shape1[] = { 1, 1, 1, 1 };
2691 std::vector<float> input1({ 2 });
2693 std::vector<float> output({ 1, 2, 2, 2, 2, 2, 2, 2});
2695 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
2707 LayerTestResult<float, 4> MinimumBroadcast1ElementTest2(
2708 armnn::IWorkloadFactory& workloadFactory,
2709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2711 unsigned int shape0[] = { 1, 2, 2, 2 };
2712 std::vector<float> input0({ 1, 6, 3, 2, 8, 9, 1, 10});
2714 unsigned int shape1[] = { 1, 1, 1, 1 };
2715 std::vector<float> input1({ 5 });
2717 std::vector<float> output({ 1, 5, 3, 2, 5, 5, 1, 5});
2719 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::Float32>(
2730 LayerTestResult<uint8_t, 4> MinimumBroadcast1DVectorUint8Test(
2731 armnn::IWorkloadFactory & workloadFactory,
2732 const armnn::IBackendInternal::IMemoryManagerSharedPtr & memoryManager)
2734 const unsigned int shape0[] = { 1, 2, 2, 3 };
2735 const unsigned int shape1[] = { 1, 1, 1, 3 };
2737 std::vector<uint8_t> input0({ 1, 2, 3, 3, 2, 1,
2738 7, 1, 2, 3, 4, 5 });
2740 std::vector<uint8_t> input1({ 1, 2, 3});
2742 std::vector<uint8_t> output({ 1, 2, 3, 1, 2, 1,
2743 1, 1, 2, 1, 2, 3 });
2745 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedAsymm8>(
2758 LayerTestResult<int16_t, 4> MinimumInt16Test(
2759 armnn::IWorkloadFactory& workloadFactory,
2760 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2762 unsigned int shape[] = { 2, 2, 2, 2 };
2764 std::vector<int16_t> input0({ 1, 1, 1, 1, 6, 6, 6, 6,
2765 3, 3, 3, 3, 4, 4, 4, 4 });
2767 std::vector<int16_t> input1({ 2, 2, 2, 2, 3, 3, 3, 3,
2768 4, 4, 4, 4, 5, 5, 5, 5 });
2770 std::vector<int16_t> output({ 1, 1, 1, 1, 3, 3, 3, 3,
2771 3, 3, 3, 3, 4, 4, 4, 4 });
2773 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2786 LayerTestResult<int16_t, 4> MinimumBroadcast1ElementInt16Test(
2787 armnn::IWorkloadFactory& workloadFactory,
2788 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2790 const unsigned int shape0[] = { 1, 2, 2, 3 };
2791 const unsigned int shape1[] = { 1, 1, 1, 1 };
2793 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
2794 7, 8, 9, 10, 11, 12 });
2796 std::vector<int16_t> input1({2});
2798 std::vector<int16_t> output({ 1, 2, 2, 2, 2, 2,
2799 2, 2, 2, 2, 2, 2 });
2801 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2814 LayerTestResult<int16_t, 4> MinimumBroadcast1DVectorInt16Test(
2815 armnn::IWorkloadFactory& workloadFactory,
2816 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2818 const unsigned int shape0[] = { 1, 2, 2, 3 };
2819 const unsigned int shape1[] = { 1, 1, 1, 3 };
2821 std::vector<int16_t> input0({ 1, 2, 3, 4, 5, 6,
2822 7, 8, 9, 10, 11, 12 });
2824 std::vector<int16_t> input1({ 1, 10, 3});
2826 std::vector<int16_t> output({ 1, 2, 3, 1, 5, 3,
2827 1, 8, 3, 1, 10, 3 });
2829 return ElementwiseTestHelper<armnn::MinimumQueueDescriptor, armnn::DataType::QuantisedSymm16>(
2843 LayerTestResult<float,4> MultiplicationTestHelper(
2844 armnn::IWorkloadFactory& workloadFactory,
2845 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2846 const unsigned int shape0[4],
2847 const std::vector<float> & values0,
2848 const unsigned int shape1[4],
2849 const std::vector<float> & values1,
2850 const unsigned int outShape[4],
2851 const std::vector<float> & outValues)
2853 const size_t dimensionCount = 4;
2854 armnn::TensorInfo inputTensorInfo0{dimensionCount, shape0, armnn::DataType::Float32};
2855 armnn::TensorInfo inputTensorInfo1{dimensionCount, shape1, armnn::DataType::Float32};
2856 armnn::TensorInfo outputTensorInfo{dimensionCount, outShape, armnn::DataType::Float32};
2858 auto input0 = MakeTensor<float, 4>(inputTensorInfo0, values0);
2859 auto input1 = MakeTensor<float, 4>(inputTensorInfo1, values1);
2861 LayerTestResult<float,4> ret(outputTensorInfo);
2863 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
2864 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
2865 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
2867 armnn::MultiplicationQueueDescriptor data;
2868 armnn::WorkloadInfo info;
2869 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
2870 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
2871 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
2873 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
2875 inputHandle0->Allocate();
2876 inputHandle1->Allocate();
2877 outputHandle->Allocate();
2879 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
2880 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
2882 workload->PostAllocationConfigure();
2883 workload->Execute();
2885 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
2887 ret.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outValues);
2890 } // anonymous namespace
2893 LayerTestResult<float,4> MultiplicationTest(
2894 armnn::IWorkloadFactory& workloadFactory,
2895 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2897 const unsigned int width = 2;
2898 const unsigned int height = 2;
2899 const unsigned int channelCount = 2;
2900 const unsigned int batchSize = 2;
2902 unsigned int shape[] = { batchSize, channelCount, height, width };
2904 std::vector<float> input0({
2905 1, 1, 1, 1, 2, 2, 2, 2,
2906 3, 3, 3, 3, 4, 4, 4, 4 });
2908 std::vector<float> input1({
2909 2, 2, 2, 2, 3, 3, 3, 3,
2910 4, 4, 4, 4, 5, 5, 5, 5 });
2912 std::vector<float> output({
2913 2, 2, 2, 2, 6, 6, 6, 6,
2914 12, 12, 12, 12, 20, 20, 20, 20 });
2916 return MultiplicationTestHelper(workloadFactory,
2926 LayerTestResult<float, 4> MultiplicationBroadcast1ElementTest(
2927 armnn::IWorkloadFactory& workloadFactory,
2928 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2930 unsigned int shape0[] = { 1, 2, 2, 2 };
2931 std::vector<float> input0({ 1, 2, 3, 4, 5, 6, 7, 8});
2933 unsigned int shape1[] = { 1, 1, 1, 1 };
2934 std::vector<float> input1({ 2 });
2936 std::vector<float> output({ 2, 4, 6, 8, 10, 12, 14, 16});
2938 return MultiplicationTestHelper(workloadFactory,
2948 LayerTestResult<float, 4> MultiplicationBroadcast1DVectorTest(
2949 armnn::IWorkloadFactory& workloadFactory,
2950 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
2952 unsigned int shape0[] = { 1, 3, 3, 2 };
2953 std::vector<float> input0({
2955 7, 8, 9, 10, 11, 12,
2956 13, 14, 15, 16, 17, 18});
2958 unsigned int shape1[] = { 1, 1, 1, 2 };
2959 std::vector<float> input1({ 1, 2 });
2961 std::vector<float> output({
2963 7, 16, 9, 20, 11, 24,
2964 13, 28, 15, 32, 17, 36});
2966 return MultiplicationTestHelper(workloadFactory,
2976 LayerTestResult<float,4> CompareMultiplicationTest(
2977 armnn::IWorkloadFactory& workloadFactory,
2978 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
2979 armnn::IWorkloadFactory& refWorkloadFactory)
2981 const unsigned int width = 16;
2982 const unsigned int height = 32;
2983 const unsigned int channelCount = 2;
2984 const unsigned int batchSize = 5;
2986 armnn::TensorInfo inputTensorInfo0;
2987 armnn::TensorInfo inputTensorInfo1;
2988 armnn::TensorInfo outputTensorInfo;
2990 constexpr unsigned int shape[] = { batchSize, channelCount, height, width };
2992 inputTensorInfo0 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2993 inputTensorInfo1 = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2994 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
2996 LayerTestResult<float,4> comparisonResult(outputTensorInfo);
2998 auto input0 = MakeRandomTensor<float, 4>(inputTensorInfo0, 803506992);
2999 auto input1 = MakeRandomTensor<float, 4>(inputTensorInfo1, 54902257);
3001 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
3002 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
3003 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3005 std::unique_ptr<armnn::ITensorHandle> inputHandle0Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo0);
3006 std::unique_ptr<armnn::ITensorHandle> inputHandle1Ref = refWorkloadFactory.CreateTensorHandle(inputTensorInfo1);
3007 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
3009 armnn::MultiplicationQueueDescriptor data;
3010 armnn::WorkloadInfo info;
3011 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
3012 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
3013 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3015 armnn::MultiplicationQueueDescriptor refData = data;
3016 armnn::WorkloadInfo refInfo = info;
3017 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo0, inputHandle0Ref.get());
3018 SetWorkloadInput(refData, refInfo, 1, inputTensorInfo1, inputHandle1Ref.get());
3019 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
3021 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
3022 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateMultiplication(refData, refInfo);
3024 inputHandle0->Allocate();
3025 inputHandle1->Allocate();
3026 outputHandle->Allocate();
3027 inputHandle0Ref->Allocate();
3028 inputHandle1Ref->Allocate();
3029 outputHandleRef->Allocate();
3031 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
3032 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
3033 CopyDataToITensorHandle(inputHandle0Ref.get(), &input0[0][0][0][0]);
3034 CopyDataToITensorHandle(inputHandle1Ref.get(), &input1[0][0][0][0]);
3036 workload->PostAllocationConfigure();
3037 workload->Execute();
3038 workloadRef->PostAllocationConfigure();
3039 workloadRef->Execute();
3040 CopyDataFromITensorHandle(&comparisonResult.output[0][0][0][0], outputHandle.get());
3041 CopyDataFromITensorHandle(&comparisonResult.outputExpected[0][0][0][0], outputHandleRef.get());
3043 return comparisonResult;
3046 LayerTestResult<float,4> CompareBatchNormTest(
3047 armnn::IWorkloadFactory& workloadFactory,
3048 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3049 armnn::IWorkloadFactory& refWorkloadFactory)
3051 const unsigned int width = 2;
3052 const unsigned int height = 3;
3053 const unsigned int channels = 5;
3054 const unsigned int batchSize = 3;
3056 armnn::TensorInfo inputTensorInfo;
3057 armnn::TensorInfo outputTensorInfo;
3058 armnn::TensorInfo tensorInfo;
3060 constexpr unsigned int shape[] = {batchSize, channels, height, width};
3061 constexpr unsigned int tensorShape[] = {channels};
3063 inputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
3064 outputTensorInfo = armnn::TensorInfo(4, shape, armnn::DataType::Float32);
3065 tensorInfo = armnn::TensorInfo(1, tensorShape, armnn::DataType::Float32);
3067 auto input = MakeRandomTensor<float, 4>(inputTensorInfo, 21312);
3069 auto mean = MakeRandomTensor<float, 1>(tensorInfo, 123);
3070 auto variance = MakeRandomTensor<float, 1>(tensorInfo, 234, 0.0f);
3071 auto beta = MakeRandomTensor<float, 1>(tensorInfo, 123);
3072 auto gamma = MakeRandomTensor<float, 1>(tensorInfo, 345);
3074 LayerTestResult<float,4> ret(outputTensorInfo);
3076 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
3077 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3079 std::unique_ptr<armnn::ITensorHandle> inputHandleRef = refWorkloadFactory.CreateTensorHandle(inputTensorInfo);
3080 std::unique_ptr<armnn::ITensorHandle> outputHandleRef = refWorkloadFactory.CreateTensorHandle(outputTensorInfo);
3082 armnn::BatchNormalizationQueueDescriptor data;
3083 armnn::WorkloadInfo info;
3084 armnn::ScopedCpuTensorHandle meanTensor(tensorInfo);
3085 armnn::ScopedCpuTensorHandle varianceTensor(tensorInfo);
3086 armnn::ScopedCpuTensorHandle betaTensor(tensorInfo);
3087 armnn::ScopedCpuTensorHandle gammaTensor(tensorInfo);
3089 AllocateAndCopyDataToITensorHandle(&meanTensor, &mean[0]);
3090 AllocateAndCopyDataToITensorHandle(&varianceTensor, &variance[0]);
3091 AllocateAndCopyDataToITensorHandle(&betaTensor, &beta[0]);
3092 AllocateAndCopyDataToITensorHandle(&gammaTensor, &gamma[0]);
3094 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
3095 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
3096 data.m_Mean = &meanTensor;
3097 data.m_Variance = &varianceTensor;
3098 data.m_Beta = &betaTensor;
3099 data.m_Gamma = &gammaTensor;
3100 data.m_Parameters.m_Eps = 0.01f;
3102 armnn::BatchNormalizationQueueDescriptor refData = data;
3103 armnn::WorkloadInfo refInfo = info;
3104 SetWorkloadInput(refData, refInfo, 0, inputTensorInfo, inputHandleRef.get());
3105 SetWorkloadOutput(refData, refInfo, 0, outputTensorInfo, outputHandleRef.get());
3107 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateBatchNormalization(data, info);
3108 std::unique_ptr<armnn::IWorkload> workloadRef = refWorkloadFactory.CreateBatchNormalization(refData, refInfo);
3110 inputHandle->Allocate();
3111 outputHandle->Allocate();
3112 inputHandleRef->Allocate();
3113 outputHandleRef->Allocate();
3115 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
3116 CopyDataToITensorHandle(inputHandleRef.get(), &input[0][0][0][0]);
3118 workload->PostAllocationConfigure();
3119 workload->Execute();
3120 workloadRef->PostAllocationConfigure();
3121 workloadRef->Execute();
3123 CopyDataFromITensorHandle(&ret.output[0][0][0][0], outputHandle.get());
3124 CopyDataFromITensorHandle(&ret.outputExpected[0][0][0][0], outputHandleRef.get());
3129 template<typename T>
3130 void PermuteTensorData(
3131 armnn::IWorkloadFactory& workloadFactory,
3132 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3133 const armnn::PermutationVector& mappings,
3134 armnn::TensorInfo & inputTensorInfo,
3135 const T * inputData,
3136 std::vector<T>& outputData)
3138 BOOST_ASSERT_MSG(inputData != nullptr, "inputData must not be null");
3139 if (inputData == nullptr)
3141 // Nullptr is an error in the test. By returning without doing the concatenation
3142 // I expect the caller to fail the test. It still makes sense to report this as
3143 // an assert for Debug builds.
3147 armnn::TensorInfo outputTensorInfo = armnnUtils::Permuted(inputTensorInfo, mappings);
3149 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
3150 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3152 armnn::PermuteQueueDescriptor queueDescriptor;
3153 queueDescriptor.m_Parameters = armnn::PermuteDescriptor{mappings};
3154 armnn::WorkloadInfo workloadInfo;
3155 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfo, inputHandle.get());
3156 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
3158 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePermute(queueDescriptor, workloadInfo);
3160 inputHandle->Allocate();
3161 outputHandle->Allocate();
3163 CopyDataToITensorHandle(inputHandle.get(), inputData);
3165 workload->PostAllocationConfigure();
3166 workload->Execute();
3168 outputData.resize(outputTensorInfo.GetNumElements());
3169 CopyDataFromITensorHandle(&outputData[0], outputHandle.get());
3170 inputTensorInfo = outputTensorInfo;
3173 armnn::OriginsDescriptor CreateMergerDescriptorForConcatenation(
3174 const std::vector<armnn::TensorInfo> & inputTensorInfos,
3175 unsigned int concatDim)
3177 std::vector<armnn::TensorShape> shapes;
3178 shapes.reserve(inputTensorInfos.size());
3179 for (const armnn::TensorInfo& it: inputTensorInfos)
3181 shapes.push_back(it.GetShape());
3184 return armnn::CreateMergerDescriptorForConcatenation(shapes.begin(),
3190 // Concatenation is only supported for N and C dimensions for NCHW and the inner most dimension
3191 // In case of <4 dimensions we need to make sure that the concat dimensions are at least
3192 // the 3rd slowest iterating one or the inner most dimension.
3195 bool NeedPermuteForConcat(
3196 const std::vector<armnn::TensorInfo> & inputTensorInfos,
3197 unsigned int concatDim)
3199 // See note above. Additionally we expect the input shapes to have the
3200 // same number of dimensions.
3201 unsigned int nDimensions = 0;
3203 // Determine the number of dimensions as well as sanity check them
3204 // agains test implementation issues.
3205 for (auto && tensorInfo : inputTensorInfos)
3209 nDimensions = tensorInfo.GetShape().GetNumDimensions();
3213 BOOST_ASSERT_MSG(nDimensions == tensorInfo.GetShape().GetNumDimensions(),
3214 "Input shapes must have the same number of dimensions");
3218 return (nDimensions < 3 || (nDimensions == 3 && (nDimensions-concatDim) < 3 && (nDimensions-concatDim) != 1));
3221 armnn::TensorShape ExpandTensorShapeTo3dForPermute(const armnn::TensorShape & inputShape)
3223 unsigned int numDims = inputShape.GetNumDimensions();
3226 // Nothing to do if the inputShape has at least 3 dimensions.
3230 std::vector<unsigned int> newDims(size_t(3), 1u);
3231 unsigned int expandedBy = 3 - numDims;
3232 for (unsigned int i=0; i<numDims; ++i)
3234 newDims[expandedBy+i] = inputShape[i];
3236 return armnn::TensorShape(3u, &newDims[0]);
3239 void Generate3dPermuteVectorForConcat(
3240 unsigned int numDimensions,
3241 unsigned int & concatDim,
3242 std::pair<armnn::PermutationVector, armnn::PermutationVector> & permutations)
3244 BOOST_ASSERT_MSG(numDimensions <= 3,
3245 "Only dimensions 1,2 and 3 are supported by this helper");
3246 unsigned int expandedBy = 3 - numDimensions;
3247 unsigned int expandedConcatAxis = concatDim + expandedBy;
3249 if (expandedConcatAxis == 2)
3252 armnn::PermutationVector forwardPermutation({1, 2, 0});
3253 armnn::PermutationVector reversePermutation({2, 0, 1});
3254 permutations = std::make_pair(forwardPermutation, reversePermutation);
3256 else if (expandedConcatAxis == 1)
3259 armnn::PermutationVector forwardPermutation({2, 0, 1});
3260 armnn::PermutationVector reversePermutation({1, 2, 0});
3261 permutations = std::make_pair(forwardPermutation, reversePermutation);
3265 BOOST_ASSERT(expandedConcatAxis == 0);
3271 // Permute the input tensors so we can do a supported concatenation.
3272 // Also treat lower than 3d tensors as 3d by adding dummy 1 dimensions
3273 // at the front. Finally this function tells what the output shape
3274 // of the permuted concatenated tensor is going to be.
3276 template <typename T>
3277 void PermuteInputsForConcat(
3278 armnn::IWorkloadFactory& workloadFactory,
3279 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3280 std::vector<armnn::TensorInfo> & inputTensorInfos,
3281 std::vector<T *> & inputData,
3282 std::vector<std::vector<T>> & inputDataStorage,
3283 armnn::PermutationVector & permuteVector,
3284 unsigned int & concatDim,
3285 armnn::TensorInfo & outputTensorInfo)
3287 BOOST_ASSERT_MSG(inputTensorInfos.size() > 1,
3288 "Expecting more than one tensor to be concatenated here");
3290 unsigned int numDims = 0;
3291 unsigned int nthInput = 0;
3292 const armnn::PermutationVector identity({0, 1, 2});
3294 std::pair<armnn::PermutationVector, armnn::PermutationVector> permutations =
3295 std::make_pair(identity, identity);
3297 inputDataStorage.resize(inputData.size());
3299 for (auto && tensorInfo : inputTensorInfos)
3303 numDims = tensorInfo.GetShape().GetNumDimensions();
3304 Generate3dPermuteVectorForConcat(numDims, concatDim, permutations);
3306 // Store the reverese permutation.
3307 permuteVector = permutations.second;
3308 BOOST_ASSERT_MSG(!permuteVector.IsEqual(identity),
3309 "Test logic error, we don't need permutation, so we shouldn't arrive here");
3313 BOOST_ASSERT_MSG(numDims == tensorInfo.GetShape().GetNumDimensions(),
3314 "All inputs must have the same number of dimensions");
3317 armnn::TensorInfo newTensorInfo = tensorInfo;
3318 newTensorInfo.SetShape(ExpandTensorShapeTo3dForPermute(tensorInfo.GetShape()));
3320 PermuteTensorData<T>(workloadFactory,
3324 inputData[nthInput],
3325 inputDataStorage[nthInput]);
3327 inputData[nthInput] = inputDataStorage[nthInput].data();
3328 inputTensorInfos[nthInput] = newTensorInfo;
3333 outputTensorInfo.SetShape(
3334 armnnUtils::Permuted(
3335 ExpandTensorShapeTo3dForPermute(outputTensorInfo.GetShape()),
3336 permutations.first));
3341 // This is the pair of PermuteInputsForConcat(...) which permutes back
3342 // the output of the concatenation so we can check it against an expected
3345 template <typename T>
3346 void PermuteOutputForConcat(
3347 armnn::IWorkloadFactory& workloadFactory,
3348 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3349 const armnn::TensorInfo & tensorInfo,
3350 const armnn::PermutationVector & permuteVector,
3351 std::unique_ptr<armnn::ITensorHandle> && inputDataHandle,
3354 BOOST_ASSERT_MSG(data != nullptr, "data must not be null");
3355 if (data == nullptr)
3357 // Nullptr is an error in the test. By returning without doing the permutation
3358 // I expect the caller to fail the test. It still makes sense to report this as
3359 // an assert for Debug builds.
3363 armnn::TensorInfo resultTensorInfo = tensorInfo;
3364 std::vector<T> inputData(tensorInfo.GetNumElements());
3365 std::vector<T> outputData;
3367 CopyDataFromITensorHandle(&inputData[0], inputDataHandle.get());
3369 PermuteTensorData<T>(workloadFactory,
3376 ::memcpy(data, &outputData[0], sizeof(T)*outputData.size());
3379 template <typename T>
3381 armnn::IWorkloadFactory& workloadFactory,
3382 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3383 std::initializer_list<const armnn::TensorInfo> inputTensorInfosOrig,
3384 std::initializer_list<T *> inputsOrig,
3385 const armnn::TensorInfo& outputTensorInfoOrig,
3387 unsigned int concatDim,
3390 BOOST_ASSERT_MSG(output != nullptr, "output must not be null");
3391 if (output == nullptr)
3393 // Nullptr is an error in the test. By returning without doing the permutation
3394 // I expect the caller to fail the test. It still makes sense to report this as
3395 // an assert for Debug builds.
3399 // Saves a copy of the parameters which we might need to change.
3400 std::vector<armnn::TensorInfo> inputTensorInfos(inputTensorInfosOrig.begin(), inputTensorInfosOrig.end());
3401 std::vector<T *> inputs = inputsOrig;
3402 armnn::TensorInfo outputTensorInfo = outputTensorInfoOrig;
3404 armnn::PermutationVector permuteVector{0, 1, 2};
3406 // Holds and automatically releases memory for the reshaped input data.
3407 std::vector<std::vector<T>> tmpInputDataStorage;
3409 const size_t inputCount = inputTensorInfos.size();
3411 bool needPermuteForConcat = NeedPermuteForConcat(inputTensorInfos, concatDim);
3413 if (needPermuteForConcat)
3416 // We need to permute the inputs, because concatenation along
3417 // the requested axis is not supported.
3419 PermuteInputsForConcat<T>(workloadFactory,
3423 tmpInputDataStorage,
3429 armnn::WorkloadInfo workloadInfo;
3431 std::vector<std::unique_ptr<armnn::ITensorHandle>> inputHandles;
3432 inputHandles.reserve(inputCount);
3434 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3436 armnn::MergerQueueDescriptor queueDescriptor;
3437 armnn::OriginsDescriptor viewsDescriptor = CreateMergerDescriptorForConcatenation(inputTensorInfos, concatDim);
3438 queueDescriptor.m_Parameters = viewsDescriptor;
3442 queueDescriptor.m_ViewOrigins.reserve(viewsDescriptor.GetNumViews());
3443 for (unsigned int i = 0; i < viewsDescriptor.GetNumViews(); ++i)
3445 queueDescriptor.m_ViewOrigins.emplace_back(std::vector<unsigned int>(viewsDescriptor.GetViewOrigin(i),
3446 viewsDescriptor.GetViewOrigin(i) + viewsDescriptor.GetNumDimensions()));
3449 outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
3451 const bool subTensorsSupported = workloadFactory.SupportsSubTensors();
3452 for (unsigned int i = 0; i < inputCount; ++i)
3454 const armnn::TensorInfo& inputTensorInfo = inputTensorInfos[i];
3455 std::unique_ptr<armnn::ITensorHandle> inputHandle =
3456 subTensorsSupported ?
3457 workloadFactory.CreateSubTensorHandle(*outputHandle,
3458 inputTensorInfo.GetShape(),
3459 queueDescriptor.m_ViewOrigins[i].m_Origin.data()) :
3460 workloadFactory.CreateTensorHandle(inputTensorInfo);
3462 inputHandles.emplace_back(std::move(inputHandle));
3468 for (unsigned int i = 0; i < inputCount; ++i)
3470 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfos[i]);
3471 inputHandles.emplace_back(std::move(inputHandle));
3475 for (unsigned int i = 0; i < inputCount; ++i)
3477 AddInputToWorkload(queueDescriptor, workloadInfo, inputTensorInfos[i], inputHandles[i].get());
3480 AddOutputToWorkload(queueDescriptor, workloadInfo, outputTensorInfo, outputHandle.get());
3482 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMerger(queueDescriptor, workloadInfo);
3484 for (auto& inputHandle : inputHandles)
3486 inputHandle->Allocate();
3489 outputHandle->Allocate();
3491 unsigned int nextInputId = 0;
3492 for (auto& inputHandle : inputHandles)
3494 CopyDataToITensorHandle(inputHandle.get(), inputs[nextInputId]);
3498 workload->PostAllocationConfigure();
3499 workload->Execute();
3501 if (needPermuteForConcat)
3503 PermuteOutputForConcat<T>(workloadFactory,
3507 std::move(outputHandle),
3512 CopyDataFromITensorHandle(output, outputHandle.get());
3516 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3517 LayerTestResult<T, 1> Concatenation1dTestImpl(
3518 armnn::IWorkloadFactory& workloadFactory,
3519 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3523 armnn::TensorInfo inputTensorInfo({ 3 }, ArmnnType);
3525 auto input0 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 1.0f, 2.0f, 3.0f }));
3526 auto input1 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 4.0f, 5.0f, 6.0f }));
3527 auto input2 = MakeTensor<T, 1>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, { 7.0f, 8.0f, 9.0f }));
3529 armnn::TensorInfo outputTensorInfo({ 9 }, ArmnnType);
3531 LayerTestResult<T, 1> result(outputTensorInfo);
3533 std::vector<T> output;
3534 output.resize(outputTensorInfo.GetNumElements());
3535 Concatenate<T>(workloadFactory, memoryManager,
3536 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
3537 { input0.data(), input1.data(), input2.data() },
3543 result.output = MakeTensor<T, 1>(outputTensorInfo, output);
3544 result.outputExpected = MakeTensor<T, 1>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3545 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f
3551 LayerTestResult<float, 1> Concatenation1dTest(
3552 armnn::IWorkloadFactory& workloadFactory,
3553 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3555 return Concatenation1dTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
3558 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3559 LayerTestResult<T, 2> Concatenation2dTestImpl(
3560 armnn::IWorkloadFactory& workloadFactory,
3561 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3562 const armnn::TensorInfo& outputTensorInfo,
3563 unsigned int dimension,
3565 const int32_t qOffset)
3567 armnn::TensorInfo inputTensorInfo({ 2, 3 }, ArmnnType);
3569 auto input0 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3574 10.0f, 11.0f, 12.0f,
3577 auto input1 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3582 13.0f, 14.0f, 15.0f,
3585 auto input2 = MakeTensor<T, 2>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3590 16.0f, 17.0f, 18.0f,
3593 LayerTestResult<T, 2> result(outputTensorInfo);
3595 std::vector<T> output;
3596 output.resize(outputTensorInfo.GetNumElements());
3597 Concatenate<T>(workloadFactory, memoryManager,
3598 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
3599 { input0.data(), input1.data(), input2.data() },
3605 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
3609 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3610 LayerTestResult<T, 2> Concatenation2dDim0TestImpl(
3611 armnn::IWorkloadFactory& workloadFactory,
3612 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3616 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType);
3618 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
3619 workloadFactory, memoryManager, outputTensorInfo, 0, qScale, qOffset);
3621 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3626 10.0f, 11.0f, 12.0f,
3632 13.0f, 14.0f, 15.0f,
3638 16.0f, 17.0f, 18.0f,
3644 LayerTestResult<float, 2> Concatenation2dDim0Test(
3645 armnn::IWorkloadFactory& workloadFactory,
3646 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3648 return Concatenation2dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
3651 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3652 LayerTestResult<T, 2> Concatenation2dDim1TestImpl(
3653 armnn::IWorkloadFactory& workloadFactory,
3654 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3658 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType);
3660 LayerTestResult<T, 2> result = Concatenation2dTestImpl<ArmnnType>(
3661 workloadFactory, memoryManager, outputTensorInfo, 1, qScale, qOffset);
3663 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3665 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
3668 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f
3674 LayerTestResult<float, 2> Concatenation2dDim1Test(
3675 armnn::IWorkloadFactory& workloadFactory,
3676 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3678 return Concatenation2dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
3681 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3682 LayerTestResult<T, 2> Concatenation2dDim0DiffInputDimsTestImpl(
3683 armnn::IWorkloadFactory& workloadFactory,
3684 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3688 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType);
3689 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3694 10.0f, 11.0f, 12.0f,
3697 armnn::TensorInfo input1TensorInfo({ 3, 3 }, ArmnnType);
3698 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3703 13.0f, 14.0f, 15.0f,
3709 armnn::TensorInfo input2TensorInfo({ 1, 3 }, ArmnnType);
3710 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3712 16.0f, 17.0f, 18.0f,
3715 armnn::TensorInfo outputTensorInfo({ 6, 3 }, ArmnnType);
3716 LayerTestResult<T, 2> result(outputTensorInfo);
3718 std::vector<T> output;
3719 output.resize(outputTensorInfo.GetNumElements());
3720 Concatenate<T>(workloadFactory, memoryManager,
3721 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
3722 { input0.data(), input1.data(), input2.data() },
3728 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
3729 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3734 10.0f, 11.0f, 12.0f,
3740 13.0f, 14.0f, 15.0f,
3746 16.0f, 17.0f, 18.0f,
3752 LayerTestResult<float, 2> Concatenation2dDim0DiffInputDimsTest(
3753 armnn::IWorkloadFactory& workloadFactory,
3754 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3756 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
3757 workloadFactory, memoryManager, 0.0f, 0);
3760 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3761 LayerTestResult<T, 2> Concatenation2dDim1DiffInputDimsTestImpl(
3762 armnn::IWorkloadFactory& workloadFactory,
3763 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3767 armnn::TensorInfo input0TensorInfo({ 2, 3 }, ArmnnType);
3768 auto input0 = MakeTensor<T, 2>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3773 10.0f, 11.0f, 12.0f,
3776 armnn::TensorInfo input1TensorInfo({ 2, 5 }, ArmnnType);
3777 auto input1 = MakeTensor<T, 2>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3779 4.0f, 5.0f, 6.0f, 7.0f, 8.0f,
3782 13.0f, 14.0f, 15.0f, 16.0f, 17.0f,
3785 armnn::TensorInfo input2TensorInfo({ 2, 1 }, ArmnnType);
3786 auto input2 = MakeTensor<T, 2>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
3794 armnn::TensorInfo outputTensorInfo({ 2, 9 }, ArmnnType);
3795 LayerTestResult<T, 2> result(outputTensorInfo);
3797 std::vector<T> output;
3798 output.resize(outputTensorInfo.GetNumElements());
3799 Concatenate<T>(workloadFactory, memoryManager,
3800 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
3801 { input0.data(), input1.data(), input2.data() },
3807 result.output = MakeTensor<T, 2>(outputTensorInfo, output);
3808 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3810 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f,
3813 10.0f, 11.0f, 12.0f, 13.0f, 14.0f, 15.0f, 16.0f, 17.0f, 18.0f,
3819 LayerTestResult<float, 2> Concatenation2dDim1DiffInputDimsTest(
3820 armnn::IWorkloadFactory& workloadFactory,
3821 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3823 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
3824 workloadFactory, memoryManager, 0.0f, 0);
3827 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3828 LayerTestResult<T, 3> Concatenation3dTestImpl(
3829 armnn::IWorkloadFactory& workloadFactory,
3830 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3831 const armnn::TensorInfo& outputTensorInfo,
3832 unsigned int dimension,
3837 armnn::TensorInfo inputTensorInfo({ 2, 3, 2 }, ArmnnType);
3839 auto input0 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3840 // Batch 0, Channel 0
3843 // Batch 0, Channel 1
3846 // Batch 0, Channel 2
3849 // Batch 1, Channel 0
3852 // Batch 1, Channel 1
3855 // Batch 1, Channel 2
3859 auto input1 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3860 // Batch 0, Channel 0
3863 // Batch 0, Channel 1
3866 // Batch 0, Channel 2
3869 // Batch 1, Channel 0
3872 // Batch 1, Channel 1
3875 // Batch 1, Channel 2
3879 auto input2 = MakeTensor<T, 3>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3880 // Batch 0, Channel 0
3883 // Batch 0, Channel 1
3886 // Batch 0, Channel 2
3889 // Batch 1, Channel 0
3892 // Batch 1, Channel 1
3895 // Batch 1, Channel 2
3899 LayerTestResult<T, 3> result(outputTensorInfo);
3901 std::vector<T> output;
3902 output.resize(outputTensorInfo.GetNumElements());
3903 Concatenate<T>(workloadFactory, memoryManager,
3904 { inputTensorInfo, inputTensorInfo, inputTensorInfo },
3905 { input0.data(), input1.data(), input2.data() },
3911 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
3915 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3916 LayerTestResult<T, 3> Concatenation3dDim0TestImpl(
3917 armnn::IWorkloadFactory& workloadFactory,
3918 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
3922 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
3924 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
3925 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
3927 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
3928 // Batch 0, Channel 0
3931 // Batch 0, Channel 1
3934 // Batch 0, Channel 2
3937 // Batch 1, Channel 0
3940 // Batch 1, Channel 1
3943 // Batch 1, Channel 2
3946 // Batch 2, Channel 0
3949 // Batch 2, Channel 1
3952 // Batch 2, Channel 2
3955 // Batch 3, Channel 0
3958 // Batch 3, Channel 1
3961 // Batch 3, Channel 2
3964 // Batch 4, Channel 0
3967 // Batch 4, Channel 1
3970 // Batch 4, Channel 2
3973 // Batch 5, Channel 0
3976 // Batch 5, Channel 1
3979 // Batch 5, Channel 2
3986 LayerTestResult<float, 3> Concatenation3dDim0Test(
3987 armnn::IWorkloadFactory& workloadFactory,
3988 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
3990 return Concatenation3dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
3993 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
3994 LayerTestResult<T, 3> Concatenation3dDim1TestImpl(
3995 armnn::IWorkloadFactory& workloadFactory,
3996 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4000 armnn::TensorInfo outputTensorInfo({ 2, 9, 2 }, ArmnnType);
4002 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
4003 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
4005 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4006 // Batch 0, Channel 0
4009 // Batch 0, Channel 1
4012 // Batch 0, Channel 2
4015 // Batch 0, Channel 3
4018 // Batch 0, Channel 4
4021 // Batch 0, Channel 5
4024 // Batch 0, Channel 6
4027 // Batch 0, Channel 7
4030 // Batch 0, Channel 8
4033 // Batch 1, Channel 0
4036 // Batch 1, Channel 1
4039 // Batch 1, Channel 2
4042 // Batch 1, Channel 3
4045 // Batch 1, Channel 4
4048 // Batch 1, Channel 5
4051 // Batch 1, Channel 6
4054 // Batch 1, Channel 7
4057 // Batch 1, Channel 8
4064 LayerTestResult<float, 3> Concatenation3dDim1Test(
4065 armnn::IWorkloadFactory& workloadFactory,
4066 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4068 return Concatenation3dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4071 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4072 LayerTestResult<T, 3> Concatenation3dDim2TestImpl(
4073 armnn::IWorkloadFactory& workloadFactory,
4074 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4079 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType);
4081 LayerTestResult<T, 3> result = Concatenation3dTestImpl<ArmnnType>(
4082 workloadFactory, memoryManager, outputTensorInfo, 2, useSubtensor, qScale, qOffset);
4084 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4085 // Batch 0, Channel 0
4086 1.0f, 2.0f, 7.0f, 8.0f, 13.0f, 14.0f,
4088 // Batch 0, Channel 1
4089 3.0f, 4.0f, 9.0f, 10.0f, 15.0f, 16.0f,
4091 // Batch 0, Channel 2
4092 5.0f, 6.0f, 11.0f, 12.0f, 17.0f, 18.0f,
4094 // Batch 1, Channel 0
4095 19.0f, 20.0f, 25.0f, 26.0f, 31.0f, 32.0f,
4097 // Batch 1, Channel 1
4098 21.0f, 22.0f, 27.0f, 28.0f, 33.0f, 34.0f,
4100 // Batch 1, Channel 2
4101 23.0f, 24.0f, 29.0f, 30.0f, 35.0f, 36.0f,
4107 LayerTestResult<float, 3> Concatenation3dDim2Test(
4108 armnn::IWorkloadFactory& workloadFactory,
4109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4112 return Concatenation3dDim2TestImpl<armnn::DataType::Float32>(
4113 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
4116 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4117 LayerTestResult<T, 3> Concatenation3dDim0DiffInputDimsTestImpl(
4118 armnn::IWorkloadFactory& workloadFactory,
4119 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4123 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
4124 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4125 // Batch 0, Channel 0
4128 // Batch 0, Channel 1
4131 // Batch 0, Channel 2
4134 // Batch 1, Channel 0
4137 // Batch 1, Channel 1
4140 // Batch 1, Channel 2
4144 armnn::TensorInfo input1TensorInfo({ 1, 3, 2 }, ArmnnType);
4145 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4146 // Batch 0, Channel 0
4149 // Batch 0, Channel 1
4152 // Batch 0, Channel 2
4156 armnn::TensorInfo input2TensorInfo({ 3, 3, 2 }, ArmnnType);
4157 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4158 // Batch 0, Channel 0
4161 // Batch 0, Channel 1
4164 // Batch 0, Channel 2
4167 // Batch 1, Channel 0
4170 // Batch 1, Channel 1
4173 // Batch 1, Channel 2
4176 // Batch 2, Channel 0
4179 // Batch 2, Channel 1
4182 // Batch 2, Channel 2
4186 armnn::TensorInfo outputTensorInfo({ 6, 3, 2 }, ArmnnType);
4187 LayerTestResult<T, 3> result(outputTensorInfo);
4189 std::vector<T> output;
4190 output.resize(outputTensorInfo.GetNumElements());
4191 Concatenate<T>(workloadFactory, memoryManager,
4192 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
4193 { input0.data(), input1.data(), input2.data() },
4199 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
4200 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4201 // Batch 0, Channel 0
4204 // Batch 0, Channel 1
4207 // Batch 0, Channel 2
4210 // Batch 1, Channel 0
4213 // Batch 1, Channel 1
4216 // Batch 1, Channel 2
4219 // Batch 2, Channel 0
4222 // Batch 2, Channel 1
4225 // Batch 2, Channel 2
4228 // Batch 3, Channel 0
4231 // Batch 3, Channel 1
4234 // Batch 3, Channel 2
4237 // Batch 4, Channel 0
4240 // Batch 4, Channel 1
4243 // Batch 4, Channel 2
4246 // Batch 5, Channel 0
4249 // Batch 5, Channel 1
4252 // Batch 5, Channel 2
4259 LayerTestResult<float, 3> Concatenation3dDim0DiffInputDimsTest(
4260 armnn::IWorkloadFactory& workloadFactory,
4261 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4263 return Concatenation3dDim0DiffInputDimsTestImpl<armnn::DataType::Float32>(
4264 workloadFactory, memoryManager, 0.0f, 0);
4267 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4268 LayerTestResult<T, 3> Concatenation3dDim1DiffInputDimsTestImpl(
4269 armnn::IWorkloadFactory& workloadFactory,
4270 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4274 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
4275 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4276 // Batch 0, Channel 0
4279 // Batch 0, Channel 1
4282 // Batch 0, Channel 2
4285 // Batch 1, Channel 0
4288 // Batch 1, Channel 1
4291 // Batch 1, Channel 2
4295 armnn::TensorInfo input1TensorInfo({ 2, 4, 2 }, ArmnnType);
4296 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4297 // Batch 0, Channel 0
4300 // Batch 0, Channel 1
4303 // Batch 0, Channel 2
4306 // Batch 0, Channel 3
4309 // Batch 1, Channel 0
4312 // Batch 1, Channel 1
4315 // Batch 1, Channel 2
4318 // Batch 1, Channel 3
4322 armnn::TensorInfo input2TensorInfo({ 2, 1, 2 }, ArmnnType);
4323 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4324 // Batch 0, Channel 0
4327 // Batch 1, Channel 0
4331 armnn::TensorInfo outputTensorInfo({ 2, 8, 2 }, ArmnnType);
4332 LayerTestResult<T, 3> result(outputTensorInfo);
4334 std::vector<T> output;
4335 output.resize(outputTensorInfo.GetNumElements());
4336 Concatenate<T>(workloadFactory, memoryManager,
4337 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
4338 { input0.data(), input1.data(), input2.data() },
4344 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
4345 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4346 // Batch 0, Channel 0
4349 // Batch 0, Channel 1
4352 // Batch 0, Channel 2
4355 // Batch 0, Channel 3
4358 // Batch 0, Channel 4
4361 // Batch 0, Channel 5
4364 // Batch 0, Channel 6
4367 // Batch 0, Channel 7
4370 // Batch 1, Channel 0
4373 // Batch 1, Channel 1
4376 // Batch 1, Channel 2
4379 // Batch 1, Channel 3
4382 // Batch 1, Channel 4
4385 // Batch 1, Channel 5
4388 // Batch 1, Channel 6
4391 // Batch 1, Channel 7
4398 LayerTestResult<float, 3> Concatenation3dDim1DiffInputDimsTest(
4399 armnn::IWorkloadFactory& workloadFactory,
4400 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4402 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::Float32>(
4403 workloadFactory, memoryManager, 0.0f, 0);
4406 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4407 LayerTestResult<T, 3> Concatenation3dDim2DiffInputDimsTestImpl(
4408 armnn::IWorkloadFactory& workloadFactory,
4409 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4414 armnn::TensorInfo input0TensorInfo({ 2, 3, 2 }, ArmnnType);
4415 auto input0 = MakeTensor<T, 3>(input0TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4416 // Batch 0, Channel 0
4419 // Batch 0, Channel 1
4422 // Batch 0, Channel 2
4425 // Batch 1, Channel 0
4428 // Batch 1, Channel 1
4431 // Batch 1, Channel 2
4435 armnn::TensorInfo input1TensorInfo({ 2, 3, 1 }, ArmnnType);
4436 auto input1 = MakeTensor<T, 3>(input1TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4437 // Batch 0, Channel 0
4440 // Batch 0, Channel 1
4443 // Batch 0, Channel 2
4446 // Batch 1, Channel 0
4449 // Batch 1, Channel 1
4452 // Batch 1, Channel 2
4456 armnn::TensorInfo input2TensorInfo({ 2, 3, 3 }, ArmnnType);
4457 auto input2 = MakeTensor<T, 3>(input2TensorInfo, QuantizedVector<T>(qScale, qOffset, {
4458 // Batch 0, Channel 0
4459 13.0f, 14.0f, 50.0f,
4461 // Batch 0, Channel 1
4462 15.0f, 16.0f, 51.0f,
4464 // Batch 0, Channel 2
4465 17.0f, 18.0f, 52.0f,
4467 // Batch 1, Channel 0
4468 31.0f, 32.0f, 53.0f,
4470 // Batch 1, Channel 1
4471 33.0f, 34.0f, 54.0f,
4473 // Batch 1, Channel 2
4474 35.0f, 36.0f, 55.0f,
4477 armnn::TensorInfo outputTensorInfo({ 2, 3, 6 }, ArmnnType);
4478 LayerTestResult<T, 3> result(outputTensorInfo);
4480 std::vector<T> output;
4481 output.resize(outputTensorInfo.GetNumElements());
4482 Concatenate<T>(workloadFactory, memoryManager,
4483 { input0TensorInfo, input1TensorInfo, input2TensorInfo },
4484 { input0.data(), input1.data(), input2.data() },
4490 result.output = MakeTensor<T, 3>(outputTensorInfo, output);
4491 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4492 // Batch 0, Channel 0
4493 1.0f, 2.0f, 7.0f, 13.0f, 14.0f, 50.0f,
4495 // Batch 0, Channel 1
4496 3.0f, 4.0f, 9.0f, 15.0f, 16.0f, 51.0f,
4498 // Batch 0, Channel 2
4499 5.0f, 6.0f, 11.0f, 17.0f, 18.0f, 52.0f,
4501 // Batch 1, Channel 0
4502 19.0f, 20.0f, 25.0f, 31.0f, 32.0f, 53.0f,
4504 // Batch 1, Channel 1
4505 21.0f, 22.0f, 27.0f, 33.0f, 34.0f, 54.0f,
4507 // Batch 1, Channel 2
4508 23.0f, 24.0f, 29.0f, 35.0f, 36.0f, 55.0f,
4514 LayerTestResult<float, 3> Concatenation3dDim2DiffInputDimsTest(
4515 armnn::IWorkloadFactory& workloadFactory,
4516 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4519 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::Float32>(
4520 workloadFactory, memoryManager, useSubtensor, 0.0f, 0);
4523 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4524 LayerTestResult<T, 4> Concatenation4dTestImpl(
4525 armnn::IWorkloadFactory& workloadFactory,
4526 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4527 const armnn::TensorInfo& outputTensorInfo,
4528 unsigned int dimension,
4533 armnn::TensorInfo inputTensorInfo({ 1, 3, 2, 2 }, ArmnnType);
4535 auto input0 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4544 auto input1 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4553 auto input2 = MakeTensor<T, 4>(inputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4562 LayerTestResult<T, 4> result(outputTensorInfo);
4564 std::vector<T> output;
4565 output.resize(outputTensorInfo.GetNumElements());
4567 Concatenate<T>(workloadFactory,
4569 {inputTensorInfo, inputTensorInfo, inputTensorInfo},
4570 {input0.data(), input1.data(), input2.data()},
4576 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
4580 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4581 LayerTestResult<T, 4> Concatenation4dDim0TestImpl(
4582 armnn::IWorkloadFactory& workloadFactory,
4583 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4587 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType);
4589 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
4590 workloadFactory, memoryManager, outputTensorInfo, 0, true, qScale, qOffset);
4592 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4617 LayerTestResult<float, 4> Concatenation4dDim0Test(
4618 armnn::IWorkloadFactory& workloadFactory,
4619 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4621 return Concatenation4dDim0TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4624 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4625 LayerTestResult<T, 4> Concatenation4dDim1TestImpl(
4626 armnn::IWorkloadFactory& workloadFactory,
4627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4631 armnn::TensorInfo outputTensorInfo({ 1, 9, 2, 2 }, ArmnnType);
4633 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
4634 workloadFactory, memoryManager, outputTensorInfo, 1, true, qScale, qOffset);
4636 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4662 LayerTestResult<float, 4> Concatenation4dDim1Test(
4663 armnn::IWorkloadFactory& workloadFactory,
4664 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4666 return Concatenation4dDim1TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4669 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4670 LayerTestResult<T, 4> Concatenation4dDim2TestImpl(
4671 armnn::IWorkloadFactory& workloadFactory,
4672 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4676 armnn::TensorInfo outputTensorInfo({ 1, 3, 6, 2 }, ArmnnType);
4678 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
4679 workloadFactory, memoryManager, outputTensorInfo, 2, true, qScale, qOffset);
4681 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4707 LayerTestResult<float, 4> Concatenation4dDim2Test(
4708 armnn::IWorkloadFactory& workloadFactory,
4709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4711 return Concatenation4dDim2TestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
4714 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4715 LayerTestResult<T, 4> Concatenation4dDim3TestImpl(
4716 armnn::IWorkloadFactory& workloadFactory,
4717 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4722 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 6 }, ArmnnType);
4724 LayerTestResult<T, 4> result = Concatenation4dTestImpl<ArmnnType>(
4725 workloadFactory, memoryManager, outputTensorInfo, 3, useSubtensor, qScale, qOffset);
4727 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4753 LayerTestResult<float, 4> Concatenation4dDim3Test(
4754 armnn::IWorkloadFactory& workloadFactory,
4755 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4758 return Concatenation4dDim3TestImpl<armnn::DataType::Float32>(
4759 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
4762 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4763 LayerTestResult<T, 4> Concatenation4dDiffShapeDim0TestImpl(
4764 armnn::IWorkloadFactory& workloadFactory,
4765 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4769 unsigned int dimension = 0;
4770 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType);
4772 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
4781 armnn::TensorInfo inputTensorInfo1({ 2, 3, 2, 2 }, ArmnnType);
4783 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
4800 armnn::TensorInfo outputTensorInfo({ 3, 3, 2, 2 }, ArmnnType);
4802 LayerTestResult<T, 4> result(outputTensorInfo);
4804 std::vector<T> output;
4805 output.resize(outputTensorInfo.GetNumElements());
4806 Concatenate<T>(workloadFactory,
4808 {inputTensorInfo0, inputTensorInfo1},
4809 {input0.data(), input1.data()},
4815 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
4816 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4842 LayerTestResult<float, 4> Concatenation4dDiffShapeDim0Test(
4843 armnn::IWorkloadFactory& workloadFactory,
4844 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4846 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::Float32>(
4847 workloadFactory, memoryManager, 0.0f, 0);
4850 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4851 LayerTestResult<T, 4> Concatenation4dDiffShapeDim1TestImpl(
4852 armnn::IWorkloadFactory& workloadFactory,
4853 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4857 unsigned int dimension = 1;
4858 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType);
4860 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
4869 armnn::TensorInfo inputTensorInfo1({ 1, 2, 2, 2 }, ArmnnType);
4871 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
4879 armnn::TensorInfo outputTensorInfo({ 1, 5, 2, 2 }, ArmnnType);
4881 LayerTestResult<T, 4> result(outputTensorInfo);
4883 std::vector<T> output;
4884 output.resize(outputTensorInfo.GetNumElements());
4885 Concatenate<T>(workloadFactory,
4887 {inputTensorInfo0, inputTensorInfo1},
4888 {input0.data(), input1.data()},
4894 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
4895 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4911 LayerTestResult<float, 4> Concatenation4dDiffShapeDim1Test(
4912 armnn::IWorkloadFactory& workloadFactory,
4913 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4915 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::Float32>(
4916 workloadFactory, memoryManager, 0.0f, 0);
4919 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
4920 LayerTestResult<T, 4> Concatenation4dDiffShapeDim2TestImpl(
4921 armnn::IWorkloadFactory& workloadFactory,
4922 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
4926 unsigned int dimension = 2;
4927 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType);
4929 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
4938 armnn::TensorInfo inputTensorInfo1({ 1, 3, 3, 2 }, ArmnnType);
4940 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
4952 armnn::TensorInfo outputTensorInfo({ 1, 3, 5, 2 }, ArmnnType);
4954 LayerTestResult<T, 4> result(outputTensorInfo);
4956 std::vector<T> output;
4957 output.resize(outputTensorInfo.GetNumElements());
4958 Concatenate<T>(workloadFactory,
4960 {inputTensorInfo0, inputTensorInfo1},
4961 {input0.data(), input1.data()},
4967 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
4968 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
4991 LayerTestResult<float, 4> Concatenation4dDiffShapeDim2Test(
4992 armnn::IWorkloadFactory& workloadFactory,
4993 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
4995 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::Float32>(
4996 workloadFactory, memoryManager, 0.0f, 0);
4999 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5000 LayerTestResult<T, 4> Concatenation4dDiffShapeDim3TestImpl(
5001 armnn::IWorkloadFactory& workloadFactory,
5002 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5007 unsigned int dimension = 3;
5008 armnn::TensorInfo inputTensorInfo0({ 1, 3, 2, 2 }, ArmnnType);
5010 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, QuantizedVector<T>(qScale, qOffset, {
5019 armnn::TensorInfo inputTensorInfo1({ 1, 3, 2, 3 }, ArmnnType);
5021 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, QuantizedVector<T>(qScale, qOffset, {
5022 11.0f, 12.0f, 13.0f,
5023 14.0f, 15.0f, 16.0f,
5025 17.0f, 18.0f, 19.0f,
5026 20.0f, 21.0f, 22.0f,
5028 23.0f, 24.0f, 25.0f,
5032 armnn::TensorInfo outputTensorInfo({ 1, 3, 2, 5 }, ArmnnType);
5034 LayerTestResult<T, 4> result(outputTensorInfo);
5036 std::vector<T> output;
5037 output.resize(outputTensorInfo.GetNumElements());
5038 Concatenate<T>(workloadFactory,
5040 {inputTensorInfo0, inputTensorInfo1},
5041 {input0.data(), input1.data()},
5047 result.output = MakeTensor<T, 4>(outputTensorInfo, output);
5048 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, QuantizedVector<T>(qScale, qOffset, {
5049 1.0f, 2.0f, 11.0f, 12.0f, 13.0f,
5050 3.0f, 4.0f, 14.0f, 15.0f, 16.0f,
5051 5.0f, 6.0f, 17.0f, 18.0f, 19.0f,
5052 7.0f, 8.0f, 20.0f, 21.0f, 22.0f,
5053 9.0f, 10.0f, 23.0f, 24.0f, 25.0f,
5054 11.0f, 12.0f, 26.0f, 27.0f, 28.0f
5060 LayerTestResult<float, 4> Concatenation4dDiffShapeDim3Test(
5061 armnn::IWorkloadFactory& workloadFactory,
5062 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5065 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::Float32>(
5066 workloadFactory, memoryManager, 0.0f, 0, useSubtensor);
5069 LayerTestResult<float, 4> ResizeBilinearNopTest(
5070 armnn::IWorkloadFactory& workloadFactory,
5071 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5072 const armnn::DataLayout dataLayout)
5074 const armnn::TensorInfo inputTensorInfo =
5075 armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, armnn::DataType::Float32);
5077 const armnn::TensorInfo outputTensorInfo =
5078 armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, armnn::DataType::Float32);
5080 std::vector<float> inputData({
5081 1.0f, 2.0f, 3.0f, 4.0f,
5082 2.0f, 3.0f, 4.0f, 5.0f,
5083 3.0f, 4.0f, 5.0f, 6.0f,
5084 4.0f, 5.0f, 6.0f, 7.0f,
5086 1.0f, 2.0f, 3.0f, 4.0f,
5087 2.0f, 3.0f, 4.0f, 5.0f,
5088 3.0f, 4.0f, 5.0f, 6.0f,
5089 4.0f, 5.0f, 6.0f, 7.0f
5092 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5093 if (dataLayout == armnn::DataLayout::NHWC)
5095 std::vector<float> tmp(inputData.size());
5096 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5100 auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
5102 LayerTestResult<float, 4> result(outputTensorInfo);
5103 result.outputExpected = input;
5105 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5106 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5108 armnn::ResizeBilinearQueueDescriptor descriptor;
5109 descriptor.m_Parameters.m_DataLayout = dataLayout;
5110 armnn::WorkloadInfo info;
5111 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5112 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5114 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
5116 inputHandle->Allocate();
5117 outputHandle->Allocate();
5118 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
5120 workload->PostAllocationConfigure();
5121 workload->Execute();
5123 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5127 LayerTestResult<float, 4> SimpleResizeBilinearTest(
5128 armnn::IWorkloadFactory& workloadFactory,
5129 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5130 const armnn::DataLayout dataLayout)
5132 const armnn::TensorInfo inputTensorInfo =
5133 armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, armnn::DataType::Float32);
5135 const armnn::TensorInfo outputTensorInfo =
5136 armnnUtils::GetTensorInfo(1, 2, 1, 1, dataLayout, armnn::DataType::Float32);
5138 std::vector<float> inputData({
5146 // The 'resize bilinear' operation projects the top-left corner of output texels into the input image,
5147 // then figures out the interpolants and weights. Note this is different to projecting the centre of the
5148 // output texel. Thus, for a input matrix of 2x2, we'll expect the output 1x1 matrix to contain, as
5149 // its single element, the value that was at position (0,0) of the input matrix (rather than an average,
5150 // which we would expect if projecting the centre).
5152 std::vector<float> outputData({
5158 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5159 if (dataLayout == armnn::DataLayout::NHWC)
5161 std::vector<float> tmp(inputData.size());
5162 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5165 std::vector<float> tmp1(outputData.size());
5166 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(float));
5170 auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
5172 LayerTestResult<float, 4> result(outputTensorInfo);
5173 result.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outputData);
5175 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5176 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5178 armnn::ResizeBilinearQueueDescriptor descriptor;
5179 descriptor.m_Parameters.m_DataLayout = dataLayout;
5180 armnn::WorkloadInfo info;
5181 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5182 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5184 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
5186 inputHandle->Allocate();
5187 outputHandle->Allocate();
5188 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
5190 workload->PostAllocationConfigure();
5191 workload->Execute();
5193 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5197 LayerTestResult<float, 4> ResizeBilinearSqMinTest(
5198 armnn::IWorkloadFactory& workloadFactory,
5199 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5200 const armnn::DataLayout dataLayout)
5202 const armnn::TensorInfo inputTensorInfo =
5203 armnnUtils::GetTensorInfo(1, 2, 4, 4, dataLayout, armnn::DataType::Float32);
5205 const armnn::TensorInfo outputTensorInfo =
5206 armnnUtils::GetTensorInfo(1, 2, 2, 2, dataLayout, armnn::DataType::Float32);
5208 std::vector<float> inputData({
5209 1.0f, 2.0f, 3.0f, 4.0f,
5210 2.0f, 3.0f, 4.0f, 5.0f,
5211 3.0f, 4.0f, 5.0f, 6.0f,
5212 4.0f, 5.0f, 6.0f, 7.0f,
5214 7.0f, 6.0f, 5.0f, 4.0f,
5215 6.0f, 5.0f, 4.0f, 3.0f,
5216 5.0f, 4.0f, 3.0f, 2.0f,
5217 4.0f, 3.0f, 2.0f, 1.0f
5220 std::vector<float> outputData({
5228 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5229 if (dataLayout == armnn::DataLayout::NHWC)
5231 std::vector<float> tmp(inputData.size());
5232 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5235 std::vector<float> tmp1(outputData.size());
5236 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(float));
5240 auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
5242 LayerTestResult<float, 4> result(outputTensorInfo);
5243 result.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outputData);
5245 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5246 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5248 armnn::ResizeBilinearQueueDescriptor descriptor;
5249 descriptor.m_Parameters.m_DataLayout = dataLayout;
5250 armnn::WorkloadInfo info;
5251 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5252 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5254 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
5256 inputHandle->Allocate();
5257 outputHandle->Allocate();
5258 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
5260 workload->PostAllocationConfigure();
5261 workload->Execute();
5263 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5267 LayerTestResult<float, 4> ResizeBilinearMinTest(
5268 armnn::IWorkloadFactory& workloadFactory,
5269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5270 const armnn::DataLayout dataLayout)
5272 const armnn::TensorInfo inputTensorInfo =
5273 armnnUtils::GetTensorInfo(1, 2, 3, 5, dataLayout, armnn::DataType::Float32);
5275 const armnn::TensorInfo outputTensorInfo =
5276 armnnUtils::GetTensorInfo(1, 2, 2, 3, dataLayout, armnn::DataType::Float32);
5278 std::vector<float> inputData({
5279 1.0f, 2.0f, 3.0f, 5.0f, 8.0f,
5280 13.0f, 21.0f, 34.0f, 55.0f, 89.0f,
5281 144.0f, 233.0f, 377.0f, 610.0f, 987.0f,
5283 987.0f, 610.0f, 377.0f, 233.0f, 144.0f,
5284 89.0f, 55.0f, 34.0f, 21.0f, 13.0f,
5285 8.0f, 5.0f, 3.0f, 2.0f, 1.0f
5288 std::vector<float> outputData({
5289 1.0f, 2.6666f, 6.00f,
5290 78.5f, 179.3333f, 401.00f,
5292 987.0f, 454.6670f, 203.33f,
5293 48.5f, 22.3333f, 10.00f
5296 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5297 if (dataLayout == armnn::DataLayout::NHWC)
5299 std::vector<float> tmp(inputData.size());
5300 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5303 std::vector<float> tmp1(outputData.size());
5304 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(float));
5308 auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
5310 LayerTestResult<float, 4> result(outputTensorInfo);
5311 result.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outputData);
5313 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5314 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5316 armnn::ResizeBilinearQueueDescriptor descriptor;
5317 descriptor.m_Parameters.m_DataLayout = dataLayout;
5318 armnn::WorkloadInfo info;
5319 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5320 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5322 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
5324 inputHandle->Allocate();
5325 outputHandle->Allocate();
5326 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
5328 workload->PostAllocationConfigure();
5329 workload->Execute();
5331 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5335 LayerTestResult<float, 4> ResizeBilinearMagTest(
5336 armnn::IWorkloadFactory& workloadFactory,
5337 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5338 const armnn::DataLayout dataLayout)
5340 const armnn::TensorInfo inputTensorInfo =
5341 armnnUtils::GetTensorInfo(1, 2, 3, 2, dataLayout, armnn::DataType::Float32);
5343 const armnn::TensorInfo outputTensorInfo =
5344 armnnUtils::GetTensorInfo(1, 2, 3, 5, dataLayout, armnn::DataType::Float32);
5346 std::vector<float> inputData({
5356 std::vector<float> outputData({
5357 1.0f, 1.4f, 1.8f, 2.0f, 2.0f,
5358 13.0f, 16.2f, 19.4f, 21.0f, 21.0f,
5359 144.0f, 179.6f, 215.2f, 233.0f, 233.0f,
5361 233.0f, 197.4f, 161.8f, 144.0f, 144.0f,
5362 21.0f, 17.8f, 14.6f, 13.0f, 13.0f,
5363 2.0f, 1.6f, 1.2f, 1.0f, 1.0f
5366 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5367 if (dataLayout == armnn::DataLayout::NHWC)
5369 std::vector<float> tmp(inputData.size());
5370 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5373 std::vector<float> tmp1(outputData.size());
5374 armnnUtils::Permute(outputTensorInfo.GetShape(), NCHWToNHWC, outputData.data(), tmp1.data(), sizeof(float));
5378 auto input = MakeTensor<float, 4>(inputTensorInfo, inputData);
5380 LayerTestResult<float, 4> result(outputTensorInfo);
5381 result.outputExpected = MakeTensor<float, 4>(outputTensorInfo, outputData);
5383 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5384 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5386 armnn::ResizeBilinearQueueDescriptor descriptor;
5387 descriptor.m_Parameters.m_DataLayout = dataLayout;
5388 armnn::WorkloadInfo info;
5389 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5390 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5392 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
5394 inputHandle->Allocate();
5395 outputHandle->Allocate();
5396 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
5398 workload->PostAllocationConfigure();
5399 workload->Execute();
5401 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5405 LayerTestResult<float, 2> FakeQuantizationTest(
5406 armnn::IWorkloadFactory& workloadFactory,
5407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5409 constexpr unsigned int width = 2;
5410 constexpr unsigned int height = 3;
5412 const armnn::TensorInfo tensorInfo({height, width },
5413 armnn::DataType::Float32);
5414 auto input = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
5420 LayerTestResult<float, 2> ret(tensorInfo);
5422 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
5424 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(tensorInfo);
5426 armnn::FakeQuantizationQueueDescriptor data;
5427 armnn::WorkloadInfo info;
5429 AddInputToWorkload(data, info, tensorInfo, inputHandle.get());
5430 AddOutputToWorkload(data, info, tensorInfo, outputHandle.get());
5434 data.m_Parameters.m_Min = min;
5435 data.m_Parameters.m_Max = max;
5437 armnn::PassthroughCpuTensorHandle refHandle(tensorInfo, &ret.outputExpected[0][0]);
5438 armnn::FakeQuantizationQueueDescriptor refData = data;
5439 armnn::WorkloadInfo refInfo = info;
5440 SetWorkloadOutput(refData, refInfo, 0, tensorInfo, &refHandle);
5442 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateFakeQuantization(data, info);
5444 inputHandle->Allocate();
5445 outputHandle->Allocate();
5447 CopyDataToITensorHandle(inputHandle.get(), &input[0][0]);
5449 workload->PostAllocationConfigure();
5450 workload->Execute();
5452 CopyDataFromITensorHandle(&ret.output[0][0], outputHandle.get());
5454 ret.outputExpected = MakeTensor<float, 2>(tensorInfo, std::vector<float>({
5465 LayerTestResult<float, 4> L2NormalizationTestImpl(
5466 armnn::IWorkloadFactory& workloadFactory,
5467 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5468 const armnn::TensorShape& inputOutputTensorShape,
5469 const std::vector<float>& inputValues,
5470 const std::vector<float>& expectedOutputValues,
5471 const armnn::DataLayout layout)
5473 const armnn::TensorInfo inputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
5474 const armnn::TensorInfo outputTensorInfo(inputOutputTensorShape, armnn::DataType::Float32);
5476 // at this point if we require it permute the input data
5477 const armnn::PermutationVector NCHWToNHWC = { 0, 3, 1, 2 };
5478 std::vector<float> inputData = inputValues;
5479 if (layout == armnn::DataLayout::NHWC)
5481 std::vector<float> tmp(inputData.size());
5482 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC, inputData.data(), tmp.data(), sizeof(float));
5486 auto inputTensor = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(inputData));
5488 LayerTestResult<float, 4> result(outputTensorInfo);
5489 std::vector<float> expectedOutputData = expectedOutputValues;
5490 if (layout == armnn::DataLayout::NHWC)
5492 std::vector<float> tmp(expectedOutputData.size());
5493 armnnUtils::Permute(inputTensorInfo.GetShape(), NCHWToNHWC,
5494 expectedOutputData.data(), tmp.data(), sizeof(float));
5495 expectedOutputData = tmp;
5497 result.outputExpected = MakeTensor<float, 4>(inputTensorInfo, std::vector<float>(expectedOutputData));
5499 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5500 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5502 armnn::L2NormalizationQueueDescriptor descriptor;
5503 descriptor.m_Parameters.m_DataLayout = layout;
5504 armnn::WorkloadInfo info;
5506 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5507 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5509 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateL2Normalization(descriptor, info);
5511 inputHandle->Allocate();
5512 outputHandle->Allocate();
5514 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
5516 workload->PostAllocationConfigure();
5517 ExecuteWorkload(*workload, memoryManager);
5519 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5524 float CalcInvL2Norm(std::initializer_list<float> elements)
5526 const float reduction = std::accumulate(elements.begin(), elements.end(), 0.0f,
5527 [](float acc, float element) { return acc + element * element; });
5528 return 1.0f / sqrtf(reduction);
5531 } // anonymous namespace
5533 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5534 LayerTestResult<T, 2> Pad2dTestCommon(
5535 armnn::IWorkloadFactory& workloadFactory,
5536 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5540 const armnn::TensorShape inputShape{ 3, 3 };
5541 const armnn::TensorShape outputShape{ 7, 7 };
5543 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
5544 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
5546 std::vector<T> inputValues(
5547 QuantizedVector<T>(qScale, qOffset,
5549 // Height (3) x Width (3)
5555 std::vector<T> expectedOutputValues(
5556 QuantizedVector<T>(qScale, qOffset,
5558 0, 0, 0, 0, 0, 0, 0,
5559 0, 0, 0, 0, 0, 0, 0,
5560 0, 0, 4, 8, 6, 0, 0,
5561 0, 0, 7, 4, 4, 0, 0,
5562 0, 0, 3, 2, 4, 0, 0,
5563 0, 0, 0, 0, 0, 0, 0,
5567 auto inputTensor = MakeTensor<T, 2>(inputTensorInfo, std::vector<T>(inputValues));
5569 LayerTestResult<T, 2> result(outputTensorInfo);
5570 result.outputExpected = MakeTensor<T, 2>(outputTensorInfo, std::vector<T>(expectedOutputValues));
5572 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5573 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5575 armnn::PadQueueDescriptor descriptor;
5577 std::vector<std::pair<unsigned int, unsigned int>> PadList;
5578 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
5579 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
5581 descriptor.m_Parameters.m_PadList = PadList;
5582 armnn::WorkloadInfo info;
5584 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5585 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5587 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
5589 inputHandle->Allocate();
5590 outputHandle->Allocate();
5592 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
5594 workload->PostAllocationConfigure();
5595 workload->Execute();
5597 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
5602 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5603 LayerTestResult<T, 3> Pad3dTestCommon(
5604 armnn::IWorkloadFactory& workloadFactory,
5605 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5609 const armnn::TensorShape inputShape{ 2, 2, 2 };
5610 const armnn::TensorShape outputShape{ 3, 5, 6 };
5612 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
5613 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
5615 std::vector<T> inputValues(
5616 QuantizedVector<T>(qScale,qOffset,
5618 // Channel 0, Height (2) x Width (2)
5622 // Channel 1, Height (2) x Width (2)
5627 std::vector<T> expectedOutputValues(
5628 QuantizedVector<T>(qScale,qOffset,
5651 auto inputTensor = MakeTensor<T, 3>(inputTensorInfo, std::vector<T>(inputValues));
5653 LayerTestResult<T, 3> result(outputTensorInfo);
5654 result.outputExpected = MakeTensor<T, 3>(outputTensorInfo, std::vector<T>(expectedOutputValues));
5656 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5657 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5659 armnn::PadQueueDescriptor descriptor;
5661 std::vector<std::pair<unsigned int, unsigned int>> PadList;
5662 PadList.push_back(std::pair<unsigned int, unsigned int>(0,1));
5663 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
5664 PadList.push_back(std::pair<unsigned int, unsigned int>(2,2));
5666 descriptor.m_Parameters.m_PadList = PadList;
5667 armnn::WorkloadInfo info;
5669 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5670 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5672 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
5674 inputHandle->Allocate();
5675 outputHandle->Allocate();
5677 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
5679 workload->PostAllocationConfigure();
5680 workload->Execute();
5682 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
5687 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
5688 LayerTestResult<T, 4> Pad4dTestCommon(
5689 armnn::IWorkloadFactory& workloadFactory,
5690 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5694 const armnn::TensorShape inputShape{ 2, 2, 3, 2 };
5695 const armnn::TensorShape outputShape{ 4, 5, 7, 4 };
5697 const armnn::TensorInfo inputTensorInfo(inputShape, ArmnnType);
5698 const armnn::TensorInfo outputTensorInfo(outputShape, ArmnnType);
5700 std::vector<T> inputValues(
5701 QuantizedVector<T>(qScale,qOffset,
5703 // Batch 0, Channel 0, Height (3) x Width (2)
5708 // Batch 0, Channel 1, Height (3) x Width (2)
5713 // Batch 1, Channel 0, Height (3) x Width (2)
5718 // Batch 1, Channel 1, Height (3) x Width (2)
5724 std::vector<T> expectedOutputValues(
5725 QuantizedVector<T>(qScale,qOffset,
5888 auto inputTensor = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(inputValues));
5890 LayerTestResult<T, 4> result(outputTensorInfo);
5891 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, std::vector<T>(expectedOutputValues));
5893 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
5894 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
5896 armnn::PadQueueDescriptor descriptor;
5898 std::vector<std::pair<unsigned int, unsigned int>> PadList;
5899 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
5900 PadList.push_back(std::pair<unsigned int, unsigned int>(2,1));
5901 PadList.push_back(std::pair<unsigned int, unsigned int>(3,1));
5902 PadList.push_back(std::pair<unsigned int, unsigned int>(1,1));
5904 descriptor.m_Parameters.m_PadList = PadList;
5905 armnn::WorkloadInfo info;
5907 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
5908 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
5910 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePad(descriptor, info);
5912 inputHandle->Allocate();
5913 outputHandle->Allocate();
5915 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0][0]);
5917 workload->PostAllocationConfigure();
5918 workload->Execute();
5920 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
5925 LayerTestResult<uint8_t, 2> PadUint82dTest(
5926 armnn::IWorkloadFactory& workloadFactory,
5927 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5929 return Pad2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
5932 LayerTestResult<uint8_t, 3> PadUint83dTest(
5933 armnn::IWorkloadFactory& workloadFactory,
5934 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5936 return Pad3dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
5939 LayerTestResult<uint8_t, 4> PadUint84dTest(
5940 armnn::IWorkloadFactory& workloadFactory,
5941 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5943 return Pad4dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
5946 LayerTestResult<float, 2> PadFloat322dTest(
5947 armnn::IWorkloadFactory& workloadFactory,
5948 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5950 return Pad2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5953 LayerTestResult<float, 3> PadFloat323dTest(
5954 armnn::IWorkloadFactory& workloadFactory,
5955 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5957 return Pad3dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5960 LayerTestResult<float, 4> PadFloat324dTest(
5961 armnn::IWorkloadFactory& workloadFactory,
5962 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
5964 return Pad4dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
5967 LayerTestResult<float, 4> L2Normalization1dTest(
5968 armnn::IWorkloadFactory& workloadFactory,
5969 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
5970 const armnn::DataLayout layout)
5976 unsigned int numberOfBatches = 1;
5977 unsigned int numberOfChannels = 10;
5978 unsigned int height = 1;
5979 unsigned int width = 1;
5982 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
5983 numberOfBatches, numberOfChannels, height, width, layout);
5984 std::vector<float> inputValues
5986 // Batch 0, Channel 0, Height (1) x Width (1)
5989 // Batch 0, Channel 1, Height (1) x Width (1)
5992 // Batch 0, Channel 2, Height (1) x Width (1)
5995 // Batch 0, Channel 3, Height (1) x Width (1)
5998 // Batch 0, Channel 4, Height (1) x Width (1)
6001 // Batch 0, Channel 5, Height (1) x Width (1)
6004 // Batch 0, Channel 6, Height (1) x Width (1)
6007 // Batch 0, Channel 7, Height (1) x Width (1)
6010 // Batch 0, Channel 8, Height (1) x Width (1)
6013 // Batch 0, Channel 9, Height (1) x Width (1)
6016 const float approxInvL2Norm = 0.050964719f;
6017 std::vector<float> expectedOutputValues
6019 // Batch 0, Channel 0, Height (1) x Width (1)
6020 1.0f * approxInvL2Norm,
6021 2.0f * approxInvL2Norm,
6022 3.0f * approxInvL2Norm,
6023 4.0f * approxInvL2Norm,
6024 5.0f * approxInvL2Norm,
6025 6.0f * approxInvL2Norm,
6026 7.0f * approxInvL2Norm,
6027 8.0f * approxInvL2Norm,
6028 9.0f * approxInvL2Norm,
6029 10.0f * approxInvL2Norm
6033 return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape,
6034 inputValues, expectedOutputValues, layout);
6037 LayerTestResult<float, 4> L2Normalization2dTest(
6038 armnn::IWorkloadFactory& workloadFactory,
6039 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6040 const armnn::DataLayout layout)
6046 unsigned int numberOfBatches = 1;
6047 unsigned int numberOfChannels = 2;
6048 unsigned int height = 1;
6049 unsigned int width = 5;
6051 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
6052 numberOfBatches, numberOfChannels, height, width, layout);
6053 std::vector<float> inputValues
6055 // Batch 0, Channel 0, Height (1) x Width (5)
6056 1.0f, 3.0f, 5.0f, 7.0f, 9.0f,
6058 // Batch 0, Channel 1, Height (1) x Width (5)
6059 2.0f, 4.0f, 6.0f, 8.0f, 10.0f
6061 std::vector<float> expectedOutputValues
6063 // Batch 0, Channel 0, Height (1) x Width (5)
6064 1.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
6065 3.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
6066 5.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
6067 7.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
6068 9.0f * CalcInvL2Norm({ 9.0f, 10.0f }),
6070 // Batch 0, Channel 1, Height (1) x Width (5)
6071 2.0f * CalcInvL2Norm({ 1.0f, 2.0f }),
6072 4.0f * CalcInvL2Norm({ 3.0f, 4.0f }),
6073 6.0f * CalcInvL2Norm({ 5.0f, 6.0f }),
6074 8.0f * CalcInvL2Norm({ 7.0f, 8.0f }),
6075 10.0f * CalcInvL2Norm({ 9.0f, 10.0f })
6078 return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape,
6079 inputValues, expectedOutputValues, layout);
6082 LayerTestResult<float, 4> L2Normalization3dTest(
6083 armnn::IWorkloadFactory& workloadFactory,
6084 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6085 const armnn::DataLayout layout)
6091 unsigned int numberOfBatches = 1;
6092 unsigned int numberOfChannels = 2;
6093 unsigned int height = 4;
6094 unsigned int width = 3;
6096 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
6097 numberOfBatches, numberOfChannels, height, width, layout);
6098 std::vector<float> inputValues
6100 // Batch 0, Channel 0, Height (4) x Width (3)
6101 119.0f, 21.0f, 150.0f,
6102 149.0f, 32.0f, 179.0f,
6103 15.0f, 227.0f, 141.0f,
6104 147.0f, 199.0f, 220.0f,
6106 // Batch 0, Channel 1, Height (4) x Width (3)
6107 110.0f, 140.0f, 73.0f,
6108 211.0f, 212.0f, 89.0f,
6109 24.0f, 138.0f, 188.0f,
6110 162.0f, 12.0f, 161.0f
6112 std::vector<float> expectedOutputValues
6114 // Batch 0, Channel 0, Height (4) x Width (3)
6115 119.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
6116 21.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
6117 150.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
6118 149.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
6119 32.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
6120 179.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
6121 15.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
6122 227.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
6123 141.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
6124 147.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
6125 199.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
6126 220.0f * CalcInvL2Norm({ 220.0f, 161.0f }),
6128 // Batch 0, Channel 1, Height (4) x Width (3)
6129 110.0f * CalcInvL2Norm({ 119.0f, 110.0f }),
6130 140.0f * CalcInvL2Norm({ 21.0f, 140.0f }),
6131 73.0f * CalcInvL2Norm({ 150.0f, 73.0f }),
6132 211.0f * CalcInvL2Norm({ 149.0f, 211.0f }),
6133 212.0f * CalcInvL2Norm({ 32.0f, 212.0f }),
6134 89.0f * CalcInvL2Norm({ 179.0f, 89.0f }),
6135 24.0f * CalcInvL2Norm({ 15.0f, 24.0f }),
6136 138.0f * CalcInvL2Norm({ 227.0f, 138.0f }),
6137 188.0f * CalcInvL2Norm({ 141.0f, 188.0f }),
6138 162.0f * CalcInvL2Norm({ 147.0f, 162.0f }),
6139 12.0f * CalcInvL2Norm({ 199.0f, 12.0f }),
6140 161.0f * CalcInvL2Norm({ 220.0f, 161.0f })
6143 return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape,
6144 inputValues, expectedOutputValues, layout);
6147 LayerTestResult<float, 4> L2Normalization4dTest(
6148 armnn::IWorkloadFactory& workloadFactory,
6149 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6150 const armnn::DataLayout layout)
6156 unsigned int numberOfBatches = 2;
6157 unsigned int numberOfChannels = 3;
6158 unsigned int height = 4;
6159 unsigned int width = 3;
6161 const armnn::TensorShape inputOutputShape = armnnUtils::GetTensorShape(
6162 numberOfBatches, numberOfChannels, height, width, layout);
6163 std::vector<float> inputValues
6165 // Batch 0, Channel 0, Height (4) x Width (3)
6166 235.0f, 46.0f, 178.0f,
6167 100.0f, 123.0f, 19.0f,
6168 172.0f, 74.0f, 250.0f,
6169 6.0f, 195.0f, 80.0f,
6171 // Batch 0, Channel 1, Height (4) x Width (3)
6172 113.0f, 95.0f, 202.0f,
6173 77.0f, 114.0f, 71.0f,
6174 122.0f, 246.0f, 166.0f,
6175 82.0f, 28.0f, 37.0f,
6177 // Batch 0, Channel 2, Height (4) x Width (3)
6178 56.0f, 170.0f, 162.0f,
6179 194.0f, 89.0f, 254.0f,
6180 12.0f, 209.0f, 200.0f,
6183 // Batch 1, Channel 0, Height (4) x Width (3)
6184 67.0f, 90.0f, 49.0f,
6185 7.0f, 163.0f, 18.0f,
6186 25.0f, 117.0f, 103.0f,
6187 247.0f, 59.0f, 189.0f,
6189 // Batch 1, Channel 1, Height (4) x Width (3)
6190 239.0f, 104.0f, 199.0f,
6191 17.0f, 124.0f, 153.0f,
6192 222.0f, 217.0f, 75.0f,
6193 32.0f, 126.0f, 21.0f,
6195 // Batch 1, Channel 2, Height (4) x Width (3)
6196 97.0f, 145.0f, 215.0f,
6197 115.0f, 116.0f, 238.0f,
6198 226.0f, 16.0f, 132.0f,
6199 92.0f, 125.0f, 88.0f
6201 std::vector<float> expectedOutputValues
6203 // Batch 0, Channel 0, Height (4) x Width (3)
6204 235.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
6205 46.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
6206 178.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
6207 100.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
6208 123.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
6209 19.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
6210 172.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
6211 74.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
6212 250.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
6213 6.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
6214 195.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
6215 80.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
6217 // Batch 0, Channel 1, Height (4) x Width (3)
6218 113.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
6219 95.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
6220 202.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
6221 77.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
6222 114.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
6223 71.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
6224 122.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
6225 246.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
6226 166.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
6227 82.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
6228 28.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
6229 37.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
6231 // Batch 0, Channel 2, Height (4) x Width (3)
6232 56.0f * CalcInvL2Norm({ 235.0f, 113.0f, 56.0f }),
6233 170.0f * CalcInvL2Norm({ 46.0f, 95.0f, 170.0f }),
6234 162.0f * CalcInvL2Norm({ 178.0f, 202.0F, 162.0f }),
6235 194.0f * CalcInvL2Norm({ 100.0f, 77.0f, 194.0f }),
6236 89.0f * CalcInvL2Norm({ 123.0f, 114.0f, 89.0f }),
6237 254.0f * CalcInvL2Norm({ 19.0f, 71.0f, 254.0f }),
6238 12.0f * CalcInvL2Norm({ 172.0f, 122.0f, 12.0f }),
6239 209.0f * CalcInvL2Norm({ 74.0f, 246.0f, 209.0f }),
6240 200.0f * CalcInvL2Norm({ 250.0f, 166.0f, 200.0f }),
6241 1.0f * CalcInvL2Norm({ 6.0f, 82.0f, 1.0f }),
6242 64.0f * CalcInvL2Norm({ 195.0f, 28.0f, 64.0f }),
6243 54.0f * CalcInvL2Norm({ 80.0f, 37.0f, 54.0f }),
6245 // Batch 1, Channel 0, Height (4) x Width (3)
6246 67.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
6247 90.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
6248 49.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
6249 7.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
6250 163.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
6251 18.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
6252 25.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
6253 117.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
6254 103.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
6255 247.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
6256 59.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
6257 189.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
6259 // Batch 1, Channel 1, Height (4) x Width (3)
6260 239.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
6261 104.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
6262 199.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
6263 17.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
6264 124.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
6265 153.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
6266 222.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
6267 217.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
6268 75.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
6269 32.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
6270 126.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
6271 21.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f }),
6273 // Batch 1, Channel 2, Height (4) x Width (3)
6274 97.0f * CalcInvL2Norm({ 67.0f, 239.0f, 97.0f }),
6275 145.0f * CalcInvL2Norm({ 90.0f, 104.0f, 145.0f }),
6276 215.0f * CalcInvL2Norm({ 49.0f, 199.0f, 215.0f }),
6277 115.0f * CalcInvL2Norm({ 7.0f, 17.0f, 115.0f }),
6278 116.0f * CalcInvL2Norm({ 163.0f, 124.0f, 116.0f }),
6279 238.0f * CalcInvL2Norm({ 18.0f, 153.0f, 238.0f }),
6280 226.0f * CalcInvL2Norm({ 25.0f, 222.0f, 226.0f }),
6281 16.0f * CalcInvL2Norm({ 117.0f, 217.0f, 16.0f }),
6282 132.0f * CalcInvL2Norm({ 103.0f, 75.0f, 132.0f }),
6283 92.0f * CalcInvL2Norm({ 247.0f, 32.0f, 92.0f }),
6284 125.0f * CalcInvL2Norm({ 59.0f, 126.0f, 125.0f }),
6285 88.0f * CalcInvL2Norm({ 189.0f, 21.0f, 88.0f })
6288 return L2NormalizationTestImpl(workloadFactory, memoryManager, inputOutputShape,
6289 inputValues, expectedOutputValues, layout);
6292 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6293 LayerTestResult<T, 4> ConstantTestImpl(
6294 armnn::IWorkloadFactory& workloadFactory,
6295 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6299 constexpr unsigned int inputWidth = 3;
6300 constexpr unsigned int inputHeight = 4;
6301 constexpr unsigned int inputChannels = 3;
6302 constexpr unsigned int inputBatchSize = 2;
6304 constexpr unsigned int outputWidth = inputWidth;
6305 constexpr unsigned int outputHeight = inputHeight;
6306 constexpr unsigned int outputChannels = inputChannels;
6307 constexpr unsigned int outputBatchSize = inputBatchSize;
6309 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth }, ArmnnType);
6311 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth }, ArmnnType);
6313 // Set quantization parameters if the requested type is a quantized type.
6314 if(armnn::IsQuantizedType<T>())
6316 inputTensorInfo.SetQuantizationScale(qScale);
6317 inputTensorInfo.SetQuantizationOffset(qOffset);
6318 outputTensorInfo.SetQuantizationScale(qScale);
6319 outputTensorInfo.SetQuantizationOffset(qOffset);
6322 auto input = MakeTensor<T, 4>(inputTensorInfo, std::vector<T>(
6323 QuantizedVector<T>(qScale, qOffset, {
6324 // Batch 0, Channel 0
6325 235.0f, 46.0f, 178.0f,
6326 100.0f, 123.0f, 19.0f,
6327 172.0f, 74.0f, 250.0f,
6328 6.0f, 195.0f, 80.0f,
6330 // Batch 0, Channel 1
6331 113.0f, 95.0f, 202.0f,
6332 77.0f, 114.0f, 71.0f,
6333 122.0f, 246.0f, 166.0f,
6334 82.0f, 28.0f, 37.0f,
6336 // Batch 0, Channel 2
6337 56.0f, 170.0f, 162.0f,
6338 194.0f, 89.0f, 254.0f,
6339 12.0f, 209.0f, 200.0f,
6342 // Batch 1, Channel 0
6343 67.0f, 90.0f, 49.0f,
6344 7.0f, 163.0f, 18.0f,
6345 25.0f, 117.0f, 103.0f,
6346 247.0f, 59.0f, 189.0f,
6348 // Batch 1, Channel 1
6349 239.0f, 104.0f, 199.0f,
6350 17.0f, 124.0f, 153.0f,
6351 222.0f, 217.0f, 75.0f,
6352 32.0f, 126.0f, 21.0f,
6354 // Batch 1, Channel 2
6355 97.0f, 145.0f, 215.0f,
6356 115.0f, 116.0f, 238.0f,
6357 226.0f, 16.0f, 132.0f,
6358 92.0f, 125.0f, 88.0f,
6361 LayerTestResult<T, 4> result(outputTensorInfo);
6362 result.outputExpected = input;
6364 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6366 armnn::ScopedCpuTensorHandle constantTensor(inputTensorInfo);
6367 AllocateAndCopyDataToITensorHandle(&constantTensor, &input[0][0][0][0]);
6369 armnn::ConstantQueueDescriptor descriptor;
6370 descriptor.m_LayerOutput = &constantTensor;
6372 armnn::WorkloadInfo info;
6373 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
6375 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateConstant(descriptor, info);
6377 outputHandle->Allocate();
6379 workload->PostAllocationConfigure();
6380 workload->Execute();
6382 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6386 LayerTestResult<float, 4> ConstantTest(
6387 armnn::IWorkloadFactory& workloadFactory,
6388 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6390 return ConstantTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager, 0.0f, 0);
6393 LayerTestResult<uint8_t, 4> ConstantTestUint8(
6394 armnn::IWorkloadFactory& workloadFactory,
6395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6397 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 1.0f, 0);
6400 LayerTestResult<uint8_t, 3> MergerUint8DifferentQParamsTest(
6401 armnn::IWorkloadFactory& workloadFactory,
6402 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6404 unsigned int outputWidth = 3;
6405 unsigned int outputHeight = 6;
6406 unsigned int outputChannels = 3;
6408 unsigned int inputWidth1 = 3;
6409 unsigned int inputHeight1 = 6;
6410 unsigned int inputChannels1 = 2;
6412 unsigned int inputWidth2 = 3;
6413 unsigned int inputHeight2 = 6;
6414 unsigned int inputChannels2 = 1;
6416 // Defines the tensor descriptors.
6417 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
6418 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
6419 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
6421 // Quantized input1 tensor. Range [-3, 1]
6422 const float inputScale1 = 0.015686f;
6423 const int32_t inputOffset1 = 192;
6425 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
6443 // Quatized input2 tensor. Range [-1, 4]
6444 const float inputScale2 = 0.019608f;
6445 const int32_t inputOffset2 = 50;
6447 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
6458 // Output has the same quantization parameters than input1,
6459 // so that only the requantization of input2 is required
6460 const float outputScale = 0.015686f;
6461 const int32_t outputOffset = 192;
6463 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
6465 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
6490 outputTensorInfo.SetQuantizationScale(outputScale);
6491 outputTensorInfo.SetQuantizationOffset(outputOffset);
6492 inputTensorInfo1.SetQuantizationScale(inputScale1);
6493 inputTensorInfo1.SetQuantizationOffset(inputOffset1);
6494 inputTensorInfo2.SetQuantizationScale(inputScale2);
6495 inputTensorInfo2.SetQuantizationOffset(inputOffset2);
6497 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
6498 armnn::MergerQueueDescriptor::ViewOrigin window1(wOrigin1);
6500 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
6501 armnn::MergerQueueDescriptor::ViewOrigin window2(wOrigin2);
6503 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6505 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
6507 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
6508 subTensorsSupported ?
6509 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
6510 workloadFactory.CreateTensorHandle(inputTensorInfo1);
6512 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
6513 subTensorsSupported ?
6514 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
6515 workloadFactory.CreateTensorHandle(inputTensorInfo2);
6517 armnn::MergerQueueDescriptor data;
6518 armnn::WorkloadInfo info;
6519 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
6520 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
6521 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
6523 data.m_ViewOrigins.push_back(window1);
6524 data.m_ViewOrigins.push_back(window2);
6526 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMerger(data, info);
6528 inputHandle1->Allocate();
6529 inputHandle2->Allocate();
6530 outputHandle->Allocate();
6532 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
6533 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
6535 workload->PostAllocationConfigure();
6536 workload->Execute();
6538 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
6543 LayerTestResult<uint8_t, 3> MergerUint8Test(
6544 armnn::IWorkloadFactory& workloadFactory,
6545 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6547 unsigned int outputWidth = 3;
6548 unsigned int outputHeight = 6;
6549 unsigned int outputChannels = 3;
6551 unsigned int inputWidth1 = 3;
6552 unsigned int inputHeight1 = 6;
6553 unsigned int inputChannels1 = 2;
6555 unsigned int inputWidth2 = 3;
6556 unsigned int inputHeight2 = 6;
6557 unsigned int inputChannels2 = 1;
6559 // Defines the tensor descriptors.
6560 armnn::TensorInfo outputTensorInfo({ outputChannels, outputHeight, outputWidth }, armnn::DataType::QuantisedAsymm8);
6561 armnn::TensorInfo inputTensorInfo1({ inputChannels1, inputHeight1, inputWidth1 }, armnn::DataType::QuantisedAsymm8);
6562 armnn::TensorInfo inputTensorInfo2({ inputChannels2, inputHeight2, inputWidth2 }, armnn::DataType::QuantisedAsymm8);
6564 // Arbitrary scale and offsets. They don't really matter as the merger operator doesn't dequantize/quantize them.
6565 const float scale = 0.13497836f;
6566 const int32_t offset = -7;
6568 outputTensorInfo.SetQuantizationScale(scale);
6569 outputTensorInfo.SetQuantizationOffset(offset);
6570 inputTensorInfo1.SetQuantizationScale(scale);
6571 inputTensorInfo1.SetQuantizationOffset(offset);
6572 inputTensorInfo2.SetQuantizationScale(scale);
6573 inputTensorInfo2.SetQuantizationOffset(offset);
6575 LayerTestResult<uint8_t, 3> ret(outputTensorInfo);
6577 ret.outputExpected = MakeTensor<uint8_t, 3>(outputTensorInfo, std::vector<uint8_t>(
6602 auto input1 = MakeTensor<uint8_t, 3>(inputTensorInfo1, std::vector<uint8_t>(
6620 auto input2 = MakeTensor<uint8_t, 3>(inputTensorInfo2, std::vector<uint8_t>(
6631 std::vector<unsigned int> wOrigin1 = { 0, 0, 0 }; //Extent of the window is defined by size of input[0].
6632 armnn::MergerQueueDescriptor::ViewOrigin window1(wOrigin1);
6634 std::vector<unsigned int> wOrigin2 = { 2, 0, 0 }; //Extent of the window is defined by size of input[1].
6635 armnn::MergerQueueDescriptor::ViewOrigin window2(wOrigin2);
6638 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6640 bool subTensorsSupported = workloadFactory.SupportsSubTensors();
6642 std::unique_ptr<armnn::ITensorHandle> inputHandle1 =
6643 subTensorsSupported ?
6644 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo1.GetShape(), wOrigin1.data()) :
6645 workloadFactory.CreateTensorHandle(inputTensorInfo1);
6647 std::unique_ptr<armnn::ITensorHandle> inputHandle2 =
6648 subTensorsSupported ?
6649 workloadFactory.CreateSubTensorHandle(*outputHandle, inputTensorInfo2.GetShape(), wOrigin2.data()) :
6650 workloadFactory.CreateTensorHandle(inputTensorInfo2);
6653 armnn::MergerQueueDescriptor data;
6654 armnn::WorkloadInfo info;
6655 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
6656 AddInputToWorkload(data, info, inputTensorInfo2, inputHandle2.get());
6657 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
6659 data.m_ViewOrigins.push_back(window1);
6660 data.m_ViewOrigins.push_back(window2);
6662 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMerger(data, info);
6664 inputHandle1->Allocate();
6665 inputHandle2->Allocate();
6666 outputHandle->Allocate();
6668 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0]);
6669 CopyDataToITensorHandle(inputHandle2.get(), &input2[0][0][0]);
6671 workload->PostAllocationConfigure();
6672 workload->Execute();
6674 CopyDataFromITensorHandle(&ret.output[0][0][0], outputHandle.get());
6682 template <typename T>
6683 LayerTestResult<T, 4> AdditionQuantizeTestHelper(
6684 armnn::IWorkloadFactory& workloadFactory,
6685 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6686 const unsigned int shape0[4],
6687 const std::vector<T>& values0,
6690 const unsigned int shape1[4],
6691 const std::vector<T> & values1,
6694 const unsigned int outShape[4],
6695 const std::vector<T> & outValues,
6699 auto dataType = (std::is_same<T, uint8_t>::value ?
6700 armnn::DataType::QuantisedAsymm8 :
6701 armnn::DataType::QuantisedSymm16);
6703 armnn::TensorInfo inputTensorInfo0(4, shape0, dataType);
6704 armnn::TensorInfo inputTensorInfo1(4, shape1, dataType);
6705 armnn::TensorInfo outputTensorInfo(4, outShape, dataType);
6707 inputTensorInfo0.SetQuantizationScale(scale0);
6708 inputTensorInfo0.SetQuantizationOffset(offset0);
6710 inputTensorInfo1.SetQuantizationScale(scale1);
6711 inputTensorInfo1.SetQuantizationOffset(offset1);
6713 outputTensorInfo.SetQuantizationScale(outScale);
6714 outputTensorInfo.SetQuantizationOffset(outOffset);
6716 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
6717 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
6719 LayerTestResult<T, 4> result(outputTensorInfo);
6720 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
6722 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
6723 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
6724 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6726 armnn::AdditionQueueDescriptor data;
6727 armnn::WorkloadInfo info;
6728 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
6729 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
6730 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
6732 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateAddition(data, info);
6734 inputHandle0->Allocate();
6735 inputHandle1->Allocate();
6736 outputHandle->Allocate();
6738 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
6739 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
6741 workload->PostAllocationConfigure();
6742 workload->Execute();
6744 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6748 } // anonymous namespace
6750 LayerTestResult<uint8_t, 4> AdditionUint8Test(
6751 armnn::IWorkloadFactory& workloadFactory,
6752 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6754 const unsigned int shape0[] = { 1, 2, 2, 3 };
6755 const unsigned int shape1[] = { 1, 2, 2, 3 };
6757 std::vector<uint8_t> input0(
6759 63, 35, 77, 70, 56, 112, // 420, 224, 518, 469, 371, 763
6760 203, 28, 252, 168, 245, 91 // 1400, 175, 1743, 1155, 1694, 616
6763 std::vector<uint8_t> input1(
6765 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
6766 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
6769 std::vector<uint8_t> output(
6771 81, 39, 249, 255, 228, 255, // 546, 252, 1722, 2065(clamped), 1575, 2212(clamped)
6772 255, 186, 255, 186, 255, 214, // 2261(clamped), 1281, 2163(clamped), 1281, 2408(clamped), 1477
6775 return AdditionQuantizeTestHelper(workloadFactory,
6777 shape0, input0, 7.0f, 3,
6778 shape1, input1, 7.0f, 3,
6779 shape0, output, 7.0f, 3);
6782 LayerTestResult<int16_t, 4> AdditionInt16Test(
6783 armnn::IWorkloadFactory& workloadFactory,
6784 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6786 const unsigned int shape0[] = { 1, 2, 2, 3 };
6787 const unsigned int shape1[] = { 1, 2, 2, 3 };
6789 std::vector<int16_t> input0(
6791 63, 35, 77, 70, 56, 112, // 441, 245, 539, 490, 392, 184
6792 203, 28, 252, 168, 245, 91 // 1421, 196, 1764, 1176, 1715, 637
6795 std::vector<int16_t> input1(
6797 21, 7, 175, 231, 175, 210, // 126, 28, 1204, 1596, 1204, 1449
6798 126, 161, 63, 21, 105, 126 // 861, 1106, 420, 126, 714, 861
6801 std::vector<int16_t> output(
6803 84, 42, 252, 301, 231, 322, // 588, 294, 1764, 2107(clamped), 1617, 2254(clamped)
6804 329, 189, 315, 189, 350, 217, // 2303(clamped), 1323, 2205(clamped), 1323, 2450(clamped), 1519
6807 return AdditionQuantizeTestHelper(workloadFactory,
6809 shape0, input0, 7.0f, 0,
6810 shape1, input1, 7.0f, 0,
6811 shape0, output, 7.0f, 0);
6816 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
6817 LayerTestResult<T, 4> MultiplicationQuantizeTestHelper(
6818 armnn::IWorkloadFactory& workloadFactory,
6819 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
6820 const unsigned int shape0[4],
6821 const std::vector<T> & values0,
6824 const unsigned int shape1[4],
6825 const std::vector<T> & values1,
6828 const unsigned int outShape[4],
6829 const std::vector<T> & outValues,
6833 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
6834 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
6835 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
6837 inputTensorInfo0.SetQuantizationScale(scale0);
6838 inputTensorInfo0.SetQuantizationOffset(offset0);
6840 inputTensorInfo1.SetQuantizationScale(scale1);
6841 inputTensorInfo1.SetQuantizationOffset(offset1);
6843 outputTensorInfo.SetQuantizationScale(outScale);
6844 outputTensorInfo.SetQuantizationOffset(outOffset);
6846 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
6847 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
6849 LayerTestResult<T, 4> result(outputTensorInfo);
6850 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
6852 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
6853 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
6854 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
6856 armnn::MultiplicationQueueDescriptor data;
6857 armnn::WorkloadInfo info;
6858 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
6859 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
6860 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
6862 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMultiplication(data, info);
6864 inputHandle0->Allocate();
6865 inputHandle1->Allocate();
6866 outputHandle->Allocate();
6868 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
6869 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
6871 workload->PostAllocationConfigure();
6872 workload->Execute();
6874 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
6878 } // anonymous namespace
6880 LayerTestResult<uint8_t, 4> MultiplicationUint8Test(
6881 armnn::IWorkloadFactory& workloadFactory,
6882 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6884 unsigned int batchSize = 1;
6885 unsigned int channels = 2;
6886 unsigned int height = 2;
6887 unsigned int width = 3;
6888 const unsigned int shape[] = { batchSize, channels, height, width };
6890 // See dequantized values to the right.
6891 std::vector<uint8_t> input0({
6892 62, 37, 3, 172, 13, 111, // 244, 144, 8, 684, 48, 440,
6893 188, 20, 73, 31, 23, 31 // 748, 76, 288, 120, 88, 120
6896 // See dequantized values to the right.
6897 std::vector<uint8_t> input1({
6898 126, 240, 252, 183, 121, 247, // 384, 726, 762, 555, 369, 747,
6899 48, 115, 151, 79, 78, 97 // 150, 351, 459, 243, 240, 297
6902 // See dequantized values to the right.
6903 std::vector<uint8_t> output(
6905 64, 72, 0, 255, 8, 236, // 93696, 104544, 6096(clamped), 379620(clamped), 17712, 328680,
6906 77, 15, 92, 16, 10, 21, // 112200, 26676, 132192, 29160, 21120, 35640
6909 // Scale/offset chosen to have output values out of range.
6910 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
6926 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1ElementUint8Test(
6927 armnn::IWorkloadFactory& workloadFactory,
6928 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6930 const unsigned int shape0[] = { 1, 2, 2, 3 };
6931 const unsigned int shape1[] = { 1, 1, 1, 1 };
6933 std::vector<uint8_t> input0({
6938 std::vector<uint8_t> input1({2});
6940 std::vector<uint8_t> output({
6942 14, 16, 18, 20, 22, 24
6945 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
6961 LayerTestResult<uint8_t, 4> MultiplicationBroadcast1DVectorUint8Test(
6962 armnn::IWorkloadFactory& workloadFactory,
6963 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
6965 const unsigned int shape0[] = { 1, 2, 2, 3 };
6966 const unsigned int shape1[] = { 1, 1, 1, 3 };
6968 std::vector<uint8_t> input0({
6973 std::vector<uint8_t> input1({1, 2, 3});
6975 std::vector<uint8_t> output({
6977 7, 16, 27, 10, 22, 36
6980 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
6996 LayerTestResult<int16_t, 4> MultiplicationInt16Test(
6997 armnn::IWorkloadFactory& workloadFactory,
6998 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7000 const unsigned int shape[] = { 1, 2, 2, 3 };
7002 std::vector<int16_t> input0(
7005 12, 13, 14, 15, 16, 17
7008 std::vector<int16_t> input1(
7014 std::vector<int16_t> output(
7016 6, 14, 24, 36, 50, 66,
7017 84, 104, 126, 150, 176, 204
7020 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7036 LayerTestResult<int16_t, 4> MultiplicationBroadcast1ElementInt16Test(
7037 armnn::IWorkloadFactory& workloadFactory,
7038 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7040 const unsigned int shape0[] = { 1, 2, 2, 3 };
7041 const unsigned int shape1[] = { 1, 1, 1, 1 };
7043 std::vector<int16_t> input0(
7049 std::vector<int16_t> input1({2});
7051 std::vector<int16_t> output(
7054 14, 16, 18, 20, 22, 24
7057 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7073 LayerTestResult<int16_t, 4> MultiplicationBroadcast1DVectorInt16Test(
7074 armnn::IWorkloadFactory& workloadFactory,
7075 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7077 const unsigned int shape0[] = { 1, 2, 2, 3 };
7078 const unsigned int shape1[] = { 1, 1, 1, 3 };
7080 std::vector<int16_t> input0(
7086 std::vector<int16_t> input1({1, 2, 3});
7088 std::vector<int16_t> output(
7091 7, 16, 27, 10, 22, 36
7094 return MultiplicationQuantizeTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7112 template<armnn::DataType ArmnnType, typename T = armnn::ResolveType<ArmnnType>>
7113 LayerTestResult<T, 4> SubtractionTestHelper(
7114 armnn::IWorkloadFactory& workloadFactory,
7115 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7116 const unsigned int shape0[4],
7117 const std::vector<T>& values0,
7120 const unsigned int shape1[4],
7121 const std::vector<T> & values1,
7124 const unsigned int outShape[4],
7125 const std::vector<T> & outValues,
7129 armnn::TensorInfo inputTensorInfo0(4, shape0, ArmnnType);
7130 armnn::TensorInfo inputTensorInfo1(4, shape1, ArmnnType);
7131 armnn::TensorInfo outputTensorInfo(4, outShape, ArmnnType);
7133 inputTensorInfo0.SetQuantizationScale(scale0);
7134 inputTensorInfo0.SetQuantizationOffset(offset0);
7136 inputTensorInfo1.SetQuantizationScale(scale1);
7137 inputTensorInfo1.SetQuantizationOffset(offset1);
7139 outputTensorInfo.SetQuantizationScale(outScale);
7140 outputTensorInfo.SetQuantizationOffset(outOffset);
7142 auto input0 = MakeTensor<T, 4>(inputTensorInfo0, values0);
7143 auto input1 = MakeTensor<T, 4>(inputTensorInfo1, values1);
7145 LayerTestResult<T, 4> result(outputTensorInfo);
7146 result.outputExpected = MakeTensor<T, 4>(outputTensorInfo, outValues);
7148 std::unique_ptr<armnn::ITensorHandle> inputHandle0 = workloadFactory.CreateTensorHandle(inputTensorInfo0);
7149 std::unique_ptr<armnn::ITensorHandle> inputHandle1 = workloadFactory.CreateTensorHandle(inputTensorInfo1);
7150 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7152 armnn::SubtractionQueueDescriptor data;
7153 armnn::WorkloadInfo info;
7154 AddInputToWorkload(data, info, inputTensorInfo0, inputHandle0.get());
7155 AddInputToWorkload(data, info, inputTensorInfo1, inputHandle1.get());
7156 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
7158 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateSubtraction(data, info);
7160 inputHandle0->Allocate();
7161 inputHandle1->Allocate();
7162 outputHandle->Allocate();
7164 CopyDataToITensorHandle(inputHandle0.get(), &input0[0][0][0][0]);
7165 CopyDataToITensorHandle(inputHandle1.get(), &input1[0][0][0][0]);
7167 workload->PostAllocationConfigure();
7168 workload->Execute();
7170 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7174 } // anonymous namespace
7176 LayerTestResult<uint8_t, 4> SubtractionUint8Test(
7177 armnn::IWorkloadFactory& workloadFactory,
7178 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7180 const unsigned int shape0[] = { 1, 1, 2, 2 };
7181 const unsigned int shape1[] = { 1, 1, 2, 2 };
7183 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
7184 std::vector<uint8_t> input1({ 1, 2, 1, 2 });
7185 std::vector<uint8_t> output({ 3, 3, 5, 5 });
7187 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
7189 shape0, input0, 0.5f, 2,
7190 shape1, input1, 1.0f, 0,
7191 shape0, output, 1.0f, 0);
7194 LayerTestResult<uint8_t, 4> SubtractionBroadcast1ElementUint8Test(
7195 armnn::IWorkloadFactory& workloadFactory,
7196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7198 const unsigned int shape0[] = { 1, 1, 2, 2 };
7199 const unsigned int shape1[] = { 1, 1, 1, 1 };
7201 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
7202 std::vector<uint8_t> input1({ 2 });
7203 std::vector<uint8_t> output({ 5, 6, 7, 8 });
7205 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
7207 shape0, input0, 0.5f, 2,
7208 shape1, input1, 1.0f, 0,
7209 shape0, output, 1.0f, 3);
7212 LayerTestResult<uint8_t, 4> SubtractionBroadcastUint8Test(
7213 armnn::IWorkloadFactory& workloadFactory,
7214 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7216 const unsigned int shape0[] = { 1, 1, 2, 2 };
7217 const unsigned int shape1[] = { 1, 1, 2, 1 };
7219 std::vector<uint8_t> input0({ 10, 12, 14, 16 });
7220 std::vector<uint8_t> input1({ 2, 1 });
7221 std::vector<uint8_t> output({ 8, 11, 12, 15 });
7223 return SubtractionTestHelper<armnn::DataType::QuantisedAsymm8>(workloadFactory,
7225 shape0, input0, 1.0f, 0,
7226 shape1, input1, 1.0f, 0,
7227 shape0, output, 1.0f, 0);
7230 LayerTestResult<float, 4> SubtractionTest(
7231 armnn::IWorkloadFactory& workloadFactory,
7232 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7234 const unsigned int shape0[] = { 1, 1, 2, 2 };
7235 const unsigned int shape1[] = { 1, 1, 2, 2 };
7237 std::vector<float> input0({ 1, 2, 3, 4 });
7238 std::vector<float> input1({ 1, -1, 0, 2 });
7239 std::vector<float> output({ 0, 3, 3, 2 });
7241 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
7243 shape0, input0, 1.0f, 0,
7244 shape1, input1, 1.0f, 0,
7245 shape0, output, 1.0f, 0);
7248 LayerTestResult<float, 4> SubtractionBroadcast1ElementTest(
7249 armnn::IWorkloadFactory& workloadFactory,
7250 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7252 const unsigned int shape0[] = { 1, 1, 2, 2 };
7253 const unsigned int shape1[] = { 1, 1, 1, 1 };
7255 std::vector<float> input0({ 1, 2, 3, 4 });
7256 std::vector<float> input1({ 10 });
7257 std::vector<float> output({ -9, -8, -7, -6 });
7259 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
7261 shape0, input0, 1.0f, 0,
7262 shape1, input1, 1.0f, 0,
7263 shape0, output, 1.0f, 0);
7266 LayerTestResult<float, 4> SubtractionBroadcastTest(
7267 armnn::IWorkloadFactory& workloadFactory,
7268 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7270 const unsigned int shape0[] = { 1, 1, 2, 2 };
7271 const unsigned int shape1[] = { 1, 1, 1, 2 };
7273 std::vector<float> input0({ 1, 2, 3, 4 });
7274 std::vector<float> input1({ 10, -5 });
7275 std::vector<float> output({ -9, 7, -7, 9 });
7277 return SubtractionTestHelper<armnn::DataType::Float32>(workloadFactory,
7279 shape0, input0, 1.0f, 0,
7280 shape1, input1, 1.0f, 0,
7281 shape0, output, 1.0f, 0);
7284 LayerTestResult<int16_t, 4> SubtractionInt16Test(
7285 armnn::IWorkloadFactory& workloadFactory,
7286 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7288 const unsigned int shape0[] = { 1, 1, 2, 2 };
7289 const unsigned int shape1[] = { 1, 1, 2, 2 };
7291 std::vector<int16_t> input0({ 10, 12, 14, 16 });
7292 std::vector<int16_t> input1({ 1, 2, 1, 2 });
7293 std::vector<int16_t> output({ 3, 3, 5, 5 });
7295 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7297 shape0, input0, 0.5f, 0,
7298 shape1, input1, 1.0f, 0,
7299 shape0, output, 1.0f, 0);
7302 LayerTestResult<int16_t, 4> SubtractionBroadcast1ElementInt16Test(
7303 armnn::IWorkloadFactory& workloadFactory,
7304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7306 const unsigned int shape0[] = { 1, 1, 2, 2 };
7307 const unsigned int shape1[] = { 1, 1, 1, 1 };
7309 std::vector<int16_t> input0({ 10, 12, 14, 16 });
7310 std::vector<int16_t> input1({ 2 });
7311 std::vector<int16_t> output({ 3, 4, 5, 6 });
7313 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7315 shape0, input0, 0.5f, 0,
7316 shape1, input1, 1.0f, 0,
7317 shape0, output, 1.0f, 0);
7320 LayerTestResult<int16_t, 4> SubtractionBroadcastInt16Test(
7321 armnn::IWorkloadFactory& workloadFactory,
7322 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7324 const unsigned int shape0[] = { 1, 1, 2, 2 };
7325 const unsigned int shape1[] = { 1, 1, 2, 1 };
7327 std::vector<int16_t> input0({ 10, 12, 14, 16 });
7328 std::vector<int16_t> input1({ 2, 1 });
7329 std::vector<int16_t> output({ 8, 11, 12, 15 });
7331 return SubtractionTestHelper<armnn::DataType::QuantisedSymm16>(workloadFactory,
7333 shape0, input0, 1.0f, 0,
7334 shape1, input1, 1.0f, 0,
7335 shape0, output, 1.0f, 0);
7338 LayerTestResult<uint8_t, 4> ResizeBilinearNopUint8Test(
7339 armnn::IWorkloadFactory& workloadFactory,
7340 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7342 constexpr unsigned int inputWidth = 4;
7343 constexpr unsigned int inputHeight = 4;
7344 constexpr unsigned int inputChannels = 1;
7345 constexpr unsigned int inputBatchSize = 1;
7347 constexpr unsigned int outputWidth = inputWidth;
7348 constexpr unsigned int outputHeight = inputHeight;
7349 constexpr unsigned int outputChannels = inputChannels;
7350 constexpr unsigned int outputBatchSize = inputBatchSize;
7352 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7353 armnn::DataType::QuantisedAsymm8);
7354 inputTensorInfo.SetQuantizationScale(1.5f);
7355 inputTensorInfo.SetQuantizationOffset(-3);
7357 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7358 armnn::DataType::QuantisedAsymm8);
7359 outputTensorInfo.SetQuantizationScale(1.5f);
7360 outputTensorInfo.SetQuantizationOffset(-3);
7362 auto input = MakeTensor<uint8_t, 4>(inputTensorInfo, std::vector<uint8_t>({
7369 LayerTestResult<uint8_t, 4> result(outputTensorInfo);
7370 result.outputExpected = input;
7372 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7373 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7375 armnn::ResizeBilinearQueueDescriptor descriptor;
7376 armnn::WorkloadInfo info;
7377 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7378 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7380 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
7382 inputHandle->Allocate();
7383 outputHandle->Allocate();
7384 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
7386 workload->PostAllocationConfigure();
7387 workload->Execute();
7389 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7393 LayerTestResult<uint8_t, 4> SimpleResizeBilinearUint8Test(
7394 armnn::IWorkloadFactory& workloadFactory,
7395 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7397 constexpr unsigned int inputWidth = 2;
7398 constexpr unsigned int inputHeight = 2;
7399 constexpr unsigned int inputChannels = 1;
7400 constexpr unsigned int inputBatchSize = 1;
7402 constexpr unsigned int outputWidth = inputWidth / 2;
7403 constexpr unsigned int outputHeight = inputHeight / 2;
7404 constexpr unsigned int outputChannels = inputChannels;
7405 constexpr unsigned int outputBatchSize = inputBatchSize;
7407 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7408 armnn::DataType::QuantisedAsymm8);
7409 inputTensorInfo.SetQuantizationScale(0.1567f);
7410 inputTensorInfo.SetQuantizationOffset(1);
7412 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7413 armnn::DataType::QuantisedAsymm8);
7414 outputTensorInfo.SetQuantizationScale(0.1567f);
7415 outputTensorInfo.SetQuantizationOffset(1);
7417 auto input = MakeTensor<uint8_t, 4>(inputTensorInfo, std::vector<uint8_t>({
7422 // The 'resize bilinear' operation projects the top-left corner of output texels into the input image,
7423 // then figures out the interpolants and weights. Note this is different to projecting the centre of the
7424 // output texel - and thus we'll expect the output 1x1 matrix to contain, as its single element, the value
7425 // that was at position (0,0) of the input matrix (rather than an average, which we would expect if projecting
7427 LayerTestResult<uint8_t, 4> result(outputTensorInfo);
7428 result.outputExpected = MakeTensor<uint8_t, 4>(outputTensorInfo, std::vector<uint8_t>({
7432 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7433 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7435 armnn::ResizeBilinearQueueDescriptor descriptor;
7436 armnn::WorkloadInfo info;
7437 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7438 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7440 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
7442 inputHandle->Allocate();
7443 outputHandle->Allocate();
7444 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
7446 workload->PostAllocationConfigure();
7447 workload->Execute();
7449 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7453 LayerTestResult<uint8_t, 4> ResizeBilinearSqMinUint8Test(
7454 armnn::IWorkloadFactory& workloadFactory,
7455 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7457 constexpr unsigned int inputWidth = 4;
7458 constexpr unsigned int inputHeight = 4;
7459 constexpr unsigned int inputChannels = 1;
7460 constexpr unsigned int inputBatchSize = 1;
7462 constexpr unsigned int outputWidth = inputWidth / 2;
7463 constexpr unsigned int outputHeight = inputHeight / 2;
7464 constexpr unsigned int outputChannels = inputChannels;
7465 constexpr unsigned int outputBatchSize = inputBatchSize;
7467 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7468 armnn::DataType::QuantisedAsymm8);
7469 inputTensorInfo.SetQuantizationScale(3.141592f);
7470 inputTensorInfo.SetQuantizationOffset(3);
7472 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7473 armnn::DataType::QuantisedAsymm8);
7474 outputTensorInfo.SetQuantizationScale(3.141592f);
7475 outputTensorInfo.SetQuantizationOffset(3);
7477 auto input = MakeTensor<uint8_t, 4>(inputTensorInfo, std::vector<uint8_t>({
7484 LayerTestResult<uint8_t, 4> result(outputTensorInfo);
7485 result.outputExpected = MakeTensor<uint8_t, 4>(outputTensorInfo, std::vector<uint8_t>({
7490 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7491 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7493 armnn::ResizeBilinearQueueDescriptor descriptor;
7494 armnn::WorkloadInfo info;
7495 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7496 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7498 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
7500 inputHandle->Allocate();
7501 outputHandle->Allocate();
7502 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
7504 workload->PostAllocationConfigure();
7505 workload->Execute();
7507 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7511 LayerTestResult<uint8_t, 4> ResizeBilinearMinUint8Test(
7512 armnn::IWorkloadFactory& workloadFactory,
7513 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7515 constexpr unsigned int inputWidth = 3;
7516 constexpr unsigned int inputHeight = 2;
7517 constexpr unsigned int inputChannels = 1;
7518 constexpr unsigned int inputBatchSize = 1;
7520 constexpr unsigned int outputWidth = 2;
7521 constexpr unsigned int outputHeight = 1;
7522 constexpr unsigned int outputChannels = inputChannels;
7523 constexpr unsigned int outputBatchSize = inputBatchSize;
7525 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7526 armnn::DataType::QuantisedAsymm8);
7527 inputTensorInfo.SetQuantizationScale(1.5f);
7528 inputTensorInfo.SetQuantizationOffset(-1);
7530 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7531 armnn::DataType::QuantisedAsymm8);
7532 outputTensorInfo.SetQuantizationScale(1.5f);
7533 outputTensorInfo.SetQuantizationOffset(-1);
7535 auto input = MakeTensor<uint8_t, 4>(inputTensorInfo, std::vector<uint8_t>({
7536 1, 2, 3, // 3.0, 4.5, 6.0
7537 5, 8, 13 // 9.0, 13.5, 21.0
7540 LayerTestResult<uint8_t, 4> result(outputTensorInfo);
7541 result.outputExpected = MakeTensor<uint8_t, 4>(outputTensorInfo, std::vector<uint8_t>({
7545 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7546 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7548 armnn::ResizeBilinearQueueDescriptor descriptor;
7549 armnn::WorkloadInfo info;
7550 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7551 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7553 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
7555 inputHandle->Allocate();
7556 outputHandle->Allocate();
7558 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
7560 workload->PostAllocationConfigure();
7561 workload->Execute();
7563 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7567 LayerTestResult<uint8_t, 4> ResizeBilinearMagUint8Test(
7568 armnn::IWorkloadFactory& workloadFactory,
7569 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7571 constexpr unsigned int inputWidth = 2;
7572 constexpr unsigned int inputHeight = 3;
7573 constexpr unsigned int inputChannels = 1;
7574 constexpr unsigned int inputBatchSize = 1;
7576 constexpr unsigned int outputWidth = 5;
7577 constexpr unsigned int outputHeight = 3;
7578 constexpr unsigned int outputChannels = inputChannels;
7579 constexpr unsigned int outputBatchSize = inputBatchSize;
7581 armnn::TensorInfo inputTensorInfo({ inputBatchSize, inputChannels, inputHeight, inputWidth },
7582 armnn::DataType::QuantisedAsymm8);
7583 inputTensorInfo.SetQuantizationScale(0.010765f);
7584 inputTensorInfo.SetQuantizationOffset(7);
7586 armnn::TensorInfo outputTensorInfo({ outputBatchSize, outputChannels, outputHeight, outputWidth },
7587 armnn::DataType::QuantisedAsymm8);
7588 outputTensorInfo.SetQuantizationScale(0.010132f);
7589 outputTensorInfo.SetQuantizationOffset(-18);
7591 auto input = MakeTensor<uint8_t, 4>(inputTensorInfo, std::vector<uint8_t>({
7592 24, 228, // 0.183005, 2.379065,
7593 105, 128, // 1.05497, 1.302565
7594 230, 71 // 2.400595, 0.68896
7597 LayerTestResult<uint8_t, 4> result(outputTensorInfo);
7598 result.outputExpected = MakeTensor<uint8_t, 4>(outputTensorInfo, std::vector<uint8_t>({
7599 0, 87, 173, 217, 217, // 0.18300501, 1.06142902, 1.93985295, 2.37906504, 2.37906504
7600 86, 96, 106, 111, 111, // 1.05497003, 1.15400803, 1.25304604, 1.30256498, 1.30256498
7601 219, 151, 84, 50, 50 // 2.40059495, 1.71594095, 1.03128707, 0.68896002, 0.68896002
7604 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7605 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7607 armnn::ResizeBilinearQueueDescriptor descriptor;
7608 armnn::WorkloadInfo info;
7609 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7610 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7612 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateResizeBilinear(descriptor, info);
7614 inputHandle->Allocate();
7615 outputHandle->Allocate();
7616 CopyDataToITensorHandle(inputHandle.get(), &input[0][0][0][0]);
7618 workload->PostAllocationConfigure();
7619 workload->Execute();
7621 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
7625 LayerTestResult<float, 2> Rsqrt2dTestCommon(
7626 armnn::IWorkloadFactory& workloadFactory,
7627 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
7628 const armnn::TensorInfo inputTensorInfo,
7629 const armnn::TensorInfo outputTensorInfo,
7630 std::vector<float> inputValues,
7631 std::vector<float> expectedOutputValues)
7633 auto inputTensor = MakeTensor<float, 2>(inputTensorInfo, std::vector<float>(inputValues));
7635 LayerTestResult<float, 2> result(outputTensorInfo);
7636 result.outputExpected = MakeTensor<float, 2>(outputTensorInfo, std::vector<float>(expectedOutputValues));
7638 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7639 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7641 armnn::RsqrtQueueDescriptor descriptor;
7643 armnn::WorkloadInfo info;
7645 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7646 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7648 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateRsqrt(descriptor, info);
7650 inputHandle->Allocate();
7651 outputHandle->Allocate();
7653 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0]);
7655 workload->PostAllocationConfigure();
7656 workload->Execute();
7658 CopyDataFromITensorHandle(&result.output[0][0], outputHandle.get());
7662 LayerTestResult<float, 2> Rsqrt2dTest(
7663 armnn::IWorkloadFactory& workloadFactory,
7664 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7666 const armnn::TensorShape inputShape{ 2, 2 };
7667 const armnn::TensorShape outputShape{ 2, 2 };
7669 const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32);
7670 const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32);
7672 std::vector<float> inputValues
7678 std::vector<float> expectedOutputValues
7684 return Rsqrt2dTestCommon(workloadFactory, memoryManager,
7685 inputTensorInfo, outputTensorInfo,
7686 inputValues, expectedOutputValues);
7689 LayerTestResult<float, 3> Rsqrt3dTest(
7690 armnn::IWorkloadFactory& workloadFactory,
7691 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7693 const armnn::TensorShape inputShape{ 3, 1, 2 };
7694 const armnn::TensorShape outputShape{ 3, 1, 2 };
7696 const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32);
7697 const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32);
7699 std::vector<float> inputValues
7705 std::vector<float> expectedOutputValues
7711 auto inputTensor = MakeTensor<float, 3>(inputTensorInfo, std::vector<float>(inputValues));
7713 LayerTestResult<float, 3> result(outputTensorInfo);
7714 result.outputExpected = MakeTensor<float, 3>(outputTensorInfo, std::vector<float >(expectedOutputValues));
7716 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
7717 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
7719 armnn::RsqrtQueueDescriptor descriptor;
7721 armnn::WorkloadInfo info;
7723 AddInputToWorkload(descriptor, info, inputTensorInfo, inputHandle.get());
7724 AddOutputToWorkload(descriptor, info, outputTensorInfo, outputHandle.get());
7726 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateRsqrt(descriptor, info);
7728 inputHandle->Allocate();
7729 outputHandle->Allocate();
7731 CopyDataToITensorHandle(inputHandle.get(), &inputTensor[0][0][0]);
7733 workload->PostAllocationConfigure();
7734 workload->Execute();
7736 CopyDataFromITensorHandle(&result.output[0][0][0], outputHandle.get());
7741 LayerTestResult<float, 2> RsqrtZeroTest(
7742 armnn::IWorkloadFactory& workloadFactory,
7743 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7745 const armnn::TensorShape inputShape{ 1, 2 };
7746 const armnn::TensorShape outputShape{ 1, 2 };
7748 const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32);
7749 const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32);
7751 std::vector<float> inputValues
7756 std::vector<float> expectedOutputValues
7761 return Rsqrt2dTestCommon(workloadFactory, memoryManager,
7762 inputTensorInfo, outputTensorInfo,
7763 inputValues, expectedOutputValues);
7766 LayerTestResult<float, 2> RsqrtNegativeTest(
7767 armnn::IWorkloadFactory& workloadFactory,
7768 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7770 const armnn::TensorShape inputShape{ 1, 2 };
7771 const armnn::TensorShape outputShape{ 1, 2 };
7773 const armnn::TensorInfo inputTensorInfo(inputShape, armnn::DataType::Float32);
7774 const armnn::TensorInfo outputTensorInfo(outputShape, armnn::DataType::Float32);
7776 std::vector<float> inputValues
7781 std::vector<float> expectedOutputValues
7786 return Rsqrt2dTestCommon(workloadFactory, memoryManager,
7787 inputTensorInfo, outputTensorInfo,
7788 inputValues, expectedOutputValues);
7791 LayerTestResult<float, 4> BatchNormTest(
7792 armnn::IWorkloadFactory& workloadFactory,
7793 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7800 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
7801 std::vector<float> inputValues
7803 // Batch 0, Channel 0, Height (3) x Width (2)
7808 // Batch 0, Channel 1, Height (3) x Width (2)
7813 std::vector<float> expectedOutputValues
7815 // Batch 0, Channel 0, Height (3) x Width (2)
7820 // Batch 0, Channel 1, Height (3) x Width (2)
7826 return BatchNormTestImpl<armnn::DataType::Float32>(
7827 workloadFactory, memoryManager,
7828 inputOutputShape, inputValues, expectedOutputValues,
7829 0.f, 0, armnn::DataLayout::NCHW);
7832 LayerTestResult<float, 4> BatchNormNhwcTest(
7833 armnn::IWorkloadFactory& workloadFactory,
7834 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7841 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
7842 std::vector<float> inputValues
7844 // Batch 0, Height 0, Width (2) x Channel (2)
7848 // Batch 0, Height 1, Width (2) x Channel (2)
7852 // Batch 0, Height 2, Width (2) x Channel (2)
7856 std::vector<float> expectedOutputValues
7858 // Batch 0, Height 0, Width (2) x Channel (2)
7862 // Batch 0, Height 1, Width (2) x Channel (2)
7866 // Batch 0, Height 2, Width (2) x Channel (2)
7871 return BatchNormTestImpl<armnn::DataType::Float32>(
7872 workloadFactory, memoryManager,
7873 inputOutputShape, inputValues, expectedOutputValues,
7874 0.f, 0, armnn::DataLayout::NHWC);
7877 LayerTestResult<uint8_t, 4> BatchNormUint8Test(
7878 armnn::IWorkloadFactory& workloadFactory,
7879 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7886 const armnn::TensorShape inputOutputShape{ 1, 2, 3, 2 };
7887 std::vector<float> inputValues
7889 // Batch 0, Channel 0, Height (3) x Width (2)
7894 // Batch 0, Channel 1, Height (3) x Width (2)
7899 std::vector<float> expectedOutputValues
7901 // Batch 0, Channel 0, Height (3) x Width (2)
7906 // Batch 0, Channel 1, Height (3) x Width (2)
7912 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>(
7913 workloadFactory, memoryManager,
7914 inputOutputShape, inputValues, expectedOutputValues,
7915 1.f/20.f, 50, armnn::DataLayout::NCHW);
7918 LayerTestResult<uint8_t, 4> BatchNormUint8NhwcTest(
7919 armnn::IWorkloadFactory& workloadFactory,
7920 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7927 const armnn::TensorShape inputOutputShape{ 1, 3, 2, 2 };
7928 std::vector<float> inputValues
7930 // Batch 0, Height 0, Width (2) x Channel (2)
7934 // Batch 0, Height 1, Width (2) x Channel (2)
7938 // Batch 0, Height 2, Width (2) x Channel (2)
7942 std::vector<float> expectedOutputValues
7944 // Batch 0, Height 0, Width (2) x Channel (2)
7948 // Batch 0, Height 1, Width (2) x Channel (2)
7952 // Batch 0, Height 2, Width (2) x Channel (2)
7957 return BatchNormTestImpl<armnn::DataType::QuantisedAsymm8>
7958 (workloadFactory, memoryManager,
7959 inputOutputShape, inputValues, expectedOutputValues,
7960 1.f/20.f, 50, armnn::DataLayout::NHWC);
7963 LayerTestResult<uint8_t, 4> ConstantUint8Test(
7964 armnn::IWorkloadFactory& workloadFactory,
7965 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7967 return ConstantTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 2e-6f, 1);
7970 LayerTestResult<uint8_t, 1> Concatenation1dUint8Test(
7971 armnn::IWorkloadFactory& workloadFactory,
7972 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7974 return Concatenation1dTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
7977 LayerTestResult<uint8_t, 2> Concatenation2dDim0Uint8Test(
7978 armnn::IWorkloadFactory& workloadFactory,
7979 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7981 return Concatenation2dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
7984 LayerTestResult<uint8_t, 2> Concatenation2dDim1Uint8Test(
7985 armnn::IWorkloadFactory& workloadFactory,
7986 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7988 return Concatenation2dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
7991 LayerTestResult<uint8_t, 2> Concatenation2dDim0DiffInputDimsUint8Test(
7992 armnn::IWorkloadFactory& workloadFactory,
7993 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
7995 return Concatenation2dDim0DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
7996 workloadFactory, memoryManager, 0.5f, -1);
7999 LayerTestResult<uint8_t, 2> Concatenation2dDim1DiffInputDimsUint8Test(
8000 armnn::IWorkloadFactory& workloadFactory,
8001 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8003 return Concatenation2dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8004 workloadFactory, memoryManager, 0.5f, -1);
8007 LayerTestResult<uint8_t, 3> Concatenation3dDim0Uint8Test(
8008 armnn::IWorkloadFactory& workloadFactory,
8009 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8011 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8014 LayerTestResult<uint8_t, 3> Concatenation3dDim1Uint8Test(
8015 armnn::IWorkloadFactory& workloadFactory,
8016 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8018 return Concatenation3dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8021 LayerTestResult<uint8_t, 3> Concatenation3dDim2Uint8Test(
8022 armnn::IWorkloadFactory& workloadFactory,
8023 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8026 return Concatenation3dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
8027 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
8030 LayerTestResult<uint8_t, 3> Concatenation3dDim0DiffInputDimsUint8Test(
8031 armnn::IWorkloadFactory& workloadFactory,
8032 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8034 return Concatenation3dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8037 LayerTestResult<uint8_t, 3> Concatenation3dDim1DiffInputDimsUint8Test(
8038 armnn::IWorkloadFactory& workloadFactory,
8039 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8041 return Concatenation3dDim1DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8042 workloadFactory, memoryManager, 0.5f, -1);
8045 LayerTestResult<uint8_t, 3> Concatenation3dDim2DiffInputDimsUint8Test(
8046 armnn::IWorkloadFactory& workloadFactory,
8047 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8050 return Concatenation3dDim2DiffInputDimsTestImpl<armnn::DataType::QuantisedAsymm8>(
8051 workloadFactory, memoryManager, useSubtensor, 0.5f, -1);
8054 LayerTestResult<uint8_t, 4> Concatenation4dDim0Uint8Test(
8055 armnn::IWorkloadFactory& workloadFactory,
8056 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8058 return Concatenation4dDim0TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8061 LayerTestResult<uint8_t, 4> Concatenation4dDim1Uint8Test(
8062 armnn::IWorkloadFactory& workloadFactory,
8063 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8065 return Concatenation4dDim1TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8068 LayerTestResult<uint8_t, 4> Concatenation4dDim2Uint8Test(
8069 armnn::IWorkloadFactory& workloadFactory,
8070 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8072 return Concatenation4dDim2TestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, 0.5f, -1);
8075 LayerTestResult<uint8_t, 4> Concatenation4dDim3Uint8Test(
8076 armnn::IWorkloadFactory& workloadFactory,
8077 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager, bool useSubtensor)
8079 return Concatenation4dDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
8080 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
8083 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim0Uint8Test(
8084 armnn::IWorkloadFactory& workloadFactory,
8085 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8087 return Concatenation4dDiffShapeDim0TestImpl<armnn::DataType::QuantisedAsymm8>(
8088 workloadFactory, memoryManager, 0.5f, -1);
8091 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim1Uint8Test(
8092 armnn::IWorkloadFactory& workloadFactory,
8093 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8095 return Concatenation4dDiffShapeDim1TestImpl<armnn::DataType::QuantisedAsymm8>(
8096 workloadFactory, memoryManager, 0.5f, -1);
8099 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim2Uint8Test(
8100 armnn::IWorkloadFactory& workloadFactory,
8101 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8103 return Concatenation4dDiffShapeDim2TestImpl<armnn::DataType::QuantisedAsymm8>(
8104 workloadFactory, memoryManager, 0.5f, -1);
8107 LayerTestResult<uint8_t, 4> Concatenation4dDiffShapeDim3Uint8Test(
8108 armnn::IWorkloadFactory& workloadFactory,
8109 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8112 return Concatenation4dDiffShapeDim3TestImpl<armnn::DataType::QuantisedAsymm8>(
8113 workloadFactory, memoryManager, 0.5f, -1, useSubtensor);
8116 LayerTestResult<float, 4> SimpleMaxPooling2dSize2x2Stride2x2Test(
8117 armnn::IWorkloadFactory& workloadFactory,
8118 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8119 bool forceNoPadding)
8121 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::Float32>(
8122 workloadFactory, memoryManager, forceNoPadding);
8125 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize2x2Stride2x2Uint8Test(
8126 armnn::IWorkloadFactory& workloadFactory,
8127 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8128 bool forceNoPadding)
8130 return SimpleMaxPooling2dSize2x2Stride2x2TestCommon<armnn::DataType::QuantisedAsymm8>(
8131 workloadFactory, memoryManager, forceNoPadding, 3.0f, -5);
8134 LayerTestResult<float, 4> SimpleMaxPooling2dSize3x3Stride2x4Test(
8135 armnn::IWorkloadFactory& workloadFactory,
8136 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8137 bool forceNoPadding)
8139 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::Float32>(
8140 workloadFactory, memoryManager, forceNoPadding);
8143 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dSize3x3Stride2x4Uint8Test(
8144 armnn::IWorkloadFactory& workloadFactory,
8145 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8146 bool forceNoPadding)
8148 return SimpleMaxPooling2dSize3x3Stride2x4TestCommon<armnn::DataType::QuantisedAsymm8>(
8149 workloadFactory, memoryManager, forceNoPadding, 0.1f, 128);
8152 LayerTestResult<float, 4> SimpleMaxPooling2dTest(
8153 armnn::IWorkloadFactory& workloadFactory,
8154 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8155 const armnn::DataLayout dataLayout)
8157 return SimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
8160 LayerTestResult<uint8_t, 4> SimpleMaxPooling2dUint8Test(
8161 armnn::IWorkloadFactory& workloadFactory,
8162 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8163 const armnn::DataLayout dataLayout)
8165 return SimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
8168 LayerTestResult<float, 4> SimpleAveragePooling2dTest(
8169 armnn::IWorkloadFactory& workloadFactory,
8170 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8171 const armnn::DataLayout dataLayout)
8173 return SimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
8176 LayerTestResult<uint8_t, 4> SimpleAveragePooling2dUint8Test(
8177 armnn::IWorkloadFactory& workloadFactory,
8178 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8179 const armnn::DataLayout dataLayout)
8181 return SimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
8182 workloadFactory, memoryManager, dataLayout, 0.5, -1);
8185 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3x2Stride2x2Test(
8186 armnn::IWorkloadFactory& workloadFactory,
8187 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8188 bool forceNoPadding)
8190 return IgnorePaddingAveragePooling2dSize3x2Stride2x2TestCommon<armnn::DataType::Float32>(
8191 workloadFactory, memoryManager, forceNoPadding);
8194 LayerTestResult<float, 4> LargeTensorsAveragePooling2dTest(
8195 armnn::IWorkloadFactory& workloadFactory,
8196 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8198 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8201 LayerTestResult<uint8_t, 4> LargeTensorsAveragePooling2dUint8Test(
8202 armnn::IWorkloadFactory& workloadFactory,
8203 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8205 return LargeTensorsAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
8206 workloadFactory, memoryManager, 0.5, -1);
8209 LayerTestResult<float, 4> SimpleL2Pooling2dTest(
8210 armnn::IWorkloadFactory& workloadFactory,
8211 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8212 const armnn::DataLayout dataLayout)
8214 return SimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, dataLayout);
8217 LayerTestResult<uint8_t, 4> SimpleL2Pooling2dUint8Test(
8218 armnn::IWorkloadFactory& workloadFactory,
8219 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8220 const armnn::DataLayout dataLayout)
8222 return SimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager, dataLayout);
8225 LayerTestResult<float, 4> L2Pooling2dSize3Stride1Test(
8226 armnn::IWorkloadFactory& workloadFactory,
8227 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8229 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8232 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride1Uint8Test(
8233 armnn::IWorkloadFactory& workloadFactory,
8234 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8236 return L2Pooling2dSize3Stride1TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8239 LayerTestResult<float, 4> L2Pooling2dSize3Stride3Test(
8240 armnn::IWorkloadFactory& workloadFactory,
8241 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8243 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8246 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride3Uint8Test(
8247 armnn::IWorkloadFactory& workloadFactory,
8248 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8250 return L2Pooling2dSize3Stride3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8253 LayerTestResult<float, 4> L2Pooling2dSize3Stride4Test(
8254 armnn::IWorkloadFactory& workloadFactory,
8255 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8257 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8260 LayerTestResult<uint8_t, 4> L2Pooling2dSize3Stride4Uint8Test(
8261 armnn::IWorkloadFactory& workloadFactory,
8262 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8264 return L2Pooling2dSize3Stride4TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8267 LayerTestResult<float, 4> L2Pooling2dSize7Test(
8268 armnn::IWorkloadFactory& workloadFactory,
8269 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8271 return L2Pooling2dSize7TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8274 LayerTestResult<uint8_t, 4> L2Pooling2dSize7Uint8Test(
8275 armnn::IWorkloadFactory& workloadFactory,
8276 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8278 return L2Pooling2dSize7TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8281 LayerTestResult<float, 4> L2Pooling2dSize9Test(
8282 armnn::IWorkloadFactory& workloadFactory,
8283 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8285 return L2Pooling2dSize9TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8288 LayerTestResult<uint8_t, 4> L2Pooling2dSize9Uint8Test(
8289 armnn::IWorkloadFactory& workloadFactory,
8290 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8292 return L2Pooling2dSize9TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8295 LayerTestResult<float, 4> AsymmetricNonSquarePooling2dTest(
8296 armnn::IWorkloadFactory& workloadFactory,
8297 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8299 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8302 LayerTestResult<uint8_t, 4> AsymmetricNonSquarePooling2dUint8Test(
8303 armnn::IWorkloadFactory& workloadFactory,
8304 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8306 return AsymmetricNonSquarePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8309 LayerTestResult<float, 4> ComparePooling2dTest(
8310 armnn::IWorkloadFactory& workloadFactory,
8311 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8312 armnn::IWorkloadFactory& refWorkloadFactory,
8313 armnn::PoolingAlgorithm poolingType)
8315 return ComparePooling2dTestCommon<armnn::DataType::Float32>(
8316 workloadFactory, memoryManager, refWorkloadFactory, poolingType);
8319 LayerTestResult<uint8_t, 4> ComparePooling2dUint8Test(
8320 armnn::IWorkloadFactory& workloadFactory,
8321 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8322 armnn::IWorkloadFactory& refWorkloadFactory,
8323 armnn::PoolingAlgorithm poolingType)
8325 return ComparePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
8326 workloadFactory, memoryManager, refWorkloadFactory, poolingType, 0.1f, 128);
8329 LayerTestResult<float, 2> FullyConnectedLargeTest(
8330 armnn::IWorkloadFactory& workloadFactory,
8331 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8332 bool transposeWeights)
8334 return FullyConnectedLargeTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager, transposeWeights);
8337 LayerTestResult<float, 4> IgnorePaddingSimpleMaxPooling2dTest(
8338 armnn::IWorkloadFactory& workloadFactory,
8339 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8341 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8344 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleMaxPooling2dUint8Test(
8345 armnn::IWorkloadFactory& workloadFactory,
8346 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8348 return IgnorePaddingSimpleMaxPooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
8349 workloadFactory, memoryManager, 1.0f, -5);
8352 LayerTestResult<float, 4> IgnorePaddingMaxPooling2dSize3Test(
8353 armnn::IWorkloadFactory& workloadFactory,
8354 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8356 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8359 LayerTestResult<uint8_t, 4> IgnorePaddingMaxPooling2dSize3Uint8Test(
8360 armnn::IWorkloadFactory& workloadFactory,
8361 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8363 return IgnorePaddingMaxPooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
8364 workloadFactory, memoryManager, 1.0f, -5);
8367 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dTest(
8368 armnn::IWorkloadFactory& workloadFactory,
8369 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8371 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8374 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dUint8Test(
8375 armnn::IWorkloadFactory& workloadFactory,
8376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8378 return IgnorePaddingSimpleAveragePooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(
8379 workloadFactory, memoryManager);
8382 LayerTestResult<float, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingTest(
8383 armnn::IWorkloadFactory& workloadFactory,
8384 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8386 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::Float32>(
8387 workloadFactory, memoryManager);
8390 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleAveragePooling2dNoPaddingUint8Test(
8391 armnn::IWorkloadFactory& workloadFactory,
8392 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8394 return IgnorePaddingSimpleAveragePooling2dNoPaddingTestCommon<armnn::DataType::QuantisedAsymm8>(
8395 workloadFactory, memoryManager);
8398 LayerTestResult<float, 4> IgnorePaddingAveragePooling2dSize3Test(
8399 armnn::IWorkloadFactory& workloadFactory,
8400 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8402 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8405 LayerTestResult<uint8_t, 4> IgnorePaddingAveragePooling2dSize3Uint8Test(
8406 armnn::IWorkloadFactory& workloadFactory,
8407 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8409 return IgnorePaddingAveragePooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(
8410 workloadFactory, memoryManager);
8413 LayerTestResult<float, 4> IgnorePaddingSimpleL2Pooling2dTest(
8414 armnn::IWorkloadFactory& workloadFactory,
8415 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8417 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8420 LayerTestResult<uint8_t, 4> IgnorePaddingSimpleL2Pooling2dUint8Test(
8421 armnn::IWorkloadFactory& workloadFactory,
8422 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8424 return IgnorePaddingSimpleL2Pooling2dTestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8427 LayerTestResult<float, 4> IgnorePaddingL2Pooling2dSize3Test(
8428 armnn::IWorkloadFactory& workloadFactory,
8429 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8431 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::Float32>(workloadFactory, memoryManager);
8434 LayerTestResult<uint8_t, 4> IgnorePaddingL2Pooling2dSize3Uint8Test(
8435 armnn::IWorkloadFactory& workloadFactory,
8436 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8438 return IgnorePaddingL2Pooling2dSize3TestCommon<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8441 LayerTestResult<float, 4> SimplePermuteFloat32Test(
8442 armnn::IWorkloadFactory& workloadFactory,
8443 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8445 return SimplePermuteFloat32TestCommon(workloadFactory, memoryManager);
8448 LayerTestResult<uint8_t, 4> SimplePermuteUint8Test(
8449 armnn::IWorkloadFactory& workloadFactory,
8450 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8452 return SimplePermuteUint8TestCommon(workloadFactory, memoryManager);
8455 LayerTestResult<float, 4> PermuteFloat32ValueSet1Test(
8456 armnn::IWorkloadFactory& workloadFactory,
8457 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8459 return PermuteFloat32ValueSet1TestCommon(workloadFactory, memoryManager);
8462 LayerTestResult<float, 4> PermuteFloat32ValueSet2Test(
8463 armnn::IWorkloadFactory& workloadFactory,
8464 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8466 return PermuteFloat32ValueSet2TestCommon(workloadFactory, memoryManager);
8469 LayerTestResult<float, 4> PermuteFloat32ValueSet3Test(
8470 armnn::IWorkloadFactory& workloadFactory,
8471 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8473 return PermuteFloat32ValueSet3TestCommon(workloadFactory, memoryManager);
8479 template <typename T, std::size_t InputDim, std::size_t OutputDim>
8480 LayerTestResult<T, OutputDim> MeanTestHelper(
8481 armnn::IWorkloadFactory& workloadFactory,
8482 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8483 const unsigned int* inputShape,
8484 const std::vector<T>& inputData,
8485 const std::vector<unsigned int>& axis,
8487 const unsigned int* outputShape,
8488 const std::vector<T>& outputData,
8492 auto dataType = (std::is_same<T, uint8_t>::value ? armnn::DataType::QuantisedAsymm8 : armnn::DataType::Float32);
8494 armnn::TensorInfo inputTensorInfo(InputDim, inputShape, dataType);
8495 armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, dataType);
8497 inputTensorInfo.SetQuantizationScale(scale);
8498 inputTensorInfo.SetQuantizationOffset(offset);
8500 outputTensorInfo.SetQuantizationScale(scale);
8501 outputTensorInfo.SetQuantizationOffset(offset);
8503 auto input = MakeTensor<T, InputDim>(inputTensorInfo, inputData);
8505 LayerTestResult<T, OutputDim> result(outputTensorInfo);
8506 result.outputExpected = MakeTensor<T, OutputDim>(outputTensorInfo, outputData);
8508 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
8509 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8511 armnn::MeanQueueDescriptor data;
8512 data.m_Parameters.m_Axis = axis;
8513 data.m_Parameters.m_KeepDims = keepDims;
8514 armnn::WorkloadInfo info;
8515 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
8516 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8518 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateMean(data, info);
8520 inputHandle->Allocate();
8521 outputHandle->Allocate();
8523 CopyDataToITensorHandle(inputHandle.get(), input.origin());
8525 workload->PostAllocationConfigure();
8526 workload->Execute();
8528 CopyDataFromITensorHandle(result.output.origin(), outputHandle.get());
8533 } // anonymous namespace
8535 LayerTestResult<uint8_t, 1> MeanUint8SimpleTest(
8536 armnn::IWorkloadFactory& workloadFactory,
8537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8539 const unsigned int inputShape[] = { 3, 2 };
8540 const unsigned int outputShape[] = { 1 };
8542 std::vector<uint8_t> input({ 1, 1, 2, 2, 3, 3 });
8543 std::vector<uint8_t> output({ 2 });
8545 return MeanTestHelper<uint8_t, 2, 1>(
8546 workloadFactory, memoryManager, inputShape, input, {}, false, outputShape, output);
8549 LayerTestResult<uint8_t, 3> MeanUint8SimpleAxisTest(
8550 armnn::IWorkloadFactory& workloadFactory,
8551 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8553 const unsigned int inputShape[] = { 1, 1, 3, 2 };
8554 const unsigned int outputShape[] = { 1, 1, 2 };
8556 std::vector<uint8_t> input({ 1, 1, 2, 2, 3, 3 });
8557 std::vector<uint8_t> output({ 2, 2 });
8559 return MeanTestHelper<uint8_t, 4, 3>(
8560 workloadFactory, memoryManager, inputShape, input, { 2 }, false, outputShape, output);
8563 LayerTestResult<uint8_t, 4> MeanUint8KeepDimsTest(
8564 armnn::IWorkloadFactory& workloadFactory,
8565 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8567 const unsigned int inputShape[] = { 1, 1, 3, 2 };
8568 const unsigned int outputShape[] = { 1, 1, 1, 2 };
8570 std::vector<uint8_t> input({ 1, 1, 2, 2, 3, 3 });
8571 std::vector<uint8_t> output({ 2, 2 });
8573 return MeanTestHelper<uint8_t, 4, 4>(
8574 workloadFactory, memoryManager, inputShape, input, { 2 }, true, outputShape, output);
8577 LayerTestResult<uint8_t, 4> MeanUint8MultipleDimsTest(
8578 armnn::IWorkloadFactory& workloadFactory,
8579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8581 const unsigned int inputShape[] = { 2, 3, 1, 2 };
8582 const unsigned int outputShape[] = { 1, 3, 1, 1 };
8584 std::vector<uint8_t> input({ 1, 2, 3, 4, 5, 6, 1, 2, 3, 4, 5, 6 });
8585 std::vector<uint8_t> output({ 1, 3, 5 });
8587 return MeanTestHelper<uint8_t, 4, 4>(
8588 workloadFactory, memoryManager, inputShape, input, { 0, 3 }, true, outputShape, output);
8591 LayerTestResult<uint8_t, 1> MeanVtsUint8Test(
8592 armnn::IWorkloadFactory& workloadFactory,
8593 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8595 const unsigned int inputShape[] = { 4, 3, 2 };
8596 const unsigned int outputShape[] = { 2 };
8598 std::vector<uint8_t> input({ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,
8600 std::vector<uint8_t> output({ 12, 13 });
8602 return MeanTestHelper<uint8_t, 3, 1>(workloadFactory, memoryManager,
8603 inputShape, input, { 0, 1 }, false, outputShape,
8607 LayerTestResult<float, 1> MeanFloatSimpleTest(
8608 armnn::IWorkloadFactory& workloadFactory,
8609 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8611 const unsigned int inputShape[] = { 3, 2 };
8612 const unsigned int outputShape[] = { 1 };
8614 std::vector<float> input({ 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f });
8615 std::vector<float> output({ 2.0f });
8617 return MeanTestHelper<float, 2, 1>(
8618 workloadFactory, memoryManager, inputShape, input, {}, false, outputShape, output);
8621 LayerTestResult<float, 3> MeanFloatSimpleAxisTest(
8622 armnn::IWorkloadFactory& workloadFactory,
8623 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8625 const unsigned int inputShape[] = { 2, 3, 1, 2 };
8626 const unsigned int outputShape[] = { 3, 1, 2 };
8628 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f });
8629 std::vector<float> output({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f });
8631 return MeanTestHelper<float, 4, 3>(
8632 workloadFactory, memoryManager, inputShape, input, { 0 }, false, outputShape, output);
8635 LayerTestResult<float, 4> MeanFloatKeepDimsTest(
8636 armnn::IWorkloadFactory& workloadFactory,
8637 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8639 const unsigned int inputShape[] = { 1, 1, 3, 2 };
8640 const unsigned int outputShape[] = { 1, 1, 1, 2 };
8642 std::vector<float> input({ 1.0f, 1.0f, 2.0f, 2.0f, 3.0f, 3.0f });
8643 std::vector<float> output({ 2.0f, 2.0f });
8645 return MeanTestHelper<float, 4, 4>(
8646 workloadFactory, memoryManager, inputShape, input, { 2 }, true, outputShape, output);
8649 LayerTestResult<float, 4> MeanFloatMultipleDimsTest(
8650 armnn::IWorkloadFactory& workloadFactory,
8651 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8653 const unsigned int inputShape[] = { 2, 3, 1, 2 };
8654 const unsigned int outputShape[] = { 1, 3, 1, 1 };
8656 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f });
8657 std::vector<float> output({ 1.5f, 3.5f, 5.5f });
8659 return MeanTestHelper<float, 4, 4>(
8660 workloadFactory, memoryManager, inputShape, input, { 0, 3 }, true, outputShape, output);
8663 LayerTestResult<float, 1> MeanVtsFloat1Test(
8664 armnn::IWorkloadFactory& workloadFactory,
8665 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8667 const unsigned int inputShape[] = { 4, 3, 2 };
8668 const unsigned int outputShape[] = { 2 };
8670 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
8671 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
8672 std::vector<float> output({ 12.0f, 13.0f });
8674 return MeanTestHelper<float, 3, 1>(
8675 workloadFactory, memoryManager, inputShape, input, { 0, 1 }, false, outputShape, output);
8678 LayerTestResult<float, 3> MeanVtsFloat2Test(
8679 armnn::IWorkloadFactory& workloadFactory,
8680 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8682 const unsigned int inputShape[] = { 4, 3, 2 };
8683 const unsigned int outputShape[] = { 1, 3, 1 };
8685 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f, 13.0f, 14.0f,
8686 15.0f, 16.0f, 17.0f, 18.0f, 19.0f, 20.0f, 21.0f, 22.0f, 23.0f, 24.0f });
8687 std::vector<float> output({ 10.5f, 12.5f, 14.5f });
8689 return MeanTestHelper<float, 3, 3>(
8690 workloadFactory, memoryManager, inputShape, input, { 0, 2 }, true, outputShape, output);
8693 LayerTestResult<float, 3> MeanVtsFloat3Test(
8694 armnn::IWorkloadFactory& workloadFactory,
8695 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8697 const unsigned int inputShape[] = { 1, 2, 2, 1 };
8698 const unsigned int outputShape[] = { 1, 2, 1 };
8700 std::vector<float> input({ 1.0f, 2.0f, 3.0f, 4.0f });
8701 std::vector<float> output({ 1.5f, 3.5f });
8703 return MeanTestHelper<float, 4, 3>(
8704 workloadFactory, memoryManager, inputShape, input, { 2 }, false, outputShape, output);
8707 LayerTestResult<float, 4> AdditionAfterMaxPoolTest(
8708 armnn::IWorkloadFactory& workloadFactory,
8709 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8711 // Create Initial Tensor
8716 armnn::TensorInfo poolingInputTensorInfo({ 1, 1, 3, 3}, armnn::DataType::Float32);
8717 armnn::TensorInfo poolingOutputTensorInfo({ 1, 1, 2, 2}, armnn::DataType::Float32);
8719 boost::multi_array<float, 4> poolingInput = MakeTensor<float,4>(poolingInputTensorInfo,
8725 std::unique_ptr<armnn::ITensorHandle> poolingInputHandle =
8726 workloadFactory.CreateTensorHandle(poolingInputTensorInfo);
8727 std::unique_ptr<armnn::ITensorHandle> poolingOutputHandle =
8728 workloadFactory.CreateTensorHandle(poolingOutputTensorInfo);
8730 // Apply MaxPool poolSize = 1x1, stride=2x2
8734 armnn::Pooling2dDescriptor descriptor;
8735 descriptor.m_PoolHeight = 1;
8736 descriptor.m_PoolWidth = 1;
8737 descriptor.m_StrideX = 2;
8738 descriptor.m_StrideY = 2;
8739 descriptor.m_PoolType = armnn::PoolingAlgorithm::Max;
8741 armnn::Pooling2dQueueDescriptor queueDescriptor;
8742 queueDescriptor.m_Parameters = descriptor;
8743 armnn::WorkloadInfo workloadInfo;
8744 AddInputToWorkload(queueDescriptor, workloadInfo, poolingInputTensorInfo, poolingInputHandle.get());
8745 AddOutputToWorkload(queueDescriptor, workloadInfo, poolingOutputTensorInfo, poolingOutputHandle.get());
8747 // Create the MaxPool
8748 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreatePooling2d(queueDescriptor, workloadInfo);
8750 //LayerTestResult<float, 4> result(poolingOutputTensorInfo);
8751 auto shape( GetTensorShapeAsArray<4>(poolingOutputTensorInfo));
8752 boost::multi_array<float, 4> resultMaxPool;
8753 resultMaxPool.resize(shape);
8756 // Create addition with another tensor the same size
8757 // This would be the result to apply a Conv2d with kernel ones(2) and stride 1x1
8758 // with the initial tensor.
8762 armnn::TensorInfo addInputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
8763 armnn::TensorInfo addOutputTensorInfo({ 1,1,2,2}, armnn::DataType::Float32);
8765 boost::multi_array<float, 4> addInput = MakeTensor<float,4>(addInputTensorInfo,
8770 // Expected output tensor after MaxPool and Addition.
8771 LayerTestResult<float,4> addRet(addOutputTensorInfo);
8772 addRet.outputExpected = MakeTensor<float, 4>(addOutputTensorInfo, std::vector<float>(
8778 std::unique_ptr<armnn::ITensorHandle> addInputHandle = workloadFactory.CreateTensorHandle(addInputTensorInfo);
8779 std::unique_ptr<armnn::ITensorHandle> addOutputHandle = workloadFactory.CreateTensorHandle(addOutputTensorInfo);
8781 armnn::AdditionQueueDescriptor data;
8782 armnn::WorkloadInfo info;
8784 // Add the output of the MaxPool and the new tensor
8785 AddInputToWorkload(data, info, poolingOutputTensorInfo, poolingOutputHandle.get());
8786 AddInputToWorkload(data, info, addInputTensorInfo, addInputHandle.get());
8787 AddOutputToWorkload(data, info, addOutputTensorInfo, addOutputHandle.get());
8789 std::unique_ptr<armnn::IWorkload> addWorkload = workloadFactory.CreateAddition(data, info);
8791 poolingInputHandle->Allocate();
8792 poolingOutputHandle->Allocate();
8793 addInputHandle->Allocate();
8794 addOutputHandle->Allocate();
8796 CopyDataToITensorHandle(poolingInputHandle.get(), &poolingInput[0][0][0][0]);
8797 CopyDataFromITensorHandle(&resultMaxPool[0][0][0][0], poolingOutputHandle.get());
8799 CopyDataToITensorHandle(poolingOutputHandle.get(), &resultMaxPool[0][0][0][0]);
8800 CopyDataToITensorHandle(addInputHandle.get(), &addInput[0][0][0][0]);
8802 workload->PostAllocationConfigure();
8803 workload->Execute();
8804 addWorkload->PostAllocationConfigure();
8805 addWorkload->Execute();
8807 CopyDataFromITensorHandle(&addRet.output[0][0][0][0], addOutputHandle.get());
8812 LayerTestResult<float, 4> SpaceToBatchNdSimpleFloat32Test(
8813 armnn::IWorkloadFactory& workloadFactory,
8814 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8816 return SpaceToBatchNdSimpleTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8819 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsFloat32Test(
8820 armnn::IWorkloadFactory& workloadFactory,
8821 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8823 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8826 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockFloat32Test(
8827 armnn::IWorkloadFactory& workloadFactory,
8828 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8830 return SpaceToBatchNdMultiBlockTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8833 LayerTestResult<float, 4> SpaceToBatchNdPaddingFloat32Test(
8834 armnn::IWorkloadFactory& workloadFactory,
8835 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8837 return SpaceToBatchNdPaddingTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8840 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleUint8Test(
8841 armnn::IWorkloadFactory& workloadFactory,
8842 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8844 return SpaceToBatchNdSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8847 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsUint8Test(
8848 armnn::IWorkloadFactory& workloadFactory,
8849 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8851 return SpaceToBatchNdMultiChannelsTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8854 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockUint8Test(
8855 armnn::IWorkloadFactory& workloadFactory,
8856 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8858 return SpaceToBatchNdMultiBlockTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8861 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingUint8Test(
8862 armnn::IWorkloadFactory& workloadFactory,
8863 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8865 return SpaceToBatchNdPaddingTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8868 LayerTestResult<float, 4> SpaceToBatchNdSimpleNHWCFloat32Test(
8869 armnn::IWorkloadFactory& workloadFactory,
8870 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8872 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8875 LayerTestResult<float, 4> SpaceToBatchNdMultiChannelsNHWCFloat32Test(
8876 armnn::IWorkloadFactory& workloadFactory,
8877 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8879 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8882 LayerTestResult<float, 4> SpaceToBatchNdMultiBlockNHWCFloat32Test(
8883 armnn::IWorkloadFactory& workloadFactory,
8884 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8886 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8889 LayerTestResult<float, 4> SpaceToBatchNdPaddingNHWCFloat32Test(
8890 armnn::IWorkloadFactory& workloadFactory,
8891 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8893 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
8896 LayerTestResult<uint8_t, 4> SpaceToBatchNdSimpleNHWCUint8Test(
8897 armnn::IWorkloadFactory& workloadFactory,
8898 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8900 return SpaceToBatchNdSimpleNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8903 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiChannelsNHWCUint8Test(
8904 armnn::IWorkloadFactory& workloadFactory,
8905 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8907 return SpaceToBatchNdMultiChannelsNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8910 LayerTestResult<uint8_t, 4> SpaceToBatchNdMultiBlockNHWCUint8Test(
8911 armnn::IWorkloadFactory& workloadFactory,
8912 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8914 return SpaceToBatchNdMultiBlockNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8917 LayerTestResult<uint8_t, 4> SpaceToBatchNdPaddingNHWCUint8Test(
8918 armnn::IWorkloadFactory& workloadFactory,
8919 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8921 return SpaceToBatchNdPaddingNHWCTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
8926 template<typename T, std::size_t InputDim, std::size_t OutputDim>
8927 LayerTestResult<T, OutputDim> BatchToSpaceNdHelper(
8928 armnn::IWorkloadFactory &workloadFactory,
8929 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager,
8930 const armnn::DataLayout& dataLayout,
8931 const unsigned int *inputShape,
8932 const std::vector<T> &inputData,
8933 const std::vector<unsigned int> &blockShape,
8934 const std::vector<std::pair<unsigned int, unsigned int>> &crops,
8935 const unsigned int *outputShape,
8936 const std::vector<T> &outputData,
8940 auto dataType = (std::is_same<T, uint8_t>::value ? armnn::DataType::QuantisedAsymm8 : armnn::DataType::Float32);
8942 armnn::TensorInfo inputTensorInfo(InputDim, inputShape, dataType);
8943 armnn::TensorInfo outputTensorInfo(OutputDim, outputShape, dataType);
8945 inputTensorInfo.SetQuantizationScale(scale);
8946 inputTensorInfo.SetQuantizationOffset(offset);
8948 outputTensorInfo.SetQuantizationScale(scale);
8949 outputTensorInfo.SetQuantizationOffset(offset);
8951 auto input = MakeTensor<T, InputDim>(inputTensorInfo, inputData);
8953 LayerTestResult<T, OutputDim> result(outputTensorInfo);
8954 result.outputExpected = MakeTensor<T, OutputDim>(outputTensorInfo, outputData);
8956 std::unique_ptr<armnn::ITensorHandle> inputHandle = workloadFactory.CreateTensorHandle(inputTensorInfo);
8957 std::unique_ptr<armnn::ITensorHandle> outputHandle = workloadFactory.CreateTensorHandle(outputTensorInfo);
8959 armnn::BatchToSpaceNdQueueDescriptor data;
8960 data.m_Parameters.m_DataLayout = dataLayout;
8961 data.m_Parameters.m_BlockShape = blockShape;
8962 data.m_Parameters.m_Crops = crops;
8963 armnn::WorkloadInfo info;
8964 AddInputToWorkload(data, info, inputTensorInfo, inputHandle.get());
8965 AddOutputToWorkload(data, info, outputTensorInfo, outputHandle.get());
8967 std::unique_ptr<armnn::IWorkload> workload = workloadFactory.CreateBatchToSpaceNd(data, info);
8969 inputHandle->Allocate();
8970 outputHandle->Allocate();
8972 CopyDataToITensorHandle(inputHandle.get(), input.origin());
8974 workload->PostAllocationConfigure();
8975 workload->Execute();
8977 CopyDataFromITensorHandle(&result.output[0][0][0][0], outputHandle.get());
8982 } // anonymous namespace
8984 LayerTestResult<float, 4> BatchToSpaceNdNhwcFloat32Test1(
8985 armnn::IWorkloadFactory& workloadFactory,
8986 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
8988 const unsigned int inputShape[] = {4, 2, 2, 1};
8989 const unsigned int outputShape[] = {1, 4, 4, 1};
8991 std::vector<float> input({
8992 // Batch 0, Height 0, Width (2) x Channel (1)
8994 // Batch 0, Height 1, Width (2) x Channel (1)
8998 // Batch 1, Height 0, Width (2) x Channel (1)
9000 // Batch 1, Height 1, Width (2) x Channel (1)
9004 // Batch 2, Height 0, Width (2) x Channel (1)
9006 // Batch 2, Height 1, Width (2) x Channel (1)
9009 // Batch 3, Height 0, Width (2) x Channel (3)
9011 // Batch 3, Height 1, Width (2) x Channel (1)
9015 std::vector<float> expectedOutput({
9016 1.0f, 2.0f, 3.0f, 4.0f,
9017 5.0f, 6.0f, 7.0f, 8.0f,
9018 9.0f, 10.0f, 11.0f, 12.0f,
9019 13.0f, 14.0f, 15.0f, 16.0f
9022 std::vector<unsigned int> blockShape {2, 2};
9023 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9025 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9026 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9027 crops, outputShape, expectedOutput);
9030 LayerTestResult<float, 4> BatchToSpaceNdNhwcFloat32Test2(
9031 armnn::IWorkloadFactory& workloadFactory,
9032 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9034 const unsigned int inputShape[] = {4, 1, 1, 1};
9035 const unsigned int outputShape[] = {1, 2, 2, 1};
9037 std::vector<float> input({
9038 // Batch 0, Height 0, Width (2) x Channel (1)
9039 1.0f, 2.0f, 3.0f, 4.0f
9042 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f});
9044 std::vector<unsigned int> blockShape({2, 2});
9045 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9047 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9048 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9049 crops, outputShape, expectedOutput);
9052 LayerTestResult<float, 4> BatchToSpaceNdNhwcFloat32Test3(
9053 armnn::IWorkloadFactory& workloadFactory,
9054 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9056 const unsigned int inputShape[] = {4, 1, 1, 3};
9057 const unsigned int outputShape[] = {1, 2, 2, 3};
9059 std::vector<float> input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
9061 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
9063 std::vector<unsigned int> blockShape({2, 2});
9064 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9066 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9067 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9068 crops, outputShape, expectedOutput);
9071 LayerTestResult<float, 4> BatchToSpaceNdNhwcFloat32Test4(
9072 armnn::IWorkloadFactory& workloadFactory,
9073 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9075 const unsigned int inputShape[] = {8, 1, 3, 1};
9076 const unsigned int outputShape[] = {2, 2, 4, 1};
9078 std::vector<float> input({
9089 std::vector<float> expectedOutput({
9090 1.0f, 2.0f, 3.0f, 4.0f,
9091 5.0f, 6.0f, 7.0f, 8.0f,
9092 9.0f, 10.0f, 11.0f, 12.0f,
9093 13.0f, 14.0f, 15.0f, 16.0f
9096 std::vector<unsigned int> blockShape({2, 2});
9097 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {2, 0}};
9099 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9100 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9101 crops, outputShape, expectedOutput);
9104 LayerTestResult<float, 4> BatchToSpaceNdNchwFloat32Test1(
9105 armnn::IWorkloadFactory &workloadFactory,
9106 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9108 const unsigned int inputShape[] = {4, 3, 1, 1};
9109 const unsigned int outputShape[] = {1, 3, 2, 2};
9111 std::vector<float> input({1.0f, 2.0f, 3.0f, 4.0f, 5.0f, 6.0f, 7.0f, 8.0f, 9.0f, 10.0f, 11.0f, 12.0f});
9113 std::vector<float> expectedOutput({
9114 // Batch 0, Channel 0, Height (2) x Width (2)
9118 // Batch 0, Channel 1, Height (2) x Width (2)
9122 // Batch 0, Channel 2, Height (2) x Width (2)
9127 std::vector<unsigned int> blockShape({2, 2});
9128 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9130 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9131 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9132 crops, outputShape, expectedOutput);
9135 LayerTestResult<float, 4> BatchToSpaceNdNchwFloat32Test2(
9136 armnn::IWorkloadFactory& workloadFactory,
9137 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9139 const unsigned int inputShape[] = {4, 1, 1, 1};
9140 const unsigned int outputShape[] = {1, 1, 2, 2};
9142 std::vector<float> input({
9143 // Batch 0, Height 0, Width (2) x Channel (1)
9144 1.0f, 2.0f, 3.0f, 4.0f
9147 std::vector<float> expectedOutput({1.0f, 2.0f, 3.0f, 4.0f});
9149 std::vector<unsigned int> blockShape({2, 2});
9150 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9152 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9153 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9154 crops, outputShape, expectedOutput);
9157 LayerTestResult<float, 4> BatchToSpaceNdNchwFloat32Test3(
9158 armnn::IWorkloadFactory& workloadFactory,
9159 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9161 const unsigned int inputShape[] = {4, 3, 1, 1};
9162 const unsigned int outputShape[] = {1, 3, 2, 2};
9164 std::vector<float> input({1.0f, 3.0f, 5.0f, 7.0f, 9.0f, 11.0f, 2.0f, 4.0f, 6.0f, 8.0f, 10.0f, 12.0f});
9166 std::vector<float> expectedOutput({
9167 // Batch 0, Channel 0, Height (2) x Width (2)
9171 // Batch 0, Channel 1, Height (2) x Width (2)
9175 // Batch 0, Channel 2, Height (2) x Width (2)
9180 std::vector<unsigned int> blockShape({2, 2});
9181 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9183 return BatchToSpaceNdHelper<float, 4, 4>(workloadFactory, memoryManager,
9184 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9185 crops, outputShape, expectedOutput);
9188 LayerTestResult<uint8_t, 4> BatchToSpaceNdNhwcUintTest1(
9189 armnn::IWorkloadFactory& workloadFactory,
9190 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9192 const unsigned int inputShape[] = {4, 2, 2, 1};
9193 const unsigned int outputShape[] = {1, 4, 4, 1};
9195 std::vector<uint8_t> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16});
9196 std::vector<uint8_t> expectedOutput({1, 5, 2, 6, 9, 13, 10, 14, 3, 7, 4, 8, 11, 15, 12, 16});
9198 std::vector<unsigned int> blockShape({2, 2});
9199 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9201 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager, armnn::DataLayout::NHWC, inputShape,
9202 input, blockShape, crops, outputShape, expectedOutput);
9205 LayerTestResult<uint8_t, 4> BatchToSpaceNdNhwcUintTest2(
9206 armnn::IWorkloadFactory& workloadFactory,
9207 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9209 const unsigned int inputShape[] = {4, 1, 1, 1};
9210 const unsigned int outputShape[] = {1, 2, 2, 1};
9212 std::vector<uint8_t> input({
9213 // Batch 0, Height 0, Width (2) x Channel (1)
9217 std::vector<uint8_t> expectedOutput({1, 2, 3, 4});
9219 std::vector<unsigned int> blockShape({2, 2});
9220 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9222 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9223 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9224 crops, outputShape, expectedOutput);
9227 LayerTestResult<uint8_t, 4> BatchToSpaceNdNhwcUintTest3(
9228 armnn::IWorkloadFactory& workloadFactory,
9229 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9231 const unsigned int inputShape[] = {4, 1, 1, 3};
9232 const unsigned int outputShape[] = {1, 2, 2, 3};
9234 std::vector<uint8_t> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
9236 std::vector<uint8_t> expectedOutput({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
9238 std::vector<unsigned int> blockShape({2, 2});
9239 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9241 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9242 armnn::DataLayout::NHWC, inputShape, input, blockShape,
9243 crops, outputShape, expectedOutput);
9247 LayerTestResult<uint8_t, 4> BatchToSpaceNdNchwUintTest1(
9248 armnn::IWorkloadFactory &workloadFactory,
9249 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9251 const unsigned int inputShape[] = {4, 3, 1, 1};
9252 const unsigned int outputShape[] = {1, 3, 2, 2};
9254 std::vector<uint8_t> input({1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12});
9256 std::vector<uint8_t> expectedOutput({
9257 // Batch 0, Channel 0, Height (2) x Width (2)
9261 // Batch 0, Channel 1, Height (2) x Width (2)
9265 // Batch 0, Channel 2, Height (2) x Width (2)
9270 std::vector<unsigned int> blockShape({2, 2});
9271 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9273 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9274 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9275 crops, outputShape, expectedOutput);
9278 LayerTestResult<uint8_t, 4> BatchToSpaceNdNchwUintTest2(
9279 armnn::IWorkloadFactory& workloadFactory,
9280 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9282 const unsigned int inputShape[] = {4, 1, 1, 1};
9283 const unsigned int outputShape[] = {1, 1, 2, 2};
9285 std::vector<uint8_t> input({
9286 // Batch 0, Height 0, Width (2) x Channel (1)
9290 std::vector<uint8_t> expectedOutput({1, 2, 3, 4});
9292 std::vector<unsigned int> blockShape({2, 2});
9293 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9295 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9296 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9297 crops, outputShape, expectedOutput);
9300 LayerTestResult<uint8_t, 4> BatchToSpaceNdNchwUintTest3(
9301 armnn::IWorkloadFactory& workloadFactory,
9302 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9304 const unsigned int inputShape[] = {4, 3, 1, 1};
9305 const unsigned int outputShape[] = {1, 3, 2, 2};
9307 std::vector<uint8_t> input({1, 3, 5, 7, 9, 11, 2, 4, 6, 8, 10, 12});
9309 std::vector<uint8_t> expectedOutput({
9310 // Batch 0, Channel 0, Height (2) x Width (2)
9314 // Batch 0, Channel 1, Height (2) x Width (2)
9318 // Batch 0, Channel 2, Height (2) x Width (2)
9323 std::vector<unsigned int> blockShape({2, 2});
9324 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {0, 0}};
9326 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9327 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9328 crops, outputShape, expectedOutput);
9331 LayerTestResult<uint8_t, 4> BatchToSpaceNdNchwUintTest4(
9332 armnn::IWorkloadFactory& workloadFactory,
9333 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9335 const unsigned int inputShape[] = {8, 1, 1, 3};
9336 const unsigned int outputShape[] = {2, 1, 2, 4};
9338 std::vector<uint8_t> input({
9345 std::vector<uint8_t> expectedOutput({
9352 std::vector<unsigned int> blockShape({2, 2});
9353 std::vector<std::pair<unsigned int, unsigned int>> crops = {{0, 0}, {2, 0}};
9355 return BatchToSpaceNdHelper<uint8_t, 4, 4>(workloadFactory, memoryManager,
9356 armnn::DataLayout::NCHW, inputShape, input, blockShape,
9357 crops, outputShape, expectedOutput);
9360 LayerTestResult<float, 4> StridedSlice4DFloat32Test(
9361 armnn::IWorkloadFactory& workloadFactory,
9362 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9364 return StridedSlice4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9367 LayerTestResult<float, 4> StridedSlice4DReverseFloat32Test(
9368 armnn::IWorkloadFactory& workloadFactory,
9369 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9371 return StridedSlice4DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9374 LayerTestResult<float, 4> StridedSliceSimpleStrideFloat32Test(
9375 armnn::IWorkloadFactory& workloadFactory,
9376 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9378 return StridedSliceSimpleStrideTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9381 LayerTestResult<float, 4> StridedSliceSimpleRangeMaskFloat32Test(
9382 armnn::IWorkloadFactory& workloadFactory,
9383 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9385 return StridedSliceSimpleRangeMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9388 LayerTestResult<float, 2> StridedSliceShrinkAxisMaskFloat32Test(
9389 armnn::IWorkloadFactory& workloadFactory,
9390 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9392 return StridedSliceShrinkAxisMaskTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9395 LayerTestResult<float, 3> StridedSlice3DFloat32Test(
9396 armnn::IWorkloadFactory& workloadFactory,
9397 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9399 return StridedSlice3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9402 LayerTestResult<float, 3> StridedSlice3DReverseFloat32Test(
9403 armnn::IWorkloadFactory& workloadFactory,
9404 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9406 return StridedSlice3DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9409 LayerTestResult<float, 2> StridedSlice2DFloat32Test(
9410 armnn::IWorkloadFactory& workloadFactory,
9411 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9413 return StridedSlice2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9416 LayerTestResult<float, 2> StridedSlice2DReverseFloat32Test(
9417 armnn::IWorkloadFactory& workloadFactory,
9418 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9420 return StridedSlice2DReverseTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9423 LayerTestResult<uint8_t, 4> StridedSlice4DUint8Test(
9424 armnn::IWorkloadFactory& workloadFactory,
9425 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9427 return StridedSlice4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9430 LayerTestResult<uint8_t, 4> StridedSlice4DReverseUint8Test(
9431 armnn::IWorkloadFactory& workloadFactory,
9432 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9434 return StridedSlice4DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9437 LayerTestResult<uint8_t, 4> StridedSliceSimpleStrideUint8Test(
9438 armnn::IWorkloadFactory& workloadFactory,
9439 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9441 return StridedSliceSimpleStrideTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9444 LayerTestResult<uint8_t, 4> StridedSliceSimpleRangeMaskUint8Test(
9445 armnn::IWorkloadFactory& workloadFactory,
9446 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9448 return StridedSliceSimpleRangeMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9451 LayerTestResult<uint8_t, 2> StridedSliceShrinkAxisMaskUint8Test(
9452 armnn::IWorkloadFactory& workloadFactory,
9453 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9455 return StridedSliceShrinkAxisMaskTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9458 LayerTestResult<uint8_t, 3> StridedSlice3DUint8Test(
9459 armnn::IWorkloadFactory& workloadFactory,
9460 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9462 return StridedSlice3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9465 LayerTestResult<uint8_t, 3> StridedSlice3DReverseUint8Test(
9466 armnn::IWorkloadFactory& workloadFactory,
9467 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9469 return StridedSlice3DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9472 LayerTestResult<uint8_t, 2> StridedSlice2DUint8Test(
9473 armnn::IWorkloadFactory& workloadFactory,
9474 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9476 return StridedSlice2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9479 LayerTestResult<uint8_t, 2> StridedSlice2DReverseUint8Test(
9480 armnn::IWorkloadFactory& workloadFactory,
9481 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9483 return StridedSlice2DReverseTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9486 LayerTestResult<float, 4> Debug4DFloat32Test(
9487 armnn::IWorkloadFactory& workloadFactory,
9488 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9490 return Debug4DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9493 LayerTestResult<float, 3> Debug3DFloat32Test(
9494 armnn::IWorkloadFactory& workloadFactory,
9495 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9497 return Debug3DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9500 LayerTestResult<float, 2> Debug2DFloat32Test(
9501 armnn::IWorkloadFactory& workloadFactory,
9502 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9504 return Debug2DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9507 LayerTestResult<float, 1> Debug1DFloat32Test(
9508 armnn::IWorkloadFactory& workloadFactory,
9509 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9511 return Debug1DTest<armnn::DataType::Float32>(workloadFactory, memoryManager);
9514 LayerTestResult<uint8_t, 4> Debug4DUint8Test(
9515 armnn::IWorkloadFactory& workloadFactory,
9516 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9518 return Debug4DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9521 LayerTestResult<uint8_t, 3> Debug3DUint8Test(
9522 armnn::IWorkloadFactory& workloadFactory,
9523 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9525 return Debug3DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9528 LayerTestResult<uint8_t, 2> Debug2DUint8Test(
9529 armnn::IWorkloadFactory& workloadFactory,
9530 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9532 return Debug2DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9535 LayerTestResult<uint8_t, 1> Debug1DUint8Test(
9536 armnn::IWorkloadFactory& workloadFactory,
9537 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9539 return Debug1DTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9542 LayerTestResult<float, 1> Gather1DParamsFloatTest(
9543 armnn::IWorkloadFactory& workloadFactory,
9544 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9546 return Gather1DParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
9549 LayerTestResult<uint8_t, 1> Gather1DParamsUint8Test(
9550 armnn::IWorkloadFactory& workloadFactory,
9551 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9553 return Gather1DParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9556 LayerTestResult<float, 2> GatherMultiDimParamsFloatTest(
9557 armnn::IWorkloadFactory& workloadFactory,
9558 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9560 return GatherMultiDimParamsTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
9563 LayerTestResult<uint8_t, 2> GatherMultiDimParamsUint8Test(
9564 armnn::IWorkloadFactory& workloadFactory,
9565 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9567 return GatherMultiDimParamsTestImpl<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9570 LayerTestResult<float, 4> GatherMultiDimParamsMultiDimIndicesFloatTest(
9571 armnn::IWorkloadFactory& workloadFactory,
9572 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9574 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::Float32>(workloadFactory, memoryManager);
9577 LayerTestResult<uint8_t, 4> GatherMultiDimParamsMultiDimIndicesUint8Test(
9578 armnn::IWorkloadFactory& workloadFactory,
9579 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9581 return GatherMultiDimParamsMultiDimIndicesTestImpl<armnn::DataType::QuantisedAsymm8>(
9582 workloadFactory, memoryManager);
9585 LayerTestResult<float, 4> DequantizeSimpleUint8Test(
9586 armnn::IWorkloadFactory& workloadFactory,
9587 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9589 return DequantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9592 LayerTestResult<float, 4> DequantizeOffsetUint8Test(
9593 armnn::IWorkloadFactory& workloadFactory,
9594 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9596 return DequantizeOffsetTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9599 LayerTestResult<float, 4> DequantizeSimpleInt16Test(
9600 armnn::IWorkloadFactory& workloadFactory,
9601 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9603 return DequantizeSimpleTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);
9606 LayerTestResult<uint8_t, 4> QuantizeSimpleUint8Test(
9607 armnn::IWorkloadFactory& workloadFactory,
9608 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9610 return QuantizeSimpleTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9613 LayerTestResult<uint8_t, 4> QuantizeClampUint8Test(
9614 armnn::IWorkloadFactory& workloadFactory,
9615 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9617 return QuantizeClampTest<armnn::DataType::QuantisedAsymm8>(workloadFactory, memoryManager);
9620 LayerTestResult<int16_t, 4> QuantizeClampInt16Test(
9621 armnn::IWorkloadFactory& workloadFactory,
9622 const armnn::IBackendInternal::IMemoryManagerSharedPtr& memoryManager)
9624 return QuantizeClampTest<armnn::DataType::QuantisedSymm16>(workloadFactory, memoryManager);