blob: 9c32e32375aabe89396cd6495b389f76b1ad0e87 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Colm Donelanb4ef1632024-02-01 15:00:43 +00002// Copyright © 2017, 2023-2024 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>
Jan Eilersbb446e52020-04-02 13:56:54 +01009#include <armnn/utility/PolymorphicDowncast.hpp>
Colm Donelan0c479742021-12-10 12:43:54 +000010#include <armnn/backends/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
Sadik Armagan1625efc2021-06-10 18:24:34 +010019#include <doctest/doctest.h>
telsoa014fcda012018-03-09 14:13:49 +000020
Sadik Armagan1625efc2021-06-10 18:24:34 +010021TEST_SUITE("CreateWorkloadNeon")
22{
telsoa014fcda012018-03-09 14:13:49 +000023namespace
24{
25
Colm Donelan25ab3a82021-05-17 13:01:52 +010026armnn::PredicateResult CompareIAclTensorHandleShape(IAclTensorHandle* tensorHandle,
27 std::initializer_list<unsigned int> expectedDimensions)
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +010028{
29 return CompareTensorHandleShape<IAclTensorHandle>(tensorHandle, expectedDimensions);
30}
31
Derek Lambertic81855f2019-06-13 17:34:19 +010032bool TestNeonTensorHandleInfo(armnn::IAclTensorHandle* handle, const armnn::TensorInfo& expectedInfo)
telsoa014fcda012018-03-09 14:13:49 +000033{
34 using namespace armnn::armcomputetensorutils;
35
36 const arm_compute::ITensorInfo* handleInfo = handle->GetTensor().info();
37 const arm_compute::TensorInfo expectedAclInfo = BuildArmComputeTensorInfo(expectedInfo);
38
39 if (handleInfo->data_type() != expectedAclInfo.data_type())
40 {
41 return false;
42 }
43
44 if (handleInfo->num_dimensions() != expectedAclInfo.num_dimensions())
45 {
46 return false;
47 }
48
49 if (handleInfo->quantization_info() != expectedAclInfo.quantization_info())
50 {
51 return false;
52 }
53
54 for (std::size_t d = 0; d < expectedAclInfo.num_dimensions(); ++d)
55 {
56 if (handleInfo->dimension(d) != expectedAclInfo.dimension(d))
57 {
58 return false;
59 }
60 }
61
62 return true;
63}
64
65} // namespace
66
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010067template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010068static void NeonCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000069{
70 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000071 NeonWorkloadFactory factory =
72 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
73
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010074 auto workload = CreateActivationWorkloadTest<NeonActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000075
telsoa01c577f2c2018-08-31 09:22:23 +010076 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000077 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010078 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
79 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +010080 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({1, 1}, DataType)));
81 CHECK(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
Sadik Armagan1625efc2021-06-10 18:24:34 +010085TEST_CASE("CreateActivationFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +010086{
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +010087 NeonCreateActivationWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010088}
89#endif
90
Sadik Armagan1625efc2021-06-10 18:24:34 +010091TEST_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]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100112 CHECK(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({2, 3}, DataType)));
113 CHECK(TestNeonTensorHandleInfo(inputHandle2, TensorInfo({2, 3}, DataType)));
114 CHECK(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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100118TEST_CASE("CreateAdditionFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100119{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127TEST_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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100136TEST_CASE("CreateSubtractionFloat16Workload")
David Beckbc392452018-09-10 14:47:28 +0100137{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100145TEST_CASE("CreateSubtractionFloatWorkload")
David Beckbc392452018-09-10 14:47:28 +0100146{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100153TEST_CASE("CreateSubtractionUint8Workload")
Conor Kennedyb99480b2019-03-08 08:24:41 +0000154{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100162TEST_CASE("CreateMultiplicationFloat16Workload")
David Beckbc392452018-09-10 14:47:28 +0100163{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100171TEST_CASE("CreateMultiplicationFloatWorkload")
David Beckbc392452018-09-10 14:47:28 +0100172{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100179TEST_CASE("CreateMultiplicationUint8Workload")
Conor Kennedyb99480b2019-03-08 08:24:41 +0000180{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100187TEST_CASE("CreateDivisionFloatWorkloadTest")
Pablo Telloe61f0712020-01-23 10:37:17 +0000188{
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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100213 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
214 CHECK(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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100218TEST_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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100223TEST_CASE("CreateBatchNormalizationFloat16NhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100224{
Matthew Benthamc48ac8c2018-12-12 16:15:59 +0000225 NeonCreateBatchNormalizationWorkloadTest<NeonBatchNormalizationWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100226}
227#endif
228
Sadik Armagan1625efc2021-06-10 18:24:34 +0100229TEST_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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100234TEST_CASE("CreateBatchNormalizationFloatNhwcWorkload")
Nikhil Rajd1340932018-10-18 14:27:50 +0100235{
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]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100255 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
256 CHECK(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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100260TEST_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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100265TEST_CASE("CreateConvolution2dFloat16NhwcWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100266{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100267 NeonCreateConvolution2dWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100268}
269
270#endif
Sadik Armagan1625efc2021-06-10 18:24:34 +0100271TEST_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
Sadik Armagan1625efc2021-06-10 18:24:34 +0100276TEST_CASE("CreateConvolution2dFloatNhwcWorkload")
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100277{
Nattapat Chaimanowong974b65f2018-10-15 15:07:34 +0100278 NeonCreateConvolution2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100279}
280
Sadik Armagan1625efc2021-06-10 18:24:34 +0100281TEST_CASE("CreateConvolution2dFastMathEnabledWorkload")
Sadik Armagan04a72972020-09-14 15:44:18 +0100282{
283 Graph graph;
Colm Donelanb4ef1632024-02-01 15:00:43 +0000284 using ModelOptions = std::vector<BackendOptions>;
Sadik Armagan04a72972020-09-14 15:44:18 +0100285 ModelOptions modelOptions = {};
Colm Donelanb4ef1632024-02-01 15:00:43 +0000286 BackendOptions cpuAcc("CpuAcc", { { "FastMathEnabled", true } });
Sadik Armagan04a72972020-09-14 15:44:18 +0100287 modelOptions.push_back(cpuAcc);
288 NeonWorkloadFactory factory =
289 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
290
Colm Donelanb4ef1632024-02-01 15:00:43 +0000291 auto workload = CreateConvolution2dWorkloadFastMathTest<NeonConvolution2dWorkload, armnn::DataType::Float32>(
292 factory, graph, DataLayout::NCHW, modelOptions);
Sadik Armagan04a72972020-09-14 15:44:18 +0100293
Colm Donelanb4ef1632024-02-01 15:00:43 +0000294 CHECK(workload != nullptr);
Sadik Armagan04a72972020-09-14 15:44:18 +0100295 auto conv2dWorkload = PolymorphicDowncast<NeonConvolution2dWorkload*>(workload.get());
Colm Donelanb4ef1632024-02-01 15:00:43 +0000296 CHECK(conv2dWorkload != nullptr);
297 CHECK(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100298}
299
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100300template <typename armnn::DataType DataType>
Nikhil Rajcec6b652018-10-12 13:51:57 +0100301static void NeonCreateDepthWiseConvolutionWorkloadTest(DataLayout dataLayout)
302{
303 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000304 NeonWorkloadFactory factory =
305 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100306
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100307 auto workload = CreateDepthwiseConvolution2dWorkloadTest<NeonDepthwiseConvolutionWorkload,
Nikhil Rajcec6b652018-10-12 13:51:57 +0100308 DataType>(factory, graph, dataLayout);
309
310 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
311 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100312 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
313 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100314
Mike Kellydb482882019-06-14 12:35:24 +0100315 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
316 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
317 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
318 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100319
Sadik Armagan1625efc2021-06-10 18:24:34 +0100320 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
321 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100322}
323
Sadik Armagan1625efc2021-06-10 18:24:34 +0100324TEST_CASE("CreateDepthWiseConvolution2dFloat32NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100325{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100326 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100327}
328
329#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100330TEST_CASE("CreateDepthWiseConvolution2dFloat16NhwcWorkload")
Nikhil Rajcec6b652018-10-12 13:51:57 +0100331{
Nattapat Chaimanowong77140882018-10-17 11:12:19 +0100332 NeonCreateDepthWiseConvolutionWorkloadTest<DataType::Float16>(DataLayout::NHWC);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100333}
334#endif
335
telsoa01c577f2c2018-08-31 09:22:23 +0100336template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
337static void NeonCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000338{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000339 Graph graph;
340 NeonWorkloadFactory factory =
341 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
342
343 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000344
telsoa01c577f2c2018-08-31 09:22:23 +0100345 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000346 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100347 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
348 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Kevin Maybe7e35c2020-04-29 17:05:05 +0100349
350 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
Teresa Charlinacb3ec52023-04-03 19:57:00 +0100351 float inputsQScale = 1.0f;
352 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 1.0;
Sadik Armagan1625efc2021-06-10 18:24:34 +0100353 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({3, 1, 4, 5}, DataType, inputsQScale)));
354 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo({3, 7}, DataType, outputQScale)));
telsoa014fcda012018-03-09 14:13:49 +0000355}
356
telsoa01c577f2c2018-08-31 09:22:23 +0100357#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100358TEST_CASE("CreateFullyConnectedFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100359{
kevmay01e448be32018-09-26 10:21:55 +0100360 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100361}
362#endif
363
Sadik Armagan1625efc2021-06-10 18:24:34 +0100364TEST_CASE("CreateFullyConnectedFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100365{
kevmay01e448be32018-09-26 10:21:55 +0100366 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100367}
368
Sadik Armagan1625efc2021-06-10 18:24:34 +0100369TEST_CASE("CreateFullyConnectedQAsymmU8Workload")
Kevin Maybe7e35c2020-04-29 17:05:05 +0100370{
371 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmU8>();
372}
373
Sadik Armagan1625efc2021-06-10 18:24:34 +0100374TEST_CASE("CreateFullyConnectedQAsymmS8Workload")
Kevin Maybe7e35c2020-04-29 17:05:05 +0100375{
376 NeonCreateFullyConnectedWorkloadTest<NeonFullyConnectedWorkload, DataType::QAsymmS8>();
377}
378
telsoa01c577f2c2018-08-31 09:22:23 +0100379template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100380static void NeonCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000381{
narpra0155a97bc2018-10-02 14:35:53 +0100382 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000383 NeonWorkloadFactory factory =
384 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
385
narpra0155a97bc2018-10-02 14:35:53 +0100386 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000387
telsoa01c577f2c2018-08-31 09:22:23 +0100388 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000389 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100390 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
391 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigha160b242018-10-18 10:33:23 +0100392
393 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
394 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 5, 5, 1} : TensorShape{3, 1, 5, 5};
395
Sadik Armagan1625efc2021-06-10 18:24:34 +0100396 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
397 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000398}
399
telsoa01c577f2c2018-08-31 09:22:23 +0100400#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100401TEST_CASE("CreateNormalizationFloat16NchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100402{
narpra0155a97bc2018-10-02 14:35:53 +0100403 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
404}
405
Sadik Armagan1625efc2021-06-10 18:24:34 +0100406TEST_CASE("CreateNormalizationFloat16NhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100407{
408 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100409}
410#endif
411
Sadik Armagan1625efc2021-06-10 18:24:34 +0100412TEST_CASE("CreateNormalizationFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100413{
narpra0155a97bc2018-10-02 14:35:53 +0100414 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100415}
416
Sadik Armagan1625efc2021-06-10 18:24:34 +0100417TEST_CASE("CreateNormalizationFloatNhwcWorkload")
narpra0155a97bc2018-10-02 14:35:53 +0100418{
419 NeonCreateNormalizationWorkloadTest<NeonNormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
420}
421
422
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100423template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100424static void NeonCreatePooling2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000425{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000426 Graph graph;
427 NeonWorkloadFactory factory =
428 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
429
430 auto workload = CreatePooling2dWorkloadTest<NeonPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100431
432 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 5, 5} : TensorShape{3, 5, 5, 2};
433 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? TensorShape{3, 2, 2, 4} : TensorShape{3, 2, 4, 2};
telsoa014fcda012018-03-09 14:13:49 +0000434
telsoa01c577f2c2018-08-31 09:22:23 +0100435 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000436 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100437 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
438 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100439 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
440 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000441}
442
telsoa01c577f2c2018-08-31 09:22:23 +0100443#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100444TEST_CASE("CreatePooling2dFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100445{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100446 NeonCreatePooling2dWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100447}
448#endif
449
Sadik Armagan1625efc2021-06-10 18:24:34 +0100450TEST_CASE("CreatePooling2dFloatNchwWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100451{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100452 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100453}
454
Sadik Armagan1625efc2021-06-10 18:24:34 +0100455TEST_CASE("CreatePooling2dFloatNhwcWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100456{
Nattapat Chaimanowong5d2e7002018-10-12 16:03:56 +0100457 NeonCreatePooling2dWorkloadTest<DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100458}
459
Sadik Armagan1625efc2021-06-10 18:24:34 +0100460TEST_CASE("CreatePooling2dUint8NchwWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100461{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000462 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100463}
464
Sadik Armagan1625efc2021-06-10 18:24:34 +0100465TEST_CASE("CreatePooling2dUint8NhwcWorkload")
Nina Drozdb48e6862018-10-09 12:09:56 +0100466{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000467 NeonCreatePooling2dWorkloadTest<DataType::QAsymmU8>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100468}
469
Nikhil Raj9b461482019-07-03 15:58:31 +0100470static void NeonCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
471 const armnn::TensorShape& alphaShape,
472 const armnn::TensorShape& outputShape,
473 armnn::DataType dataType)
474{
475 Graph graph;
476 NeonWorkloadFactory factory =
477 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
478
479 auto workload = CreatePreluWorkloadTest<NeonPreluWorkload>(factory,
480 graph,
481 inputShape,
482 alphaShape,
483 outputShape,
484 dataType);
485
486 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
487 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100488 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
489 auto alphaHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
490 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100491 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, dataType)));
492 CHECK(TestNeonTensorHandleInfo(alphaHandle, TensorInfo(alphaShape, dataType)));
493 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, dataType)));
Nikhil Raj9b461482019-07-03 15:58:31 +0100494}
495
496#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100497TEST_CASE("CreatePreluFloat16Workload")
Nikhil Raj9b461482019-07-03 15:58:31 +0100498{
499 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
500}
501#endif
502
Sadik Armagan1625efc2021-06-10 18:24:34 +0100503TEST_CASE("CreatePreluFloatWorkload")
Nikhil Raj9b461482019-07-03 15:58:31 +0100504{
505 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
506}
507
Sadik Armagan1625efc2021-06-10 18:24:34 +0100508TEST_CASE("CreatePreluUint8Workload")
Nikhil Raj9b461482019-07-03 15:58:31 +0100509{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000510 NeonCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj9b461482019-07-03 15:58:31 +0100511}
512
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100513template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100514static void NeonCreateReshapeWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000515{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000516 Graph graph;
517 NeonWorkloadFactory factory =
518 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
519
520 auto workload = CreateReshapeWorkloadTest<NeonReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000521
telsoa01c577f2c2018-08-31 09:22:23 +0100522 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000523 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100524 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
525 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100526 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({4, 1}, DataType)));
527 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo({1, 4}, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000528}
529
telsoa01c577f2c2018-08-31 09:22:23 +0100530#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100531TEST_CASE("CreateReshapeFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100532{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100533 NeonCreateReshapeWorkloadTest<DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100534}
535#endif
536
Sadik Armagan1625efc2021-06-10 18:24:34 +0100537TEST_CASE("CreateReshapeFloatWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000538{
Nattapat Chaimanowongcce11fc2018-10-12 16:30:56 +0100539 NeonCreateReshapeWorkloadTest<DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000540}
541
Sadik Armagan1625efc2021-06-10 18:24:34 +0100542TEST_CASE("CreateReshapeUint8Workload")
telsoa014fcda012018-03-09 14:13:49 +0000543{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000544 NeonCreateReshapeWorkloadTest<DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000545}
546
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100547template <typename ResizeWorkloadType, armnn::DataType DataType>
548static void NeonCreateResizeWorkloadTest(DataLayout dataLayout)
549{
550 Graph graph;
551 NeonWorkloadFactory factory =
552 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
553 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
554
555 auto queueDescriptor = workload->GetData();
556
Jan Eilersbb446e52020-04-02 13:56:54 +0100557 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
558 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100559
Colm Donelan25ab3a82021-05-17 13:01:52 +0100560 armnn::PredicateResult predResult(true);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100561 switch (dataLayout)
562 {
563 case DataLayout::NHWC:
Colm Donelan25ab3a82021-05-17 13:01:52 +0100564 predResult = CompareIAclTensorHandleShape(inputHandle, { 2, 4, 4, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100565 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100566 predResult = CompareIAclTensorHandleShape(outputHandle, { 2, 2, 2, 3 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100567 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100568 break;
Colm Donelan25ab3a82021-05-17 13:01:52 +0100569 default: // DataLayout::NCHW
570 predResult = CompareIAclTensorHandleShape(inputHandle, { 2, 3, 4, 4 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100571 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Colm Donelan25ab3a82021-05-17 13:01:52 +0100572 predResult = CompareIAclTensorHandleShape(outputHandle, { 2, 3, 2, 2 });
Sadik Armagan1625efc2021-06-10 18:24:34 +0100573 CHECK_MESSAGE(predResult.m_Result, predResult.m_Message.str());
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100574 }
575}
576
Sadik Armagan1625efc2021-06-10 18:24:34 +0100577TEST_CASE("CreateResizeFloat32NchwWorkload")
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100578{
579 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
580}
581
Sadik Armagan1625efc2021-06-10 18:24:34 +0100582TEST_CASE("CreateResizeUint8NchwWorkload")
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100583{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000584 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100585}
586
Sadik Armagan1625efc2021-06-10 18:24:34 +0100587TEST_CASE("CreateResizeFloat32NhwcWorkload")
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100588{
589 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
590}
591
Sadik Armagan1625efc2021-06-10 18:24:34 +0100592TEST_CASE("CreateResizeUint8NhwcWorkload")
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100593{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000594 NeonCreateResizeWorkloadTest<NeonResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ellen Norris-Thompson37e68682019-07-15 14:23:30 +0100595}
596
telsoa01c577f2c2018-08-31 09:22:23 +0100597template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
598static void NeonCreateSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000599{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000600 Graph graph;
601 NeonWorkloadFactory factory =
602 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
603
telsoa01c577f2c2018-08-31 09:22:23 +0100604 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000605
telsoa01c577f2c2018-08-31 09:22:23 +0100606 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000607 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100608 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
609 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armaganbe88a572020-04-30 11:39:37 +0100610 armnn::TensorInfo tensorInfo({4, 1}, DataType);
611 if (DataType == armnn::DataType::QAsymmU8)
612 {
613 tensorInfo.SetQuantizationOffset(0);
614 tensorInfo.SetQuantizationScale(1.f / 256);
615 }
616 else if (DataType == armnn::DataType::QAsymmS8)
617 {
618 tensorInfo.SetQuantizationOffset(-128);
619 tensorInfo.SetQuantizationScale(1.f / 256);
620 }
Sadik Armagan1625efc2021-06-10 18:24:34 +0100621 CHECK(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
622 CHECK(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
telsoa01c577f2c2018-08-31 09:22:23 +0100623}
624
625#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100626TEST_CASE("CreateSoftmaxFloat16Workload")
telsoa01c577f2c2018-08-31 09:22:23 +0100627{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100628 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100629}
630#endif
631
Sadik Armagan1625efc2021-06-10 18:24:34 +0100632TEST_CASE("CreateSoftmaxFloatWorkload")
telsoa01c577f2c2018-08-31 09:22:23 +0100633{
Sadik Armaganbe88a572020-04-30 11:39:37 +0100634 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::Float32>();
635}
636
Sadik Armagan1625efc2021-06-10 18:24:34 +0100637TEST_CASE("CreateSoftmaxQAsymmU8Workload")
Sadik Armaganbe88a572020-04-30 11:39:37 +0100638{
639 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmU8>();
640}
641
Sadik Armagan1625efc2021-06-10 18:24:34 +0100642TEST_CASE("CreateSoftmaxQAsymmS8Workload")
Sadik Armaganbe88a572020-04-30 11:39:37 +0100643{
644 NeonCreateSoftmaxWorkloadTest<NeonSoftmaxWorkload, DataType::QAsymmS8>();
telsoa014fcda012018-03-09 14:13:49 +0000645}
646
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100647template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
648static void NeonSpaceToDepthWorkloadTest()
649{
650 Graph graph;
651 NeonWorkloadFactory factory =
652 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
653
654 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
655
656 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100657 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
658 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100659
Sadik Armagan1625efc2021-06-10 18:24:34 +0100660 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 1, 2, 2, 1 }, DataType)));
661 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 1, 1, 1, 4 }, DataType)));
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100662}
663
Sadik Armagan1625efc2021-06-10 18:24:34 +0100664TEST_CASE("CreateSpaceToDepthFloat32Workload")
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100665{
666 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float32>();
667}
668
Sadik Armagan1625efc2021-06-10 18:24:34 +0100669TEST_CASE("CreateSpaceToDepthFloat16Workload")
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100670{
671 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::Float16>();
672}
673
Sadik Armagan1625efc2021-06-10 18:24:34 +0100674TEST_CASE("CreateSpaceToDepthQAsymm8Workload")
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100675{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000676 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100677}
678
Sadik Armagan1625efc2021-06-10 18:24:34 +0100679TEST_CASE("CreateSpaceToDepthQSymm16Workload")
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100680{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000681 NeonSpaceToDepthWorkloadTest<NeonSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100682}
683
Sadik Armagan1625efc2021-06-10 18:24:34 +0100684TEST_CASE("CreateSplitterWorkload")
telsoa014fcda012018-03-09 14:13:49 +0000685{
686 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000687 NeonWorkloadFactory factory =
688 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
689
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100690 auto workload = CreateSplitterWorkloadTest<NeonSplitterWorkload, DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000691
telsoa01c577f2c2018-08-31 09:22:23 +0100692 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000693 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100694 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100695 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({5, 7, 7}, DataType::Float32)));
surmeh013537c2c2018-05-18 16:31:43 +0100696
Jan Eilersbb446e52020-04-02 13:56:54 +0100697 auto outputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100698 CHECK(TestNeonTensorHandleInfo(outputHandle0, TensorInfo({1, 7, 7}, DataType::Float32)));
surmeh013537c2c2018-05-18 16:31:43 +0100699
Jan Eilersbb446e52020-04-02 13:56:54 +0100700 auto outputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100701 CHECK(TestNeonTensorHandleInfo(outputHandle1, TensorInfo({2, 7, 7}, DataType::Float32)));
surmeh013537c2c2018-05-18 16:31:43 +0100702
Jan Eilersbb446e52020-04-02 13:56:54 +0100703 auto outputHandle2 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100704 CHECK(TestNeonTensorHandleInfo(outputHandle2, TensorInfo({2, 7, 7}, DataType::Float32)));
telsoa014fcda012018-03-09 14:13:49 +0000705}
706
Sadik Armagan1625efc2021-06-10 18:24:34 +0100707TEST_CASE("CreateSplitterConcat")
telsoa014fcda012018-03-09 14:13:49 +0000708{
telsoa01c577f2c2018-08-31 09:22:23 +0100709 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100710 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100711 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100712 // of the splitter to be the 1st input to the concat, and the 1st output of the splitter to be 0th input
713 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000714
715 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000716 NeonWorkloadFactory factory =
717 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000718
719 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100720 CreateSplitterConcatWorkloadTest<NeonSplitterWorkload, NeonConcatWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100721 DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000722
723 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100724 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000725
telsoa01c577f2c2018-08-31 09:22:23 +0100726 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Derek Lambertic81855f2019-06-13 17:34:19 +0100727 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
728 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
729 armnn::IAclTensorHandle* mIn0 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
730 armnn::IAclTensorHandle* mIn1 = dynamic_cast<armnn::IAclTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000731
Sadik Armagan1625efc2021-06-10 18:24:34 +0100732 CHECK(sOut0);
733 CHECK(sOut1);
734 CHECK(mIn0);
735 CHECK(mIn1);
telsoa014fcda012018-03-09 14:13:49 +0000736
737 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
738
Sadik Armagan1625efc2021-06-10 18:24:34 +0100739 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000740}
741
Sadik Armagan1625efc2021-06-10 18:24:34 +0100742TEST_CASE("CreateSingleOutputMultipleInputs")
telsoa014fcda012018-03-09 14:13:49 +0000743{
telsoa01c577f2c2018-08-31 09:22:23 +0100744 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
745 // 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 +0000746
747 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000748 NeonWorkloadFactory factory =
749 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
750
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100751 std::unique_ptr<NeonSplitterWorkload> wlSplitter;
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100752 std::unique_ptr<NeonActivationWorkload> wlActiv0_0;
753 std::unique_ptr<NeonActivationWorkload> wlActiv0_1;
754 std::unique_ptr<NeonActivationWorkload> wlActiv1_0;
755 std::unique_ptr<NeonActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000756
Nattapat Chaimanowong14766d72018-10-12 15:09:53 +0100757 CreateSplitterMultipleInputsOneOutputWorkloadTest<NeonSplitterWorkload,
Nattapat Chaimanowongd4b70592018-10-12 11:21:49 +0100758 NeonActivationWorkload, DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
759 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000760
Derek Lambertic81855f2019-06-13 17:34:19 +0100761 armnn::IAclTensorHandle* sOut0 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
762 armnn::IAclTensorHandle* sOut1 = dynamic_cast<armnn::IAclTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
763 armnn::IAclTensorHandle* activ0_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
764 armnn::IAclTensorHandle* activ0_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
765 armnn::IAclTensorHandle* activ1_0Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
766 armnn::IAclTensorHandle* activ1_1Im = dynamic_cast<armnn::IAclTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000767
768
Sadik Armagan1625efc2021-06-10 18:24:34 +0100769 CHECK(sOut0);
770 CHECK(sOut1);
771 CHECK(activ0_0Im);
772 CHECK(activ0_1Im);
773 CHECK(activ1_0Im);
774 CHECK(activ1_1Im);
telsoa014fcda012018-03-09 14:13:49 +0000775
776 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
777 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
778
Sadik Armagan1625efc2021-06-10 18:24:34 +0100779 CHECK(validDataPointers);
telsoa014fcda012018-03-09 14:13:49 +0000780}
781
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100782#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100783
784// This test unit needs the reference backend, it's not available if the reference backend is not built
785
Sadik Armagan1625efc2021-06-10 18:24:34 +0100786TEST_CASE("CreateMemCopyWorkloadsNeon")
telsoa014fcda012018-03-09 14:13:49 +0000787{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000788 NeonWorkloadFactory factory =
789 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
Derek Lambertic81855f2019-06-13 17:34:19 +0100790 CreateMemCopyWorkloads<IAclTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000791}
792
Matteo Martincighe67edb22019-08-14 14:05:46 +0100793#endif
794
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100795template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
796static void NeonCreateL2NormalizationWorkloadTest(DataLayout dataLayout)
797{
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100798 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000799 NeonWorkloadFactory factory =
800 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
801
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100802 auto workload =
803 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100804
805 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
806 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100807 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
808 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100809
810 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ?
811 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
812 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ?
813 TensorShape{ 5, 20, 50, 67 } : TensorShape{ 5, 50, 67, 20 };
814
Sadik Armagan1625efc2021-06-10 18:24:34 +0100815 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
816 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100817}
818
819#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100820TEST_CASE("CreateL2NormalizationFloat16NchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100821{
822 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NCHW);
823}
824
Sadik Armagan1625efc2021-06-10 18:24:34 +0100825TEST_CASE("CreateL2NormalizationFloat16NhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100826{
827 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float16>(DataLayout::NHWC);
828}
829#endif
830
Sadik Armagan1625efc2021-06-10 18:24:34 +0100831TEST_CASE("CreateL2NormalizationNchwWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100832{
833 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NCHW);
834}
835
Sadik Armagan1625efc2021-06-10 18:24:34 +0100836TEST_CASE("CreateL2NormalizationNhwcWorkload")
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100837{
838 NeonCreateL2NormalizationWorkloadTest<NeonL2NormalizationFloatWorkload, DataType::Float32>(DataLayout::NHWC);
839}
840
Keith Davis69e653f2020-07-02 11:49:26 +0100841template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
842static void NeonCreateLogSoftmaxWorkloadTest()
843{
844 Graph graph;
845 NeonWorkloadFactory factory =
846 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
847
848 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
849
850 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
851 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
852 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
853 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
854 armnn::TensorInfo tensorInfo({4, 1}, DataType);
855
Sadik Armagan1625efc2021-06-10 18:24:34 +0100856 CHECK(TestNeonTensorHandleInfo(inputHandle, tensorInfo));
857 CHECK(TestNeonTensorHandleInfo(outputHandle, tensorInfo));
Keith Davis69e653f2020-07-02 11:49:26 +0100858}
859
860#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100861TEST_CASE("CreateLogSoftmaxFloat16Workload")
Keith Davis69e653f2020-07-02 11:49:26 +0100862{
863 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float16>();
864}
865#endif
866
Sadik Armagan1625efc2021-06-10 18:24:34 +0100867TEST_CASE("CreateLogSoftmaxFloatWorkload")
Keith Davis69e653f2020-07-02 11:49:26 +0100868{
869 NeonCreateLogSoftmaxWorkloadTest<NeonLogSoftmaxWorkload, DataType::Float32>();
870}
871
Jan Eilersad5293a2019-07-08 09:57:55 +0100872template <typename LstmWorkloadType>
873static void NeonCreateLstmWorkloadTest()
874{
875 Graph graph;
876 NeonWorkloadFactory factory =
877 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
878
879 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
880
881 LstmQueueDescriptor queueDescriptor = workload->GetData();
882
Jan Eilersbb446e52020-04-02 13:56:54 +0100883 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
884 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Jan Eilersad5293a2019-07-08 09:57:55 +0100885
Sadik Armagan1625efc2021-06-10 18:24:34 +0100886 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo({ 2, 2 }, DataType::Float32)));
887 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo({ 2, 4 }, DataType::Float32)));
Jan Eilersad5293a2019-07-08 09:57:55 +0100888}
889
Sadik Armagan1625efc2021-06-10 18:24:34 +0100890TEST_CASE("CreateLSTMWorkloadFloatWorkload")
Jan Eilersad5293a2019-07-08 09:57:55 +0100891{
892 NeonCreateLstmWorkloadTest<NeonLstmFloatWorkload>();
893}
894
Jim Flynne242f2d2019-05-22 14:24:13 +0100895template <typename ConcatWorkloadType, armnn::DataType DataType>
896static void NeonCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000897 unsigned int concatAxis)
898{
899 Graph graph;
900 NeonWorkloadFactory factory =
901 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
902
Jim Flynne242f2d2019-05-22 14:24:13 +0100903 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000904
Jim Flynne242f2d2019-05-22 14:24:13 +0100905 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100906 auto inputHandle0 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
907 auto inputHandle1 = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
908 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000909
Sadik Armagan1625efc2021-06-10 18:24:34 +0100910 CHECK(TestNeonTensorHandleInfo(inputHandle0, TensorInfo({ 2, 3, 2, 5 }, DataType)));
911 CHECK(TestNeonTensorHandleInfo(inputHandle1, TensorInfo({ 2, 3, 2, 5 }, DataType)));
912 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
narpra015cdda352018-11-19 15:30:27 +0000913}
914
Sadik Armagan1625efc2021-06-10 18:24:34 +0100915TEST_CASE("CreateConcatDim0Float32Workload")
narpra015cdda352018-11-19 15:30:27 +0000916{
Jim Flynne242f2d2019-05-22 14:24:13 +0100917 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000918}
919
Sadik Armagan1625efc2021-06-10 18:24:34 +0100920TEST_CASE("CreateConcatDim1Float32Workload")
narpra015cdda352018-11-19 15:30:27 +0000921{
Jim Flynne242f2d2019-05-22 14:24:13 +0100922 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000923}
924
Sadik Armagan1625efc2021-06-10 18:24:34 +0100925TEST_CASE("CreateConcatDim3Float32Workload")
narpra015cdda352018-11-19 15:30:27 +0000926{
Jim Flynne242f2d2019-05-22 14:24:13 +0100927 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000928}
929
Sadik Armagan1625efc2021-06-10 18:24:34 +0100930TEST_CASE("CreateConcatDim0Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +0000931{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000932 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000933}
934
Sadik Armagan1625efc2021-06-10 18:24:34 +0100935TEST_CASE("CreateConcatDim1Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +0000936{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000937 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000938}
939
Sadik Armagan1625efc2021-06-10 18:24:34 +0100940TEST_CASE("CreateConcatDim3Uint8Workload")
narpra0163b08822018-11-20 11:29:12 +0000941{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000942 NeonCreateConcatWorkloadTest<NeonConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000943}
944
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100945template <armnn::DataType DataType>
946static void NeonCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
947 const std::initializer_list<unsigned int>& outputShape,
948 unsigned int axis,
949 unsigned int numInputs)
950{
951 armnn::Graph graph;
952 NeonWorkloadFactory factory =
953 NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
954
955 auto workload = CreateStackWorkloadTest<NeonStackWorkload, DataType>(factory,
956 graph,
957 TensorShape(inputShape),
958 TensorShape(outputShape),
959 axis,
960 numInputs);
961
962 // Check inputs and output are as expected
963 StackQueueDescriptor queueDescriptor = workload->GetData();
964 for (unsigned int i = 0; i < numInputs; ++i)
965 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100966 auto inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[i]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100967 CHECK(TestNeonTensorHandleInfo(inputHandle, TensorInfo(inputShape, DataType)));
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100968 }
Jan Eilersbb446e52020-04-02 13:56:54 +0100969 auto outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +0100970 CHECK(TestNeonTensorHandleInfo(outputHandle, TensorInfo(outputShape, DataType)));
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100971}
972
Sadik Armagan1625efc2021-06-10 18:24:34 +0100973TEST_CASE("CreateStackFloat32Workload")
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100974{
975 NeonCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
976}
977
Matthew Jacksone69c3992019-09-09 14:31:21 +0100978#ifdef __ARM_FEATURE_FP16_VECTOR_ARITHMETIC
Sadik Armagan1625efc2021-06-10 18:24:34 +0100979TEST_CASE("CreateStackFloat16Workload")
Matthew Jacksone69c3992019-09-09 14:31:21 +0100980{
981 NeonCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
982}
983#endif
984
Sadik Armagan1625efc2021-06-10 18:24:34 +0100985TEST_CASE("CreateStackUint8Workload")
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100986{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000987 NeonCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson87f65ea2019-08-01 10:01:34 +0100988}
989
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100990template <typename QuantizedLstmWorkloadType>
991static void NeonCreateQuantizedLstmWorkloadTest()
992{
Francis Murtagh4fc3c482019-08-02 13:20:54 +0100993 Graph graph;
994 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
995
996 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
997
998 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
999
Jan Eilersbb446e52020-04-02 13:56:54 +01001000 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001001 CHECK((inputHandle->GetShape() == TensorShape({2, 2})));
1002 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001003
Jan Eilersbb446e52020-04-02 13:56:54 +01001004 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001005 CHECK((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1006 CHECK((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001007
Jan Eilersbb446e52020-04-02 13:56:54 +01001008 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001009 CHECK((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1010 CHECK((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001011
Jan Eilersbb446e52020-04-02 13:56:54 +01001012 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001013 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1014 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001015
Jan Eilersbb446e52020-04-02 13:56:54 +01001016 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001017 CHECK((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1018 CHECK((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001019}
1020
Sadik Armagan1625efc2021-06-10 18:24:34 +01001021TEST_CASE("CreateQuantizedLstmWorkload")
Francis Murtagh4fc3c482019-08-02 13:20:54 +01001022{
1023 NeonCreateQuantizedLstmWorkloadTest<NeonQuantizedLstmWorkload>();
1024}
1025
James Conroycc340932020-05-12 18:08:52 +01001026template <typename QLstmWorkloadType>
1027static void NeonCreateQLstmWorkloadTest()
1028{
1029 Graph graph;
1030 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(NeonWorkloadFactoryHelper::GetMemoryManager());
1031
1032 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1033 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1034
1035 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001036 CHECK((inputHandle->GetShape() == TensorShape({2, 4})));
1037 CHECK((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
James Conroycc340932020-05-12 18:08:52 +01001038
1039 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001040 CHECK((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1041 CHECK((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
James Conroycc340932020-05-12 18:08:52 +01001042
1043 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
Sadik Armagan1625efc2021-06-10 18:24:34 +01001044 CHECK((outputHandle->GetShape() == TensorShape({2, 4})));
1045 CHECK((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
James Conroycc340932020-05-12 18:08:52 +01001046}
1047
Sadik Armagan1625efc2021-06-10 18:24:34 +01001048TEST_CASE("CreateQLstmWorkloadTest")
James Conroycc340932020-05-12 18:08:52 +01001049{
1050 NeonCreateQLstmWorkloadTest<NeonQLstmWorkload>();
1051}
1052
Teresa Charlin98b0dcb2022-01-18 22:09:29 +00001053template <armnn::DataType DataType>
1054static void NeonCreateActivationWorkloadReplaceFunctionsTest()
1055{
1056 shared_ptr<NeonMemoryManager> memoryManager = make_shared<NeonMemoryManager>();
1057
1058 Graph graph;
1059 NeonWorkloadFactory factory = NeonWorkloadFactoryHelper::GetFactory(memoryManager);
1060 // input and output are created as armnn::TensorInfo tensorInfo({1, 1}, DataType)
1061 auto workloadPtr = CreateActivationWorkloadTest<NeonActivationWorkload, DataType>(factory, graph);
1062
1063 // new input and output tensor handlers are created and then replace in the workload
1064 const NeonTensorHandleFactory tensorHandleFactory(memoryManager);
1065 TensorInfo inputInfo({2 , 2}, DataType::Float16);
1066 TensorInfo outputInfo({2 , 2}, DataType::Float16);
1067 unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
1068 inputHandle->Allocate();
1069 unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
1070 outputHandle->Allocate();
1071
1072 unsigned int slot = 0;
1073 CHECK_THROWS_AS(workloadPtr->ReplaceInputTensorHandle(inputHandle.get(), slot), UnimplementedException);
1074 CHECK_THROWS_AS(workloadPtr->ReplaceOutputTensorHandle(outputHandle.get(), slot), UnimplementedException);
1075}
1076
1077TEST_CASE("NeonReplaceFunctionsfromFloat32toFloat16ActivationWorkload")
1078{
1079 NeonCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::Float32>();
1080}
1081
1082TEST_CASE("NeonReplaceFunctionsfromUint8toFloat16ActivationWorkload")
1083{
1084 NeonCreateActivationWorkloadReplaceFunctionsTest<armnn::DataType::QAsymmU8>();
1085}
1086
Sadik Armagan1625efc2021-06-10 18:24:34 +01001087}