blob: c5f685dc9488e227e0a8de5bc67da6beb2b9b5a9 [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>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010012
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000013#include <cl/ClTensorHandle.hpp>
14#include <cl/ClWorkloadFactory.hpp>
15#include <cl/workloads/ClWorkloads.hpp>
16#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010017
telsoa014fcda012018-03-09 14:13:49 +000018boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
19 std::initializer_list<unsigned int> expectedDimensions)
20{
21 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
22}
23
telsoa01c577f2c2018-08-31 09:22:23 +010024BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000025
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010026template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010027static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000028{
29 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000030 ClWorkloadFactory factory =
31 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000032
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010033 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000034
telsoa01c577f2c2018-08-31 09:22:23 +010035 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000036 ActivationQueueDescriptor queueDescriptor = workload->GetData();
37 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
38 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
39
Matthew Bentham89105282018-11-20 14:33:33 +000040 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 1}));
41 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 1}));
telsoa014fcda012018-03-09 14:13:49 +000042}
43
arovir019e53a352018-08-31 15:26:35 +010044BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010045{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010046 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010047}
48
49BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
50{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010051 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010052}
53
David Beck4a8692c2018-09-07 16:19:24 +010054template <typename WorkloadType,
55 typename DescriptorType,
56 typename LayerType,
57 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000058static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000059{
60 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000061 ClWorkloadFactory factory =
62 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
63
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000064 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000065
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000066 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010067 DescriptorType queueDescriptor = workload->GetData();
telsoa014fcda012018-03-09 14:13:49 +000068 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
69 auto inputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
70 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
71 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
72 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
73 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
74}
75
arovir019e53a352018-08-31 15:26:35 +010076BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000077{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010079 AdditionQueueDescriptor,
80 AdditionLayer,
81 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010082}
83
84BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
85{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000086 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010087 AdditionQueueDescriptor,
88 AdditionLayer,
89 armnn::DataType::Float16>();
90}
91
92BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
93{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000094 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010095 SubtractionQueueDescriptor,
96 SubtractionLayer,
97 armnn::DataType::Float32>();
98}
99
100BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
101{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000102 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100103 SubtractionQueueDescriptor,
104 SubtractionLayer,
105 armnn::DataType::Float16>();
106}
107
108BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
109{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000110 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100111 MultiplicationQueueDescriptor,
112 MultiplicationLayer,
113 armnn::DataType::Float32>();
114}
115
116BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
117{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000118 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100119 MultiplicationQueueDescriptor,
120 MultiplicationLayer,
121 armnn::DataType::Float16>();
122}
123
Matthew Benthame2ec3302018-10-01 11:32:48 +0100124BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
125{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000126 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100127 MultiplicationQueueDescriptor,
128 MultiplicationLayer,
129 armnn::DataType::QuantisedAsymm8>();
130}
131
David Beck4a8692c2018-09-07 16:19:24 +0100132BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
133{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000134 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100135 DivisionQueueDescriptor,
136 DivisionLayer,
137 armnn::DataType::Float32>();
138}
139
140BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
141{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000142 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100143 DivisionQueueDescriptor,
144 DivisionLayer,
145 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100146}
147
148template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100149static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100150{
151 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000152 ClWorkloadFactory factory =
153 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000154
telsoa01c577f2c2018-08-31 09:22:23 +0100155 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100156 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000157
telsoa01c577f2c2018-08-31 09:22:23 +0100158 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000159 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
160 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
161 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
162
Nikhil Rajd1340932018-10-18 14:27:50 +0100163 switch (dataLayout)
164 {
165 case DataLayout::NHWC:
166 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
167 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
168 break;
169 default: // NCHW
170 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
171 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
172 }
telsoa014fcda012018-03-09 14:13:49 +0000173}
174
Nikhil Rajd1340932018-10-18 14:27:50 +0100175BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000176{
Nikhil Rajd1340932018-10-18 14:27:50 +0100177 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
178 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100179}
telsoa014fcda012018-03-09 14:13:49 +0000180
Nikhil Rajd1340932018-10-18 14:27:50 +0100181BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100182{
Nikhil Rajd1340932018-10-18 14:27:50 +0100183 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
184 armnn::DataType::Float16>(DataLayout::NCHW);
185}
186
187BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
188{
189 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
190 armnn::DataType::Float32>(DataLayout::NHWC);
191}
192
193BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
194{
195 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
196 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100197}
198
199BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
200{
201 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000202 ClWorkloadFactory factory =
203 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
204
telsoa01c577f2c2018-08-31 09:22:23 +0100205 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
206
207 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
208 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
209 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
210
Matthew Bentham89105282018-11-20 14:33:33 +0000211 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
212 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100213 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
214 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
215}
216
217BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
218{
219 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000220 ClWorkloadFactory factory =
221 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
222
telsoa01c577f2c2018-08-31 09:22:23 +0100223 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
224
225 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
226 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
227 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
228
Matthew Bentham89105282018-11-20 14:33:33 +0000229 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
230 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100231 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
232 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
233}
234
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100235template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
236static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100237{
238 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000239 ClWorkloadFactory factory =
240 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
241
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100242 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
243 graph,
244 dataLayout);
245
246 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
247 std::initializer_list<unsigned int>({2, 3, 8, 16}) : std::initializer_list<unsigned int>({2, 8, 16, 3});
248 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
249 std::initializer_list<unsigned int>({2, 2, 2, 10}) : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100250
251 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000252 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
253 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
254 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100255 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
256 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000257}
258
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100259BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000260{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100261 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100262}
263
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100264BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100265{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100266 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000267}
268
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100269BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
270{
271 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
272}
273
274BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
275{
276 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
277}
278
Nikhil Rajcec6b652018-10-12 13:51:57 +0100279template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
280static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
281{
282 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000283 ClWorkloadFactory factory =
284 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100285
286 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
287 (factory, graph, dataLayout);
288
289 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
290 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
291 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
292 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
293
294 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
295 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
296 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
297 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
298 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
299 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
300
301 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
302 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
303}
304
305BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
306{
307 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
308}
309
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100310template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100311static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000312{
telsoa01c577f2c2018-08-31 09:22:23 +0100313 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000314 ClWorkloadFactory factory =
315 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
316
Matthew Benthamd8067922018-10-03 17:18:04 +0100317 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000318
telsoa01c577f2c2018-08-31 09:22:23 +0100319 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000320 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
321 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
322 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
323 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
324 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
325}
326
arovir019e53a352018-08-31 15:26:35 +0100327BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000328{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100329 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100330}
331
332BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
333{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100334 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000335}
336
337BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
338{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100339 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000340}
341
telsoa01c577f2c2018-08-31 09:22:23 +0100342template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
343static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000344{
telsoa01c577f2c2018-08-31 09:22:23 +0100345 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000346 ClWorkloadFactory factory =
347 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
348
telsoa01c577f2c2018-08-31 09:22:23 +0100349 auto workload =
350 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000351
telsoa01c577f2c2018-08-31 09:22:23 +0100352 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000353 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
354 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
355 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
356 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
357 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
358}
359
telsoa01c577f2c2018-08-31 09:22:23 +0100360
arovir019e53a352018-08-31 15:26:35 +0100361BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000362{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100363 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100364}
365
366BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
367{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100368 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100369}
370
telsoa01c577f2c2018-08-31 09:22:23 +0100371template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100372static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100373{
374 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000375 ClWorkloadFactory factory =
376 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
377
Matteo Martincigha160b242018-10-18 10:33:23 +0100378 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000379
telsoa01c577f2c2018-08-31 09:22:23 +0100380 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000381 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
382 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
383 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
384
Matteo Martincigha160b242018-10-18 10:33:23 +0100385 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
386 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
387 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
388 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
389
390 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
391 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000392}
393
narpra0155a97bc2018-10-02 14:35:53 +0100394BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000395{
narpra0155a97bc2018-10-02 14:35:53 +0100396 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100397}
398
narpra0155a97bc2018-10-02 14:35:53 +0100399BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100400{
narpra0155a97bc2018-10-02 14:35:53 +0100401 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
402}
403
404BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
405{
406 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
407}
408
409BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
410{
411 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100412}
413
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100414template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100415static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100416{
417 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000418 ClWorkloadFactory factory =
419 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000420
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100421 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100422
423 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
424 std::initializer_list<unsigned int>({3, 2, 5, 5}) : std::initializer_list<unsigned int>({3, 5, 5, 2});
425 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
426 std::initializer_list<unsigned int>({3, 2, 2, 4}) : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000427
telsoa01c577f2c2018-08-31 09:22:23 +0100428 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000429 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
430 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
431 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
432
Nina Drozdb48e6862018-10-09 12:09:56 +0100433 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
434 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000435}
436
Nina Drozdb48e6862018-10-09 12:09:56 +0100437BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100438{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100439 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100440}
441
Nina Drozdb48e6862018-10-09 12:09:56 +0100442BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100443{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100444 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100445}
446
447BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
448{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100449 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100450}
451
452BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
453{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100454 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100455}
456
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100457template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000458static void ClCreateReshapeWorkloadTest()
459{
telsoa01c577f2c2018-08-31 09:22:23 +0100460 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000461 ClWorkloadFactory factory =
462 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000463
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100464 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000465
telsoa01c577f2c2018-08-31 09:22:23 +0100466 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000467 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100468 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
469 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000470
471 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000472 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000473}
474
arovir019e53a352018-08-31 15:26:35 +0100475BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000476{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100477 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100478}
479
480BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
481{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100482 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000483}
484
485BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
486{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100487 ClCreateReshapeWorkloadTest<armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000488}
489
telsoa01c577f2c2018-08-31 09:22:23 +0100490template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
491static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000492{
telsoa01c577f2c2018-08-31 09:22:23 +0100493 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000494 ClWorkloadFactory factory =
495 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000496
telsoa01c577f2c2018-08-31 09:22:23 +0100497 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000498
arovir019e53a352018-08-31 15:26:35 +0100499 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000500 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100501 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
502 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000503
504 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
505 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
506}
507
telsoa01c577f2c2018-08-31 09:22:23 +0100508
arovir019e53a352018-08-31 15:26:35 +0100509BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100510{
arovir019e53a352018-08-31 15:26:35 +0100511 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100512}
513
514BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
515{
arovir019e53a352018-08-31 15:26:35 +0100516 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100517}
518
Matthew Bentham29cadb32018-10-01 17:22:32 +0100519template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100520static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000521{
522 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000523 ClWorkloadFactory factory =
524 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000525
Matthew Bentham29cadb32018-10-01 17:22:32 +0100526 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000527
telsoa01c577f2c2018-08-31 09:22:23 +0100528 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000529 SplitterQueueDescriptor queueDescriptor = workload->GetData();
530 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100531 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
532
telsoa014fcda012018-03-09 14:13:49 +0000533 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100534 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
535
telsoa014fcda012018-03-09 14:13:49 +0000536 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100537 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
538
539 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000540 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000541}
542
arovir019e53a352018-08-31 15:26:35 +0100543BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000544{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100545 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100546}
547
548BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
549{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100550 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100551}
552
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100553template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100554static void ClSplitterMergerTest()
555{
556 // Tests that it is possible to decide which output of the splitter layer
557 // should be lined to which input of the merger layer.
telsoa014fcda012018-03-09 14:13:49 +0000558 // We test that is is possible to specify 0th output
559 // of the splitter to be the 1st input to the merger and the 1st output of the splitter to be 0th input
560 // of the merger.
561
562 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000563 ClWorkloadFactory factory =
564 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000565
566 auto workloads =
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100567 CreateSplitterMergerWorkloadTest<ClSplitterWorkload, ClMergerWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100568 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000569
570 auto wlSplitter = std::move(workloads.first);
571 auto wlMerger = std::move(workloads.second);
572
telsoa01c577f2c2018-08-31 09:22:23 +0100573 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000574 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
575 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
576 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
577 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
578
579 BOOST_TEST(sOut0);
580 BOOST_TEST(sOut1);
581 BOOST_TEST(mIn0);
582 BOOST_TEST(mIn1);
583
telsoa01c577f2c2018-08-31 09:22:23 +0100584 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000585 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
586 BOOST_TEST(validDataPointers);
587
588
telsoa01c577f2c2018-08-31 09:22:23 +0100589 //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 +0000590 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
591 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
592
593 BOOST_TEST(validSubTensorParents);
594}
595
arovir019e53a352018-08-31 15:26:35 +0100596BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100597{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100598 ClSplitterMergerTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100599}
600
601BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat16Workload)
602{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100603 ClSplitterMergerTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100604}
605
606
telsoa014fcda012018-03-09 14:13:49 +0000607BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
608{
609 // 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 +0100610 // 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 +0000611
612 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000613 ClWorkloadFactory factory =
614 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
615
Matthew Bentham29cadb32018-10-01 17:22:32 +0100616 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100617 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
618 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
619 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
620 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000621
Matthew Bentham29cadb32018-10-01 17:22:32 +0100622 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100623 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100624 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000625
telsoa01c577f2c2018-08-31 09:22:23 +0100626 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000627 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
628 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
629 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
630 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
631 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
632 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
633
634
635 BOOST_TEST(sOut0);
636 BOOST_TEST(sOut1);
637 BOOST_TEST(activ0_0Im);
638 BOOST_TEST(activ0_1Im);
639 BOOST_TEST(activ1_0Im);
640 BOOST_TEST(activ1_1Im);
641
642 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
643 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
644
645 BOOST_TEST(validDataPointers);
646}
647
648BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
649{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000650 ClWorkloadFactory factory =
651 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
652
telsoa01c577f2c2018-08-31 09:22:23 +0100653 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000654}
655
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100656template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
657static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000658{
telsoa01c577f2c2018-08-31 09:22:23 +0100659 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000660 ClWorkloadFactory factory =
661 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
662
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100663 auto workload =
664 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000665
telsoa01c577f2c2018-08-31 09:22:23 +0100666 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000667 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
668 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
669 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
670
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100671 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
672 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
673 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
674 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
675 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
676 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
677
678 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
679 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000680}
681
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100682BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
683{
684 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
685}
686
687BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
688{
689 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
690}
691
692BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
693{
694 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
695}
696
697BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
698{
699 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
700}
701
telsoa01c577f2c2018-08-31 09:22:23 +0100702template <typename LstmWorkloadType>
703static void ClCreateLstmWorkloadTest()
704{
705 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000706 ClWorkloadFactory factory =
707 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
708
telsoa01c577f2c2018-08-31 09:22:23 +0100709 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
710
711 LstmQueueDescriptor queueDescriptor = workload->GetData();
712 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
713 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
714 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
715 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
716}
717
arovir019e53a352018-08-31 15:26:35 +0100718BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100719{
arovir019e53a352018-08-31 15:26:35 +0100720 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100721}
722
James Conroy074f3712018-10-03 09:32:03 +0100723template <typename ResizeBilinearWorkloadType, typename armnn::DataType DataType>
724static void ClResizeBilinearWorkloadTest(DataLayout dataLayout)
725{
726 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000727 ClWorkloadFactory factory =
728 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100729
730 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
731
732 // Checks that inputs/outputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
733 ResizeBilinearQueueDescriptor queueDescriptor = workload->GetData();
734 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
735 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
736
737 switch (dataLayout)
738 {
739 case DataLayout::NHWC:
740 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
741 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
742 break;
James Conroy69482272018-10-19 10:41:35 +0100743 case DataLayout::NCHW:
744 default:
James Conroy074f3712018-10-03 09:32:03 +0100745 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
746 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
747 }
748}
749
750BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NchwWorkload)
751{
752 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
753}
754
755BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NchwWorkload)
756{
757 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
758}
759
760BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NhwcWorkload)
761{
762 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
763}
764
765BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NhwcWorkload)
766{
767 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
768}
telsoa01c577f2c2018-08-31 09:22:23 +0100769
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100770template <typename MeanWorkloadType, typename armnn::DataType DataType>
771static void ClMeanWorkloadTest()
772{
773 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000774 ClWorkloadFactory factory =
775 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
776
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100777 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
778
779 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
780 MeanQueueDescriptor queueDescriptor = workload->GetData();
781 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
782 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
783
784 // 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 +0000785 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
786 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100787}
788
789BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
790{
791 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
792}
793
794BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
795{
796 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
797}
798
799BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
800{
801 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QuantisedAsymm8>();
802}
803
narpra015cdda352018-11-19 15:30:27 +0000804template <typename MergerWorkloadType, armnn::DataType DataType>
805static void ClCreateMergerWorkloadTest(std::initializer_list<unsigned int> outputShape,
806 unsigned int concatAxis)
807{
808 Graph graph;
809 ClWorkloadFactory factory =
810 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
811
812 auto workload = CreateMergerWorkloadTest<MergerWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
813
814 MergerQueueDescriptor queueDescriptor = workload->GetData();
815 auto inputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
816 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
817 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
818
819 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
820 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
821 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
822}
823
824BOOST_AUTO_TEST_CASE(CreateMergerDim0Float32Workload)
825{
826 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
827}
828
829BOOST_AUTO_TEST_CASE(CreateMergerDim1Float32Workload)
830{
831 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
832}
833
834BOOST_AUTO_TEST_CASE(CreateMergerDim3Float32Workload)
835{
836 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
837}
838
narpra0163b08822018-11-20 11:29:12 +0000839BOOST_AUTO_TEST_CASE(CreateMergerDim0Uint8Workload)
840{
841 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::QuantisedAsymm8>({ 4, 3, 2, 5 }, 0);
842}
843
844BOOST_AUTO_TEST_CASE(CreateMergerDim1Uint8Workload)
845{
846 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 6, 2, 5 }, 1);
847}
848
849BOOST_AUTO_TEST_CASE(CreateMergerDim3Uint8Workload)
850{
851 ClCreateMergerWorkloadTest<ClMergerWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }, 3);
852}
853
telsoa014fcda012018-03-09 14:13:49 +0000854BOOST_AUTO_TEST_SUITE_END()