blob: c994bfe55a4e8b4133929cb43eab629b27db5be0 [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
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +010026boost::test_tools::predicate_result CompareIAclTensorHandleShape(IAclTensorHandle* tensorHandle,
27 std::initializer_list<unsigned int> expectedDimensions)
28{
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
567 switch (dataLayout)
568 {
569 case DataLayout::NHWC:
570 BOOST_TEST(CompareIAclTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
571 BOOST_TEST(CompareIAclTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
572 break;
573 case DataLayout::NCHW:
574 default:
575 BOOST_TEST(CompareIAclTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
576 BOOST_TEST(CompareIAclTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
577 }
578}
579
580BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
581{
582 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
583}
584
585BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
586{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000587 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100588}
589
590BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
591{
592 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
593}
594
595BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
596{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000597 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100598}
599
telsoa01c577f2c2018-08-31 09:22:23 +0100600template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
601static void NeonCreateSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000602{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000603 Graph graph;
604 NeonWorkloadFactory factory =
605 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
606
telsoa01c577f2c2018-08-31 09:22:23 +0100607 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000608
telsoa01c577f2c2018-08-31 09:22:23 +0100609 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000610 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100611 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
612 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armaganbe88a572020-04-30 11:39:37 +0100613 armnn::TensorInfo tensorInfo({4, 1}, DataType);
614 if (DataType == armnn::DataType::QAsymmU8)
615 {
616 tensorInfo.SetQuantizationOffset(0);
617 tensorInfo.SetQuantizationScale(1.f / 256);
618 }
619 else if (DataType == armnn::DataType::QAsymmS8)
620 {
621 tensorInfo.SetQuantizationOffset(-128);
622 tensorInfo.SetQuantizationScale(1.f / 256);
623 }
624 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
625 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
telsoa01c577f2c2018-08-31 09:22:23 +0100626}
627
628#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
629BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
630{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100631 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100632}
633#endif
634
arovir019e53a352018-08-31 15:26:35 +0100635BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100636{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100637 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float32>();
638}
639
640BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmU8Workload)
641{
642 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmU8>();
643}
644
645BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmS8Workload)
646{
647 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmS8>();
telsoa014fcda012018-03-09 14:13:49 +0000648}
649
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100650template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
651static void NeonSpaceToDepthWorkloadTest()
652{
653 Graph graph;
654 NeonWorkloadFactory factory =
655 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
656
657 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
658
659 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100660 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
661 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100662
663 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 1, 2, 2, 1 }, DataType)));
664 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 1, 1, 1, 4 }, DataType)));
665}
666
667BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
668{
669 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float32>();
670}
671
672BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
673{
674 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float16>();
675}
676
677BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
678{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000679 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100680}
681
682BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
683{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000684 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100685}
686
telsoa014fcda012018-03-09 14:13:49 +0000687BOOST_AUTO_TEST_CASE(CreateSplitterWorkload)
688{
689 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000690 NeonWorkloadFactory factory =
691 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
692
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100693 auto workload = CreateSplitterWorkloadTest<NeonSplitterWorkload, DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000694
telsoa01c577f2c2018-08-31 09:22:23 +0100695 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000696 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100697 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100698 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({5, 7, 7}, DataType::Float32)));
699
Jan Eilersbb446e52020-04-02 13:56:54 +0100700 auto outputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100701 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle0, TensorInfo({1, 7, 7}, DataType::Float32)));
702
Jan Eilersbb446e52020-04-02 13:56:54 +0100703 auto outputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100704 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle1, TensorInfo({2, 7, 7}, DataType::Float32)));
705
Jan Eilersbb446e52020-04-02 13:56:54 +0100706 auto outputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100707 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle2, TensorInfo({2, 7, 7}, DataType::Float32)));
telsoa014fcda012018-03-09 14:13:49 +0000708}
709
Jim Flynne242f2d2019-05-22 14:24:13 +0100710BOOST_AUTO_TEST_CASE(CreateSplitterConcat)
telsoa014fcda012018-03-09 14:13:49 +0000711{
telsoa01c577f2c2018-08-31 09:22:23 +0100712 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100713 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100714 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100715 // of the splitter to be the 1st input to the concat, and the 1st output of the splitter to be 0th input
716 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000717
718 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000719 NeonWorkloadFactory factory =
720 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000721
722 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100723 CreateSplitterConcatWorkloadTest<NeonSplitterWorkload, NeonConcatWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100724 DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000725
726 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100727 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000728
telsoa01c577f2c2018-08-31 09:22:23 +0100729 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Derek Lambertic81855f2019-06-13 17:34:19 +0100730 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
731 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
732 armnn::IAclTensorHandle* mIn0 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
733 armnn::IAclTensorHandle* mIn1 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000734
735 BOOST_TEST(sOut0);
736 BOOST_TEST(sOut1);
737 BOOST_TEST(mIn0);
738 BOOST_TEST(mIn1);
739
740 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
741
742 BOOST_TEST(validDataPointers);
743}
744
745BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
746{
telsoa01c577f2c2018-08-31 09:22:23 +0100747 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
748 // 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 +0000749
750 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000751 NeonWorkloadFactory factory =
752 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
753
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100754 std::unique_ptr<NeonSplitterWorkload> wlSplitter;
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100755 std::unique_ptr<NeonActivationWorkload> wlActiv0_0;
756 std::unique_ptr<NeonActivationWorkload> wlActiv0_1;
757 std::unique_ptr<NeonActivationWorkload> wlActiv1_0;
758 std::unique_ptr<NeonActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000759
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100760 CreateSplitterMultipleInputsOneOutputWorkloadTest<NeonSplitterWorkload,
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100761 NeonActivationWorkload, DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
762 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000763
Derek Lambertic81855f2019-06-13 17:34:19 +0100764 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
765 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
766 armnn::IAclTensorHandle* activ0_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
767 armnn::IAclTensorHandle* activ0_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
768 armnn::IAclTensorHandle* activ1_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
769 armnn::IAclTensorHandle* activ1_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000770
771
772 BOOST_TEST(sOut0);
773 BOOST_TEST(sOut1);
774 BOOST_TEST(activ0_0Im);
775 BOOST_TEST(activ0_1Im);
776 BOOST_TEST(activ1_0Im);
777 BOOST_TEST(activ1_1Im);
778
779 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
780 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
781
782 BOOST_TEST(validDataPointers);
783}
784
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100785#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100786
787// This test unit needs the reference backend, it's not available if the reference backend is not built
788
telsoa014fcda012018-03-09 14:13:49 +0000789BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsNeon)
790{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000791 NeonWorkloadFactory factory =
792 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Derek Lambertic81855f2019-06-13 17:34:19 +0100793 CreateMemCopyWorkloads<IAclTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000794}
795
Matteo Martincighe67edb22019-08-14 14:05:46 +0100796#endif
797
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100798template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
799static void NeonCreateL2NormalizationWorkloadTest(DataLayout dataLayout)
800{
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100801 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000802 NeonWorkloadFactory factory =
803 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
804
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100805 auto workload =
806 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100807
808 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
809 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100810 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
811 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100812
813 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ?
814 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
815 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ?
816 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
817
818 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
819 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100820}
821
822#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
823BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
824{
825 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
826}
827
828BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
829{
830 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
831}
832#endif
833
834BOOST_AUTO_TEST_CASE(CreateL2NormalizationNchwWorkload)
835{
836 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
837}
838
839BOOST_AUTO_TEST_CASE(CreateL2NormalizationNhwcWorkload)
840{
841 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
842}
843
Keith Davis69e653f2020-07-02 11:49:26 +0100844template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
845static void NeonCreateLogSoftmaxWorkloadTest()
846{
847 Graph graph;
848 NeonWorkloadFactory factory =
849 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
850
851 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
852
853 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
854 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
855 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
856 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
857 armnn::TensorInfo tensorInfo({4, 1}, DataType);
858
859 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
860 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
861}
862
863#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
864BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloat16Workload)
865{
866 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float16>();
867}
868#endif
869
870BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloatWorkload)
871{
872 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float32>();
873}
874
Jan Eilersad5293a2019-07-08 09:57:55 +0100875template <typename LstmWorkloadType>
876static void NeonCreateLstmWorkloadTest()
877{
878 Graph graph;
879 NeonWorkloadFactory factory =
880 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
881
882 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
883
884 LstmQueueDescriptor queueDescriptor = workload->GetData();
885
Jan Eilersbb446e52020-04-02 13:56:54 +0100886 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
887 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Jan Eilersad5293a2019-07-08 09:57:55 +0100888
889 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 2, 2 }, DataType::Float32)));
890 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 2, 4 }, DataType::Float32)));
891}
892
893BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
894{
895 NeonCreateLstmWorkloadTest<NeonLstmFloatWorkload>();
896}
897
Jim Flynne242f2d2019-05-22 14:24:13 +0100898template <typename ConcatWorkloadType, armnn::DataType DataType>
899static void NeonCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000900 unsigned int concatAxis)
901{
902 Graph graph;
903 NeonWorkloadFactory factory =
904 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
905
Jim Flynne242f2d2019-05-22 14:24:13 +0100906 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000907
Jim Flynne242f2d2019-05-22 14:24:13 +0100908 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100909 auto inputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
910 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
911 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000912
913 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle0, TensorInfo({ 2, 3, 2, 5 }, DataType)));
914 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({ 2, 3, 2, 5 }, DataType)));
915 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
916}
917
Jim Flynne242f2d2019-05-22 14:24:13 +0100918BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000919{
Jim Flynne242f2d2019-05-22 14:24:13 +0100920 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000921}
922
Jim Flynne242f2d2019-05-22 14:24:13 +0100923BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000924{
Jim Flynne242f2d2019-05-22 14:24:13 +0100925 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000926}
927
Jim Flynne242f2d2019-05-22 14:24:13 +0100928BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000929{
Jim Flynne242f2d2019-05-22 14:24:13 +0100930 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000931}
932
Jim Flynne242f2d2019-05-22 14:24:13 +0100933BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000934{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000935 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000936}
937
Jim Flynne242f2d2019-05-22 14:24:13 +0100938BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000939{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000940 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000941}
942
Jim Flynne242f2d2019-05-22 14:24:13 +0100943BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000944{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000945 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000946}
947
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100948template <armnn::DataType DataType>
949static void NeonCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
950 const std::initializer_list<unsigned int>& outputShape,
951 unsigned int axis,
952 unsigned int numInputs)
953{
954 armnn::Graph graph;
955 NeonWorkloadFactory factory =
956 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
957
958 auto workload = CreateStackWorkloadTest<NeonStackWorkload, DataType>(factory,
959 graph,
960 TensorShape(inputShape),
961 TensorShape(outputShape),
962 axis,
963 numInputs);
964
965 // Check inputs and output are as expected
966 StackQueueDescriptor queueDescriptor = workload->GetData();
967 for (unsigned int i = 0; i < numInputs; ++i)
968 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100969 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100970 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
971 }
Jan Eilersbb446e52020-04-02 13:56:54 +0100972 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100973 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
974}
975
976BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
977{
978 NeonCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
979}
980
Matthew Jacksone69c3992019-09-09 14:31:21 +0100981#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
982BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
983{
984 NeonCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
985}
986#endif
987
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100988BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
989{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000990 NeonCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100991}
992
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100993template <typename QuantizedLstmWorkloadType>
994static void NeonCreateQuantizedLstmWorkloadTest()
995{
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100996 Graph graph;
997 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
998
999 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1000
1001 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1002
Jan Eilersbb446e52020-04-02 13:56:54 +01001003 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001004 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1005 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1006
Jan Eilersbb446e52020-04-02 13:56:54 +01001007 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001008 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1009 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1010
Jan Eilersbb446e52020-04-02 13:56:54 +01001011 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001012 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1013 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1014
Jan Eilersbb446e52020-04-02 13:56:54 +01001015 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001016 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1017 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1018
Jan Eilersbb446e52020-04-02 13:56:54 +01001019 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001020 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1021 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1022}
1023
1024BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1025{
1026 NeonCreateQuantizedLstmWorkloadTest<NeonQuantizedLstmWorkload>();
1027}
1028
James Conroycc340932020-05-12 18:08:52 +01001029template <typename QLstmWorkloadType>
1030static void NeonCreateQLstmWorkloadTest()
1031{
1032 Graph graph;
1033 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
1034
1035 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1036 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1037
1038 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1039 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 4})));
1040 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1041
1042 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1043 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1044 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1045
1046 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
1047 BOOST_TEST((outputHandle->GetShape() == TensorShape({2, 4})));
1048 BOOST_TEST((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1049}
1050
1051BOOST_AUTO_TEST_CASE(CreateQLstmWorkloadTest)
1052{
1053 NeonCreateQLstmWorkloadTest<NeonQLstmWorkload>();
1054}
1055
telsoa014fcda012018-03-09 14:13:49 +00001056BOOST_AUTO_TEST_SUITE_END()