blob: 978b3bce9a36bc7137774e77356be2fa8240930e [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-Tar56055192018-11-12 18:10:43 +000030 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +000031
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010032 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000033
telsoa01c577f2c2018-08-31 09:22:23 +010034 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000035 ActivationQueueDescriptor queueDescriptor = workload->GetData();
36 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
37 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
38
39 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1}));
40 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1}));
41}
42
arovir019e53a352018-08-31 15:26:35 +010043BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010044{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010045 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010046}
47
48BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
49{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010050 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010051}
52
David Beck4a8692c2018-09-07 16:19:24 +010053template <typename WorkloadType,
54 typename DescriptorType,
55 typename LayerType,
56 armnn::DataType DataType>
57static void ClCreateArithmethicWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000058{
59 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000060 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
David Beck4a8692c2018-09-07 16:19:24 +010061 auto workload = CreateArithmeticWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000062
James Conroyb9bf9462018-09-19 11:58:44 +010063 // Checks that inputs/outputs are as we expect them (see definition of CreateArithmeticWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010064 DescriptorType queueDescriptor = workload->GetData();
telsoa014fcda012018-03-09 14:13:49 +000065 auto inputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
66 auto inputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
67 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
68 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
69 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
70 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
71}
72
arovir019e53a352018-08-31 15:26:35 +010073BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000074{
Nattapat Chaimanowongcd066ca2018-10-10 12:11:50 +010075 ClCreateArithmethicWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010076 AdditionQueueDescriptor,
77 AdditionLayer,
78 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010079}
80
81BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
82{
Nattapat Chaimanowongcd066ca2018-10-10 12:11:50 +010083 ClCreateArithmethicWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010084 AdditionQueueDescriptor,
85 AdditionLayer,
86 armnn::DataType::Float16>();
87}
88
89BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
90{
Matthew Bentham092b3042018-10-01 16:39:28 +010091 ClCreateArithmethicWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010092 SubtractionQueueDescriptor,
93 SubtractionLayer,
94 armnn::DataType::Float32>();
95}
96
97BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
98{
Matthew Bentham092b3042018-10-01 16:39:28 +010099 ClCreateArithmethicWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100100 SubtractionQueueDescriptor,
101 SubtractionLayer,
102 armnn::DataType::Float16>();
103}
104
105BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
106{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100107 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100108 MultiplicationQueueDescriptor,
109 MultiplicationLayer,
110 armnn::DataType::Float32>();
111}
112
113BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
114{
Matthew Benthame2ec3302018-10-01 11:32:48 +0100115 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100116 MultiplicationQueueDescriptor,
117 MultiplicationLayer,
118 armnn::DataType::Float16>();
119}
120
Matthew Benthame2ec3302018-10-01 11:32:48 +0100121BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
122{
123 ClCreateArithmethicWorkloadTest<ClMultiplicationWorkload,
124 MultiplicationQueueDescriptor,
125 MultiplicationLayer,
126 armnn::DataType::QuantisedAsymm8>();
127}
128
David Beck4a8692c2018-09-07 16:19:24 +0100129BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
130{
131 ClCreateArithmethicWorkloadTest<ClDivisionFloatWorkload,
132 DivisionQueueDescriptor,
133 DivisionLayer,
134 armnn::DataType::Float32>();
135}
136
137BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
138{
139 ClCreateArithmethicWorkloadTest<ClDivisionFloatWorkload,
140 DivisionQueueDescriptor,
141 DivisionLayer,
142 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100143}
144
145template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100146static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100147{
148 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000149 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000150
telsoa01c577f2c2018-08-31 09:22:23 +0100151 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100152 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000153
telsoa01c577f2c2018-08-31 09:22:23 +0100154 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000155 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
156 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
157 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
158
Nikhil Rajd1340932018-10-18 14:27:50 +0100159 switch (dataLayout)
160 {
161 case DataLayout::NHWC:
162 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
163 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
164 break;
165 default: // NCHW
166 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
167 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
168 }
telsoa014fcda012018-03-09 14:13:49 +0000169}
170
Nikhil Rajd1340932018-10-18 14:27:50 +0100171BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000172{
Nikhil Rajd1340932018-10-18 14:27:50 +0100173 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
174 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100175}
telsoa014fcda012018-03-09 14:13:49 +0000176
Nikhil Rajd1340932018-10-18 14:27:50 +0100177BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100178{
Nikhil Rajd1340932018-10-18 14:27:50 +0100179 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
180 armnn::DataType::Float16>(DataLayout::NCHW);
181}
182
183BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
184{
185 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
186 armnn::DataType::Float32>(DataLayout::NHWC);
187}
188
189BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
190{
191 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
192 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100193}
194
195BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
196{
197 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000198 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100199 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
200
201 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
202 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
203 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
204
205 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 2, 3}));
206 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 2, 3}));
207 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
208 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
209}
210
211BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
212{
213 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000214 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100215 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
216
217 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
218 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
219 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
220
221 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 2, 3}));
222 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 2, 3}));
223 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
224 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
225}
226
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100227template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
228static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100229{
230 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000231 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100232 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
233 graph,
234 dataLayout);
235
236 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
237 std::initializer_list<unsigned int>({2, 3, 8, 16}) : std::initializer_list<unsigned int>({2, 8, 16, 3});
238 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
239 std::initializer_list<unsigned int>({2, 2, 2, 10}) : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100240
241 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000242 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
243 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
244 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100245 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
246 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000247}
248
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100249BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000250{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100251 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100252}
253
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100254BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100255{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100256 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000257}
258
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100259BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
260{
261 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
262}
263
264BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
265{
266 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
267}
268
Nikhil Rajcec6b652018-10-12 13:51:57 +0100269template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
270static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
271{
272 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000273 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Nikhil Rajcec6b652018-10-12 13:51:57 +0100274
275 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
276 (factory, graph, dataLayout);
277
278 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
279 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
280 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
281 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
282
283 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
284 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
285 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
286 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
287 ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
288 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
289
290 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
291 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
292}
293
294BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
295{
296 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
297}
298
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100299template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100300static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000301{
telsoa01c577f2c2018-08-31 09:22:23 +0100302 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000303 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Matthew Benthamd8067922018-10-03 17:18:04 +0100304 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000305
telsoa01c577f2c2018-08-31 09:22:23 +0100306 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000307 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
308 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
309 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
310 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
311 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
312}
313
arovir019e53a352018-08-31 15:26:35 +0100314BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000315{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100316 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100317}
318
319BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
320{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100321 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000322}
323
324BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
325{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100326 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000327}
328
telsoa01c577f2c2018-08-31 09:22:23 +0100329template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
330static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000331{
telsoa01c577f2c2018-08-31 09:22:23 +0100332 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000333 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100334 auto workload =
335 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000336
telsoa01c577f2c2018-08-31 09:22:23 +0100337 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000338 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
339 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
340 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
341 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
342 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
343}
344
telsoa01c577f2c2018-08-31 09:22:23 +0100345
arovir019e53a352018-08-31 15:26:35 +0100346BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000347{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100348 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100349}
350
351BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
352{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100353 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100354}
355
telsoa01c577f2c2018-08-31 09:22:23 +0100356template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100357static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100358{
359 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000360 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100361 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000362
telsoa01c577f2c2018-08-31 09:22:23 +0100363 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000364 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
365 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
366 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
367
Matteo Martincigha160b242018-10-18 10:33:23 +0100368 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
369 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
370 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
371 std::initializer_list<unsigned int>({3, 5, 5, 1}) : std::initializer_list<unsigned int>({3, 1, 5, 5});
372
373 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
374 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000375}
376
narpra0155a97bc2018-10-02 14:35:53 +0100377BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000378{
narpra0155a97bc2018-10-02 14:35:53 +0100379 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100380}
381
narpra0155a97bc2018-10-02 14:35:53 +0100382BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100383{
narpra0155a97bc2018-10-02 14:35:53 +0100384 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
385}
386
387BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
388{
389 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
390}
391
392BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
393{
394 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100395}
396
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100397template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100398static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100399{
400 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000401 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000402
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100403 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100404
405 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
406 std::initializer_list<unsigned int>({3, 2, 5, 5}) : std::initializer_list<unsigned int>({3, 5, 5, 2});
407 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
408 std::initializer_list<unsigned int>({3, 2, 2, 4}) : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000409
telsoa01c577f2c2018-08-31 09:22:23 +0100410 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000411 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
412 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
413 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
414
Nina Drozdb48e6862018-10-09 12:09:56 +0100415 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
416 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000417}
418
Nina Drozdb48e6862018-10-09 12:09:56 +0100419BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100420{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100421 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100422}
423
Nina Drozdb48e6862018-10-09 12:09:56 +0100424BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100425{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100426 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100427}
428
429BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
430{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100431 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100432}
433
434BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
435{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100436 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100437}
438
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100439template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000440static void ClCreateReshapeWorkloadTest()
441{
telsoa01c577f2c2018-08-31 09:22:23 +0100442 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000443 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000444
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100445 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000446
telsoa01c577f2c2018-08-31 09:22:23 +0100447 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000448 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100449 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
450 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000451
452 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
453 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4})); // Leading size 1 dimensions are collapsed by ACL.
454}
455
arovir019e53a352018-08-31 15:26:35 +0100456BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000457{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100458 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100459}
460
461BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
462{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100463 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000464}
465
466BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
467{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100468 ClCreateReshapeWorkloadTest<armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000469}
470
telsoa01c577f2c2018-08-31 09:22:23 +0100471template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
472static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000473{
telsoa01c577f2c2018-08-31 09:22:23 +0100474 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000475 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000476
telsoa01c577f2c2018-08-31 09:22:23 +0100477 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000478
arovir019e53a352018-08-31 15:26:35 +0100479 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000480 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
telsoa01c577f2c2018-08-31 09:22:23 +0100481 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
482 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000483
484 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
485 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
486}
487
telsoa01c577f2c2018-08-31 09:22:23 +0100488
arovir019e53a352018-08-31 15:26:35 +0100489BOOST_AUTO_TEST_CASE(CreateSoftmaxFloatWorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100490{
arovir019e53a352018-08-31 15:26:35 +0100491 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100492}
493
494BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
495{
arovir019e53a352018-08-31 15:26:35 +0100496 ClSoftmaxWorkloadTest<ClSoftmaxFloatWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100497}
498
Matthew Bentham29cadb32018-10-01 17:22:32 +0100499template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100500static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000501{
502 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000503 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000504
Matthew Bentham29cadb32018-10-01 17:22:32 +0100505 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000506
telsoa01c577f2c2018-08-31 09:22:23 +0100507 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000508 SplitterQueueDescriptor queueDescriptor = workload->GetData();
509 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100510 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
511
telsoa014fcda012018-03-09 14:13:49 +0000512 auto outputHandle1 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100513 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
514
telsoa014fcda012018-03-09 14:13:49 +0000515 auto outputHandle2 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100516 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
517
518 auto outputHandle0 = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
519 // NOTE: At the moment the CL collapses the tensor to a 2 dim when dimension zero = 1
telsoa01c577f2c2018-08-31 09:22:23 +0100520 // 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 +0100521 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000522}
523
arovir019e53a352018-08-31 15:26:35 +0100524BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000525{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100526 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100527}
528
529BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
530{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100531 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100532}
533
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100534template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100535static void ClSplitterMergerTest()
536{
537 // Tests that it is possible to decide which output of the splitter layer
538 // should be lined to which input of the merger layer.
telsoa014fcda012018-03-09 14:13:49 +0000539 // We test that is is possible to specify 0th output
540 // of the splitter to be the 1st input to the merger and the 1st output of the splitter to be 0th input
541 // of the merger.
542
543 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000544 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000545
546 auto workloads =
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100547 CreateSplitterMergerWorkloadTest<ClSplitterWorkload, ClMergerWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100548 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000549
550 auto wlSplitter = std::move(workloads.first);
551 auto wlMerger = std::move(workloads.second);
552
telsoa01c577f2c2018-08-31 09:22:23 +0100553 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000554 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
555 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
556 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
557 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
558
559 BOOST_TEST(sOut0);
560 BOOST_TEST(sOut1);
561 BOOST_TEST(mIn0);
562 BOOST_TEST(mIn1);
563
telsoa01c577f2c2018-08-31 09:22:23 +0100564 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000565 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
566 BOOST_TEST(validDataPointers);
567
568
telsoa01c577f2c2018-08-31 09:22:23 +0100569 //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 +0000570 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
571 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
572
573 BOOST_TEST(validSubTensorParents);
574}
575
arovir019e53a352018-08-31 15:26:35 +0100576BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100577{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100578 ClSplitterMergerTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100579}
580
581BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat16Workload)
582{
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100583 ClSplitterMergerTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100584}
585
586
telsoa014fcda012018-03-09 14:13:49 +0000587BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
588{
589 // 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 +0100590 // 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 +0000591
592 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000593 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Matthew Bentham29cadb32018-10-01 17:22:32 +0100594 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100595 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
596 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
597 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
598 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000599
Matthew Bentham29cadb32018-10-01 17:22:32 +0100600 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100601 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100602 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000603
telsoa01c577f2c2018-08-31 09:22:23 +0100604 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000605 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
606 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
607 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
608 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
609 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
610 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
611
612
613 BOOST_TEST(sOut0);
614 BOOST_TEST(sOut1);
615 BOOST_TEST(activ0_0Im);
616 BOOST_TEST(activ0_1Im);
617 BOOST_TEST(activ1_0Im);
618 BOOST_TEST(activ1_1Im);
619
620 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
621 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
622
623 BOOST_TEST(validDataPointers);
624}
625
626BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
627{
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000628 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100629 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000630}
631
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100632template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
633static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000634{
telsoa01c577f2c2018-08-31 09:22:23 +0100635 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000636 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100637 auto workload =
638 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000639
telsoa01c577f2c2018-08-31 09:22:23 +0100640 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000641 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
642 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
643 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
644
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100645 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW)
646 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
647 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
648 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW)
649 ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
650 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
651
652 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
653 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000654}
655
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100656BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
657{
658 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
659}
660
661BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
662{
663 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
664}
665
666BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
667{
668 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
669}
670
671BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
672{
673 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
674}
675
telsoa01c577f2c2018-08-31 09:22:23 +0100676template <typename LstmWorkloadType>
677static void ClCreateLstmWorkloadTest()
678{
679 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000680 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100681 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
682
683 LstmQueueDescriptor queueDescriptor = workload->GetData();
684 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
685 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
686 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
687 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
688}
689
arovir019e53a352018-08-31 15:26:35 +0100690BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100691{
arovir019e53a352018-08-31 15:26:35 +0100692 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100693}
694
James Conroy074f3712018-10-03 09:32:03 +0100695template <typename ResizeBilinearWorkloadType, typename armnn::DataType DataType>
696static void ClResizeBilinearWorkloadTest(DataLayout dataLayout)
697{
698 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000699 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
James Conroy074f3712018-10-03 09:32:03 +0100700
701 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
702
703 // Checks that inputs/outputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
704 ResizeBilinearQueueDescriptor queueDescriptor = workload->GetData();
705 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
706 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
707
708 switch (dataLayout)
709 {
710 case DataLayout::NHWC:
711 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
712 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
713 break;
James Conroy69482272018-10-19 10:41:35 +0100714 case DataLayout::NCHW:
715 default:
James Conroy074f3712018-10-03 09:32:03 +0100716 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
717 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
718 }
719}
720
721BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NchwWorkload)
722{
723 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
724}
725
726BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NchwWorkload)
727{
728 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
729}
730
731BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32NhwcWorkload)
732{
733 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
734}
735
736BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16NhwcWorkload)
737{
738 ClResizeBilinearWorkloadTest<ClResizeBilinearFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
739}
telsoa01c577f2c2018-08-31 09:22:23 +0100740
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100741template <typename MeanWorkloadType, typename armnn::DataType DataType>
742static void ClMeanWorkloadTest()
743{
744 Graph graph;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000745 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory();
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100746 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
747
748 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
749 MeanQueueDescriptor queueDescriptor = workload->GetData();
750 auto inputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
751 auto outputHandle = boost::polymorphic_downcast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
752
753 // The first dimension (batch size) in both input and output is singular thus it has been reduced by ACL.
754 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 3, 7, 4 }));
755 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 4 }));
756}
757
758BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
759{
760 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
761}
762
763BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
764{
765 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
766}
767
768BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
769{
770 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QuantisedAsymm8>();
771}
772
telsoa014fcda012018-03-09 14:13:49 +0000773BOOST_AUTO_TEST_SUITE_END()