blob: 0af9bf3e0dc8cd2e6efde9692c6e345dbb9ba200 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. 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>
Jan Eilersbb446e52020-04-02 13:56:54 +01009#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <backendsCommon/MemCopyWorkload.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010011
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <neon/NeonWorkloadFactory.hpp>
15#include <neon/NeonTensorHandle.hpp>
16#include <neon/workloads/NeonWorkloadUtils.hpp>
17#include <neon/workloads/NeonWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000018
19BOOST_AUTO_TEST_SUITE(CreateWorkloadNeon)
20
21namespace
22{
23
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +010024boost::test_tools::predicate_result CompareIAclTensorHandleShape(IAclTensorHandle* tensorHandle,
25 std::initializer_list<unsigned int> expectedDimensions)
26{
27 return CompareTensorHandleShape<IAclTensorHandle>(tensorHandle, expectedDimensions);
28}
29
Derek Lambertic81855f2019-06-13 17:34:19 +010030bool TestNeonTensorHandleInfo(armnn::IAclTensorHandle* handle, const armnn::TensorInfo& expectedInfo)
telsoa014fcda012018-03-09 14:13:49 +000031{
32 using namespace armnn::armcomputetensorutils;
33
34 const arm_compute::ITensorInfo* handleInfo = handle->GetTensor().info();
35 const arm_compute::TensorInfo expectedAclInfo = BuildArmComputeTensorInfo(expectedInfo);
36
37 if (handleInfo->data_type() != expectedAclInfo.data_type())
38 {
39 return false;
40 }
41
42 if (handleInfo->num_dimensions() != expectedAclInfo.num_dimensions())
43 {
44 return false;
45 }
46
47 if (handleInfo->quantization_info() != expectedAclInfo.quantization_info())
48 {
49 return false;
50 }
51
52 for (std::size_t d = 0; d < expectedAclInfo.num_dimensions(); ++d)
53 {
54 if (handleInfo->dimension(d) != expectedAclInfo.dimension(d))
55 {
56 return false;
57 }
58 }
59
60 return true;
61}
62
63} // namespace
64
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010065template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010066static void NeonCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000067{
68 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000069 NeonWorkloadFactory factory =
70 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
71
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010072 auto workload = CreateActivationWorkloadTest<NeonActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000073
telsoa01c577f2c2018-08-31 09:22:23 +010074 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000075 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010076 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
77 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +010078 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({1, 1}, DataType)));
79 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({1, 1}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +000080}
81
telsoa01c577f2c2018-08-31 09:22:23 +010082#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
83BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
84{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010085 NeonCreateActivationWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010086}
87#endif
88
arovir019e53a352018-08-31 15:26:35 +010089BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010090{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010091 NeonCreateActivationWorkloadTest<DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010092}
93
David Beckbc392452018-09-10 14:47:28 +010094template <typename WorkloadType,
95 typename DescriptorType,
96 typename LayerType,
97 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000098static void NeonCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000099{
David Beckbc392452018-09-10 14:47:28 +0100100 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000101 NeonWorkloadFactory factory =
102 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
103
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000104 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000105
David Beckbc392452018-09-10 14:47:28 +0100106 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100107 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
108 auto inputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
109 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100110 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({2, 3}, DataType)));
111 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle2, TensorInfo({2, 3}, DataType)));
112 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({2, 3}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000113}
114
telsoa01c577f2c2018-08-31 09:22:23 +0100115#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
116BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
117{
Matthew Bentham955258d2018-12-10 10:48:52 +0000118 NeonCreateElementwiseWorkloadTest<NeonAdditionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100119 AdditionQueueDescriptor,
120 AdditionLayer,
121 DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100122}
123#endif
124
arovir019e53a352018-08-31 15:26:35 +0100125BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100126{
Matthew Bentham955258d2018-12-10 10:48:52 +0000127 NeonCreateElementwiseWorkloadTest<NeonAdditionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100128 AdditionQueueDescriptor,
129 AdditionLayer,
130 DataType::Float32>();
131}
132
133#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
134BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
135{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000136 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100137 SubtractionQueueDescriptor,
138 SubtractionLayer,
139 DataType::Float16>();
140}
141#endif
142
143BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
144{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000145 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
David Beckbc392452018-09-10 14:47:28 +0100146 SubtractionQueueDescriptor,
147 SubtractionLayer,
148 DataType::Float32>();
149}
150
Conor Kennedyb99480b2019-03-08 08:24:41 +0000151BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
152{
153 NeonCreateElementwiseWorkloadTest<NeonSubtractionWorkload,
154 SubtractionQueueDescriptor,
155 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000156 DataType::QAsymmU8>();
Conor Kennedyb99480b2019-03-08 08:24:41 +0000157}
158
David Beckbc392452018-09-10 14:47:28 +0100159#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
160BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16Workload)
161{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000162 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
David Beckbc392452018-09-10 14:47:28 +0100163 MultiplicationQueueDescriptor,
164 MultiplicationLayer,
165 DataType::Float16>();
166}
167#endif
168
169BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
170{
Conor Kennedyb99480b2019-03-08 08:24:41 +0000171 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
David Beckbc392452018-09-10 14:47:28 +0100172 MultiplicationQueueDescriptor,
173 MultiplicationLayer,
174 DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100175}
176
Conor Kennedyb99480b2019-03-08 08:24:41 +0000177BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
178{
179 NeonCreateElementwiseWorkloadTest<NeonMultiplicationWorkload,
180 MultiplicationQueueDescriptor,
181 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000182 DataType::QAsymmU8>();
Conor Kennedyb99480b2019-03-08 08:24:41 +0000183}
184
Pablo Telloe61f0712020-01-23 10:37:17 +0000185BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
186{
187 NeonCreateElementwiseWorkloadTest<NeonDivisionWorkload,
188 DivisionQueueDescriptor,
189 DivisionLayer,
190 armnn::DataType::Float32>();
191}
192
telsoa01c577f2c2018-08-31 09:22:23 +0100193template <typename BatchNormalizationWorkloadType, typename armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100194static void NeonCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000195{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000196 Graph graph;
197 NeonWorkloadFactory factory =
198 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
199
Nikhil Rajd1340932018-10-18 14:27:50 +0100200 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
201 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000202
telsoa01c577f2c2018-08-31 09:22:23 +0100203 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000204 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100205 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
206 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajd1340932018-10-18 14:27:50 +0100207
208 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 4, 4} : TensorShape{2, 4, 4, 3};
209 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 4, 4} : TensorShape{2, 4, 4, 3};
210
211 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
212 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000213}
214
telsoa01c577f2c2018-08-31 09:22:23 +0100215#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Nikhil Rajd1340932018-10-18 14:27:50 +0100216BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100217{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000218 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float16>(DataLayout::NCHW);
Nikhil Rajd1340932018-10-18 14:27:50 +0100219}
220
221BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NhwcWorkload)
222{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000223 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100224}
225#endif
226
Nikhil Rajd1340932018-10-18 14:27:50 +0100227BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100228{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000229 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float32>(DataLayout::NCHW);
Nikhil Rajd1340932018-10-18 14:27:50 +0100230}
231
232BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
233{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000234 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float32>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100235}
236
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100237template <typename armnn::DataType DataType>
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100238static void NeonCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000239{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000240 Graph graph;
241 NeonWorkloadFactory factory =
242 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
243
244 auto workload = CreateConvolution2dWorkloadTest<NeonConvolution2dWorkload, DataType>(factory, graph, dataLayout);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100245
246 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 3, 8, 16} : TensorShape{2, 8, 16, 3};
247 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{2, 2, 2, 10} : TensorShape{2, 2, 10, 2};
telsoa014fcda012018-03-09 14:13:49 +0000248
telsoa01c577f2c2018-08-31 09:22:23 +0100249 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000250 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100251 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
252 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100253 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
254 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000255}
256
telsoa01c577f2c2018-08-31 09:22:23 +0100257#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100258BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100259{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100260 NeonCreateConvolution2dWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100261}
telsoa01c577f2c2018-08-31 09:22:23 +0100262
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100263BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
264{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100265 NeonCreateConvolution2dWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100266}
267
268#endif
269BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100270{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100271 NeonCreateConvolution2dWorkloadTest<DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100272}
273
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100274BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
275{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100276 NeonCreateConvolution2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100277}
278
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100279template <typename armnn::DataType DataType>
Nikhil Rajcec6b652018-10-12 13:51:57 +0100280static void NeonCreateDepthWiseConvolutionWorkloadTest(DataLayout dataLayout)
281{
282 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000283 NeonWorkloadFactory factory =
284 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100285
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100286 auto workload = CreateDepthwiseConvolution2dWorkloadTest<NeonDepthwiseConvolutionWorkload,
Nikhil Rajcec6b652018-10-12 13:51:57 +0100287 DataType>(factory, graph, dataLayout);
288
289 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
290 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100291 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
292 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100293
Mike Kellydb482882019-06-14 12:35:24 +0100294 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
295 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
296 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
297 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100298
299 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
300 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
301}
302
303BOOST_AUTO_TEST_CASE(CreateDepthWiseConvolution2dFloat32NhwcWorkload)
304{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100305 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100306}
307
308#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
309BOOST_AUTO_TEST_CASE(CreateDepthWiseConvolution2dFloat16NhwcWorkload)
310{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100311 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100312}
313#endif
314
telsoa01c577f2c2018-08-31 09:22:23 +0100315template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
316static void NeonCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000317{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000318 Graph graph;
319 NeonWorkloadFactory factory =
320 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
321
322 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000323
telsoa01c577f2c2018-08-31 09:22:23 +0100324 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000325 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100326 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
327 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Kevin Maybe7e35c2020-04-29 17:05:05 +0100328
329 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
330 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
331 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
332 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({3, 1, 4, 5}, DataType, inputsQScale)));
333 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({3, 7}, DataType, outputQScale)));
telsoa014fcda012018-03-09 14:13:49 +0000334}
335
telsoa01c577f2c2018-08-31 09:22:23 +0100336#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
337BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16Workload)
338{
kevmay01e448be32018-09-26 10:21:55 +0100339 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100340}
341#endif
342
arovir019e53a352018-08-31 15:26:35 +0100343BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100344{
kevmay01e448be32018-09-26 10:21:55 +0100345 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100346}
347
Kevin Maybe7e35c2020-04-29 17:05:05 +0100348BOOST_AUTO_TEST_CASE(CreateFullyConnectedQAsymmU8Workload)
349{
350 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmU8>();
351}
352
353BOOST_AUTO_TEST_CASE(CreateFullyConnectedQAsymmS8Workload)
354{
355 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmS8>();
356}
357
telsoa01c577f2c2018-08-31 09:22:23 +0100358template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100359static void NeonCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000360{
narpra0155a97bc2018-10-02 14:35:53 +0100361 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000362 NeonWorkloadFactory factory =
363 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
364
narpra0155a97bc2018-10-02 14:35:53 +0100365 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000366
telsoa01c577f2c2018-08-31 09:22:23 +0100367 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000368 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100369 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
370 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigha160b242018-10-18 10:33:23 +0100371
372 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
373 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
374
375 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
376 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000377}
378
telsoa01c577f2c2018-08-31 09:22:23 +0100379#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
narpra0155a97bc2018-10-02 14:35:53 +0100380BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100381{
narpra0155a97bc2018-10-02 14:35:53 +0100382 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
383}
384
385BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
386{
387 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100388}
389#endif
390
narpra0155a97bc2018-10-02 14:35:53 +0100391BOOST_AUTO_TEST_CASE(CreateNormalizationFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100392{
narpra0155a97bc2018-10-02 14:35:53 +0100393 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100394}
395
narpra0155a97bc2018-10-02 14:35:53 +0100396BOOST_AUTO_TEST_CASE(CreateNormalizationFloatNhwcWorkload)
397{
398 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
399}
400
401
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100402template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100403static void NeonCreatePooling2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000404{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000405 Graph graph;
406 NeonWorkloadFactory factory =
407 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
408
409 auto workload = CreatePooling2dWorkloadTest<NeonPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100410
411 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 5, 5} : TensorShape{3, 5, 5, 2};
412 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 2, 4} : TensorShape{3, 2, 4, 2};
telsoa014fcda012018-03-09 14:13:49 +0000413
telsoa01c577f2c2018-08-31 09:22:23 +0100414 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000415 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100416 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
417 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozdb48e6862018-10-09 12:09:56 +0100418 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
419 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000420}
421
telsoa01c577f2c2018-08-31 09:22:23 +0100422#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
423BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16Workload)
424{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100425 NeonCreatePooling2dWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100426}
427#endif
428
Nina Drozdb48e6862018-10-09 12:09:56 +0100429BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100430{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100431 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100432}
433
Nina Drozdb48e6862018-10-09 12:09:56 +0100434BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100435{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100436 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100437}
438
439BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NchwWorkload)
440{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000441 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100442}
443
444BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
445{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000446 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100447}
448
Nikhil Raj9b461482019-07-03 15:58:31 +0100449static void NeonCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
450 const armnn::TensorShape& alphaShape,
451 const armnn::TensorShape& outputShape,
452 armnn::DataType dataType)
453{
454 Graph graph;
455 NeonWorkloadFactory factory =
456 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
457
458 auto workload = CreatePreluWorkloadTest<NeonPreluWorkload>(factory,
459 graph,
460 inputShape,
461 alphaShape,
462 outputShape,
463 dataType);
464
465 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
466 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100467 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
468 auto alphaHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
469 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj9b461482019-07-03 15:58:31 +0100470 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, dataType)));
471 BOOST_TEST(TestNeonTensorHandleInfo(alphaHandle, TensorInfo(alphaShape, dataType)));
472 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, dataType)));
473}
474
475#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
476 BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
477{
478 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
479}
480#endif
481
482BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
483{
484 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
485}
486
487BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
488{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000489 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj9b461482019-07-03 15:58:31 +0100490}
491
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100492template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100493static void NeonCreateReshapeWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000494{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000495 Graph graph;
496 NeonWorkloadFactory factory =
497 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
498
499 auto workload = CreateReshapeWorkloadTest<NeonReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000500
telsoa01c577f2c2018-08-31 09:22:23 +0100501 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000502 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100503 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
504 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100505 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({4, 1}, DataType)));
506 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({1, 4}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000507}
508
telsoa01c577f2c2018-08-31 09:22:23 +0100509#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
510BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
511{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100512 NeonCreateReshapeWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100513}
514#endif
515
arovir019e53a352018-08-31 15:26:35 +0100516BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000517{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100518 NeonCreateReshapeWorkloadTest<DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000519}
520
521BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
522{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000523 NeonCreateReshapeWorkloadTest<DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000524}
525
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100526template <typename ResizeWorkloadType, armnn::DataType DataType>
527static void NeonCreateResizeWorkloadTest(DataLayout dataLayout)
528{
529 Graph graph;
530 NeonWorkloadFactory factory =
531 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
532 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
533
534 auto queueDescriptor = workload->GetData();
535
Jan Eilersbb446e52020-04-02 13:56:54 +0100536 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
537 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100538
539 switch (dataLayout)
540 {
541 case DataLayout::NHWC:
542 BOOST_TEST(CompareIAclTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
543 BOOST_TEST(CompareIAclTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
544 break;
545 case DataLayout::NCHW:
546 default:
547 BOOST_TEST(CompareIAclTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
548 BOOST_TEST(CompareIAclTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
549 }
550}
551
552BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
553{
554 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
555}
556
557BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
558{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000559 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100560}
561
562BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
563{
564 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
565}
566
567BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
568{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000569 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100570}
571
telsoa01c577f2c2018-08-31 09:22:23 +0100572template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
573static void NeonCreateSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000574{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000575 Graph graph;
576 NeonWorkloadFactory factory =
577 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
578
telsoa01c577f2c2018-08-31 09:22:23 +0100579 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000580
telsoa01c577f2c2018-08-31 09:22:23 +0100581 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000582 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100583 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
584 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armaganbe88a572020-04-30 11:39:37 +0100585 armnn::TensorInfo tensorInfo({4, 1}, DataType);
586 if (DataType == armnn::DataType::QAsymmU8)
587 {
588 tensorInfo.SetQuantizationOffset(0);
589 tensorInfo.SetQuantizationScale(1.f / 256);
590 }
591 else if (DataType == armnn::DataType::QAsymmS8)
592 {
593 tensorInfo.SetQuantizationOffset(-128);
594 tensorInfo.SetQuantizationScale(1.f / 256);
595 }
596 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
597 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
telsoa01c577f2c2018-08-31 09:22:23 +0100598}
599
600#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
601BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
602{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100603 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100604}
605#endif
606
arovir019e53a352018-08-31 15:26:35 +0100607BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100608{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100609 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float32>();
610}
611
612BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmU8Workload)
613{
614 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmU8>();
615}
616
617BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmS8Workload)
618{
619 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmS8>();
telsoa014fcda012018-03-09 14:13:49 +0000620}
621
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100622template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
623static void NeonSpaceToDepthWorkloadTest()
624{
625 Graph graph;
626 NeonWorkloadFactory factory =
627 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
628
629 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
630
631 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100632 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
633 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100634
635 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 1, 2, 2, 1 }, DataType)));
636 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 1, 1, 1, 4 }, DataType)));
637}
638
639BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
640{
641 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float32>();
642}
643
644BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
645{
646 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float16>();
647}
648
649BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
650{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000651 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100652}
653
654BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
655{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000656 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100657}
658
telsoa014fcda012018-03-09 14:13:49 +0000659BOOST_AUTO_TEST_CASE(CreateSplitterWorkload)
660{
661 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000662 NeonWorkloadFactory factory =
663 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
664
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100665 auto workload = CreateSplitterWorkloadTest<NeonSplitterWorkload, DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000666
telsoa01c577f2c2018-08-31 09:22:23 +0100667 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000668 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100669 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100670 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({5, 7, 7}, DataType::Float32)));
671
Jan Eilersbb446e52020-04-02 13:56:54 +0100672 auto outputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100673 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle0, TensorInfo({1, 7, 7}, DataType::Float32)));
674
Jan Eilersbb446e52020-04-02 13:56:54 +0100675 auto outputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100676 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle1, TensorInfo({2, 7, 7}, DataType::Float32)));
677
Jan Eilersbb446e52020-04-02 13:56:54 +0100678 auto outputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100679 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle2, TensorInfo({2, 7, 7}, DataType::Float32)));
telsoa014fcda012018-03-09 14:13:49 +0000680}
681
Jim Flynne242f2d2019-05-22 14:24:13 +0100682BOOST_AUTO_TEST_CASE(CreateSplitterConcat)
telsoa014fcda012018-03-09 14:13:49 +0000683{
telsoa01c577f2c2018-08-31 09:22:23 +0100684 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100685 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100686 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100687 // of the splitter to be the 1st input to the concat, and the 1st output of the splitter to be 0th input
688 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000689
690 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000691 NeonWorkloadFactory factory =
692 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000693
694 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100695 CreateSplitterConcatWorkloadTest<NeonSplitterWorkload, NeonConcatWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100696 DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000697
698 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100699 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000700
telsoa01c577f2c2018-08-31 09:22:23 +0100701 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Derek Lambertic81855f2019-06-13 17:34:19 +0100702 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
703 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
704 armnn::IAclTensorHandle* mIn0 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
705 armnn::IAclTensorHandle* mIn1 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000706
707 BOOST_TEST(sOut0);
708 BOOST_TEST(sOut1);
709 BOOST_TEST(mIn0);
710 BOOST_TEST(mIn1);
711
712 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
713
714 BOOST_TEST(validDataPointers);
715}
716
717BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
718{
telsoa01c577f2c2018-08-31 09:22:23 +0100719 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
720 // 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 +0000721
722 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000723 NeonWorkloadFactory factory =
724 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
725
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100726 std::unique_ptr<NeonSplitterWorkload> wlSplitter;
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100727 std::unique_ptr<NeonActivationWorkload> wlActiv0_0;
728 std::unique_ptr<NeonActivationWorkload> wlActiv0_1;
729 std::unique_ptr<NeonActivationWorkload> wlActiv1_0;
730 std::unique_ptr<NeonActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000731
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100732 CreateSplitterMultipleInputsOneOutputWorkloadTest<NeonSplitterWorkload,
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100733 NeonActivationWorkload, DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
734 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000735
Derek Lambertic81855f2019-06-13 17:34:19 +0100736 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
737 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
738 armnn::IAclTensorHandle* activ0_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
739 armnn::IAclTensorHandle* activ0_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
740 armnn::IAclTensorHandle* activ1_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
741 armnn::IAclTensorHandle* activ1_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000742
743
744 BOOST_TEST(sOut0);
745 BOOST_TEST(sOut1);
746 BOOST_TEST(activ0_0Im);
747 BOOST_TEST(activ0_1Im);
748 BOOST_TEST(activ1_0Im);
749 BOOST_TEST(activ1_1Im);
750
751 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
752 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
753
754 BOOST_TEST(validDataPointers);
755}
756
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100757#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100758
759// This test unit needs the reference backend, it's not available if the reference backend is not built
760
telsoa014fcda012018-03-09 14:13:49 +0000761BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsNeon)
762{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000763 NeonWorkloadFactory factory =
764 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Derek Lambertic81855f2019-06-13 17:34:19 +0100765 CreateMemCopyWorkloads<IAclTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000766}
767
Matteo Martincighe67edb22019-08-14 14:05:46 +0100768#endif
769
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100770template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
771static void NeonCreateL2NormalizationWorkloadTest(DataLayout dataLayout)
772{
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100773 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000774 NeonWorkloadFactory factory =
775 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
776
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100777 auto workload =
778 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100779
780 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
781 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100782 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
783 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100784
785 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ?
786 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
787 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ?
788 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
789
790 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
791 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100792}
793
794#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
795BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
796{
797 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
798}
799
800BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
801{
802 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
803}
804#endif
805
806BOOST_AUTO_TEST_CASE(CreateL2NormalizationNchwWorkload)
807{
808 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
809}
810
811BOOST_AUTO_TEST_CASE(CreateL2NormalizationNhwcWorkload)
812{
813 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
814}
815
Jan Eilersad5293a2019-07-08 09:57:55 +0100816template <typename LstmWorkloadType>
817static void NeonCreateLstmWorkloadTest()
818{
819 Graph graph;
820 NeonWorkloadFactory factory =
821 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
822
823 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
824
825 LstmQueueDescriptor queueDescriptor = workload->GetData();
826
Jan Eilersbb446e52020-04-02 13:56:54 +0100827 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
828 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Jan Eilersad5293a2019-07-08 09:57:55 +0100829
830 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 2, 2 }, DataType::Float32)));
831 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 2, 4 }, DataType::Float32)));
832}
833
834BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
835{
836 NeonCreateLstmWorkloadTest<NeonLstmFloatWorkload>();
837}
838
Jim Flynne242f2d2019-05-22 14:24:13 +0100839template <typename ConcatWorkloadType, armnn::DataType DataType>
840static void NeonCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000841 unsigned int concatAxis)
842{
843 Graph graph;
844 NeonWorkloadFactory factory =
845 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
846
Jim Flynne242f2d2019-05-22 14:24:13 +0100847 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000848
Jim Flynne242f2d2019-05-22 14:24:13 +0100849 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100850 auto inputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
851 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
852 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000853
854 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle0, TensorInfo({ 2, 3, 2, 5 }, DataType)));
855 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({ 2, 3, 2, 5 }, DataType)));
856 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
857}
858
Jim Flynne242f2d2019-05-22 14:24:13 +0100859BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000860{
Jim Flynne242f2d2019-05-22 14:24:13 +0100861 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000862}
863
Jim Flynne242f2d2019-05-22 14:24:13 +0100864BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000865{
Jim Flynne242f2d2019-05-22 14:24:13 +0100866 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000867}
868
Jim Flynne242f2d2019-05-22 14:24:13 +0100869BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000870{
Jim Flynne242f2d2019-05-22 14:24:13 +0100871 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000872}
873
Jim Flynne242f2d2019-05-22 14:24:13 +0100874BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000875{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000876 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000877}
878
Jim Flynne242f2d2019-05-22 14:24:13 +0100879BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000880{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000881 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000882}
883
Jim Flynne242f2d2019-05-22 14:24:13 +0100884BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000885{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000886 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000887}
888
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100889template <armnn::DataType DataType>
890static void NeonCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
891 const std::initializer_list<unsigned int>& outputShape,
892 unsigned int axis,
893 unsigned int numInputs)
894{
895 armnn::Graph graph;
896 NeonWorkloadFactory factory =
897 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
898
899 auto workload = CreateStackWorkloadTest<NeonStackWorkload, DataType>(factory,
900 graph,
901 TensorShape(inputShape),
902 TensorShape(outputShape),
903 axis,
904 numInputs);
905
906 // Check inputs and output are as expected
907 StackQueueDescriptor queueDescriptor = workload->GetData();
908 for (unsigned int i = 0; i < numInputs; ++i)
909 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100910 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100911 BOOST_TEST(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
912 }
Jan Eilersbb446e52020-04-02 13:56:54 +0100913 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100914 BOOST_TEST(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
915}
916
917BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
918{
919 NeonCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
920}
921
Matthew Jacksone69c3992019-09-09 14:31:21 +0100922#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
923BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
924{
925 NeonCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
926}
927#endif
928
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100929BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
930{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000931 NeonCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100932}
933
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100934template <typename QuantizedLstmWorkloadType>
935static void NeonCreateQuantizedLstmWorkloadTest()
936{
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100937 Graph graph;
938 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
939
940 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
941
942 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
943
Jan Eilersbb446e52020-04-02 13:56:54 +0100944 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100945 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
946 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
947
Jan Eilersbb446e52020-04-02 13:56:54 +0100948 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100949 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
950 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
951
Jan Eilersbb446e52020-04-02 13:56:54 +0100952 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100953 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
954 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
955
Jan Eilersbb446e52020-04-02 13:56:54 +0100956 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100957 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
958 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
959
Jan Eilersbb446e52020-04-02 13:56:54 +0100960 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100961 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
962 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
963}
964
965BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
966{
967 NeonCreateQuantizedLstmWorkloadTest<NeonQuantizedLstmWorkload>();
968}
969
telsoa014fcda012018-03-09 14:13:49 +0000970BOOST_AUTO_TEST_SUITE_END()