blob: 833918c7272b8b156bc62910ff49941066456bfe [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
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <backendsCommon/MemCopyWorkload.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010010
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000011#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010012#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <cl/ClTensorHandle.hpp>
15#include <cl/ClWorkloadFactory.hpp>
16#include <cl/workloads/ClWorkloads.hpp>
17#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010018
telsoa014fcda012018-03-09 14:13:49 +000019boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
20 std::initializer_list<unsigned int> expectedDimensions)
21{
22 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
23}
24
telsoa01c577f2c2018-08-31 09:22:23 +010025BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000026
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010027template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010028static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000029{
30 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000031 ClWorkloadFactory factory =
32 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000033
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010034 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000035
telsoa01c577f2c2018-08-31 09:22:23 +010036 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000037 ActivationQueueDescriptor queueDescriptor = workload->GetData();
38 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
39 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
40
Matthew Bentham89105282018-11-20 14:33:33 +000041 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 1}));
42 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 1}));
telsoa014fcda012018-03-09 14:13:49 +000043}
44
arovir019e53a352018-08-31 15:26:35 +010045BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010046{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010047 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010048}
49
50BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
51{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010052 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010053}
54
David Beck4a8692c2018-09-07 16:19:24 +010055template <typename WorkloadType,
56 typename DescriptorType,
57 typename LayerType,
58 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000059static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000060{
61 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000062 ClWorkloadFactory factory =
63 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
64
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000065 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000066
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000067 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010068 DescriptorType queueDescriptor = workload->GetData();
telsoa014fcda012018-03-09 14:13:49 +000069 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
70 auto inputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
71 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
72 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
73 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
74 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
75}
76
arovir019e53a352018-08-31 15:26:35 +010077BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000078{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000079 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010080 AdditionQueueDescriptor,
81 AdditionLayer,
82 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010083}
84
85BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
86{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000087 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010088 AdditionQueueDescriptor,
89 AdditionLayer,
90 armnn::DataType::Float16>();
91}
92
93BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
94{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000095 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010096 SubtractionQueueDescriptor,
97 SubtractionLayer,
98 armnn::DataType::Float32>();
99}
100
101BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
102{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000103 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100104 SubtractionQueueDescriptor,
105 SubtractionLayer,
106 armnn::DataType::Float16>();
107}
108
109BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
110{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000111 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100112 MultiplicationQueueDescriptor,
113 MultiplicationLayer,
114 armnn::DataType::Float32>();
115}
116
117BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
118{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000119 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100120 MultiplicationQueueDescriptor,
121 MultiplicationLayer,
122 armnn::DataType::Float16>();
123}
124
Matthew Benthame2ec3302018-10-01 11:32:48 +0100125BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
126{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000127 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100128 MultiplicationQueueDescriptor,
129 MultiplicationLayer,
130 armnn::DataType::QuantisedAsymm8>();
131}
132
David Beck4a8692c2018-09-07 16:19:24 +0100133BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
134{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000135 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100136 DivisionQueueDescriptor,
137 DivisionLayer,
138 armnn::DataType::Float32>();
139}
140
141BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
142{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000143 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100144 DivisionQueueDescriptor,
145 DivisionLayer,
146 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100147}
148
149template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100150static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100151{
152 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000153 ClWorkloadFactory factory =
154 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000155
telsoa01c577f2c2018-08-31 09:22:23 +0100156 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100157 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000158
telsoa01c577f2c2018-08-31 09:22:23 +0100159 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000160 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
161 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
162 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
163
Nikhil Rajd1340932018-10-18 14:27:50 +0100164 switch (dataLayout)
165 {
166 case DataLayout::NHWC:
167 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
168 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
169 break;
170 default: // NCHW
171 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
172 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
173 }
telsoa014fcda012018-03-09 14:13:49 +0000174}
175
Nikhil Rajd1340932018-10-18 14:27:50 +0100176BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000177{
Nikhil Rajd1340932018-10-18 14:27:50 +0100178 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
179 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100180}
telsoa014fcda012018-03-09 14:13:49 +0000181
Nikhil Rajd1340932018-10-18 14:27:50 +0100182BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100183{
Nikhil Rajd1340932018-10-18 14:27:50 +0100184 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
185 armnn::DataType::Float16>(DataLayout::NCHW);
186}
187
188BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
189{
190 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
191 armnn::DataType::Float32>(DataLayout::NHWC);
192}
193
194BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
195{
196 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
197 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100198}
199
200BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
201{
202 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000203 ClWorkloadFactory factory =
204 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
205
telsoa01c577f2c2018-08-31 09:22:23 +0100206 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
207
208 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
209 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
210 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
211
Matthew Bentham89105282018-11-20 14:33:33 +0000212 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
213 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100214 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
215 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
216}
217
218BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
219{
220 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000221 ClWorkloadFactory factory =
222 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
223
telsoa01c577f2c2018-08-31 09:22:23 +0100224 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
225
226 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
227 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
228 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
229
Matthew Bentham89105282018-11-20 14:33:33 +0000230 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
231 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100232 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
233 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
234}
235
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100236template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
237static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100238{
239 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000240 ClWorkloadFactory factory =
241 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
242
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100243 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
244 graph,
245 dataLayout);
246
Mike Kellydb482882019-06-14 12:35:24 +0100247 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
248 : std::initializer_list<unsigned int>({2, 8, 16, 3});
249 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
250 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100251
252 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000253 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
254 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
255 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100256 BOOST_TEST((inputHandle->GetShape() == inputShape));
257 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000258}
259
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100260BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000261{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100262 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100263}
264
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100265BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100266{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100267 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000268}
269
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100270BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
271{
272 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
273}
274
275BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
276{
277 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
278}
279
Nikhil Rajcec6b652018-10-12 13:51:57 +0100280template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
281static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
282{
283 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000284 ClWorkloadFactory factory =
285 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100286
287 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
288 (factory, graph, dataLayout);
289
290 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
291 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
292 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
293 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
294
Mike Kellydb482882019-06-14 12:35:24 +0100295 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
296 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
297 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
298 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100299
Mike Kellydb482882019-06-14 12:35:24 +0100300 BOOST_TEST((inputHandle->GetShape() == inputShape));
301 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100302}
303
304BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
305{
306 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
307}
308
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100309template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100310static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000311{
telsoa01c577f2c2018-08-31 09:22:23 +0100312 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000313 ClWorkloadFactory factory =
314 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
315
Matthew Benthamd8067922018-10-03 17:18:04 +0100316 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000317
telsoa01c577f2c2018-08-31 09:22:23 +0100318 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000319 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
320 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
321 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
322 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
323 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
324}
325
arovir019e53a352018-08-31 15:26:35 +0100326BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000327{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100328 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100329}
330
331BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
332{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100333 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000334}
335
336BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
337{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100338 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000339}
340
telsoa01c577f2c2018-08-31 09:22:23 +0100341template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
342static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000343{
telsoa01c577f2c2018-08-31 09:22:23 +0100344 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000345 ClWorkloadFactory factory =
346 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
347
telsoa01c577f2c2018-08-31 09:22:23 +0100348 auto workload =
349 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000350
telsoa01c577f2c2018-08-31 09:22:23 +0100351 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000352 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
353 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
354 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
355 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
356 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
357}
358
telsoa01c577f2c2018-08-31 09:22:23 +0100359
arovir019e53a352018-08-31 15:26:35 +0100360BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000361{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100362 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100363}
364
365BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
366{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100367 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100368}
369
telsoa01c577f2c2018-08-31 09:22:23 +0100370template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100371static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100372{
373 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000374 ClWorkloadFactory factory =
375 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
376
Matteo Martincigha160b242018-10-18 10:33:23 +0100377 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000378
telsoa01c577f2c2018-08-31 09:22:23 +0100379 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000380 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
381 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
382 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
383
Mike Kellydb482882019-06-14 12:35:24 +0100384 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
385 : std::initializer_list<unsigned int>({3, 1, 5, 5});
386 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
387 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100388
Mike Kellydb482882019-06-14 12:35:24 +0100389 BOOST_TEST((inputHandle->GetShape() == inputShape));
390 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000391}
392
narpra0155a97bc2018-10-02 14:35:53 +0100393BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000394{
narpra0155a97bc2018-10-02 14:35:53 +0100395 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100396}
397
narpra0155a97bc2018-10-02 14:35:53 +0100398BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100399{
narpra0155a97bc2018-10-02 14:35:53 +0100400 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
401}
402
403BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
404{
405 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
406}
407
408BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
409{
410 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100411}
412
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100413template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100414static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100415{
416 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000417 ClWorkloadFactory factory =
418 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000419
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100420 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100421
Mike Kellydb482882019-06-14 12:35:24 +0100422 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
423 : std::initializer_list<unsigned int>({3, 5, 5, 2});
424 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
425 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000426
telsoa01c577f2c2018-08-31 09:22:23 +0100427 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000428 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
429 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
430 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
431
Mike Kellydb482882019-06-14 12:35:24 +0100432 BOOST_TEST((inputHandle->GetShape() == inputShape));
433 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000434}
435
Nina Drozdb48e6862018-10-09 12:09:56 +0100436BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100437{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100438 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100439}
440
Nina Drozdb48e6862018-10-09 12:09:56 +0100441BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100442{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100443 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100444}
445
446BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
447{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100448 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100449}
450
451BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
452{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100453 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100454}
455
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100456static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
457 const armnn::TensorShape& alphaShape,
458 const armnn::TensorShape& outputShape,
459 armnn::DataType dataType)
460{
461 Graph graph;
462 ClWorkloadFactory factory =
463 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
464
465 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
466 graph,
467 inputShape,
468 alphaShape,
469 outputShape,
470 dataType);
471
472 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
473 PreluQueueDescriptor queueDescriptor = workload->GetData();
474 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
475 auto alphaHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
476 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
477
478 BOOST_TEST((inputHandle->GetShape() == inputShape));
479 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
480 BOOST_TEST((outputHandle->GetShape() == outputShape));
481}
482
483BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
484{
485 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
486}
487
488BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
489{
490 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
491}
492
493BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
494{
495 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QuantisedAsymm8);
496}
497
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100498template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000499static void ClCreateReshapeWorkloadTest()
500{
telsoa01c577f2c2018-08-31 09:22:23 +0100501 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000502 ClWorkloadFactory factory =
503 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000504
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100505 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000506
telsoa01c577f2c2018-08-31 09:22:23 +0100507 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000508 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100509 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
510 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000511
512 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000513 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000514}
515
arovir019e53a352018-08-31 15:26:35 +0100516BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000517{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100518 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100519}
520
521BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
522{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100523 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000524}
525
526BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
527{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100528 ClCreateReshapeWorkloadTest<armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000529}
530
telsoa01c577f2c2018-08-31 09:22:23 +0100531template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
532static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000533{
telsoa01c577f2c2018-08-31 09:22:23 +0100534 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000535 ClWorkloadFactory factory =
536 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000537
telsoa01c577f2c2018-08-31 09:22:23 +0100538 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000539
arovir019e53a352018-08-31 15:26:35 +0100540 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000541 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100542 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
543 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000544
545 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
546 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
547}
548
telsoa01c577f2c2018-08-31 09:22:23 +0100549
arovir019e53a352018-08-31 15:26:35 +0100550BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100551{
arovir019e53a352018-08-31 15:26:35 +0100552 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100553}
554
555BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
556{
arovir019e53a352018-08-31 15:26:35 +0100557 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100558}
559
Matthew Bentham29cadb32018-10-01 17:22:32 +0100560template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100561static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000562{
563 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000564 ClWorkloadFactory factory =
565 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000566
Matthew Bentham29cadb32018-10-01 17:22:32 +0100567 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000568
telsoa01c577f2c2018-08-31 09:22:23 +0100569 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000570 SplitterQueueDescriptor queueDescriptor = workload->GetData();
571 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100572 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
573
telsoa014fcda012018-03-09 14:13:49 +0000574 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100575 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
576
telsoa014fcda012018-03-09 14:13:49 +0000577 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100578 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
579
580 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000581 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000582}
583
arovir019e53a352018-08-31 15:26:35 +0100584BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000585{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100586 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100587}
588
589BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
590{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100591 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100592}
593
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100594template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100595static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100596{
597 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100598 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000599 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100600 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
601 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000602
603 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000604 ClWorkloadFactory factory =
605 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000606
607 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100608 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100609 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000610
611 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100612 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000613
telsoa01c577f2c2018-08-31 09:22:23 +0100614 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000615 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
616 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100617 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
618 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000619
620 BOOST_TEST(sOut0);
621 BOOST_TEST(sOut1);
622 BOOST_TEST(mIn0);
623 BOOST_TEST(mIn1);
624
telsoa01c577f2c2018-08-31 09:22:23 +0100625 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000626 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
627 BOOST_TEST(validDataPointers);
628
629
telsoa01c577f2c2018-08-31 09:22:23 +0100630 //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 +0000631 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
632 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
633
634 BOOST_TEST(validSubTensorParents);
635}
636
Jim Flynne242f2d2019-05-22 14:24:13 +0100637BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100638{
Jim Flynne242f2d2019-05-22 14:24:13 +0100639 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100640}
641
Jim Flynne242f2d2019-05-22 14:24:13 +0100642BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100643{
Jim Flynne242f2d2019-05-22 14:24:13 +0100644 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100645}
646
647
telsoa014fcda012018-03-09 14:13:49 +0000648BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
649{
650 // 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 +0100651 // 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 +0000652
653 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000654 ClWorkloadFactory factory =
655 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
656
Matthew Bentham29cadb32018-10-01 17:22:32 +0100657 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100658 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
659 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
660 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
661 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000662
Matthew Bentham29cadb32018-10-01 17:22:32 +0100663 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100664 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100665 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000666
telsoa01c577f2c2018-08-31 09:22:23 +0100667 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000668 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
669 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
670 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
671 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
672 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
673 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
674
675
676 BOOST_TEST(sOut0);
677 BOOST_TEST(sOut1);
678 BOOST_TEST(activ0_0Im);
679 BOOST_TEST(activ0_1Im);
680 BOOST_TEST(activ1_0Im);
681 BOOST_TEST(activ1_1Im);
682
683 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
684 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
685
686 BOOST_TEST(validDataPointers);
687}
688
Matteo Martincigh14a25f02019-08-27 16:41:11 +0100689#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100690
691// This test unit needs the reference backend, it's not available if the reference backend is not built
692
telsoa014fcda012018-03-09 14:13:49 +0000693BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
694{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000695 ClWorkloadFactory factory =
696 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
697
telsoa01c577f2c2018-08-31 09:22:23 +0100698 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000699}
700
Matteo Martincighe67edb22019-08-14 14:05:46 +0100701#endif
702
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100703template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
704static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000705{
telsoa01c577f2c2018-08-31 09:22:23 +0100706 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000707 ClWorkloadFactory factory =
708 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
709
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100710 auto workload =
711 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000712
telsoa01c577f2c2018-08-31 09:22:23 +0100713 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000714 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
715 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
716 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
717
Mike Kellydb482882019-06-14 12:35:24 +0100718 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
719 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
720 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
721 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100722
Mike Kellydb482882019-06-14 12:35:24 +0100723 BOOST_TEST((inputHandle->GetShape() == inputShape));
724 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000725}
726
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100727BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
728{
729 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
730}
731
732BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
733{
734 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
735}
736
737BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
738{
739 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
740}
741
742BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
743{
744 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
745}
746
telsoa01c577f2c2018-08-31 09:22:23 +0100747template <typename LstmWorkloadType>
748static void ClCreateLstmWorkloadTest()
749{
750 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000751 ClWorkloadFactory factory =
752 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
753
telsoa01c577f2c2018-08-31 09:22:23 +0100754 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
755
756 LstmQueueDescriptor queueDescriptor = workload->GetData();
757 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
758 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
759 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
760 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
761}
762
arovir019e53a352018-08-31 15:26:35 +0100763BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100764{
arovir019e53a352018-08-31 15:26:35 +0100765 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100766}
767
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100768template <typename ResizeWorkloadType, typename armnn::DataType DataType>
769static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100770{
771 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000772 ClWorkloadFactory factory =
773 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100774
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100775 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100776
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100777 auto queueDescriptor = workload->GetData();
778
779 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100780 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
781
782 switch (dataLayout)
783 {
784 case DataLayout::NHWC:
785 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
786 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
787 break;
James Conroy69482272018-10-19 10:41:35 +0100788 case DataLayout::NCHW:
789 default:
James Conroy074f3712018-10-03 09:32:03 +0100790 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
791 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
792 }
793}
794
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100795BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100796{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100797 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100798}
799
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100800BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100801{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100802 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100803}
804
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100805BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100806{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100807 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100808}
809
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100810BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100811{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100812 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
813}
814
815BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
816{
817 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
818}
819
820BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
821{
822 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +0100823}
telsoa01c577f2c2018-08-31 09:22:23 +0100824
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100825template <typename MeanWorkloadType, typename armnn::DataType DataType>
826static void ClMeanWorkloadTest()
827{
828 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000829 ClWorkloadFactory factory =
830 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
831
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100832 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
833
834 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
835 MeanQueueDescriptor queueDescriptor = workload->GetData();
836 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
837 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
838
839 // 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 +0000840 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
841 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100842}
843
844BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
845{
846 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
847}
848
849BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
850{
851 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
852}
853
854BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
855{
856 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QuantisedAsymm8>();
857}
858
Jim Flynne242f2d2019-05-22 14:24:13 +0100859template <typename ConcatWorkloadType, armnn::DataType DataType>
860static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000861 unsigned int concatAxis)
862{
863 Graph graph;
864 ClWorkloadFactory factory =
865 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
866
Jim Flynne242f2d2019-05-22 14:24:13 +0100867 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000868
Jim Flynne242f2d2019-05-22 14:24:13 +0100869 ConcatQueueDescriptor queueDescriptor = workload->GetData();
narpra015cdda352018-11-19 15:30:27 +0000870 auto inputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
871 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
872 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
873
874 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
875 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
876 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
877}
878
Jim Flynne242f2d2019-05-22 14:24:13 +0100879BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000880{
Jim Flynne242f2d2019-05-22 14:24:13 +0100881 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000882}
883
Jim Flynne242f2d2019-05-22 14:24:13 +0100884BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000885{
Jim Flynne242f2d2019-05-22 14:24:13 +0100886 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000887}
888
Jim Flynne242f2d2019-05-22 14:24:13 +0100889BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000890{
Jim Flynne242f2d2019-05-22 14:24:13 +0100891 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000892}
893
Jim Flynne242f2d2019-05-22 14:24:13 +0100894BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000895{
Jim Flynne242f2d2019-05-22 14:24:13 +0100896 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000897}
898
Jim Flynne242f2d2019-05-22 14:24:13 +0100899BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000900{
Jim Flynne242f2d2019-05-22 14:24:13 +0100901 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000902}
903
Jim Flynne242f2d2019-05-22 14:24:13 +0100904BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000905{
Jim Flynne242f2d2019-05-22 14:24:13 +0100906 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000907}
908
James Conroy60597842019-07-02 10:57:56 +0100909template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
910static void ClSpaceToDepthWorkloadTest()
911{
912 Graph graph;
913 ClWorkloadFactory factory =
914 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
915
916 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
917
918 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
919 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
920 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
921
922 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
923 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
924}
925
926BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
927{
928 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
929}
930
931BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
932{
933 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
934}
935
936BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
937{
938 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QuantisedAsymm8>();
939}
940
941BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
942{
943 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QuantisedSymm16>();
944}
945
Matthew Jacksond5166102019-07-31 14:06:28 +0100946template <armnn::DataType DataType>
947static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
948 const std::initializer_list<unsigned int>& outputShape,
949 unsigned int axis,
950 unsigned int numInputs)
951{
952 armnn::Graph graph;
953 ClWorkloadFactory factory =
954 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
955
956 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
957 graph,
958 TensorShape(inputShape),
959 TensorShape(outputShape),
960 axis,
961 numInputs);
962
963 // Check inputs and output are as expected
964 StackQueueDescriptor queueDescriptor = workload->GetData();
965 for (unsigned int i = 0; i < numInputs; ++i)
966 {
967 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
968 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
969 }
970 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
971 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
972}
973
974BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
975{
976 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
977}
978
979BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
980{
981 ClCreateStackWorkloadTest<armnn::DataType::QuantisedAsymm8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
982}
983
Ferran Balaguer737d9ff2019-08-01 09:58:08 +0100984template <typename QuantizedLstmWorkloadType>
985static void ClCreateQuantizedLstmWorkloadTest()
986{
987 using namespace armnn::armcomputetensorutils;
988 using boost::polymorphic_downcast;
989
990 Graph graph;
991 ClWorkloadFactory factory =
992 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
993
994 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
995
996 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
997
998 IAclTensorHandle* inputHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
999 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1000 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1001
1002 IAclTensorHandle* cellStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
1003 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1004 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1005
1006 IAclTensorHandle* outputStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
1007 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1008 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1009
1010 IAclTensorHandle* cellStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
1011 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1012 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1013
1014 IAclTensorHandle* outputStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1015 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1016 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1017}
1018
1019BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1020{
1021 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1022}
1023
telsoa014fcda012018-03-09 14:13:49 +00001024BOOST_AUTO_TEST_SUITE_END()