blob: 3c80ea9d49d66a65b3e5eabd31df4e8021b971ae [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
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100149template <typename WorkloadType,
150 typename DescriptorType,
151 typename LayerType,
152 armnn::DataType DataType>
153static void ClCreateElementwiseUnaryWorkloadTest()
154{
155 Graph graph;
156 ClWorkloadFactory factory =
157 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
158
159 auto workload = CreateElementwiseUnaryWorkloadTest
160 <WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
161
162 DescriptorType queueDescriptor = workload->GetData();
163
164 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
165 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
166
167 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3}));
168 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
169}
170
171BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32WorkloadTest)
172{
173 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload,
174 RsqrtQueueDescriptor,
175 RsqrtLayer,
176 armnn::DataType::Float32>();
177}
178
telsoa01c577f2c2018-08-31 09:22:23 +0100179template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100180static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100181{
182 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000183 ClWorkloadFactory factory =
184 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000185
telsoa01c577f2c2018-08-31 09:22:23 +0100186 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100187 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000188
telsoa01c577f2c2018-08-31 09:22:23 +0100189 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000190 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
191 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
192 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
193
Nikhil Rajd1340932018-10-18 14:27:50 +0100194 switch (dataLayout)
195 {
196 case DataLayout::NHWC:
197 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
198 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
199 break;
200 default: // NCHW
201 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
202 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
203 }
telsoa014fcda012018-03-09 14:13:49 +0000204}
205
Nikhil Rajd1340932018-10-18 14:27:50 +0100206BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000207{
Nikhil Rajd1340932018-10-18 14:27:50 +0100208 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
209 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100210}
telsoa014fcda012018-03-09 14:13:49 +0000211
Nikhil Rajd1340932018-10-18 14:27:50 +0100212BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100213{
Nikhil Rajd1340932018-10-18 14:27:50 +0100214 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
215 armnn::DataType::Float16>(DataLayout::NCHW);
216}
217
218BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
219{
220 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
221 armnn::DataType::Float32>(DataLayout::NHWC);
222}
223
224BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
225{
226 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
227 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100228}
229
230BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
231{
232 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000233 ClWorkloadFactory factory =
234 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
235
telsoa01c577f2c2018-08-31 09:22:23 +0100236 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
237
238 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
239 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
240 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
241
Matthew Bentham89105282018-11-20 14:33:33 +0000242 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
243 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100244 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
245 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
246}
247
248BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
249{
250 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000251 ClWorkloadFactory factory =
252 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
253
telsoa01c577f2c2018-08-31 09:22:23 +0100254 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
255
256 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
257 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
258 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
259
Matthew Bentham89105282018-11-20 14:33:33 +0000260 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
261 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100262 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
263 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
264}
265
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100266template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
267static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100268{
269 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000270 ClWorkloadFactory factory =
271 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
272
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100273 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
274 graph,
275 dataLayout);
276
Mike Kellydb482882019-06-14 12:35:24 +0100277 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
278 : std::initializer_list<unsigned int>({2, 8, 16, 3});
279 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
280 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100281
282 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000283 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
284 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
285 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100286 BOOST_TEST((inputHandle->GetShape() == inputShape));
287 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000288}
289
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100290BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000291{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100292 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100293}
294
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100295BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100296{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100297 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000298}
299
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100300BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
301{
302 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
303}
304
305BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
306{
307 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
308}
309
Nikhil Rajcec6b652018-10-12 13:51:57 +0100310template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
311static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
312{
313 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000314 ClWorkloadFactory factory =
315 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100316
317 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
318 (factory, graph, dataLayout);
319
320 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
321 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
322 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
323 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
324
Mike Kellydb482882019-06-14 12:35:24 +0100325 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
326 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
327 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
328 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100329
Mike Kellydb482882019-06-14 12:35:24 +0100330 BOOST_TEST((inputHandle->GetShape() == inputShape));
331 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100332}
333
334BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
335{
336 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
337}
338
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100339template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100340static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000341{
telsoa01c577f2c2018-08-31 09:22:23 +0100342 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000343 ClWorkloadFactory factory =
344 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
345
Matthew Benthamd8067922018-10-03 17:18:04 +0100346 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000347
telsoa01c577f2c2018-08-31 09:22:23 +0100348 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000349 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
350 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
351 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
352 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
353 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
354}
355
arovir019e53a352018-08-31 15:26:35 +0100356BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000357{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100358 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100359}
360
361BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
362{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100363 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000364}
365
366BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
367{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100368 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000369}
370
telsoa01c577f2c2018-08-31 09:22:23 +0100371template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
372static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000373{
telsoa01c577f2c2018-08-31 09:22:23 +0100374 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000375 ClWorkloadFactory factory =
376 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
377
telsoa01c577f2c2018-08-31 09:22:23 +0100378 auto workload =
379 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000380
telsoa01c577f2c2018-08-31 09:22:23 +0100381 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000382 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
383 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
384 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
385 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
386 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
387}
388
telsoa01c577f2c2018-08-31 09:22:23 +0100389
arovir019e53a352018-08-31 15:26:35 +0100390BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000391{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100392 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100393}
394
395BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
396{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100397 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100398}
399
telsoa01c577f2c2018-08-31 09:22:23 +0100400template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100401static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100402{
403 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000404 ClWorkloadFactory factory =
405 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
406
Matteo Martincigha160b242018-10-18 10:33:23 +0100407 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000408
telsoa01c577f2c2018-08-31 09:22:23 +0100409 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000410 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
411 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
412 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
413
Mike Kellydb482882019-06-14 12:35:24 +0100414 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
415 : std::initializer_list<unsigned int>({3, 1, 5, 5});
416 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
417 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100418
Mike Kellydb482882019-06-14 12:35:24 +0100419 BOOST_TEST((inputHandle->GetShape() == inputShape));
420 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000421}
422
narpra0155a97bc2018-10-02 14:35:53 +0100423BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000424{
narpra0155a97bc2018-10-02 14:35:53 +0100425 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100426}
427
narpra0155a97bc2018-10-02 14:35:53 +0100428BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100429{
narpra0155a97bc2018-10-02 14:35:53 +0100430 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
431}
432
433BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
434{
435 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
436}
437
438BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
439{
440 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100441}
442
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100443template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100444static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100445{
446 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000447 ClWorkloadFactory factory =
448 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000449
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100450 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100451
Mike Kellydb482882019-06-14 12:35:24 +0100452 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
453 : std::initializer_list<unsigned int>({3, 5, 5, 2});
454 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
455 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000456
telsoa01c577f2c2018-08-31 09:22:23 +0100457 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000458 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
459 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
460 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
461
Mike Kellydb482882019-06-14 12:35:24 +0100462 BOOST_TEST((inputHandle->GetShape() == inputShape));
463 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000464}
465
Nina Drozdb48e6862018-10-09 12:09:56 +0100466BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100467{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100468 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100469}
470
Nina Drozdb48e6862018-10-09 12:09:56 +0100471BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100472{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100473 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100474}
475
476BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
477{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100478 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100479}
480
481BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
482{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100483 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100484}
485
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100486static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
487 const armnn::TensorShape& alphaShape,
488 const armnn::TensorShape& outputShape,
489 armnn::DataType dataType)
490{
491 Graph graph;
492 ClWorkloadFactory factory =
493 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
494
495 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
496 graph,
497 inputShape,
498 alphaShape,
499 outputShape,
500 dataType);
501
502 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
503 PreluQueueDescriptor queueDescriptor = workload->GetData();
504 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
505 auto alphaHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
506 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
507
508 BOOST_TEST((inputHandle->GetShape() == inputShape));
509 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
510 BOOST_TEST((outputHandle->GetShape() == outputShape));
511}
512
513BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
514{
515 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
516}
517
518BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
519{
520 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
521}
522
523BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
524{
525 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QuantisedAsymm8);
526}
527
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100528template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000529static void ClCreateReshapeWorkloadTest()
530{
telsoa01c577f2c2018-08-31 09:22:23 +0100531 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000532 ClWorkloadFactory factory =
533 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000534
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100535 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000536
telsoa01c577f2c2018-08-31 09:22:23 +0100537 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000538 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100539 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
540 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000541
542 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000543 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000544}
545
arovir019e53a352018-08-31 15:26:35 +0100546BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000547{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100548 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100549}
550
551BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
552{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100553 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000554}
555
556BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
557{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100558 ClCreateReshapeWorkloadTest<armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000559}
560
telsoa01c577f2c2018-08-31 09:22:23 +0100561template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
562static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000563{
telsoa01c577f2c2018-08-31 09:22:23 +0100564 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000565 ClWorkloadFactory factory =
566 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000567
telsoa01c577f2c2018-08-31 09:22:23 +0100568 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000569
arovir019e53a352018-08-31 15:26:35 +0100570 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000571 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100572 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
573 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000574
575 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
576 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
577}
578
telsoa01c577f2c2018-08-31 09:22:23 +0100579
arovir019e53a352018-08-31 15:26:35 +0100580BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100581{
arovir019e53a352018-08-31 15:26:35 +0100582 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100583}
584
585BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
586{
arovir019e53a352018-08-31 15:26:35 +0100587 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100588}
589
Matthew Bentham29cadb32018-10-01 17:22:32 +0100590template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100591static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000592{
593 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000594 ClWorkloadFactory factory =
595 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000596
Matthew Bentham29cadb32018-10-01 17:22:32 +0100597 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000598
telsoa01c577f2c2018-08-31 09:22:23 +0100599 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000600 SplitterQueueDescriptor queueDescriptor = workload->GetData();
601 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100602 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
603
telsoa014fcda012018-03-09 14:13:49 +0000604 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100605 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
606
telsoa014fcda012018-03-09 14:13:49 +0000607 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100608 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
609
610 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000611 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000612}
613
arovir019e53a352018-08-31 15:26:35 +0100614BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000615{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100616 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100617}
618
619BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
620{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100621 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100622}
623
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100624template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100625static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100626{
627 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100628 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000629 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100630 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
631 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000632
633 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000634 ClWorkloadFactory factory =
635 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000636
637 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100638 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100639 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000640
641 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100642 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000643
telsoa01c577f2c2018-08-31 09:22:23 +0100644 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000645 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
646 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100647 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
648 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000649
650 BOOST_TEST(sOut0);
651 BOOST_TEST(sOut1);
652 BOOST_TEST(mIn0);
653 BOOST_TEST(mIn1);
654
telsoa01c577f2c2018-08-31 09:22:23 +0100655 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000656 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
657 BOOST_TEST(validDataPointers);
658
659
telsoa01c577f2c2018-08-31 09:22:23 +0100660 //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 +0000661 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
662 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
663
664 BOOST_TEST(validSubTensorParents);
665}
666
Jim Flynne242f2d2019-05-22 14:24:13 +0100667BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100668{
Jim Flynne242f2d2019-05-22 14:24:13 +0100669 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100670}
671
Jim Flynne242f2d2019-05-22 14:24:13 +0100672BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100673{
Jim Flynne242f2d2019-05-22 14:24:13 +0100674 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100675}
676
677
telsoa014fcda012018-03-09 14:13:49 +0000678BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
679{
680 // 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 +0100681 // 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 +0000682
683 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000684 ClWorkloadFactory factory =
685 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
686
Matthew Bentham29cadb32018-10-01 17:22:32 +0100687 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100688 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
689 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
690 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
691 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000692
Matthew Bentham29cadb32018-10-01 17:22:32 +0100693 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100694 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100695 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000696
telsoa01c577f2c2018-08-31 09:22:23 +0100697 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000698 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
699 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
700 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
701 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
702 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
703 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
704
705
706 BOOST_TEST(sOut0);
707 BOOST_TEST(sOut1);
708 BOOST_TEST(activ0_0Im);
709 BOOST_TEST(activ0_1Im);
710 BOOST_TEST(activ1_0Im);
711 BOOST_TEST(activ1_1Im);
712
713 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
714 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
715
716 BOOST_TEST(validDataPointers);
717}
718
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100719#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100720
721// This test unit needs the reference backend, it's not available if the reference backend is not built
722
telsoa014fcda012018-03-09 14:13:49 +0000723BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
724{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000725 ClWorkloadFactory factory =
726 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
727
telsoa01c577f2c2018-08-31 09:22:23 +0100728 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000729}
730
Matteo Martincighe67edb22019-08-14 14:05:46 +0100731#endif
732
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100733template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
734static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000735{
telsoa01c577f2c2018-08-31 09:22:23 +0100736 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000737 ClWorkloadFactory factory =
738 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
739
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100740 auto workload =
741 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000742
telsoa01c577f2c2018-08-31 09:22:23 +0100743 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000744 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
745 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
746 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
747
Mike Kellydb482882019-06-14 12:35:24 +0100748 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
749 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
750 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
751 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100752
Mike Kellydb482882019-06-14 12:35:24 +0100753 BOOST_TEST((inputHandle->GetShape() == inputShape));
754 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000755}
756
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100757BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
758{
759 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
760}
761
762BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
763{
764 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
765}
766
767BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
768{
769 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
770}
771
772BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
773{
774 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
775}
776
telsoa01c577f2c2018-08-31 09:22:23 +0100777template <typename LstmWorkloadType>
778static void ClCreateLstmWorkloadTest()
779{
780 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000781 ClWorkloadFactory factory =
782 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
783
telsoa01c577f2c2018-08-31 09:22:23 +0100784 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
785
786 LstmQueueDescriptor queueDescriptor = workload->GetData();
787 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
788 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
789 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
790 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
791}
792
arovir019e53a352018-08-31 15:26:35 +0100793BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100794{
arovir019e53a352018-08-31 15:26:35 +0100795 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100796}
797
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100798template <typename ResizeWorkloadType, typename armnn::DataType DataType>
799static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100800{
801 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000802 ClWorkloadFactory factory =
803 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100804
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100805 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100806
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100807 auto queueDescriptor = workload->GetData();
808
809 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100810 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
811
812 switch (dataLayout)
813 {
814 case DataLayout::NHWC:
815 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
816 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
817 break;
James Conroy69482272018-10-19 10:41:35 +0100818 case DataLayout::NCHW:
819 default:
James Conroy074f3712018-10-03 09:32:03 +0100820 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
821 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
822 }
823}
824
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100825BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100826{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100827 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100828}
829
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100830BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100831{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100832 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100833}
834
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100835BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100836{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100837 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100838}
839
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100840BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100841{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100842 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
843}
844
845BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
846{
847 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
848}
849
850BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
851{
852 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +0100853}
telsoa01c577f2c2018-08-31 09:22:23 +0100854
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100855template <typename MeanWorkloadType, typename armnn::DataType DataType>
856static void ClMeanWorkloadTest()
857{
858 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000859 ClWorkloadFactory factory =
860 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
861
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100862 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
863
864 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
865 MeanQueueDescriptor queueDescriptor = workload->GetData();
866 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
867 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
868
869 // 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 +0000870 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
871 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100872}
873
874BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
875{
876 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
877}
878
879BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
880{
881 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
882}
883
884BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
885{
886 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QuantisedAsymm8>();
887}
888
Jim Flynne242f2d2019-05-22 14:24:13 +0100889template <typename ConcatWorkloadType, armnn::DataType DataType>
890static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000891 unsigned int concatAxis)
892{
893 Graph graph;
894 ClWorkloadFactory factory =
895 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
896
Jim Flynne242f2d2019-05-22 14:24:13 +0100897 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000898
Jim Flynne242f2d2019-05-22 14:24:13 +0100899 ConcatQueueDescriptor queueDescriptor = workload->GetData();
narpra015cdda352018-11-19 15:30:27 +0000900 auto inputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
901 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
902 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
903
904 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
905 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
906 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
907}
908
Jim Flynne242f2d2019-05-22 14:24:13 +0100909BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000910{
Jim Flynne242f2d2019-05-22 14:24:13 +0100911 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000912}
913
Jim Flynne242f2d2019-05-22 14:24:13 +0100914BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000915{
Jim Flynne242f2d2019-05-22 14:24:13 +0100916 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000917}
918
Jim Flynne242f2d2019-05-22 14:24:13 +0100919BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000920{
Jim Flynne242f2d2019-05-22 14:24:13 +0100921 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000922}
923
Jim Flynne242f2d2019-05-22 14:24:13 +0100924BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000925{
Jim Flynne242f2d2019-05-22 14:24:13 +0100926 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000927}
928
Jim Flynne242f2d2019-05-22 14:24:13 +0100929BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000930{
Jim Flynne242f2d2019-05-22 14:24:13 +0100931 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000932}
933
Jim Flynne242f2d2019-05-22 14:24:13 +0100934BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000935{
Jim Flynne242f2d2019-05-22 14:24:13 +0100936 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000937}
938
James Conroy60597842019-07-02 10:57:56 +0100939template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
940static void ClSpaceToDepthWorkloadTest()
941{
942 Graph graph;
943 ClWorkloadFactory factory =
944 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
945
946 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
947
948 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
949 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
950 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
951
952 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
953 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
954}
955
956BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
957{
958 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
959}
960
961BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
962{
963 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
964}
965
966BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
967{
968 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QuantisedAsymm8>();
969}
970
971BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
972{
973 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QuantisedSymm16>();
974}
975
Matthew Jacksond5166102019-07-31 14:06:28 +0100976template <armnn::DataType DataType>
977static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
978 const std::initializer_list<unsigned int>& outputShape,
979 unsigned int axis,
980 unsigned int numInputs)
981{
982 armnn::Graph graph;
983 ClWorkloadFactory factory =
984 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
985
986 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
987 graph,
988 TensorShape(inputShape),
989 TensorShape(outputShape),
990 axis,
991 numInputs);
992
993 // Check inputs and output are as expected
994 StackQueueDescriptor queueDescriptor = workload->GetData();
995 for (unsigned int i = 0; i < numInputs; ++i)
996 {
997 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
998 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
999 }
1000 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
1001 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
1002}
1003
1004BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1005{
1006 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1007}
1008
Matthew Jacksone69c3992019-09-09 14:31:21 +01001009BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
1010{
1011 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1012}
1013
Matthew Jacksond5166102019-07-31 14:06:28 +01001014BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1015{
1016 ClCreateStackWorkloadTest<armnn::DataType::QuantisedAsymm8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1017}
1018
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001019template <typename QuantizedLstmWorkloadType>
1020static void ClCreateQuantizedLstmWorkloadTest()
1021{
1022 using namespace armnn::armcomputetensorutils;
1023 using boost::polymorphic_downcast;
1024
1025 Graph graph;
1026 ClWorkloadFactory factory =
1027 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1028
1029 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1030
1031 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1032
1033 IAclTensorHandle* inputHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1034 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1035 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1036
1037 IAclTensorHandle* cellStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
1038 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1039 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1040
1041 IAclTensorHandle* outputStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
1042 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1043 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1044
1045 IAclTensorHandle* cellStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
1046 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1047 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1048
1049 IAclTensorHandle* outputStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1050 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1051 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1052}
1053
1054BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1055{
1056 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1057}
1058
telsoa014fcda012018-03-09 14:13:49 +00001059BOOST_AUTO_TEST_SUITE_END()