blob: b09b26f9b37a1c059e23b7c6eb5eafc83896c2e4 [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
telsoa01c577f2c2018-08-31 09:22:23 +01006#include "ClContextControlFixture.hpp"
Aron Virginas-Tar56055192018-11-12 18:10:43 +00007#include "ClWorkloadFactoryHelper.hpp"
telsoa014fcda012018-03-09 14:13:49 +00008
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>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010013#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010014
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000015#include <cl/ClTensorHandle.hpp>
16#include <cl/ClWorkloadFactory.hpp>
17#include <cl/workloads/ClWorkloads.hpp>
18#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010019
telsoa014fcda012018-03-09 14:13:49 +000020boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
21 std::initializer_list<unsigned int> expectedDimensions)
22{
23 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
24}
25
telsoa01c577f2c2018-08-31 09:22:23 +010026BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000027
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010028template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010029static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000030{
31 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000032 ClWorkloadFactory factory =
33 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000034
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010035 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000036
telsoa01c577f2c2018-08-31 09:22:23 +010037 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000038 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010039 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
40 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000041
Matthew Bentham89105282018-11-20 14:33:33 +000042 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 1}));
43 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 1}));
telsoa014fcda012018-03-09 14:13:49 +000044}
45
arovir019e53a352018-08-31 15:26:35 +010046BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010047{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010048 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010049}
50
51BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
52{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010053 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010054}
55
David Beck4a8692c2018-09-07 16:19:24 +010056template <typename WorkloadType,
57 typename DescriptorType,
58 typename LayerType,
59 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000060static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000061{
62 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000063 ClWorkloadFactory factory =
64 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
65
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000066 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000067
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000068 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010069 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010070 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
71 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
72 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000073 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
74 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
75 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
76}
77
arovir019e53a352018-08-31 15:26:35 +010078BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000079{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000080 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010081 AdditionQueueDescriptor,
82 AdditionLayer,
83 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010084}
85
86BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
87{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000088 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010089 AdditionQueueDescriptor,
90 AdditionLayer,
91 armnn::DataType::Float16>();
92}
93
94BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
95{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000096 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010097 SubtractionQueueDescriptor,
98 SubtractionLayer,
99 armnn::DataType::Float32>();
100}
101
102BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
103{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000104 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100105 SubtractionQueueDescriptor,
106 SubtractionLayer,
107 armnn::DataType::Float16>();
108}
109
110BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
111{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000112 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100113 MultiplicationQueueDescriptor,
114 MultiplicationLayer,
115 armnn::DataType::Float32>();
116}
117
118BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
119{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000120 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100121 MultiplicationQueueDescriptor,
122 MultiplicationLayer,
123 armnn::DataType::Float16>();
124}
125
Matthew Benthame2ec3302018-10-01 11:32:48 +0100126BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
127{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000128 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100129 MultiplicationQueueDescriptor,
130 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000131 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100132}
133
David Beck4a8692c2018-09-07 16:19:24 +0100134BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
135{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000136 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100137 DivisionQueueDescriptor,
138 DivisionLayer,
139 armnn::DataType::Float32>();
140}
141
142BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
143{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000144 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100145 DivisionQueueDescriptor,
146 DivisionLayer,
147 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100148}
149
josh minor4a3c6102020-01-06 16:40:46 -0600150template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100151 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100152 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600153static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100154{
155 Graph graph;
156 ClWorkloadFactory factory =
157 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
158
josh minor4a3c6102020-01-06 16:40:46 -0600159 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100160
161 DescriptorType queueDescriptor = workload->GetData();
162
Jan Eilersbb446e52020-04-02 13:56:54 +0100163 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
164 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100165
166 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3}));
167 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
168}
169
170BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32WorkloadTest)
171{
josh minor4a3c6102020-01-06 16:40:46 -0600172 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
173 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100174}
175
telsoa01c577f2c2018-08-31 09:22:23 +0100176template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100177static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100178{
179 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000180 ClWorkloadFactory factory =
181 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000182
telsoa01c577f2c2018-08-31 09:22:23 +0100183 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100184 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000185
telsoa01c577f2c2018-08-31 09:22:23 +0100186 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000187 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100188 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
189 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000190
Nikhil Rajd1340932018-10-18 14:27:50 +0100191 switch (dataLayout)
192 {
193 case DataLayout::NHWC:
194 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
195 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
196 break;
197 default: // NCHW
198 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
199 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
200 }
telsoa014fcda012018-03-09 14:13:49 +0000201}
202
Nikhil Rajd1340932018-10-18 14:27:50 +0100203BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000204{
Nikhil Rajd1340932018-10-18 14:27:50 +0100205 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
206 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100207}
telsoa014fcda012018-03-09 14:13:49 +0000208
Nikhil Rajd1340932018-10-18 14:27:50 +0100209BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100210{
Nikhil Rajd1340932018-10-18 14:27:50 +0100211 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
212 armnn::DataType::Float16>(DataLayout::NCHW);
213}
214
215BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
216{
217 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
218 armnn::DataType::Float32>(DataLayout::NHWC);
219}
220
221BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
222{
223 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
224 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100225}
226
227BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
228{
229 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000230 ClWorkloadFactory factory =
231 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
232
telsoa01c577f2c2018-08-31 09:22:23 +0100233 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
234
235 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100236 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
237 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100238
Matthew Bentham89105282018-11-20 14:33:33 +0000239 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
240 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100241 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
242 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
243}
244
245BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
246{
247 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000248 ClWorkloadFactory factory =
249 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
250
telsoa01c577f2c2018-08-31 09:22:23 +0100251 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
252
253 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100254 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
255 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100256
Matthew Bentham89105282018-11-20 14:33:33 +0000257 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
258 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100259 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
260 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
261}
262
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100263template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
264static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100265{
266 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000267 ClWorkloadFactory factory =
268 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
269
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100270 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
271 graph,
272 dataLayout);
273
Mike Kellydb482882019-06-14 12:35:24 +0100274 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
275 : std::initializer_list<unsigned int>({2, 8, 16, 3});
276 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
277 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100278
279 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000280 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100281 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
282 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100283 BOOST_TEST((inputHandle->GetShape() == inputShape));
284 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000285}
286
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100287BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000288{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100289 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100290}
291
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100292BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100293{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100294 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000295}
296
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100297BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
298{
299 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
300}
301
302BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
303{
304 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
305}
306
Nikhil Rajcec6b652018-10-12 13:51:57 +0100307template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
308static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
309{
310 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000311 ClWorkloadFactory factory =
312 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100313
314 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
315 (factory, graph, dataLayout);
316
317 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
318 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100319 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
320 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100321
Mike Kellydb482882019-06-14 12:35:24 +0100322 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
323 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
324 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
325 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100326
Mike Kellydb482882019-06-14 12:35:24 +0100327 BOOST_TEST((inputHandle->GetShape() == inputShape));
328 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100329}
330
331BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
332{
333 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
334}
335
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100336template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100337static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000338{
telsoa01c577f2c2018-08-31 09:22:23 +0100339 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000340 ClWorkloadFactory factory =
341 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
342
Matthew Benthamd8067922018-10-03 17:18:04 +0100343 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, 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 CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000346 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100347 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
348 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000349 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
350 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
351}
352
arovir019e53a352018-08-31 15:26:35 +0100353BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000354{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100355 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100356}
357
358BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
359{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100360 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000361}
362
363BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
364{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000365 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000366}
367
telsoa01c577f2c2018-08-31 09:22:23 +0100368template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
369static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000370{
telsoa01c577f2c2018-08-31 09:22:23 +0100371 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000372 ClWorkloadFactory factory =
373 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
374
telsoa01c577f2c2018-08-31 09:22:23 +0100375 auto workload =
376 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000377
telsoa01c577f2c2018-08-31 09:22:23 +0100378 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000379 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100380 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
381 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000382 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
383 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
384}
385
telsoa01c577f2c2018-08-31 09:22:23 +0100386
arovir019e53a352018-08-31 15:26:35 +0100387BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000388{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100389 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100390}
391
392BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
393{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100394 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100395}
396
telsoa01c577f2c2018-08-31 09:22:23 +0100397template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100398static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100399{
400 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000401 ClWorkloadFactory factory =
402 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
403
Matteo Martincigha160b242018-10-18 10:33:23 +0100404 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000405
telsoa01c577f2c2018-08-31 09:22:23 +0100406 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000407 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100408 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
409 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000410
Mike Kellydb482882019-06-14 12:35:24 +0100411 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
412 : std::initializer_list<unsigned int>({3, 1, 5, 5});
413 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
414 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100415
Mike Kellydb482882019-06-14 12:35:24 +0100416 BOOST_TEST((inputHandle->GetShape() == inputShape));
417 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000418}
419
narpra0155a97bc2018-10-02 14:35:53 +0100420BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000421{
narpra0155a97bc2018-10-02 14:35:53 +0100422 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100423}
424
narpra0155a97bc2018-10-02 14:35:53 +0100425BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100426{
narpra0155a97bc2018-10-02 14:35:53 +0100427 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
428}
429
430BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
431{
432 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
433}
434
435BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
436{
437 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100438}
439
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100440template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100441static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100442{
443 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000444 ClWorkloadFactory factory =
445 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000446
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100447 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100448
Mike Kellydb482882019-06-14 12:35:24 +0100449 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
450 : std::initializer_list<unsigned int>({3, 5, 5, 2});
451 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
452 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000453
telsoa01c577f2c2018-08-31 09:22:23 +0100454 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000455 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100456 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
457 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000458
Mike Kellydb482882019-06-14 12:35:24 +0100459 BOOST_TEST((inputHandle->GetShape() == inputShape));
460 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000461}
462
Nina Drozdb48e6862018-10-09 12:09:56 +0100463BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100464{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100465 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100466}
467
Nina Drozdb48e6862018-10-09 12:09:56 +0100468BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100469{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100470 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100471}
472
473BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
474{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100475 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100476}
477
478BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
479{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100480 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100481}
482
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100483static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
484 const armnn::TensorShape& alphaShape,
485 const armnn::TensorShape& outputShape,
486 armnn::DataType dataType)
487{
488 Graph graph;
489 ClWorkloadFactory factory =
490 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
491
492 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
493 graph,
494 inputShape,
495 alphaShape,
496 outputShape,
497 dataType);
498
499 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
500 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100501 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
502 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
503 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100504
505 BOOST_TEST((inputHandle->GetShape() == inputShape));
506 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
507 BOOST_TEST((outputHandle->GetShape() == outputShape));
508}
509
510BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
511{
512 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
513}
514
515BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
516{
517 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
518}
519
520BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
521{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000522 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100523}
524
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100525template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000526static void ClCreateReshapeWorkloadTest()
527{
telsoa01c577f2c2018-08-31 09:22:23 +0100528 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000529 ClWorkloadFactory factory =
530 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000531
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100532 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000533
telsoa01c577f2c2018-08-31 09:22:23 +0100534 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000535 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100536 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
537 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000538
539 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000540 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000541}
542
arovir019e53a352018-08-31 15:26:35 +0100543BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000544{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100545 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100546}
547
548BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
549{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100550 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000551}
552
553BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
554{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000555 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000556}
557
telsoa01c577f2c2018-08-31 09:22:23 +0100558template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
559static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000560{
telsoa01c577f2c2018-08-31 09:22:23 +0100561 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000562 ClWorkloadFactory factory =
563 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000564
telsoa01c577f2c2018-08-31 09:22:23 +0100565 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000566
arovir019e53a352018-08-31 15:26:35 +0100567 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000568 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100569 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
570 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000571
572 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
573 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
574}
575
telsoa01c577f2c2018-08-31 09:22:23 +0100576
arovir019e53a352018-08-31 15:26:35 +0100577BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100578{
arovir019e53a352018-08-31 15:26:35 +0100579 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100580}
581
582BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
583{
arovir019e53a352018-08-31 15:26:35 +0100584 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100585}
586
Matthew Bentham29cadb32018-10-01 17:22:32 +0100587template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100588static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000589{
590 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000591 ClWorkloadFactory factory =
592 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000593
Matthew Bentham29cadb32018-10-01 17:22:32 +0100594 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000595
telsoa01c577f2c2018-08-31 09:22:23 +0100596 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000597 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100598 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100599 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
600
Jan Eilersbb446e52020-04-02 13:56:54 +0100601 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100602 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
603
Jan Eilersbb446e52020-04-02 13:56:54 +0100604 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100605 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
606
Jan Eilersbb446e52020-04-02 13:56:54 +0100607 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000608 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000609}
610
arovir019e53a352018-08-31 15:26:35 +0100611BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000612{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100613 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100614}
615
616BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
617{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100618 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100619}
620
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100621template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100622static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100623{
624 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100625 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000626 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100627 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
628 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000629
630 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000631 ClWorkloadFactory factory =
632 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000633
634 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100635 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100636 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000637
638 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100639 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000640
telsoa01c577f2c2018-08-31 09:22:23 +0100641 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000642 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
643 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100644 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
645 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000646
647 BOOST_TEST(sOut0);
648 BOOST_TEST(sOut1);
649 BOOST_TEST(mIn0);
650 BOOST_TEST(mIn1);
651
telsoa01c577f2c2018-08-31 09:22:23 +0100652 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000653 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
654 BOOST_TEST(validDataPointers);
655
656
telsoa01c577f2c2018-08-31 09:22:23 +0100657 //Also make sure that the inputs are subtensors of one tensor and outputs are sub tensors of another tensor.
telsoa014fcda012018-03-09 14:13:49 +0000658 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
659 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
660
661 BOOST_TEST(validSubTensorParents);
662}
663
Jim Flynne242f2d2019-05-22 14:24:13 +0100664BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100665{
Jim Flynne242f2d2019-05-22 14:24:13 +0100666 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100667}
668
Jim Flynne242f2d2019-05-22 14:24:13 +0100669BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100670{
Jim Flynne242f2d2019-05-22 14:24:13 +0100671 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100672}
673
674
telsoa014fcda012018-03-09 14:13:49 +0000675BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
676{
677 // Test that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100678 // We create a splitter with two outputs. That each of those outputs is used by two different activation layers.
telsoa014fcda012018-03-09 14:13:49 +0000679
680 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000681 ClWorkloadFactory factory =
682 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
683
Matthew Bentham29cadb32018-10-01 17:22:32 +0100684 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100685 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
686 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
687 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
688 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000689
Matthew Bentham29cadb32018-10-01 17:22:32 +0100690 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100691 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100692 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000693
telsoa01c577f2c2018-08-31 09:22:23 +0100694 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000695 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
696 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
697 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
698 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
699 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
700 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
701
702
703 BOOST_TEST(sOut0);
704 BOOST_TEST(sOut1);
705 BOOST_TEST(activ0_0Im);
706 BOOST_TEST(activ0_1Im);
707 BOOST_TEST(activ1_0Im);
708 BOOST_TEST(activ1_1Im);
709
710 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
711 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
712
713 BOOST_TEST(validDataPointers);
714}
715
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100716#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100717
718// This test unit needs the reference backend, it's not available if the reference backend is not built
719
telsoa014fcda012018-03-09 14:13:49 +0000720BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
721{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000722 ClWorkloadFactory factory =
723 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
724
telsoa01c577f2c2018-08-31 09:22:23 +0100725 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000726}
727
Matteo Martincighe67edb22019-08-14 14:05:46 +0100728#endif
729
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100730template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
731static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000732{
telsoa01c577f2c2018-08-31 09:22:23 +0100733 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000734 ClWorkloadFactory factory =
735 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
736
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100737 auto workload =
738 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000739
telsoa01c577f2c2018-08-31 09:22:23 +0100740 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000741 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100742 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
743 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000744
Mike Kellydb482882019-06-14 12:35:24 +0100745 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
746 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
747 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
748 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100749
Mike Kellydb482882019-06-14 12:35:24 +0100750 BOOST_TEST((inputHandle->GetShape() == inputShape));
751 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000752}
753
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100754BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
755{
756 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
757}
758
759BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
760{
761 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
762}
763
764BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
765{
766 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
767}
768
769BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
770{
771 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
772}
773
telsoa01c577f2c2018-08-31 09:22:23 +0100774template <typename LstmWorkloadType>
775static void ClCreateLstmWorkloadTest()
776{
777 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000778 ClWorkloadFactory factory =
779 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
780
telsoa01c577f2c2018-08-31 09:22:23 +0100781 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
782
783 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100784 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
785 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100786 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
787 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
788}
789
arovir019e53a352018-08-31 15:26:35 +0100790BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100791{
arovir019e53a352018-08-31 15:26:35 +0100792 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100793}
794
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100795template <typename ResizeWorkloadType, typename armnn::DataType DataType>
796static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100797{
798 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000799 ClWorkloadFactory factory =
800 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100801
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100802 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100803
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100804 auto queueDescriptor = workload->GetData();
805
Jan Eilersbb446e52020-04-02 13:56:54 +0100806 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
807 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100808
809 switch (dataLayout)
810 {
811 case DataLayout::NHWC:
812 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
813 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
814 break;
James Conroy69482272018-10-19 10:41:35 +0100815 case DataLayout::NCHW:
816 default:
James Conroy074f3712018-10-03 09:32:03 +0100817 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
818 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
819 }
820}
821
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100822BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100823{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100824 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100825}
826
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100827BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100828{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100829 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100830}
831
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100832BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100833{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000834 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100835}
836
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100837BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100838{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100839 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
840}
841
842BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
843{
844 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
845}
846
847BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
848{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000849 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +0100850}
telsoa01c577f2c2018-08-31 09:22:23 +0100851
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100852template <typename MeanWorkloadType, typename armnn::DataType DataType>
853static void ClMeanWorkloadTest()
854{
855 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000856 ClWorkloadFactory factory =
857 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
858
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100859 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
860
861 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
862 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100863 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
864 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100865
866 // The first dimension (batch size) in both input and output is singular thus it has been reduced by ACL.
Matthew Bentham89105282018-11-20 14:33:33 +0000867 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
868 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100869}
870
871BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
872{
873 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
874}
875
876BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
877{
878 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
879}
880
881BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
882{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000883 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100884}
885
Jim Flynne242f2d2019-05-22 14:24:13 +0100886template <typename ConcatWorkloadType, armnn::DataType DataType>
887static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000888 unsigned int concatAxis)
889{
890 Graph graph;
891 ClWorkloadFactory factory =
892 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
893
Jim Flynne242f2d2019-05-22 14:24:13 +0100894 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000895
Jim Flynne242f2d2019-05-22 14:24:13 +0100896 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100897 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
898 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
899 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000900
901 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
902 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
903 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
904}
905
Jim Flynne242f2d2019-05-22 14:24:13 +0100906BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000907{
Jim Flynne242f2d2019-05-22 14:24:13 +0100908 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000909}
910
Jim Flynne242f2d2019-05-22 14:24:13 +0100911BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000912{
Jim Flynne242f2d2019-05-22 14:24:13 +0100913 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000914}
915
Jim Flynne242f2d2019-05-22 14:24:13 +0100916BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000917{
Jim Flynne242f2d2019-05-22 14:24:13 +0100918 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000919}
920
Jim Flynne242f2d2019-05-22 14:24:13 +0100921BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000922{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000923 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000924}
925
Jim Flynne242f2d2019-05-22 14:24:13 +0100926BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000927{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000928 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000929}
930
Jim Flynne242f2d2019-05-22 14:24:13 +0100931BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000932{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000933 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000934}
935
James Conroy60597842019-07-02 10:57:56 +0100936template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
937static void ClSpaceToDepthWorkloadTest()
938{
939 Graph graph;
940 ClWorkloadFactory factory =
941 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
942
943 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
944
945 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100946 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
947 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +0100948
949 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
950 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
951}
952
953BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
954{
955 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
956}
957
958BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
959{
960 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
961}
962
963BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
964{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000965 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +0100966}
967
968BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
969{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000970 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +0100971}
972
Matthew Jacksond5166102019-07-31 14:06:28 +0100973template <armnn::DataType DataType>
974static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
975 const std::initializer_list<unsigned int>& outputShape,
976 unsigned int axis,
977 unsigned int numInputs)
978{
979 armnn::Graph graph;
980 ClWorkloadFactory factory =
981 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
982
983 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
984 graph,
985 TensorShape(inputShape),
986 TensorShape(outputShape),
987 axis,
988 numInputs);
989
990 // Check inputs and output are as expected
991 StackQueueDescriptor queueDescriptor = workload->GetData();
992 for (unsigned int i = 0; i < numInputs; ++i)
993 {
Jan Eilersbb446e52020-04-02 13:56:54 +0100994 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +0100995 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
996 }
Jan Eilersbb446e52020-04-02 13:56:54 +0100997 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +0100998 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
999}
1000
1001BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1002{
1003 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1004}
1005
Matthew Jacksone69c3992019-09-09 14:31:21 +01001006BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
1007{
1008 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1009}
1010
Matthew Jacksond5166102019-07-31 14:06:28 +01001011BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1012{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001013 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001014}
1015
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001016template <typename QuantizedLstmWorkloadType>
1017static void ClCreateQuantizedLstmWorkloadTest()
1018{
1019 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001020
1021 Graph graph;
1022 ClWorkloadFactory factory =
1023 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1024
1025 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1026
1027 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1028
Jan Eilersbb446e52020-04-02 13:56:54 +01001029 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001030 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1031 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1032
Jan Eilersbb446e52020-04-02 13:56:54 +01001033 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001034 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1035 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1036
Jan Eilersbb446e52020-04-02 13:56:54 +01001037 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001038 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1039 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1040
Jan Eilersbb446e52020-04-02 13:56:54 +01001041 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001042 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1043 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1044
Jan Eilersbb446e52020-04-02 13:56:54 +01001045 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001046 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1047 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1048}
1049
1050BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1051{
1052 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1053}
1054
telsoa014fcda012018-03-09 14:13:49 +00001055BOOST_AUTO_TEST_SUITE_END()