blob: 92e771760fc9390b56477a0aa7acc817b86b65b3 [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,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000130 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100131}
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
josh minor4a3c6102020-01-06 16:40:46 -0600149template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100150 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100151 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600152static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100153{
154 Graph graph;
155 ClWorkloadFactory factory =
156 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
157
josh minor4a3c6102020-01-06 16:40:46 -0600158 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100159
160 DescriptorType queueDescriptor = workload->GetData();
161
162 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
163 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
164
165 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3}));
166 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
167}
168
169BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32WorkloadTest)
170{
josh minor4a3c6102020-01-06 16:40:46 -0600171 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
172 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100173}
174
telsoa01c577f2c2018-08-31 09:22:23 +0100175template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100176static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100177{
178 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000179 ClWorkloadFactory factory =
180 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000181
telsoa01c577f2c2018-08-31 09:22:23 +0100182 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100183 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000184
telsoa01c577f2c2018-08-31 09:22:23 +0100185 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000186 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
187 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
188 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
189
Nikhil Rajd1340932018-10-18 14:27:50 +0100190 switch (dataLayout)
191 {
192 case DataLayout::NHWC:
193 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
194 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
195 break;
196 default: // NCHW
197 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
198 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
199 }
telsoa014fcda012018-03-09 14:13:49 +0000200}
201
Nikhil Rajd1340932018-10-18 14:27:50 +0100202BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000203{
Nikhil Rajd1340932018-10-18 14:27:50 +0100204 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
205 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100206}
telsoa014fcda012018-03-09 14:13:49 +0000207
Nikhil Rajd1340932018-10-18 14:27:50 +0100208BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100209{
Nikhil Rajd1340932018-10-18 14:27:50 +0100210 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
211 armnn::DataType::Float16>(DataLayout::NCHW);
212}
213
214BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
215{
216 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
217 armnn::DataType::Float32>(DataLayout::NHWC);
218}
219
220BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
221{
222 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
223 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100224}
225
226BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
227{
228 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000229 ClWorkloadFactory factory =
230 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
231
telsoa01c577f2c2018-08-31 09:22:23 +0100232 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
233
234 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
235 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
236 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
237
Matthew Bentham89105282018-11-20 14:33:33 +0000238 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
239 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100240 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
241 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
242}
243
244BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
245{
246 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000247 ClWorkloadFactory factory =
248 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
249
telsoa01c577f2c2018-08-31 09:22:23 +0100250 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
251
252 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
253 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
254 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
255
Matthew Bentham89105282018-11-20 14:33:33 +0000256 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
257 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100258 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
259 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
260}
261
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100262template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
263static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100264{
265 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000266 ClWorkloadFactory factory =
267 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
268
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100269 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
270 graph,
271 dataLayout);
272
Mike Kellydb482882019-06-14 12:35:24 +0100273 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
274 : std::initializer_list<unsigned int>({2, 8, 16, 3});
275 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
276 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100277
278 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000279 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
280 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
281 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100282 BOOST_TEST((inputHandle->GetShape() == inputShape));
283 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000284}
285
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100286BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000287{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100288 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100289}
290
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100291BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100292{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100293 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000294}
295
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100296BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
297{
298 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
299}
300
301BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
302{
303 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
304}
305
Nikhil Rajcec6b652018-10-12 13:51:57 +0100306template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
307static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
308{
309 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000310 ClWorkloadFactory factory =
311 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100312
313 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
314 (factory, graph, dataLayout);
315
316 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
317 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
318 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
319 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
320
Mike Kellydb482882019-06-14 12:35:24 +0100321 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
322 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
323 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
324 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100325
Mike Kellydb482882019-06-14 12:35:24 +0100326 BOOST_TEST((inputHandle->GetShape() == inputShape));
327 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100328}
329
330BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
331{
332 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
333}
334
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100335template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100336static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000337{
telsoa01c577f2c2018-08-31 09:22:23 +0100338 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000339 ClWorkloadFactory factory =
340 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
341
Matthew Benthamd8067922018-10-03 17:18:04 +0100342 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000343
telsoa01c577f2c2018-08-31 09:22:23 +0100344 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000345 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
346 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
347 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
348 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
349 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
350}
351
arovir019e53a352018-08-31 15:26:35 +0100352BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000353{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100354 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100355}
356
357BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
358{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100359 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000360}
361
362BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
363{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000364 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000365}
366
telsoa01c577f2c2018-08-31 09:22:23 +0100367template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
368static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000369{
telsoa01c577f2c2018-08-31 09:22:23 +0100370 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000371 ClWorkloadFactory factory =
372 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
373
telsoa01c577f2c2018-08-31 09:22:23 +0100374 auto workload =
375 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000376
telsoa01c577f2c2018-08-31 09:22:23 +0100377 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000378 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
379 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
380 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
381 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
382 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
383}
384
telsoa01c577f2c2018-08-31 09:22:23 +0100385
arovir019e53a352018-08-31 15:26:35 +0100386BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000387{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100388 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100389}
390
391BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
392{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100393 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100394}
395
telsoa01c577f2c2018-08-31 09:22:23 +0100396template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100397static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100398{
399 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000400 ClWorkloadFactory factory =
401 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
402
Matteo Martincigha160b242018-10-18 10:33:23 +0100403 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000404
telsoa01c577f2c2018-08-31 09:22:23 +0100405 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000406 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
407 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
408 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
409
Mike Kellydb482882019-06-14 12:35:24 +0100410 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
411 : std::initializer_list<unsigned int>({3, 1, 5, 5});
412 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
413 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100414
Mike Kellydb482882019-06-14 12:35:24 +0100415 BOOST_TEST((inputHandle->GetShape() == inputShape));
416 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000417}
418
narpra0155a97bc2018-10-02 14:35:53 +0100419BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000420{
narpra0155a97bc2018-10-02 14:35:53 +0100421 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100422}
423
narpra0155a97bc2018-10-02 14:35:53 +0100424BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100425{
narpra0155a97bc2018-10-02 14:35:53 +0100426 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
427}
428
429BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
430{
431 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
432}
433
434BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
435{
436 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100437}
438
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100439template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100440static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100441{
442 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000443 ClWorkloadFactory factory =
444 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000445
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100446 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100447
Mike Kellydb482882019-06-14 12:35:24 +0100448 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
449 : std::initializer_list<unsigned int>({3, 5, 5, 2});
450 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
451 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000452
telsoa01c577f2c2018-08-31 09:22:23 +0100453 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000454 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
455 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
456 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
457
Mike Kellydb482882019-06-14 12:35:24 +0100458 BOOST_TEST((inputHandle->GetShape() == inputShape));
459 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000460}
461
Nina Drozdb48e6862018-10-09 12:09:56 +0100462BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100463{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100464 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100465}
466
Nina Drozdb48e6862018-10-09 12:09:56 +0100467BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100468{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100469 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100470}
471
472BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
473{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100474 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100475}
476
477BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
478{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100479 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100480}
481
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100482static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
483 const armnn::TensorShape& alphaShape,
484 const armnn::TensorShape& outputShape,
485 armnn::DataType dataType)
486{
487 Graph graph;
488 ClWorkloadFactory factory =
489 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
490
491 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
492 graph,
493 inputShape,
494 alphaShape,
495 outputShape,
496 dataType);
497
498 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
499 PreluQueueDescriptor queueDescriptor = workload->GetData();
500 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
501 auto alphaHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
502 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
503
504 BOOST_TEST((inputHandle->GetShape() == inputShape));
505 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
506 BOOST_TEST((outputHandle->GetShape() == outputShape));
507}
508
509BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
510{
511 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
512}
513
514BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
515{
516 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
517}
518
519BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
520{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000521 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100522}
523
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100524template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000525static void ClCreateReshapeWorkloadTest()
526{
telsoa01c577f2c2018-08-31 09:22:23 +0100527 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000528 ClWorkloadFactory factory =
529 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000530
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100531 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000532
telsoa01c577f2c2018-08-31 09:22:23 +0100533 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000534 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100535 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
536 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000537
538 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000539 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000540}
541
arovir019e53a352018-08-31 15:26:35 +0100542BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000543{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100544 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100545}
546
547BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
548{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100549 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000550}
551
552BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
553{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000554 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000555}
556
telsoa01c577f2c2018-08-31 09:22:23 +0100557template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
558static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000559{
telsoa01c577f2c2018-08-31 09:22:23 +0100560 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000561 ClWorkloadFactory factory =
562 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000563
telsoa01c577f2c2018-08-31 09:22:23 +0100564 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000565
arovir019e53a352018-08-31 15:26:35 +0100566 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000567 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100568 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
569 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000570
571 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
572 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
573}
574
telsoa01c577f2c2018-08-31 09:22:23 +0100575
arovir019e53a352018-08-31 15:26:35 +0100576BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100577{
arovir019e53a352018-08-31 15:26:35 +0100578 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100579}
580
581BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
582{
arovir019e53a352018-08-31 15:26:35 +0100583 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100584}
585
Matthew Bentham29cadb32018-10-01 17:22:32 +0100586template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100587static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000588{
589 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000590 ClWorkloadFactory factory =
591 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000592
Matthew Bentham29cadb32018-10-01 17:22:32 +0100593 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000594
telsoa01c577f2c2018-08-31 09:22:23 +0100595 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000596 SplitterQueueDescriptor queueDescriptor = workload->GetData();
597 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100598 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
599
telsoa014fcda012018-03-09 14:13:49 +0000600 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100601 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
602
telsoa014fcda012018-03-09 14:13:49 +0000603 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100604 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
605
606 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000607 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000608}
609
arovir019e53a352018-08-31 15:26:35 +0100610BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000611{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100612 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100613}
614
615BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
616{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100617 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100618}
619
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100620template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100621static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100622{
623 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100624 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000625 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100626 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
627 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000628
629 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000630 ClWorkloadFactory factory =
631 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000632
633 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100634 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100635 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000636
637 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100638 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000639
telsoa01c577f2c2018-08-31 09:22:23 +0100640 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000641 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
642 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100643 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
644 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000645
646 BOOST_TEST(sOut0);
647 BOOST_TEST(sOut1);
648 BOOST_TEST(mIn0);
649 BOOST_TEST(mIn1);
650
telsoa01c577f2c2018-08-31 09:22:23 +0100651 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000652 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
653 BOOST_TEST(validDataPointers);
654
655
telsoa01c577f2c2018-08-31 09:22:23 +0100656 //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 +0000657 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
658 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
659
660 BOOST_TEST(validSubTensorParents);
661}
662
Jim Flynne242f2d2019-05-22 14:24:13 +0100663BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100664{
Jim Flynne242f2d2019-05-22 14:24:13 +0100665 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100666}
667
Jim Flynne242f2d2019-05-22 14:24:13 +0100668BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100669{
Jim Flynne242f2d2019-05-22 14:24:13 +0100670 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100671}
672
673
telsoa014fcda012018-03-09 14:13:49 +0000674BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
675{
676 // 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 +0100677 // 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 +0000678
679 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000680 ClWorkloadFactory factory =
681 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
682
Matthew Bentham29cadb32018-10-01 17:22:32 +0100683 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100684 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
685 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
686 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
687 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000688
Matthew Bentham29cadb32018-10-01 17:22:32 +0100689 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100690 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100691 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000692
telsoa01c577f2c2018-08-31 09:22:23 +0100693 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000694 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
695 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
696 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
697 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
698 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
699 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
700
701
702 BOOST_TEST(sOut0);
703 BOOST_TEST(sOut1);
704 BOOST_TEST(activ0_0Im);
705 BOOST_TEST(activ0_1Im);
706 BOOST_TEST(activ1_0Im);
707 BOOST_TEST(activ1_1Im);
708
709 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
710 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
711
712 BOOST_TEST(validDataPointers);
713}
714
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100715#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100716
717// This test unit needs the reference backend, it's not available if the reference backend is not built
718
telsoa014fcda012018-03-09 14:13:49 +0000719BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
720{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000721 ClWorkloadFactory factory =
722 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
723
telsoa01c577f2c2018-08-31 09:22:23 +0100724 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000725}
726
Matteo Martincighe67edb22019-08-14 14:05:46 +0100727#endif
728
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100729template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
730static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000731{
telsoa01c577f2c2018-08-31 09:22:23 +0100732 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000733 ClWorkloadFactory factory =
734 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
735
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100736 auto workload =
737 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000738
telsoa01c577f2c2018-08-31 09:22:23 +0100739 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000740 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
741 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
742 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
743
Mike Kellydb482882019-06-14 12:35:24 +0100744 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
745 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
746 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
747 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100748
Mike Kellydb482882019-06-14 12:35:24 +0100749 BOOST_TEST((inputHandle->GetShape() == inputShape));
750 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000751}
752
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100753BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
754{
755 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
756}
757
758BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
759{
760 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
761}
762
763BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
764{
765 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
766}
767
768BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
769{
770 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
771}
772
telsoa01c577f2c2018-08-31 09:22:23 +0100773template <typename LstmWorkloadType>
774static void ClCreateLstmWorkloadTest()
775{
776 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000777 ClWorkloadFactory factory =
778 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
779
telsoa01c577f2c2018-08-31 09:22:23 +0100780 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
781
782 LstmQueueDescriptor queueDescriptor = workload->GetData();
783 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
784 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
785 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
786 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
787}
788
arovir019e53a352018-08-31 15:26:35 +0100789BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100790{
arovir019e53a352018-08-31 15:26:35 +0100791 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100792}
793
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100794template <typename ResizeWorkloadType, typename armnn::DataType DataType>
795static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100796{
797 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000798 ClWorkloadFactory factory =
799 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100800
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100801 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100802
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100803 auto queueDescriptor = workload->GetData();
804
805 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100806 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
807
808 switch (dataLayout)
809 {
810 case DataLayout::NHWC:
811 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
812 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
813 break;
James Conroy69482272018-10-19 10:41:35 +0100814 case DataLayout::NCHW:
815 default:
James Conroy074f3712018-10-03 09:32:03 +0100816 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
817 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
818 }
819}
820
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100821BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100822{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100823 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100824}
825
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100826BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100827{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100828 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100829}
830
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100831BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100832{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000833 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100834}
835
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100836BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100837{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100838 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
839}
840
841BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
842{
843 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
844}
845
846BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
847{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000848 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +0100849}
telsoa01c577f2c2018-08-31 09:22:23 +0100850
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100851template <typename MeanWorkloadType, typename armnn::DataType DataType>
852static void ClMeanWorkloadTest()
853{
854 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000855 ClWorkloadFactory factory =
856 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
857
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100858 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
859
860 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
861 MeanQueueDescriptor queueDescriptor = workload->GetData();
862 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
863 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
864
865 // 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 +0000866 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
867 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100868}
869
870BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
871{
872 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
873}
874
875BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
876{
877 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
878}
879
880BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
881{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000882 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100883}
884
Jim Flynne242f2d2019-05-22 14:24:13 +0100885template <typename ConcatWorkloadType, armnn::DataType DataType>
886static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000887 unsigned int concatAxis)
888{
889 Graph graph;
890 ClWorkloadFactory factory =
891 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
892
Jim Flynne242f2d2019-05-22 14:24:13 +0100893 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000894
Jim Flynne242f2d2019-05-22 14:24:13 +0100895 ConcatQueueDescriptor queueDescriptor = workload->GetData();
narpra015cdda352018-11-19 15:30:27 +0000896 auto inputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
897 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
898 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
899
900 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
901 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
902 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
903}
904
Jim Flynne242f2d2019-05-22 14:24:13 +0100905BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000906{
Jim Flynne242f2d2019-05-22 14:24:13 +0100907 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000908}
909
Jim Flynne242f2d2019-05-22 14:24:13 +0100910BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000911{
Jim Flynne242f2d2019-05-22 14:24:13 +0100912 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000913}
914
Jim Flynne242f2d2019-05-22 14:24:13 +0100915BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000916{
Jim Flynne242f2d2019-05-22 14:24:13 +0100917 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000918}
919
Jim Flynne242f2d2019-05-22 14:24:13 +0100920BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000921{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000922 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000923}
924
Jim Flynne242f2d2019-05-22 14:24:13 +0100925BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000926{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000927 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +0000928}
929
Jim Flynne242f2d2019-05-22 14:24:13 +0100930BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000931{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000932 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +0000933}
934
James Conroy60597842019-07-02 10:57:56 +0100935template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
936static void ClSpaceToDepthWorkloadTest()
937{
938 Graph graph;
939 ClWorkloadFactory factory =
940 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
941
942 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
943
944 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
945 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
946 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
947
948 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
949 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
950}
951
952BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
953{
954 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
955}
956
957BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
958{
959 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
960}
961
962BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
963{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000964 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +0100965}
966
967BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
968{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000969 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +0100970}
971
Matthew Jacksond5166102019-07-31 14:06:28 +0100972template <armnn::DataType DataType>
973static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
974 const std::initializer_list<unsigned int>& outputShape,
975 unsigned int axis,
976 unsigned int numInputs)
977{
978 armnn::Graph graph;
979 ClWorkloadFactory factory =
980 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
981
982 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
983 graph,
984 TensorShape(inputShape),
985 TensorShape(outputShape),
986 axis,
987 numInputs);
988
989 // Check inputs and output are as expected
990 StackQueueDescriptor queueDescriptor = workload->GetData();
991 for (unsigned int i = 0; i < numInputs; ++i)
992 {
993 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
994 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
995 }
996 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
997 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
998}
999
1000BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1001{
1002 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1003}
1004
Matthew Jacksone69c3992019-09-09 14:31:21 +01001005BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
1006{
1007 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1008}
1009
Matthew Jacksond5166102019-07-31 14:06:28 +01001010BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1011{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001012 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001013}
1014
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001015template <typename QuantizedLstmWorkloadType>
1016static void ClCreateQuantizedLstmWorkloadTest()
1017{
1018 using namespace armnn::armcomputetensorutils;
1019 using boost::polymorphic_downcast;
1020
1021 Graph graph;
1022 ClWorkloadFactory factory =
1023 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1024
1025 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1026
1027 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1028
1029 IAclTensorHandle* inputHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1030 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1031 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1032
1033 IAclTensorHandle* cellStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
1034 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1035 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1036
1037 IAclTensorHandle* outputStateInHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
1038 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1039 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1040
1041 IAclTensorHandle* cellStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
1042 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1043 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1044
1045 IAclTensorHandle* outputStateOutHandle = polymorphic_downcast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1046 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1047 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1048}
1049
1050BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1051{
1052 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1053}
1054
telsoa014fcda012018-03-09 14:13:49 +00001055BOOST_AUTO_TEST_SUITE_END()