blob: 72a2eb27e102cac45b6170e6b3096547908eff42 [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"
telsoa014fcda012018-03-09 14:13:49 +00007
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00008#include <backendsCommon/MemCopyWorkload.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +01009
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010011
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <cl/ClTensorHandle.hpp>
13#include <cl/ClWorkloadFactory.hpp>
14#include <cl/workloads/ClWorkloads.hpp>
15#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010016
telsoa014fcda012018-03-09 14:13:49 +000017boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
18 std::initializer_list<unsigned int> expectedDimensions)
19{
20 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
21}
22
telsoa01c577f2c2018-08-31 09:22:23 +010023BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000024
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010025template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010026static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000027{
28 Graph graph;
29 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +000030
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010031 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000032
telsoa01c577f2c2018-08-31 09:22:23 +010033 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000034 ActivationQueueDescriptor queueDescriptor = workload->GetData();
35 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
36 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
37
38 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1}));
39 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1}));
40}
41
arovir019e53a352018-08-31 15:26:35 +010042BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010043{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010044 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010045}
46
47BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
48{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010049 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010050}
51
David Beck4a8692c2018-09-07 16:19:24 +010052template <typename WorkloadType,
53 typename DescriptorType,
54 typename LayerType,
55 armnn::DataType DataType>
56static void ClCreateArithmethicWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000057{
58 Graph graph;
59 ClWorkloadFactory factory;
David Beck4a8692c2018-09-07 16:19:24 +010060 auto workload = CreateArithmeticWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000061
James Conroyb9bf9462018-09-19 11:58:44 +010062 // Checks that inputs/outputs are as we expect them (see definition of CreateArithmeticWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010063 DescriptorType queueDescriptor = workload->GetData();
telsoa014fcda012018-03-09 14:13:49 +000064 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
65 auto inputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
66 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
67 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
68 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
69 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
70}
71
arovir019e53a352018-08-31 15:26:35 +010072BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000073{
Nattapat Chaimanowongcd066ca2018-10-10 12:11:50 +010074 ClCreateArithmethicWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010075 AdditionQueueDescriptor,
76 AdditionLayer,
77 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010078}
79
80BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
81{
Nattapat Chaimanowongcd066ca2018-10-10 12:11:50 +010082 ClCreateArithmethicWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010083 AdditionQueueDescriptor,
84 AdditionLayer,
85 armnn::DataType::Float16>();
86}
87
88BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
89{
Matthew Bentham092b3042018-10-01 16:39:28 +010090 ClCreateArithmethicWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010091 SubtractionQueueDescriptor,
92 SubtractionLayer,
93 armnn::DataType::Float32>();
94}
95
96BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
97{
Matthew Bentham092b3042018-10-01 16:39:28 +010098 ClCreateArithmethicWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010099 SubtractionQueueDescriptor,
100 SubtractionLayer,
101 armnn::DataType::Float16>();
102}
103
104BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
105{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100106 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100107 MultiplicationQueueDescriptor,
108 MultiplicationLayer,
109 armnn::DataType::Float32>();
110}
111
112BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
113{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100114 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100115 MultiplicationQueueDescriptor,
116 MultiplicationLayer,
117 armnn::DataType::Float16>();
118}
119
Matthew Benthame2ec3302018-10-01 11:32:48 +0100120BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
121{
122 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
123 MultiplicationQueueDescriptor,
124 MultiplicationLayer,
125 armnn::DataType::QuantisedAsymm8>();
126}
127
David Beck4a8692c2018-09-07 16:19:24 +0100128BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
129{
130 ClCreateArithmethicWorkloadTest<ClDivisionFloatWorkload,
131 DivisionQueueDescriptor,
132 DivisionLayer,
133 armnn::DataType::Float32>();
134}
135
136BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
137{
138 ClCreateArithmethicWorkloadTest<ClDivisionFloatWorkload,
139 DivisionQueueDescriptor,
140 DivisionLayer,
141 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100142}
143
144template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100145static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100146{
147 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000148 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000149
telsoa01c577f2c2018-08-31 09:22:23 +0100150 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100151 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000152
telsoa01c577f2c2018-08-31 09:22:23 +0100153 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000154 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
155 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
156 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
157
Nikhil Rajd1340932018-10-18 14:27:50 +0100158 switch (dataLayout)
159 {
160 case DataLayout::NHWC:
161 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
162 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
163 break;
164 default: // NCHW
165 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
166 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
167 }
telsoa014fcda012018-03-09 14:13:49 +0000168}
169
Nikhil Rajd1340932018-10-18 14:27:50 +0100170BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000171{
Nikhil Rajd1340932018-10-18 14:27:50 +0100172 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
173 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100174}
telsoa014fcda012018-03-09 14:13:49 +0000175
Nikhil Rajd1340932018-10-18 14:27:50 +0100176BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100177{
Nikhil Rajd1340932018-10-18 14:27:50 +0100178 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
179 armnn::DataType::Float16>(DataLayout::NCHW);
180}
181
182BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
183{
184 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
185 armnn::DataType::Float32>(DataLayout::NHWC);
186}
187
188BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
189{
190 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
191 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100192}
193
194BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
195{
196 Graph graph;
197 ClWorkloadFactory factory;
198 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
199
200 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
201 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
202 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
203
204 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 2, 3}));
205 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 2, 3}));
206 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
207 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
208}
209
210BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
211{
212 Graph graph;
213 ClWorkloadFactory factory;
214 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
215
216 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
217 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
218 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
219
220 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 2, 3}));
221 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 2, 3}));
222 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
223 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
224}
225
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100226template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
227static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100228{
229 Graph graph;
230 ClWorkloadFactory factory;
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100231 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
232 graph,
233 dataLayout);
234
235 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
236 std::initializer_list<unsigned int>({2, 3, 8, 16}) : std::initializer_list<unsigned int>({2, 8, 16, 3});
237 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
238 std::initializer_list<unsigned int>({2, 2, 2, 10}) : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100239
240 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000241 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
242 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
243 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100244 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
245 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000246}
247
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100248BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000249{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100250 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100251}
252
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100253BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100254{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100255 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000256}
257
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100258BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
259{
260 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
261}
262
263BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
264{
265 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
266}
267
Nikhil Rajcec6b652018-10-12 13:51:57 +0100268template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
269static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
270{
271 Graph graph;
272 ClWorkloadFactory factory;
273
274 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
275 (factory, graph, dataLayout);
276
277 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
278 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
279 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
280 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
281
282 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
283 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
284 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
285 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
286 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
287 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
288
289 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
290 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
291}
292
293BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
294{
295 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
296}
297
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100298template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100299static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000300{
telsoa01c577f2c2018-08-31 09:22:23 +0100301 Graph graph;
302 ClWorkloadFactory factory;
Matthew Benthamd8067922018-10-03 17:18:04 +0100303 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000304
telsoa01c577f2c2018-08-31 09:22:23 +0100305 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000306 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
307 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
308 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
309 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
310 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
311}
312
arovir019e53a352018-08-31 15:26:35 +0100313BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000314{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100315 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100316}
317
318BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
319{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100320 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000321}
322
323BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
324{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100325 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000326}
327
telsoa01c577f2c2018-08-31 09:22:23 +0100328template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
329static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000330{
telsoa01c577f2c2018-08-31 09:22:23 +0100331 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000332 ClWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100333 auto workload =
334 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000335
telsoa01c577f2c2018-08-31 09:22:23 +0100336 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000337 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
338 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
339 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
340 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
341 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
342}
343
telsoa01c577f2c2018-08-31 09:22:23 +0100344
arovir019e53a352018-08-31 15:26:35 +0100345BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000346{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100347 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100348}
349
350BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
351{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100352 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100353}
354
telsoa01c577f2c2018-08-31 09:22:23 +0100355template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100356static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100357{
358 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000359 ClWorkloadFactory factory;
Matteo Martincigha160b242018-10-18 10:33:23 +0100360 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000361
telsoa01c577f2c2018-08-31 09:22:23 +0100362 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000363 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
364 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
365 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
366
Matteo Martincigha160b242018-10-18 10:33:23 +0100367 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
368 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
369 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
370 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
371
372 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
373 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000374}
375
narpra0155a97bc2018-10-02 14:35:53 +0100376BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000377{
narpra0155a97bc2018-10-02 14:35:53 +0100378 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100379}
380
narpra0155a97bc2018-10-02 14:35:53 +0100381BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100382{
narpra0155a97bc2018-10-02 14:35:53 +0100383 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
384}
385
386BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
387{
388 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
389}
390
391BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
392{
393 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100394}
395
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100396template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100397static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100398{
399 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000400 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000401
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100402 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100403
404 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
405 std::initializer_list<unsigned int>({3, 2, 5, 5}) : std::initializer_list<unsigned int>({3, 5, 5, 2});
406 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
407 std::initializer_list<unsigned int>({3, 2, 2, 4}) : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000408
telsoa01c577f2c2018-08-31 09:22:23 +0100409 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000410 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
411 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
412 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
413
Nina Drozdb48e6862018-10-09 12:09:56 +0100414 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
415 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000416}
417
Nina Drozdb48e6862018-10-09 12:09:56 +0100418BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100419{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100420 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100421}
422
Nina Drozdb48e6862018-10-09 12:09:56 +0100423BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100424{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100425 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100426}
427
428BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
429{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100430 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100431}
432
433BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
434{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100435 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100436}
437
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100438template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000439static void ClCreateReshapeWorkloadTest()
440{
telsoa01c577f2c2018-08-31 09:22:23 +0100441 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000442 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000443
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100444 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000445
telsoa01c577f2c2018-08-31 09:22:23 +0100446 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000447 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100448 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
449 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000450
451 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
452 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4})); // Leading size 1 dimensions are collapsed by ACL.
453}
454
arovir019e53a352018-08-31 15:26:35 +0100455BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000456{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100457 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100458}
459
460BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
461{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100462 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000463}
464
465BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
466{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100467 ClCreateReshapeWorkloadTest<armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000468}
469
telsoa01c577f2c2018-08-31 09:22:23 +0100470template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
471static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000472{
telsoa01c577f2c2018-08-31 09:22:23 +0100473 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000474 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000475
telsoa01c577f2c2018-08-31 09:22:23 +0100476 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000477
arovir019e53a352018-08-31 15:26:35 +0100478 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000479 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100480 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
481 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000482
483 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
484 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
485}
486
telsoa01c577f2c2018-08-31 09:22:23 +0100487
arovir019e53a352018-08-31 15:26:35 +0100488BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100489{
arovir019e53a352018-08-31 15:26:35 +0100490 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100491}
492
493BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
494{
arovir019e53a352018-08-31 15:26:35 +0100495 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100496}
497
Matthew Bentham29cadb32018-10-01 17:22:32 +0100498template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100499static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000500{
501 Graph graph;
502 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000503
Matthew Bentham29cadb32018-10-01 17:22:32 +0100504 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000505
telsoa01c577f2c2018-08-31 09:22:23 +0100506 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000507 SplitterQueueDescriptor queueDescriptor = workload->GetData();
508 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100509 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
510
telsoa014fcda012018-03-09 14:13:49 +0000511 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100512 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
513
telsoa014fcda012018-03-09 14:13:49 +0000514 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100515 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
516
517 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
518 // NOTE: At the moment the CL collapses the tensor to a 2 dim when dimension zero = 1
telsoa01c577f2c2018-08-31 09:22:23 +0100519 // we are raising this difference between the NEON and CL libs as an issue with the compute library team.
surmeh013537c2c2018-05-18 16:31:43 +0100520 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000521}
522
arovir019e53a352018-08-31 15:26:35 +0100523BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000524{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100525 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100526}
527
528BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
529{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100530 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100531}
532
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100533template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100534static void ClSplitterMergerTest()
535{
536 // Tests that it is possible to decide which output of the splitter layer
537 // should be lined to which input of the merger layer.
telsoa014fcda012018-03-09 14:13:49 +0000538 // We test that is is possible to specify 0th output
539 // of the splitter to be the 1st input to the merger and the 1st output of the splitter to be 0th input
540 // of the merger.
541
542 Graph graph;
543 ClWorkloadFactory factory;
telsoa014fcda012018-03-09 14:13:49 +0000544
545 auto workloads =
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100546 CreateSplitterMergerWorkloadTest<ClSplitterWorkload, ClMergerWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100547 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000548
549 auto wlSplitter = std::move(workloads.first);
550 auto wlMerger = std::move(workloads.second);
551
telsoa01c577f2c2018-08-31 09:22:23 +0100552 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000553 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
554 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
555 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
556 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
557
558 BOOST_TEST(sOut0);
559 BOOST_TEST(sOut1);
560 BOOST_TEST(mIn0);
561 BOOST_TEST(mIn1);
562
telsoa01c577f2c2018-08-31 09:22:23 +0100563 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000564 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
565 BOOST_TEST(validDataPointers);
566
567
telsoa01c577f2c2018-08-31 09:22:23 +0100568 //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 +0000569 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
570 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
571
572 BOOST_TEST(validSubTensorParents);
573}
574
arovir019e53a352018-08-31 15:26:35 +0100575BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100576{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100577 ClSplitterMergerTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100578}
579
580BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat16Workload)
581{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100582 ClSplitterMergerTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100583}
584
585
telsoa014fcda012018-03-09 14:13:49 +0000586BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
587{
588 // 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 +0100589 // 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 +0000590
591 Graph graph;
592 ClWorkloadFactory factory;
Matthew Bentham29cadb32018-10-01 17:22:32 +0100593 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100594 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
595 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
596 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
597 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000598
Matthew Bentham29cadb32018-10-01 17:22:32 +0100599 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100600 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100601 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000602
telsoa01c577f2c2018-08-31 09:22:23 +0100603 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000604 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
605 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
606 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
607 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
608 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
609 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
610
611
612 BOOST_TEST(sOut0);
613 BOOST_TEST(sOut1);
614 BOOST_TEST(activ0_0Im);
615 BOOST_TEST(activ0_1Im);
616 BOOST_TEST(activ1_0Im);
617 BOOST_TEST(activ1_1Im);
618
619 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
620 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
621
622 BOOST_TEST(validDataPointers);
623}
624
625BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
626{
627 ClWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100628 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000629}
630
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100631template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
632static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000633{
telsoa01c577f2c2018-08-31 09:22:23 +0100634 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000635 ClWorkloadFactory factory;
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100636 auto workload =
637 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000638
telsoa01c577f2c2018-08-31 09:22:23 +0100639 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000640 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
641 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
642 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
643
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100644 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
645 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
646 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
647 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
648 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
649 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
650
651 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
652 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000653}
654
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100655BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
656{
657 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
658}
659
660BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
661{
662 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
663}
664
665BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
666{
667 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
668}
669
670BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
671{
672 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
673}
674
telsoa01c577f2c2018-08-31 09:22:23 +0100675template <typename LstmWorkloadType>
676static void ClCreateLstmWorkloadTest()
677{
678 Graph graph;
679 ClWorkloadFactory factory;
680 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
681
682 LstmQueueDescriptor queueDescriptor = workload->GetData();
683 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
684 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
685 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
686 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
687}
688
arovir019e53a352018-08-31 15:26:35 +0100689BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100690{
arovir019e53a352018-08-31 15:26:35 +0100691 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100692}
693
James Conroy074f3712018-10-03 09:32:03 +0100694template <typename ResizeBilinearWorkloadType, typename armnn::DataType DataType>
695static void ClResizeBilinearWorkloadTest(DataLayout dataLayout)
696{
697 Graph graph;
698 ClWorkloadFactory factory;
699
700 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
701
702 // Checks that inputs/outputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
703 ResizeBilinearQueueDescriptor queueDescriptor = workload->GetData();
704 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
705 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
706
707 switch (dataLayout)
708 {
709 case DataLayout::NHWC:
710 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
711 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
712 break;
James Conroy69482272018-10-19 10:41:35 +0100713 case DataLayout::NCHW:
714 default:
James Conroy074f3712018-10-03 09:32:03 +0100715 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
716 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
717 }
718}
719
720BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NchwWorkload)
721{
722 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
723}
724
725BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NchwWorkload)
726{
727 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
728}
729
730BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NhwcWorkload)
731{
732 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
733}
734
735BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NhwcWorkload)
736{
737 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
738}
telsoa01c577f2c2018-08-31 09:22:23 +0100739
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100740template <typename MeanWorkloadType, typename armnn::DataType DataType>
741static void ClMeanWorkloadTest()
742{
743 Graph graph;
744 ClWorkloadFactory factory;
745 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
746
747 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
748 MeanQueueDescriptor queueDescriptor = workload->GetData();
749 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
750 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
751
752 // The first dimension (batch size) in both input and output is singular thus it has been reduced by ACL.
753 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 3, 7, 4 }));
754 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 4 }));
755}
756
757BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
758{
759 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
760}
761
762BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
763{
764 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
765}
766
767BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
768{
769 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QuantisedAsymm8>();
770}
771
telsoa014fcda012018-03-09 14:13:49 +0000772BOOST_AUTO_TEST_SUITE_END()