blob: a8c0c8aca0bfdb40d82a5ebda9ebb975289e1269 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Keith Davis69e653f2020-07-02 11:49:26 +01002// Copyright © 2017 Arm Ltd and Contributors. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
arovir0143095f32018-10-09 18:04:24 +01005
Aron Virginas-Tar56055192018-11-12 18:10:43 +00006#include "NeonWorkloadFactoryHelper.hpp"
7
Francis Murtagh4fc3c482019-08-02 13:20:54 +01008#include <aclCommon/ArmComputeTensorUtils.hpp>
Sadik Armagan04a72972020-09-14 15:44:18 +01009#include <armnn/utility/Assert.hpp>
10#include <armnn/utility/IgnoreUnused.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010011#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/MemCopyWorkload.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010015
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <neon/NeonWorkloadFactory.hpp>
17#include <neon/NeonTensorHandle.hpp>
18#include <neon/workloads/NeonWorkloadUtils.hpp>
19#include <neon/workloads/NeonWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000020
21BOOST_AUTO_TEST_SUITE(CreateWorkloadNeon)
22
23namespace
24{
25
Colm Donelan25ab3a82021-05-17 13:01:52 +010026armnn::PredicateResult CompareIAclTensorHandleShape(IAclTensorHandle* tensorHandle,
27 std::initializer_list<unsigned int> expectedDimensions)
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +010028{
29 return CompareTensorHandleShape<IAclTensorHandle>(tensorHandle, expectedDimensions);
30}
31
Derek Lambertic81855f2019-06-13 17:34:19 +010032bool TestNeonTensorHandleInfo(armnn::IAclTensorHandle* handle, const armnn::TensorInfo& expectedInfo)
telsoa014fcda012018-03-09 14:13:49 +000033{
34 using namespace armnn::armcomputetensorutils;
35
36 const arm_compute::ITensorInfo* handleInfo = handle->GetTensor().info();
37 const arm_compute::TensorInfo expectedAclInfo = BuildArmComputeTensorInfo(expectedInfo);
38
39 if (handleInfo->data_type() != expectedAclInfo.data_type())
40 {
41 return false;
42 }
43
44 if (handleInfo->num_dimensions() != expectedAclInfo.num_dimensions())
45 {
46 return false;
47 }
48
49 if (handleInfo->quantization_info() != expectedAclInfo.quantization_info())
50 {
51 return false;
52 }
53
54 for (std::size_t d = 0; d < expectedAclInfo.num_dimensions(); ++d)
55 {
56 if (handleInfo->dimension(d) != expectedAclInfo.dimension(d))
57 {
58 return false;
59 }
60 }
61
62 return true;
63}
64
65} // namespace
66
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010067template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010068static void NeonCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000069{
70 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000071 NeonWorkloadFactory factory =
72 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
73
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010074 auto workload = CreateActivationWorkloadTest<NeonActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000075
telsoa01c577f2c2018-08-31 09:22:23 +010076 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000077 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010078 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
79 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +010080 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({1, 1}, DataType)));
81 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({1, 1}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +000082}
83
telsoa01c577f2c2018-08-31 09:22:23 +010084#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
85BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
86{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010087 NeonCreateActivationWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010088}
89#endif
90
arovir019e53a352018-08-31 15:26:35 +010091BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010092{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010093 NeonCreateActivationWorkloadTest<DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010094}
95
David Beckbc392452018-09-10 14:47:28 +010096template <typename WorkloadType,
97 typename DescriptorType,
98 typename LayerType,
99 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000100static void NeonCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000101{
David Beckbc392452018-09-10 14:47:28 +0100102 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000103 NeonWorkloadFactory factory =
104 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
105
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000106 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000107
David Beckbc392452018-09-10 14:47:28 +0100108 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100109 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
110 auto inputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
111 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100112 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({2, 3}, DataType)));
113 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle2, TensorInfo({2, 3}, DataType)));
114 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({2, 3}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000115}
116
telsoa01c577f2c2018-08-31 09:22:23 +0100117#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
118BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
119{
Matthew Bentham955258d2018-12-10 10:48:52 +0000120 NeonCreateElementwiseWorkloadTest<NeonAdditionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100121 AdditionQueueDescriptor,
122 AdditionLayer,
123 DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100124}
125#endif
126
arovir019e53a352018-08-31 15:26:35 +0100127BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100128{
Matthew Bentham955258d2018-12-10 10:48:52 +0000129 NeonCreateElementwiseWorkloadTest<NeonAdditionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100130 AdditionQueueDescriptor,
131 AdditionLayer,
132 DataType::Float32>();
133}
134
135#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
136BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
137{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000138 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100139 SubtractionQueueDescriptor,
140 SubtractionLayer,
141 DataType::Float16>();
142}
143#endif
144
145BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
146{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000147 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100148 SubtractionQueueDescriptor,
149 SubtractionLayer,
150 DataType::Float32>();
151}
152
Conor Kennedyb99480b2019-03-08 08:24:41 +0000153BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
154{
155 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
156 SubtractionQueueDescriptor,
157 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000158 DataType::QAsymmU8>();
Conor Kennedyb99480b2019-03-08 08:24:41 +0000159}
160
David Beckbc392452018-09-10 14:47:28 +0100161#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
162BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16Workload)
163{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000164 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
David Beckbc392452018-09-10 14:47:28 +0100165 MultiplicationQueueDescriptor,
166 MultiplicationLayer,
167 DataType::Float16>();
168}
169#endif
170
171BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
172{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000173 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
David Beckbc392452018-09-10 14:47:28 +0100174 MultiplicationQueueDescriptor,
175 MultiplicationLayer,
176 DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100177}
178
Conor Kennedyb99480b2019-03-08 08:24:41 +0000179BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
180{
181 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
182 MultiplicationQueueDescriptor,
183 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000184 DataType::QAsymmU8>();
Conor Kennedyb99480b2019-03-08 08:24:41 +0000185}
186
Pablo Telloe61f0712020-01-23 10:37:17 +0000187BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
188{
189 NeonCreateElementwiseWorkloadTest<NeonDivisionWorkload,
190 DivisionQueueDescriptor,
191 DivisionLayer,
192 armnn::DataType::Float32>();
193}
194
telsoa01c577f2c2018-08-31 09:22:23 +0100195template <typename BatchNormalizationWorkloadType, typename armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100196static void NeonCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000197{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000198 Graph graph;
199 NeonWorkloadFactory factory =
200 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
201
Nikhil Rajd1340932018-10-18 14:27:50 +0100202 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
203 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000204
telsoa01c577f2c2018-08-31 09:22:23 +0100205 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000206 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100207 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
208 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajd1340932018-10-18 14:27:50 +0100209
210 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 4, 4} : TensorShape{2, 4, 4, 3};
211 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 4, 4} : TensorShape{2, 4, 4, 3};
212
213 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
214 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000215}
216
telsoa01c577f2c2018-08-31 09:22:23 +0100217#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Nikhil Rajd1340932018-10-18 14:27:50 +0100218BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100219{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000220 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float16>(DataLayout::NCHW);
Nikhil Rajd1340932018-10-18 14:27:50 +0100221}
222
223BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NhwcWorkload)
224{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000225 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100226}
227#endif
228
Nikhil Rajd1340932018-10-18 14:27:50 +0100229BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100230{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000231 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float32>(DataLayout::NCHW);
Nikhil Rajd1340932018-10-18 14:27:50 +0100232}
233
234BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
235{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000236 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float32>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100237}
238
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100239template <typename armnn::DataType DataType>
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100240static void NeonCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000241{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000242 Graph graph;
243 NeonWorkloadFactory factory =
244 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
245
246 auto workload = CreateConvolution2dWorkloadTest<NeonConvolution2dWorkload, DataType>(factory, graph, dataLayout);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100247
248 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 8, 16} : TensorShape{2, 8, 16, 3};
249 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 2, 2, 10} : TensorShape{2, 2, 10, 2};
telsoa014fcda012018-03-09 14:13:49 +0000250
telsoa01c577f2c2018-08-31 09:22:23 +0100251 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000252 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100253 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
254 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100255 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
256 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000257}
258
telsoa01c577f2c2018-08-31 09:22:23 +0100259#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100260BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100261{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100262 NeonCreateConvolution2dWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100263}
telsoa01c577f2c2018-08-31 09:22:23 +0100264
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100265BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
266{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100267 NeonCreateConvolution2dWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100268}
269
270#endif
271BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100272{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100273 NeonCreateConvolution2dWorkloadTest<DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100274}
275
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100276BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
277{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100278 NeonCreateConvolution2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100279}
280
Sadik Armagan04a72972020-09-14 15:44:18 +0100281BOOST_AUTO_TEST_CASE(CreateConvolution2dFastMathEnabledWorkload)
282{
283 Graph graph;
284 using ModelOptions = std::vector<BackendOptions>;
285 ModelOptions modelOptions = {};
286 BackendOptions cpuAcc("CpuAcc",
287 {
288 { "FastMathEnabled", true }
289 });
290 modelOptions.push_back(cpuAcc);
291 NeonWorkloadFactory factory =
292 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
293
294 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100295 CreateConvolution2dWorkloadFastMathTest<NeonConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100296 graph,
297 DataLayout::NCHW,
298 modelOptions);
299
300 ARMNN_ASSERT(workload != nullptr);
301 auto conv2dWorkload = PolymorphicDowncast<NeonConvolution2dWorkload*>(workload.get());
302 IgnoreUnused(conv2dWorkload);
303 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100304 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100305}
306
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100307template <typename armnn::DataType DataType>
Nikhil Rajcec6b652018-10-12 13:51:57 +0100308static void NeonCreateDepthWiseConvolutionWorkloadTest(DataLayout dataLayout)
309{
310 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000311 NeonWorkloadFactory factory =
312 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100313
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100314 auto workload = CreateDepthwiseConvolution2dWorkloadTest<NeonDepthwiseConvolutionWorkload,
Nikhil Rajcec6b652018-10-12 13:51:57 +0100315 DataType>(factory, graph, dataLayout);
316
317 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
318 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100319 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
320 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100321
Mike Kellydb482882019-06-14 12:35:24 +0100322 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
323 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
324 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
325 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100326
327 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
328 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
329}
330
331BOOST_AUTO_TEST_CASE(CreateDepthWiseConvolution2dFloat32NhwcWorkload)
332{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100333 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100334}
335
336#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
337BOOST_AUTO_TEST_CASE(CreateDepthWiseConvolution2dFloat16NhwcWorkload)
338{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100339 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100340}
341#endif
342
telsoa01c577f2c2018-08-31 09:22:23 +0100343template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
344static void NeonCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000345{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000346 Graph graph;
347 NeonWorkloadFactory factory =
348 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
349
350 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000351
telsoa01c577f2c2018-08-31 09:22:23 +0100352 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000353 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100354 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
355 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Kevin Maybe7e35c2020-04-29 17:05:05 +0100356
357 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
358 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
359 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
360 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({3, 1, 4, 5}, DataType, inputsQScale)));
361 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({3, 7}, DataType, outputQScale)));
telsoa014fcda012018-03-09 14:13:49 +0000362}
363
telsoa01c577f2c2018-08-31 09:22:23 +0100364#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
365BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16Workload)
366{
kevmay01e448be32018-09-26 10:21:55 +0100367 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100368}
369#endif
370
arovir019e53a352018-08-31 15:26:35 +0100371BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100372{
kevmay01e448be32018-09-26 10:21:55 +0100373 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100374}
375
Kevin Maybe7e35c2020-04-29 17:05:05 +0100376BOOST_AUTO_TEST_CASE(CreateFullyConnectedQAsymmU8Workload)
377{
378 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmU8>();
379}
380
381BOOST_AUTO_TEST_CASE(CreateFullyConnectedQAsymmS8Workload)
382{
383 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmS8>();
384}
385
telsoa01c577f2c2018-08-31 09:22:23 +0100386template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100387static void NeonCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000388{
narpra0155a97bc2018-10-02 14:35:53 +0100389 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000390 NeonWorkloadFactory factory =
391 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
392
narpra0155a97bc2018-10-02 14:35:53 +0100393 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000394
telsoa01c577f2c2018-08-31 09:22:23 +0100395 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000396 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100397 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
398 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigha160b242018-10-18 10:33:23 +0100399
400 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
401 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
402
403 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
404 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000405}
406
telsoa01c577f2c2018-08-31 09:22:23 +0100407#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
narpra0155a97bc2018-10-02 14:35:53 +0100408BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100409{
narpra0155a97bc2018-10-02 14:35:53 +0100410 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
411}
412
413BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
414{
415 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100416}
417#endif
418
narpra0155a97bc2018-10-02 14:35:53 +0100419BOOST_AUTO_TEST_CASE(CreateNormalizationFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100420{
narpra0155a97bc2018-10-02 14:35:53 +0100421 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100422}
423
narpra0155a97bc2018-10-02 14:35:53 +0100424BOOST_AUTO_TEST_CASE(CreateNormalizationFloatNhwcWorkload)
425{
426 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
427}
428
429
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100430template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100431static void NeonCreatePooling2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000432{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000433 Graph graph;
434 NeonWorkloadFactory factory =
435 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
436
437 auto workload = CreatePooling2dWorkloadTest<NeonPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100438
439 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 5, 5} : TensorShape{3, 5, 5, 2};
440 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 2, 4} : TensorShape{3, 2, 4, 2};
telsoa014fcda012018-03-09 14:13:49 +0000441
telsoa01c577f2c2018-08-31 09:22:23 +0100442 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000443 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100444 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
445 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozdb48e6862018-10-09 12:09:56 +0100446 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
447 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000448}
449
telsoa01c577f2c2018-08-31 09:22:23 +0100450#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
451BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16Workload)
452{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100453 NeonCreatePooling2dWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100454}
455#endif
456
Nina Drozdb48e6862018-10-09 12:09:56 +0100457BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100458{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100459 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100460}
461
Nina Drozdb48e6862018-10-09 12:09:56 +0100462BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100463{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100464 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100465}
466
467BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NchwWorkload)
468{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000469 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100470}
471
472BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
473{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000474 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100475}
476
Nikhil Raj9b461482019-07-03 15:58:31 +0100477static void NeonCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
478 const armnn::TensorShape& alphaShape,
479 const armnn::TensorShape& outputShape,
480 armnn::DataType dataType)
481{
482 Graph graph;
483 NeonWorkloadFactory factory =
484 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
485
486 auto workload = CreatePreluWorkloadTest<NeonPreluWorkload>(factory,
487 graph,
488 inputShape,
489 alphaShape,
490 outputShape,
491 dataType);
492
493 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
494 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100495 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
496 auto alphaHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
497 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj9b461482019-07-03 15:58:31 +0100498 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, dataType)));
499 BOOST_TEST(TestNeonTensorHandleInfo(alphaHandle, TensorInfo(alphaShape, dataType)));
500 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, dataType)));
501}
502
503#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
504 BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
505{
506 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
507}
508#endif
509
510BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
511{
512 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
513}
514
515BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
516{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000517 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj9b461482019-07-03 15:58:31 +0100518}
519
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100520template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100521static void NeonCreateReshapeWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000522{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000523 Graph graph;
524 NeonWorkloadFactory factory =
525 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
526
527 auto workload = CreateReshapeWorkloadTest<NeonReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000528
telsoa01c577f2c2018-08-31 09:22:23 +0100529 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000530 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100531 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
532 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100533 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({4, 1}, DataType)));
534 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({1, 4}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000535}
536
telsoa01c577f2c2018-08-31 09:22:23 +0100537#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
538BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
539{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100540 NeonCreateReshapeWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100541}
542#endif
543
arovir019e53a352018-08-31 15:26:35 +0100544BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000545{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100546 NeonCreateReshapeWorkloadTest<DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000547}
548
549BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
550{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000551 NeonCreateReshapeWorkloadTest<DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000552}
553
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100554template <typename ResizeWorkloadType, armnn::DataType DataType>
555static void NeonCreateResizeWorkloadTest(DataLayout dataLayout)
556{
557 Graph graph;
558 NeonWorkloadFactory factory =
559 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
560 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
561
562 auto queueDescriptor = workload->GetData();
563
Jan Eilersbb446e52020-04-02 13:56:54 +0100564 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
565 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100566
Colm Donelan25ab3a82021-05-17 13:01:52 +0100567 armnn::PredicateResult predResult(true);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100568 switch (dataLayout)
569 {
570 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +0100571 predResult = CompareIAclTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
572 BOOST_TEST(predResult.m_Result, predResult.m_Message.str());
573 predResult = CompareIAclTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
574 BOOST_TEST(predResult.m_Result, predResult.m_Message.str());
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100575 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +0100576 default: // DataLayout::NCHW
577 predResult = CompareIAclTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
578 BOOST_TEST(predResult.m_Result, predResult.m_Message.str());
579 predResult = CompareIAclTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
580 BOOST_TEST(predResult.m_Result, predResult.m_Message.str());
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100581 }
582}
583
584BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
585{
586 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
587}
588
589BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
590{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000591 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100592}
593
594BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
595{
596 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
597}
598
599BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
600{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000601 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100602}
603
telsoa01c577f2c2018-08-31 09:22:23 +0100604template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
605static void NeonCreateSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000606{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000607 Graph graph;
608 NeonWorkloadFactory factory =
609 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
610
telsoa01c577f2c2018-08-31 09:22:23 +0100611 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000612
telsoa01c577f2c2018-08-31 09:22:23 +0100613 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000614 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100615 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
616 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armaganbe88a572020-04-30 11:39:37 +0100617 armnn::TensorInfo tensorInfo({4, 1}, DataType);
618 if (DataType == armnn::DataType::QAsymmU8)
619 {
620 tensorInfo.SetQuantizationOffset(0);
621 tensorInfo.SetQuantizationScale(1.f / 256);
622 }
623 else if (DataType == armnn::DataType::QAsymmS8)
624 {
625 tensorInfo.SetQuantizationOffset(-128);
626 tensorInfo.SetQuantizationScale(1.f / 256);
627 }
628 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
629 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
telsoa01c577f2c2018-08-31 09:22:23 +0100630}
631
632#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
633BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
634{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100635 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100636}
637#endif
638
arovir019e53a352018-08-31 15:26:35 +0100639BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100640{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100641 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float32>();
642}
643
644BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmU8Workload)
645{
646 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmU8>();
647}
648
649BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmS8Workload)
650{
651 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmS8>();
telsoa014fcda012018-03-09 14:13:49 +0000652}
653
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100654template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
655static void NeonSpaceToDepthWorkloadTest()
656{
657 Graph graph;
658 NeonWorkloadFactory factory =
659 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
660
661 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
662
663 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100664 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
665 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100666
667 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 1, 2, 2, 1 }, DataType)));
668 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 1, 1, 1, 4 }, DataType)));
669}
670
671BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
672{
673 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float32>();
674}
675
676BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
677{
678 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float16>();
679}
680
681BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
682{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000683 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100684}
685
686BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
687{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000688 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100689}
690
telsoa014fcda012018-03-09 14:13:49 +0000691BOOST_AUTO_TEST_CASE(CreateSplitterWorkload)
692{
693 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000694 NeonWorkloadFactory factory =
695 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
696
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100697 auto workload = CreateSplitterWorkloadTest<NeonSplitterWorkload, DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000698
telsoa01c577f2c2018-08-31 09:22:23 +0100699 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000700 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100701 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100702 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({5, 7, 7}, DataType::Float32)));
703
Jan Eilersbb446e52020-04-02 13:56:54 +0100704 auto outputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100705 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle0, TensorInfo({1, 7, 7}, DataType::Float32)));
706
Jan Eilersbb446e52020-04-02 13:56:54 +0100707 auto outputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100708 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle1, TensorInfo({2, 7, 7}, DataType::Float32)));
709
Jan Eilersbb446e52020-04-02 13:56:54 +0100710 auto outputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100711 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle2, TensorInfo({2, 7, 7}, DataType::Float32)));
telsoa014fcda012018-03-09 14:13:49 +0000712}
713
Jim Flynne242f2d2019-05-22 14:24:13 +0100714BOOST_AUTO_TEST_CASE(CreateSplitterConcat)
telsoa014fcda012018-03-09 14:13:49 +0000715{
telsoa01c577f2c2018-08-31 09:22:23 +0100716 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100717 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100718 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100719 // of the splitter to be the 1st input to the concat, and the 1st output of the splitter to be 0th input
720 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000721
722 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000723 NeonWorkloadFactory factory =
724 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000725
726 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100727 CreateSplitterConcatWorkloadTest<NeonSplitterWorkload, NeonConcatWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100728 DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000729
730 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100731 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000732
telsoa01c577f2c2018-08-31 09:22:23 +0100733 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Derek Lambertic81855f2019-06-13 17:34:19 +0100734 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
735 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
736 armnn::IAclTensorHandle* mIn0 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
737 armnn::IAclTensorHandle* mIn1 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000738
739 BOOST_TEST(sOut0);
740 BOOST_TEST(sOut1);
741 BOOST_TEST(mIn0);
742 BOOST_TEST(mIn1);
743
744 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
745
746 BOOST_TEST(validDataPointers);
747}
748
749BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
750{
telsoa01c577f2c2018-08-31 09:22:23 +0100751 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
752 // We created a splitter with two outputs. That each of those outputs is used by two different activation layers
telsoa014fcda012018-03-09 14:13:49 +0000753
754 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000755 NeonWorkloadFactory factory =
756 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
757
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100758 std::unique_ptr<NeonSplitterWorkload> wlSplitter;
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100759 std::unique_ptr<NeonActivationWorkload> wlActiv0_0;
760 std::unique_ptr<NeonActivationWorkload> wlActiv0_1;
761 std::unique_ptr<NeonActivationWorkload> wlActiv1_0;
762 std::unique_ptr<NeonActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000763
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100764 CreateSplitterMultipleInputsOneOutputWorkloadTest<NeonSplitterWorkload,
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100765 NeonActivationWorkload, DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
766 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000767
Derek Lambertic81855f2019-06-13 17:34:19 +0100768 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
769 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
770 armnn::IAclTensorHandle* activ0_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
771 armnn::IAclTensorHandle* activ0_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
772 armnn::IAclTensorHandle* activ1_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
773 armnn::IAclTensorHandle* activ1_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000774
775
776 BOOST_TEST(sOut0);
777 BOOST_TEST(sOut1);
778 BOOST_TEST(activ0_0Im);
779 BOOST_TEST(activ0_1Im);
780 BOOST_TEST(activ1_0Im);
781 BOOST_TEST(activ1_1Im);
782
783 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
784 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
785
786 BOOST_TEST(validDataPointers);
787}
788
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100789#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100790
791// This test unit needs the reference backend, it's not available if the reference backend is not built
792
telsoa014fcda012018-03-09 14:13:49 +0000793BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsNeon)
794{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000795 NeonWorkloadFactory factory =
796 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Derek Lambertic81855f2019-06-13 17:34:19 +0100797 CreateMemCopyWorkloads<IAclTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000798}
799
Matteo Martincighe67edb22019-08-14 14:05:46 +0100800#endif
801
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100802template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
803static void NeonCreateL2NormalizationWorkloadTest(DataLayout dataLayout)
804{
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100805 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000806 NeonWorkloadFactory factory =
807 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
808
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100809 auto workload =
810 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100811
812 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
813 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100814 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
815 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100816
817 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ?
818 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
819 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ?
820 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
821
822 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
823 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100824}
825
826#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
827BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
828{
829 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
830}
831
832BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
833{
834 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
835}
836#endif
837
838BOOST_AUTO_TEST_CASE(CreateL2NormalizationNchwWorkload)
839{
840 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
841}
842
843BOOST_AUTO_TEST_CASE(CreateL2NormalizationNhwcWorkload)
844{
845 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
846}
847
Keith Davis69e653f2020-07-02 11:49:26 +0100848template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
849static void NeonCreateLogSoftmaxWorkloadTest()
850{
851 Graph graph;
852 NeonWorkloadFactory factory =
853 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
854
855 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
856
857 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
858 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
859 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
860 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
861 armnn::TensorInfo tensorInfo({4, 1}, DataType);
862
863 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
864 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
865}
866
867#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
868BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloat16Workload)
869{
870 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float16>();
871}
872#endif
873
874BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloatWorkload)
875{
876 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float32>();
877}
878
Jan Eilersad5293a2019-07-08 09:57:55 +0100879template <typename LstmWorkloadType>
880static void NeonCreateLstmWorkloadTest()
881{
882 Graph graph;
883 NeonWorkloadFactory factory =
884 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
885
886 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
887
888 LstmQueueDescriptor queueDescriptor = workload->GetData();
889
Jan Eilersbb446e52020-04-02 13:56:54 +0100890 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
891 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Jan Eilersad5293a2019-07-08 09:57:55 +0100892
893 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 2, 2 }, DataType::Float32)));
894 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 2, 4 }, DataType::Float32)));
895}
896
897BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
898{
899 NeonCreateLstmWorkloadTest<NeonLstmFloatWorkload>();
900}
901
Jim Flynne242f2d2019-05-22 14:24:13 +0100902template <typename ConcatWorkloadType, armnn::DataType DataType>
903static void NeonCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000904 unsigned int concatAxis)
905{
906 Graph graph;
907 NeonWorkloadFactory factory =
908 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
909
Jim Flynne242f2d2019-05-22 14:24:13 +0100910 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000911
Jim Flynne242f2d2019-05-22 14:24:13 +0100912 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100913 auto inputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
914 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
915 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000916
917 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle0, TensorInfo({ 2, 3, 2, 5 }, DataType)));
918 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({ 2, 3, 2, 5 }, DataType)));
919 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
920}
921
Jim Flynne242f2d2019-05-22 14:24:13 +0100922BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000923{
Jim Flynne242f2d2019-05-22 14:24:13 +0100924 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000925}
926
Jim Flynne242f2d2019-05-22 14:24:13 +0100927BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000928{
Jim Flynne242f2d2019-05-22 14:24:13 +0100929 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000930}
931
Jim Flynne242f2d2019-05-22 14:24:13 +0100932BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000933{
Jim Flynne242f2d2019-05-22 14:24:13 +0100934 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000935}
936
Jim Flynne242f2d2019-05-22 14:24:13 +0100937BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000938{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000939 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000940}
941
Jim Flynne242f2d2019-05-22 14:24:13 +0100942BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000943{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000944 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000945}
946
Jim Flynne242f2d2019-05-22 14:24:13 +0100947BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000948{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000949 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000950}
951
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100952template <armnn::DataType DataType>
953static void NeonCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
954 const std::initializer_list<unsigned int>& outputShape,
955 unsigned int axis,
956 unsigned int numInputs)
957{
958 armnn::Graph graph;
959 NeonWorkloadFactory factory =
960 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
961
962 auto workload = CreateStackWorkloadTest<NeonStackWorkload, DataType>(factory,
963 graph,
964 TensorShape(inputShape),
965 TensorShape(outputShape),
966 axis,
967 numInputs);
968
969 // Check inputs and output are as expected
970 StackQueueDescriptor queueDescriptor = workload->GetData();
971 for (unsigned int i = 0; i < numInputs; ++i)
972 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100973 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100974 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
975 }
Jan Eilersbb446e52020-04-02 13:56:54 +0100976 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100977 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
978}
979
980BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
981{
982 NeonCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
983}
984
Matthew Jacksone69c3992019-09-09 14:31:21 +0100985#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
986BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
987{
988 NeonCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
989}
990#endif
991
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100992BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
993{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000994 NeonCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100995}
996
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100997template <typename QuantizedLstmWorkloadType>
998static void NeonCreateQuantizedLstmWorkloadTest()
999{
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001000 Graph graph;
1001 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
1002
1003 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1004
1005 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1006
Jan Eilersbb446e52020-04-02 13:56:54 +01001007 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001008 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1009 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1010
Jan Eilersbb446e52020-04-02 13:56:54 +01001011 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001012 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1013 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1014
Jan Eilersbb446e52020-04-02 13:56:54 +01001015 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001016 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1017 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1018
Jan Eilersbb446e52020-04-02 13:56:54 +01001019 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001020 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1021 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1022
Jan Eilersbb446e52020-04-02 13:56:54 +01001023 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001024 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1025 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1026}
1027
1028BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1029{
1030 NeonCreateQuantizedLstmWorkloadTest<NeonQuantizedLstmWorkload>();
1031}
1032
James Conroycc340932020-05-12 18:08:52 +01001033template <typename QLstmWorkloadType>
1034static void NeonCreateQLstmWorkloadTest()
1035{
1036 Graph graph;
1037 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
1038
1039 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1040 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1041
1042 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1043 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 4})));
1044 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1045
1046 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1047 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1048 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1049
1050 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
1051 BOOST_TEST((outputHandle->GetShape() == TensorShape({2, 4})));
1052 BOOST_TEST((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1053}
1054
1055BOOST_AUTO_TEST_CASE(CreateQLstmWorkloadTest)
1056{
1057 NeonCreateQLstmWorkloadTest<NeonQLstmWorkload>();
1058}
1059
telsoa014fcda012018-03-09 14:13:49 +00001060BOOST_AUTO_TEST_SUITE_END()