blob: 4bd3d3a33d05e35866f7890c06fefc35590152bc [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
Teresa Charlin8398edc2020-07-20 14:23:02 +01002// Copyright © 2017 Arm Ltd and Contributors. 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
Sadik Armagan04a72972020-09-14 15:44:18 +01009#include <armnn/utility/Assert.hpp>
10#include <armnn/utility/IgnoreUnused.hpp>
Jan Eilersbb446e52020-04-02 13:56:54 +010011#include <armnn/utility/PolymorphicDowncast.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000012#include <backendsCommon/MemCopyWorkload.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010013
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000014#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010015#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010016
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000017#include <cl/ClTensorHandle.hpp>
18#include <cl/ClWorkloadFactory.hpp>
19#include <cl/workloads/ClWorkloads.hpp>
20#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010021
telsoa014fcda012018-03-09 14:13:49 +000022boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
23 std::initializer_list<unsigned int> expectedDimensions)
24{
25 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
26}
27
telsoa01c577f2c2018-08-31 09:22:23 +010028BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000029
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010030template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010031static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000032{
33 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000034 ClWorkloadFactory factory =
35 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000036
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010037 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000038
telsoa01c577f2c2018-08-31 09:22:23 +010039 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000040 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010041 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
42 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000043
Matthew Bentham89105282018-11-20 14:33:33 +000044 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 1}));
45 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 1}));
telsoa014fcda012018-03-09 14:13:49 +000046}
47
arovir019e53a352018-08-31 15:26:35 +010048BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010049{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010050 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010051}
52
53BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
54{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010055 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010056}
57
David Beck4a8692c2018-09-07 16:19:24 +010058template <typename WorkloadType,
59 typename DescriptorType,
60 typename LayerType,
61 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000062static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000063{
64 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000065 ClWorkloadFactory factory =
66 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
67
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000068 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000069
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000070 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010071 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010072 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
73 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
74 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000075 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
76 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
77 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
78}
79
arovir019e53a352018-08-31 15:26:35 +010080BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000081{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000082 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010083 AdditionQueueDescriptor,
84 AdditionLayer,
85 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010086}
87
88BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
89{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000090 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010091 AdditionQueueDescriptor,
92 AdditionLayer,
93 armnn::DataType::Float16>();
94}
95
96BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
97{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000098 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010099 SubtractionQueueDescriptor,
100 SubtractionLayer,
101 armnn::DataType::Float32>();
102}
103
104BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
105{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000106 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100107 SubtractionQueueDescriptor,
108 SubtractionLayer,
109 armnn::DataType::Float16>();
110}
111
112BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
113{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000114 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100115 MultiplicationQueueDescriptor,
116 MultiplicationLayer,
117 armnn::DataType::Float32>();
118}
119
120BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
121{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000122 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100123 MultiplicationQueueDescriptor,
124 MultiplicationLayer,
125 armnn::DataType::Float16>();
126}
127
Matthew Benthame2ec3302018-10-01 11:32:48 +0100128BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
129{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000130 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100131 MultiplicationQueueDescriptor,
132 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000133 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100134}
135
David Beck4a8692c2018-09-07 16:19:24 +0100136BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
137{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000138 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100139 DivisionQueueDescriptor,
140 DivisionLayer,
141 armnn::DataType::Float32>();
142}
143
144BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
145{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000146 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100147 DivisionQueueDescriptor,
148 DivisionLayer,
149 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100150}
151
josh minor4a3c6102020-01-06 16:40:46 -0600152template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100153 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100154 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600155static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100156{
157 Graph graph;
158 ClWorkloadFactory factory =
159 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
160
josh minor4a3c6102020-01-06 16:40:46 -0600161 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100162
163 DescriptorType queueDescriptor = workload->GetData();
164
Jan Eilersbb446e52020-04-02 13:56:54 +0100165 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
166 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100167
168 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3}));
169 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
170}
171
172BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32WorkloadTest)
173{
josh minor4a3c6102020-01-06 16:40:46 -0600174 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
175 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100176}
177
telsoa01c577f2c2018-08-31 09:22:23 +0100178template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100179static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100180{
181 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000182 ClWorkloadFactory factory =
183 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000184
telsoa01c577f2c2018-08-31 09:22:23 +0100185 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100186 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000187
telsoa01c577f2c2018-08-31 09:22:23 +0100188 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000189 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100190 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
191 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000192
Nikhil Rajd1340932018-10-18 14:27:50 +0100193 switch (dataLayout)
194 {
195 case DataLayout::NHWC:
196 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
197 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
198 break;
199 default: // NCHW
200 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
201 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
202 }
telsoa014fcda012018-03-09 14:13:49 +0000203}
204
Nikhil Rajd1340932018-10-18 14:27:50 +0100205BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000206{
Nikhil Rajd1340932018-10-18 14:27:50 +0100207 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
208 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100209}
telsoa014fcda012018-03-09 14:13:49 +0000210
Nikhil Rajd1340932018-10-18 14:27:50 +0100211BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100212{
Nikhil Rajd1340932018-10-18 14:27:50 +0100213 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
214 armnn::DataType::Float16>(DataLayout::NCHW);
215}
216
217BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
218{
219 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
220 armnn::DataType::Float32>(DataLayout::NHWC);
221}
222
223BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
224{
225 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
226 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100227}
228
229BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
230{
231 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000232 ClWorkloadFactory factory =
233 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
234
telsoa01c577f2c2018-08-31 09:22:23 +0100235 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
236
237 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100238 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
239 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100240
Matthew Bentham89105282018-11-20 14:33:33 +0000241 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
242 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100243 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
244 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
245}
246
247BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
248{
249 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000250 ClWorkloadFactory factory =
251 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
252
telsoa01c577f2c2018-08-31 09:22:23 +0100253 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
254
255 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100256 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
257 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100258
Matthew Bentham89105282018-11-20 14:33:33 +0000259 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
260 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100261 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
262 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
263}
264
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100265template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
266static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100267{
268 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000269 ClWorkloadFactory factory =
270 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
271
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100272 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
273 graph,
274 dataLayout);
275
Mike Kellydb482882019-06-14 12:35:24 +0100276 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
277 : std::initializer_list<unsigned int>({2, 8, 16, 3});
278 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
279 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100280
281 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000282 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100283 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
284 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100285 BOOST_TEST((inputHandle->GetShape() == inputShape));
286 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000287}
288
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100289BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000290{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100291 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100292}
293
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100294BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100295{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100296 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000297}
298
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100299BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
300{
301 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
302}
303
304BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
305{
306 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
307}
308
Sadik Armagan04a72972020-09-14 15:44:18 +0100309BOOST_AUTO_TEST_CASE(CreateConvolution2dFastMathEnabledWorkload)
310{
311 Graph graph;
312
313 using ModelOptions = std::vector<BackendOptions>;
314 ModelOptions modelOptions = {};
315 BackendOptions gpuAcc("GpuAcc",
316 {
317 { "FastMathEnabled", true }
318 });
319 modelOptions.push_back(gpuAcc);
320
321 ClWorkloadFactory factory =
322 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
323
324 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100325 CreateConvolution2dWorkloadFastMathTest<ClConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100326 graph,
327 DataLayout::NCHW,
328 modelOptions);
329
330 ARMNN_ASSERT(workload != nullptr);
331 auto conv2dWorkload = PolymorphicDowncast<ClConvolution2dWorkload*>(workload.get());
332 IgnoreUnused(conv2dWorkload);
333 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100334 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100335}
336
Nikhil Rajcec6b652018-10-12 13:51:57 +0100337template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
338static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
339{
340 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000341 ClWorkloadFactory factory =
342 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100343
344 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
345 (factory, graph, dataLayout);
346
347 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
348 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100349 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
350 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100351
Mike Kellydb482882019-06-14 12:35:24 +0100352 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
353 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
354 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
355 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100356
Mike Kellydb482882019-06-14 12:35:24 +0100357 BOOST_TEST((inputHandle->GetShape() == inputShape));
358 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100359}
360
361BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
362{
363 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
364}
365
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100366template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100367static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000368{
telsoa01c577f2c2018-08-31 09:22:23 +0100369 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000370 ClWorkloadFactory factory =
371 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
372
Matthew Benthamd8067922018-10-03 17:18:04 +0100373 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000374
telsoa01c577f2c2018-08-31 09:22:23 +0100375 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000376 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100377 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
378 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000379 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
380 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
381}
382
arovir019e53a352018-08-31 15:26:35 +0100383BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000384{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100385 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100386}
387
388BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
389{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100390 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000391}
392
393BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
394{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000395 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000396}
397
telsoa01c577f2c2018-08-31 09:22:23 +0100398template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
399static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000400{
telsoa01c577f2c2018-08-31 09:22:23 +0100401 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000402 ClWorkloadFactory factory =
403 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
404
telsoa01c577f2c2018-08-31 09:22:23 +0100405 auto workload =
406 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000407
telsoa01c577f2c2018-08-31 09:22:23 +0100408 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000409 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100410 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
411 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000412 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
413 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
414}
415
telsoa01c577f2c2018-08-31 09:22:23 +0100416
arovir019e53a352018-08-31 15:26:35 +0100417BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000418{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100419 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100420}
421
422BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
423{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100424 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100425}
426
telsoa01c577f2c2018-08-31 09:22:23 +0100427template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100428static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100429{
430 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000431 ClWorkloadFactory factory =
432 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
433
Matteo Martincigha160b242018-10-18 10:33:23 +0100434 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000435
telsoa01c577f2c2018-08-31 09:22:23 +0100436 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000437 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100438 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
439 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000440
Mike Kellydb482882019-06-14 12:35:24 +0100441 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
442 : std::initializer_list<unsigned int>({3, 1, 5, 5});
443 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
444 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100445
Mike Kellydb482882019-06-14 12:35:24 +0100446 BOOST_TEST((inputHandle->GetShape() == inputShape));
447 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000448}
449
narpra0155a97bc2018-10-02 14:35:53 +0100450BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000451{
narpra0155a97bc2018-10-02 14:35:53 +0100452 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100453}
454
narpra0155a97bc2018-10-02 14:35:53 +0100455BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100456{
narpra0155a97bc2018-10-02 14:35:53 +0100457 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
458}
459
460BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
461{
462 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
463}
464
465BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
466{
467 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100468}
469
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100470template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100471static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100472{
473 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000474 ClWorkloadFactory factory =
475 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000476
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100477 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100478
Mike Kellydb482882019-06-14 12:35:24 +0100479 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
480 : std::initializer_list<unsigned int>({3, 5, 5, 2});
481 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
482 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000483
telsoa01c577f2c2018-08-31 09:22:23 +0100484 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000485 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100486 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
487 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000488
Mike Kellydb482882019-06-14 12:35:24 +0100489 BOOST_TEST((inputHandle->GetShape() == inputShape));
490 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000491}
492
Nina Drozdb48e6862018-10-09 12:09:56 +0100493BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100494{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100495 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100496}
497
Nina Drozdb48e6862018-10-09 12:09:56 +0100498BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100499{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100500 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100501}
502
503BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
504{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100505 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100506}
507
508BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
509{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100510 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100511}
512
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100513static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
514 const armnn::TensorShape& alphaShape,
515 const armnn::TensorShape& outputShape,
516 armnn::DataType dataType)
517{
518 Graph graph;
519 ClWorkloadFactory factory =
520 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
521
522 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
523 graph,
524 inputShape,
525 alphaShape,
526 outputShape,
527 dataType);
528
529 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
530 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100531 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
532 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
533 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100534
535 BOOST_TEST((inputHandle->GetShape() == inputShape));
536 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
537 BOOST_TEST((outputHandle->GetShape() == outputShape));
538}
539
540BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
541{
542 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
543}
544
545BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
546{
547 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
548}
549
550BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
551{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000552 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100553}
554
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100555template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000556static void ClCreateReshapeWorkloadTest()
557{
telsoa01c577f2c2018-08-31 09:22:23 +0100558 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000559 ClWorkloadFactory factory =
560 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000561
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100562 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000563
telsoa01c577f2c2018-08-31 09:22:23 +0100564 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000565 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100566 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
567 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000568
569 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000570 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000571}
572
arovir019e53a352018-08-31 15:26:35 +0100573BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000574{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100575 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100576}
577
578BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
579{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100580 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000581}
582
583BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
584{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000585 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000586}
587
telsoa01c577f2c2018-08-31 09:22:23 +0100588template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
589static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000590{
telsoa01c577f2c2018-08-31 09:22:23 +0100591 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000592 ClWorkloadFactory factory =
593 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000594
telsoa01c577f2c2018-08-31 09:22:23 +0100595 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000596
arovir019e53a352018-08-31 15:26:35 +0100597 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000598 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100599 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
600 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000601
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100602 armnn::TensorInfo tensorInfo({4, 1}, DataType);
603 if (DataType == armnn::DataType::QAsymmU8)
604 {
605 tensorInfo.SetQuantizationOffset(0);
606 tensorInfo.SetQuantizationScale(1.f / 256);
607 }
608 else if (DataType == armnn::DataType::QAsymmS8)
609 {
610 tensorInfo.SetQuantizationOffset(-128);
611 tensorInfo.SetQuantizationScale(1.f / 256);
612 }
613
telsoa014fcda012018-03-09 14:13:49 +0000614 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
615 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
616}
617
telsoa01c577f2c2018-08-31 09:22:23 +0100618
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100619BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32WorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100620{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100621 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100622}
623
624BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
625{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100626 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
627}
628
629BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmU8Workload)
630{
631 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
632}
633
634BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmS8Workload)
635{
636 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100637}
638
Matthew Bentham29cadb32018-10-01 17:22:32 +0100639template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100640static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000641{
642 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000643 ClWorkloadFactory factory =
644 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000645
Matthew Bentham29cadb32018-10-01 17:22:32 +0100646 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000647
telsoa01c577f2c2018-08-31 09:22:23 +0100648 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000649 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100650 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100651 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
652
Jan Eilersbb446e52020-04-02 13:56:54 +0100653 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100654 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
655
Jan Eilersbb446e52020-04-02 13:56:54 +0100656 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100657 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
658
Jan Eilersbb446e52020-04-02 13:56:54 +0100659 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000660 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000661}
662
arovir019e53a352018-08-31 15:26:35 +0100663BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000664{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100665 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100666}
667
668BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
669{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100670 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100671}
672
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100673template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100674static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100675{
676 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100677 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000678 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100679 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
680 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000681
682 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000683 ClWorkloadFactory factory =
684 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000685
686 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100687 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100688 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000689
690 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100691 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000692
telsoa01c577f2c2018-08-31 09:22:23 +0100693 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000694 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
695 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100696 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
697 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000698
699 BOOST_TEST(sOut0);
700 BOOST_TEST(sOut1);
701 BOOST_TEST(mIn0);
702 BOOST_TEST(mIn1);
703
telsoa01c577f2c2018-08-31 09:22:23 +0100704 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000705 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
706 BOOST_TEST(validDataPointers);
707
708
telsoa01c577f2c2018-08-31 09:22:23 +0100709 //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 +0000710 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
711 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
712
713 BOOST_TEST(validSubTensorParents);
714}
715
Jim Flynne242f2d2019-05-22 14:24:13 +0100716BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100717{
Jim Flynne242f2d2019-05-22 14:24:13 +0100718 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100719}
720
Jim Flynne242f2d2019-05-22 14:24:13 +0100721BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100722{
Jim Flynne242f2d2019-05-22 14:24:13 +0100723 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100724}
725
726
telsoa014fcda012018-03-09 14:13:49 +0000727BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
728{
729 // 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 +0100730 // 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 +0000731
732 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000733 ClWorkloadFactory factory =
734 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
735
Matthew Bentham29cadb32018-10-01 17:22:32 +0100736 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100737 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
738 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
739 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
740 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000741
Matthew Bentham29cadb32018-10-01 17:22:32 +0100742 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100743 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100744 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000745
telsoa01c577f2c2018-08-31 09:22:23 +0100746 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000747 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
748 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
749 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
750 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
751 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
752 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
753
754
755 BOOST_TEST(sOut0);
756 BOOST_TEST(sOut1);
757 BOOST_TEST(activ0_0Im);
758 BOOST_TEST(activ0_1Im);
759 BOOST_TEST(activ1_0Im);
760 BOOST_TEST(activ1_1Im);
761
762 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
763 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
764
765 BOOST_TEST(validDataPointers);
766}
767
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100768#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100769
770// This test unit needs the reference backend, it's not available if the reference backend is not built
771
telsoa014fcda012018-03-09 14:13:49 +0000772BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
773{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000774 ClWorkloadFactory factory =
775 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
776
telsoa01c577f2c2018-08-31 09:22:23 +0100777 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000778}
779
Matteo Martincighe67edb22019-08-14 14:05:46 +0100780#endif
781
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100782template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
783static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000784{
telsoa01c577f2c2018-08-31 09:22:23 +0100785 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000786 ClWorkloadFactory factory =
787 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
788
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100789 auto workload =
790 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000791
telsoa01c577f2c2018-08-31 09:22:23 +0100792 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000793 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100794 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
795 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000796
Mike Kellydb482882019-06-14 12:35:24 +0100797 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
798 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
799 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
800 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100801
Mike Kellydb482882019-06-14 12:35:24 +0100802 BOOST_TEST((inputHandle->GetShape() == inputShape));
803 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000804}
805
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100806BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
807{
808 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
809}
810
811BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
812{
813 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
814}
815
816BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
817{
818 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
819}
820
821BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
822{
823 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
824}
825
Teresa Charlin8398edc2020-07-20 14:23:02 +0100826template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
827static void ClCreateLogSoftmaxWorkloadTest()
828{
829 Graph graph;
830 ClWorkloadFactory factory =
831 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
832
833 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
834
835 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
836 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
837 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
838 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
839
840 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
841 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
842}
843
844BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloat32WorkloadTest)
845{
846 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
847}
848
telsoa01c577f2c2018-08-31 09:22:23 +0100849template <typename LstmWorkloadType>
850static void ClCreateLstmWorkloadTest()
851{
852 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000853 ClWorkloadFactory factory =
854 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
855
telsoa01c577f2c2018-08-31 09:22:23 +0100856 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
857
858 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100859 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
860 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100861 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
862 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
863}
864
arovir019e53a352018-08-31 15:26:35 +0100865BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100866{
arovir019e53a352018-08-31 15:26:35 +0100867 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100868}
869
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100870template <typename ResizeWorkloadType, typename armnn::DataType DataType>
871static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100872{
873 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000874 ClWorkloadFactory factory =
875 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100876
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100877 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100878
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100879 auto queueDescriptor = workload->GetData();
880
Jan Eilersbb446e52020-04-02 13:56:54 +0100881 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
882 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100883
884 switch (dataLayout)
885 {
886 case DataLayout::NHWC:
887 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
888 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
889 break;
James Conroy69482272018-10-19 10:41:35 +0100890 case DataLayout::NCHW:
891 default:
James Conroy074f3712018-10-03 09:32:03 +0100892 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
893 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
894 }
895}
896
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100897BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100898{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100899 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100900}
901
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100902BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100903{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100904 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100905}
906
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100907BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100908{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000909 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100910}
911
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100912BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100913{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100914 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
915}
916
917BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
918{
919 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
920}
921
922BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
923{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000924 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +0100925}
telsoa01c577f2c2018-08-31 09:22:23 +0100926
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100927template <typename MeanWorkloadType, typename armnn::DataType DataType>
928static void ClMeanWorkloadTest()
929{
930 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000931 ClWorkloadFactory factory =
932 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
933
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100934 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
935
936 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
937 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100938 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
939 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100940
941 // 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 +0000942 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
943 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100944}
945
946BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
947{
948 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
949}
950
951BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
952{
953 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
954}
955
956BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
957{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000958 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +0100959}
960
Jim Flynne242f2d2019-05-22 14:24:13 +0100961template <typename ConcatWorkloadType, armnn::DataType DataType>
962static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +0000963 unsigned int concatAxis)
964{
965 Graph graph;
966 ClWorkloadFactory factory =
967 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
968
Jim Flynne242f2d2019-05-22 14:24:13 +0100969 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000970
Jim Flynne242f2d2019-05-22 14:24:13 +0100971 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100972 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
973 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
974 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +0000975
976 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
977 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
978 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
979}
980
Jim Flynne242f2d2019-05-22 14:24:13 +0100981BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000982{
Jim Flynne242f2d2019-05-22 14:24:13 +0100983 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000984}
985
Jim Flynne242f2d2019-05-22 14:24:13 +0100986BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000987{
Jim Flynne242f2d2019-05-22 14:24:13 +0100988 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000989}
990
Jim Flynne242f2d2019-05-22 14:24:13 +0100991BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000992{
Jim Flynne242f2d2019-05-22 14:24:13 +0100993 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000994}
995
Jim Flynne242f2d2019-05-22 14:24:13 +0100996BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +0000997{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000998 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +0000999}
1000
Jim Flynne242f2d2019-05-22 14:24:13 +01001001BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +00001002{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001003 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001004}
1005
Jim Flynne242f2d2019-05-22 14:24:13 +01001006BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +00001007{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001008 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001009}
1010
James Conroy60597842019-07-02 10:57:56 +01001011template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1012static void ClSpaceToDepthWorkloadTest()
1013{
1014 Graph graph;
1015 ClWorkloadFactory factory =
1016 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1017
1018 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1019
1020 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001021 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1022 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001023
1024 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
1025 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
1026}
1027
1028BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
1029{
1030 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1031}
1032
1033BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
1034{
1035 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1036}
1037
1038BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
1039{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001040 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001041}
1042
1043BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
1044{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001045 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001046}
1047
Matthew Jacksond5166102019-07-31 14:06:28 +01001048template <armnn::DataType DataType>
1049static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1050 const std::initializer_list<unsigned int>& outputShape,
1051 unsigned int axis,
1052 unsigned int numInputs)
1053{
1054 armnn::Graph graph;
1055 ClWorkloadFactory factory =
1056 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1057
1058 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1059 graph,
1060 TensorShape(inputShape),
1061 TensorShape(outputShape),
1062 axis,
1063 numInputs);
1064
1065 // Check inputs and output are as expected
1066 StackQueueDescriptor queueDescriptor = workload->GetData();
1067 for (unsigned int i = 0; i < numInputs; ++i)
1068 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001069 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001070 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
1071 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001072 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001073 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
1074}
1075
1076BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1077{
1078 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1079}
1080
Matthew Jacksone69c3992019-09-09 14:31:21 +01001081BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
1082{
1083 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1084}
1085
Matthew Jacksond5166102019-07-31 14:06:28 +01001086BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1087{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001088 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001089}
1090
Ryan OShea2323af42020-05-13 16:36:19 +01001091
1092template <typename QLstmWorkloadType>
1093static void ClCreateQLstmWorkloadTest()
1094{
1095 Graph graph;
1096 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1097
1098 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1099 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1100
1101 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1102 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 4})));
1103 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1104
1105 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1106 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1107 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1108
1109 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
1110 BOOST_TEST((outputHandle->GetShape() == TensorShape({2, 4})));
1111 BOOST_TEST((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1112}
1113
1114BOOST_AUTO_TEST_CASE(CreateQLstmWorkloadTest)
1115{
1116 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1117}
1118
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001119template <typename QuantizedLstmWorkloadType>
1120static void ClCreateQuantizedLstmWorkloadTest()
1121{
1122 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001123
1124 Graph graph;
1125 ClWorkloadFactory factory =
1126 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1127
1128 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1129
1130 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1131
Jan Eilersbb446e52020-04-02 13:56:54 +01001132 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001133 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1134 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1135
Jan Eilersbb446e52020-04-02 13:56:54 +01001136 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001137 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1138 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1139
Jan Eilersbb446e52020-04-02 13:56:54 +01001140 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001141 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1142 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1143
Jan Eilersbb446e52020-04-02 13:56:54 +01001144 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001145 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1146 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1147
Jan Eilersbb446e52020-04-02 13:56:54 +01001148 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001149 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1150 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1151}
1152
1153BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1154{
1155 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1156}
1157
telsoa014fcda012018-03-09 14:13:49 +00001158BOOST_AUTO_TEST_SUITE_END()