blob: 765409a4263fd2cb3c92d1b4824186447d652529 [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>
Sadik Armagane9444752020-12-02 11:28:58 +000013#include <backendsCommon/test/TensorCopyUtils.hpp>
14#include <backendsCommon/test/WorkloadTestUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010015
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000016#include <aclCommon/test/CreateWorkloadClNeon.hpp>
Ferran Balaguer737d9ff2019-08-01 09:58:08 +010017#include <aclCommon/ArmComputeTensorUtils.hpp>
Aron Virginas-Tar3b278e92018-10-12 13:00:55 +010018
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000019#include <cl/ClTensorHandle.hpp>
20#include <cl/ClWorkloadFactory.hpp>
21#include <cl/workloads/ClWorkloads.hpp>
22#include <cl/workloads/ClWorkloadUtils.hpp>
arovir0143095f32018-10-09 18:04:24 +010023
telsoa014fcda012018-03-09 14:13:49 +000024boost::test_tools::predicate_result CompareIClTensorHandleShape(IClTensorHandle* tensorHandle,
25 std::initializer_list<unsigned int> expectedDimensions)
26{
27 return CompareTensorHandleShape<IClTensorHandle>(tensorHandle, expectedDimensions);
28}
29
telsoa01c577f2c2018-08-31 09:22:23 +010030BOOST_FIXTURE_TEST_SUITE(CreateWorkloadCl, ClContextControlFixture)
telsoa014fcda012018-03-09 14:13:49 +000031
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010032template <armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +010033static void ClCreateActivationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000034{
35 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000036 ClWorkloadFactory factory =
37 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +000038
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010039 auto workload = CreateActivationWorkloadTest<ClActivationWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000040
telsoa01c577f2c2018-08-31 09:22:23 +010041 // Checks that inputs/outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000042 ActivationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010043 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
44 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000045
Matthew Bentham89105282018-11-20 14:33:33 +000046 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 1}));
47 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 1}));
telsoa014fcda012018-03-09 14:13:49 +000048}
49
arovir019e53a352018-08-31 15:26:35 +010050BOOST_AUTO_TEST_CASE(CreateActivationFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +010051{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010052 ClCreateActivationWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010053}
54
55BOOST_AUTO_TEST_CASE(CreateActivationFloat16Workload)
56{
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +010057 ClCreateActivationWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +010058}
59
David Beck4a8692c2018-09-07 16:19:24 +010060template <typename WorkloadType,
61 typename DescriptorType,
62 typename LayerType,
63 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000064static void ClCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000065{
66 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +000067 ClWorkloadFactory factory =
68 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
69
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000070 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000071
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000072 // Checks that inputs/outputs are as we expect them (see definition of CreateElementwiseWorkloadTest).
David Beck4a8692c2018-09-07 16:19:24 +010073 DescriptorType queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010074 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
75 auto inputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
76 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000077 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, {2, 3}));
78 BOOST_TEST(CompareIClTensorHandleShape(inputHandle2, {2, 3}));
79 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
80}
81
arovir019e53a352018-08-31 15:26:35 +010082BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +000083{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000084 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010085 AdditionQueueDescriptor,
86 AdditionLayer,
87 armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +010088}
89
90BOOST_AUTO_TEST_CASE(CreateAdditionFloat16Workload)
91{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000092 ClCreateElementwiseWorkloadTest<ClAdditionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +010093 AdditionQueueDescriptor,
94 AdditionLayer,
95 armnn::DataType::Float16>();
96}
97
98BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
99{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000100 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100101 SubtractionQueueDescriptor,
102 SubtractionLayer,
103 armnn::DataType::Float32>();
104}
105
106BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
107{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000108 ClCreateElementwiseWorkloadTest<ClSubtractionWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100109 SubtractionQueueDescriptor,
110 SubtractionLayer,
111 armnn::DataType::Float16>();
112}
113
114BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkloadTest)
115{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000116 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100117 MultiplicationQueueDescriptor,
118 MultiplicationLayer,
119 armnn::DataType::Float32>();
120}
121
122BOOST_AUTO_TEST_CASE(CreateMultiplicationFloat16WorkloadTest)
123{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000124 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100125 MultiplicationQueueDescriptor,
126 MultiplicationLayer,
127 armnn::DataType::Float16>();
128}
129
Matthew Benthame2ec3302018-10-01 11:32:48 +0100130BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8WorkloadTest)
131{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000132 ClCreateElementwiseWorkloadTest<ClMultiplicationWorkload,
Matthew Benthame2ec3302018-10-01 11:32:48 +0100133 MultiplicationQueueDescriptor,
134 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000135 armnn::DataType::QAsymmU8>();
Matthew Benthame2ec3302018-10-01 11:32:48 +0100136}
137
David Beck4a8692c2018-09-07 16:19:24 +0100138BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkloadTest)
139{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000140 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100141 DivisionQueueDescriptor,
142 DivisionLayer,
143 armnn::DataType::Float32>();
144}
145
146BOOST_AUTO_TEST_CASE(CreateDivisionFloat16WorkloadTest)
147{
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000148 ClCreateElementwiseWorkloadTest<ClDivisionFloatWorkload,
David Beck4a8692c2018-09-07 16:19:24 +0100149 DivisionQueueDescriptor,
150 DivisionLayer,
151 armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100152}
153
josh minor4a3c6102020-01-06 16:40:46 -0600154template <typename WorkloadType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100155 typename DescriptorType,
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100156 armnn::DataType DataType>
josh minor4a3c6102020-01-06 16:40:46 -0600157static void ClCreateElementwiseUnaryWorkloadTest(armnn::UnaryOperation op)
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100158{
159 Graph graph;
160 ClWorkloadFactory factory =
161 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
162
josh minor4a3c6102020-01-06 16:40:46 -0600163 auto workload = CreateElementwiseUnaryWorkloadTest<WorkloadType, DescriptorType, DataType>(factory, graph, op);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100164
165 DescriptorType queueDescriptor = workload->GetData();
166
Jan Eilersbb446e52020-04-02 13:56:54 +0100167 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
168 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100169
170 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3}));
171 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 3}));
172}
173
174BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32WorkloadTest)
175{
josh minor4a3c6102020-01-06 16:40:46 -0600176 ClCreateElementwiseUnaryWorkloadTest<ClRsqrtWorkload, RsqrtQueueDescriptor, armnn::DataType::Float32>(
177 UnaryOperation::Rsqrt);
Aron Virginas-Tar1a763dd2019-09-10 12:32:08 +0100178}
179
telsoa01c577f2c2018-08-31 09:22:23 +0100180template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100181static void ClCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100182{
183 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000184 ClWorkloadFactory factory =
185 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000186
telsoa01c577f2c2018-08-31 09:22:23 +0100187 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>
Nikhil Rajd1340932018-10-18 14:27:50 +0100188 (factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000189
telsoa01c577f2c2018-08-31 09:22:23 +0100190 // Checks that inputs/outputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000191 BatchNormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100192 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
193 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000194
Nikhil Rajd1340932018-10-18 14:27:50 +0100195 switch (dataLayout)
196 {
197 case DataLayout::NHWC:
198 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
199 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4, 4, 3 }));
200 break;
201 default: // NCHW
202 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
203 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 4, 4 }));
204 }
telsoa014fcda012018-03-09 14:13:49 +0000205}
206
Nikhil Rajd1340932018-10-18 14:27:50 +0100207BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000208{
Nikhil Rajd1340932018-10-18 14:27:50 +0100209 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
210 armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100211}
telsoa014fcda012018-03-09 14:13:49 +0000212
Nikhil Rajd1340932018-10-18 14:27:50 +0100213BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100214{
Nikhil Rajd1340932018-10-18 14:27:50 +0100215 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
216 armnn::DataType::Float16>(DataLayout::NCHW);
217}
218
219BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloatNhwcWorkload)
220{
221 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
222 armnn::DataType::Float32>(DataLayout::NHWC);
223}
224
225BOOST_AUTO_TEST_CASE(CreateBatchNormalizationNhwcFloat16NhwcWorkload)
226{
227 ClCreateBatchNormalizationWorkloadTest<ClBatchNormalizationFloatWorkload,
228 armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100229}
230
231BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Workload)
232{
233 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000234 ClWorkloadFactory factory =
235 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
236
telsoa01c577f2c2018-08-31 09:22:23 +0100237 auto workload = CreateConvertFp16ToFp32WorkloadTest<ClConvertFp16ToFp32Workload>(factory, graph);
238
239 ConvertFp16ToFp32QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100240 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
241 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100242
Matthew Bentham89105282018-11-20 14:33:33 +0000243 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
244 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100245 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
246 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
247}
248
249BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Workload)
250{
251 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000252 ClWorkloadFactory factory =
253 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
254
telsoa01c577f2c2018-08-31 09:22:23 +0100255 auto workload = CreateConvertFp32ToFp16WorkloadTest<ClConvertFp32ToFp16Workload>(factory, graph);
256
257 ConvertFp32ToFp16QueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100258 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
259 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100260
Matthew Bentham89105282018-11-20 14:33:33 +0000261 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {1, 3, 2, 3}));
262 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 3, 2, 3}));
telsoa01c577f2c2018-08-31 09:22:23 +0100263 BOOST_TEST((inputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F32));
264 BOOST_TEST((outputHandle->GetTensor().info()->data_type() == arm_compute::DataType::F16));
265}
266
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100267template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
268static void ClConvolution2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100269{
270 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000271 ClWorkloadFactory factory =
272 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
273
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100274 auto workload = CreateConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory,
275 graph,
276 dataLayout);
277
Mike Kellydb482882019-06-14 12:35:24 +0100278 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
279 : std::initializer_list<unsigned int>({2, 8, 16, 3});
280 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
281 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa01c577f2c2018-08-31 09:22:23 +0100282
283 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000284 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100285 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
286 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Mike Kellydb482882019-06-14 12:35:24 +0100287 BOOST_TEST((inputHandle->GetShape() == inputShape));
288 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000289}
290
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100291BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000292{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100293 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100294}
295
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100296BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100297{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100298 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000299}
300
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100301BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NchwWorkload)
302{
303 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
304}
305
306BOOST_AUTO_TEST_CASE(CreateConvolution2dFloat16NhwcWorkload)
307{
308 ClConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
309}
310
Sadik Armagan04a72972020-09-14 15:44:18 +0100311BOOST_AUTO_TEST_CASE(CreateConvolution2dFastMathEnabledWorkload)
312{
313 Graph graph;
314
315 using ModelOptions = std::vector<BackendOptions>;
316 ModelOptions modelOptions = {};
317 BackendOptions gpuAcc("GpuAcc",
318 {
319 { "FastMathEnabled", true }
320 });
321 modelOptions.push_back(gpuAcc);
322
323 ClWorkloadFactory factory =
324 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager(), modelOptions);
325
326 auto workload =
Sadik Armagan283a8b42020-09-22 14:35:19 +0100327 CreateConvolution2dWorkloadFastMathTest<ClConvolution2dWorkload, armnn::DataType::Float32>(factory,
Sadik Armagan04a72972020-09-14 15:44:18 +0100328 graph,
329 DataLayout::NCHW,
330 modelOptions);
331
332 ARMNN_ASSERT(workload != nullptr);
333 auto conv2dWorkload = PolymorphicDowncast<ClConvolution2dWorkload*>(workload.get());
334 IgnoreUnused(conv2dWorkload);
335 ARMNN_ASSERT(conv2dWorkload != nullptr);
Sadik Armagan283a8b42020-09-22 14:35:19 +0100336 ARMNN_ASSERT(conv2dWorkload->GetConvolutionMethod() == arm_compute::ConvolutionMethod::WINOGRAD);
Sadik Armagan04a72972020-09-14 15:44:18 +0100337}
338
Sadik Armagane9444752020-12-02 11:28:58 +0000339BOOST_AUTO_TEST_CASE(CreateConvolution2dClCompiledContextWorkload)
340{
341 using namespace armnn;
342
343 const DataType inputType = DataType::QAsymmU8;
344 const DataType kernelType = DataType::QSymmS8;
345 const DataType biasType = DataType::Signed32;
346
347 TensorInfo inputInfo ({ 1, 3, 1, 2 }, inputType, 0.5f, 128);
348 TensorInfo outputInfo({ 1, 3, 1, 3 }, inputType, 1.0f, 128);
349
350 const std::vector<float> quantScales{ 0.5f, 0.75f, 1.0f };
351 constexpr unsigned int quantDimension = 0;
352
353 TensorInfo kernelInfo({ 3, 1, 1, 2 }, kernelType, quantScales, quantDimension);
354
355 const std::vector<float> biasQuantScales{ 0.25f, 0.375f, 0.5f };
356 TensorInfo biasInfo({ 3 }, biasType, biasQuantScales, quantDimension);
357
358 std::vector<uint8_t> inputData =
359 {
360 138, 108, 138, 108, 138, 108
361 };
362
363 std::vector<int8_t> kernelData =
364 {
365 1, 2, 1, 2, 1, 2
366 };
367
368 std::vector<int32_t> biasData =
369 {
370 4, 4, 4
371 };
372
373 std::vector<uint8_t> expectedOutputData =
374 {
375 121, 118, 115, 121, 118, 115, 121, 118, 115
376 };
377
378
379 Convolution2dDescriptor descriptor;
380 descriptor.m_StrideX = 1;
381 descriptor.m_StrideY = 1;
382 descriptor.m_PadLeft = 0;
383 descriptor.m_PadRight = 0;
384 descriptor.m_PadTop = 0;
385 descriptor.m_PadBottom = 0;
386 descriptor.m_BiasEnabled = true;
387 descriptor.m_DataLayout = DataLayout::NHWC;
388
389 auto memoryManager = ClWorkloadFactoryHelper::GetMemoryManager();
390 auto clMemoryManager = armnn::PolymorphicPointerDowncast<armnn::ClMemoryManager>(memoryManager);
391 auto tensorHandleFactory = ClWorkloadFactoryHelper::GetTensorHandleFactory(memoryManager);
392
393 std::unique_ptr<ITensorHandle> inputHandle = tensorHandleFactory.CreateTensorHandle(inputInfo);
394 std::unique_ptr<ITensorHandle> outputHandle = tensorHandleFactory.CreateTensorHandle(outputInfo);
395
396
397 WorkloadInfo workloadInfo;
398 ScopedCpuTensorHandle weightTensor(kernelInfo);
399 ScopedCpuTensorHandle biasTensor(biasInfo);
400
401 AllocateAndCopyDataToITensorHandle(&weightTensor, kernelData.data());
402 AllocateAndCopyDataToITensorHandle(&biasTensor, biasData.data());
403
404 Convolution2dQueueDescriptor queueDescriptor;
405 queueDescriptor.m_Parameters = descriptor;
406 queueDescriptor.m_Weight = &weightTensor;
407 queueDescriptor.m_Bias = &biasTensor;
408
409 AddInputToWorkload(queueDescriptor, workloadInfo, inputInfo, inputHandle.get());
410 AddOutputToWorkload(queueDescriptor, workloadInfo, outputInfo, outputHandle.get());
411
412 // Initialize our m_CLCompileContext using default device and context
413 auto context = arm_compute::CLKernelLibrary::get().context();
414 auto device = arm_compute::CLKernelLibrary::get().get_device();
415 auto clCompileContext = arm_compute::CLCompileContext(context, device);
416
417
418
419 // Check built programs are empty in context
420 BOOST_TEST(clCompileContext.get_built_programs().empty());
421
422 auto workload = std::make_unique<ClConvolution2dWorkload>(queueDescriptor,
423 workloadInfo,
424 clMemoryManager->GetIntraLayerManager(),
425 clCompileContext);
426 ARMNN_ASSERT(workload != nullptr);
427 // Check built programs are not empty in context
428 BOOST_TEST(!clCompileContext.get_built_programs().empty());
429}
430
Nikhil Rajcec6b652018-10-12 13:51:57 +0100431template <typename DepthwiseConvolutionWorkloadType, typename armnn::DataType DataType>
432static void ClDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
433{
434 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000435 ClWorkloadFactory factory =
436 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
Nikhil Rajcec6b652018-10-12 13:51:57 +0100437
438 auto workload = CreateDepthwiseConvolution2dWorkloadTest<DepthwiseConvolutionWorkloadType, DataType>
439 (factory, graph, dataLayout);
440
441 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
442 DepthwiseConvolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100443 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
444 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Rajcec6b652018-10-12 13:51:57 +0100445
Mike Kellydb482882019-06-14 12:35:24 +0100446 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
447 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
448 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
449 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
Nikhil Rajcec6b652018-10-12 13:51:57 +0100450
Mike Kellydb482882019-06-14 12:35:24 +0100451 BOOST_TEST((inputHandle->GetShape() == inputShape));
452 BOOST_TEST((outputHandle->GetShape() == outputShape));
Nikhil Rajcec6b652018-10-12 13:51:57 +0100453}
454
455BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
456{
457 ClDepthwiseConvolutionWorkloadTest<ClDepthwiseConvolutionWorkload, DataType::Float32>(DataLayout::NHWC);
458}
459
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100460template <typename Convolution2dWorkloadType, typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100461static void ClDirectConvolution2dWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000462{
telsoa01c577f2c2018-08-31 09:22:23 +0100463 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000464 ClWorkloadFactory factory =
465 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
466
Matthew Benthamd8067922018-10-03 17:18:04 +0100467 auto workload = CreateDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000468
telsoa01c577f2c2018-08-31 09:22:23 +0100469 // Checks that outputs and inputs are as we expect them (see definition of CreateDirectConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000470 Convolution2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100471 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
472 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000473 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {2, 3, 6, 6}));
474 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {2, 2, 6, 6}));
475}
476
arovir019e53a352018-08-31 15:26:35 +0100477BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000478{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100479 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100480}
481
482BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dFloat16Workload)
483{
Francis Murtagh0d9d4192018-10-09 16:22:33 +0100484 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000485}
486
487BOOST_AUTO_TEST_CASE(CreateDirectConvolution2dUint8Workload)
488{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000489 ClDirectConvolution2dWorkloadTest<ClConvolution2dWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000490}
491
telsoa01c577f2c2018-08-31 09:22:23 +0100492template <typename FullyConnectedWorkloadType, typename armnn::DataType DataType>
493static void ClCreateFullyConnectedWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000494{
telsoa01c577f2c2018-08-31 09:22:23 +0100495 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000496 ClWorkloadFactory factory =
497 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
498
telsoa01c577f2c2018-08-31 09:22:23 +0100499 auto workload =
500 CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000501
telsoa01c577f2c2018-08-31 09:22:23 +0100502 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000503 FullyConnectedQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100504 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
505 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000506 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {3, 1, 4, 5}));
507 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {3, 7}));
508}
509
telsoa01c577f2c2018-08-31 09:22:23 +0100510
arovir019e53a352018-08-31 15:26:35 +0100511BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloatWorkloadTest)
telsoa014fcda012018-03-09 14:13:49 +0000512{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100513 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100514}
515
516BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat16WorkloadTest)
517{
Matthew Benthamab8cdc12018-09-17 11:17:41 +0100518 ClCreateFullyConnectedWorkloadTest<ClFullyConnectedWorkload, armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100519}
520
telsoa01c577f2c2018-08-31 09:22:23 +0100521template <typename NormalizationWorkloadType, typename armnn::DataType DataType>
narpra0155a97bc2018-10-02 14:35:53 +0100522static void ClNormalizationWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100523{
524 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000525 ClWorkloadFactory factory =
526 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
527
Matteo Martincigha160b242018-10-18 10:33:23 +0100528 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000529
telsoa01c577f2c2018-08-31 09:22:23 +0100530 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000531 NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100532 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
533 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000534
Mike Kellydb482882019-06-14 12:35:24 +0100535 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
536 : std::initializer_list<unsigned int>({3, 1, 5, 5});
537 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 5, 5, 1})
538 : std::initializer_list<unsigned int>({3, 1, 5, 5});
Matteo Martincigha160b242018-10-18 10:33:23 +0100539
Mike Kellydb482882019-06-14 12:35:24 +0100540 BOOST_TEST((inputHandle->GetShape() == inputShape));
541 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000542}
543
narpra0155a97bc2018-10-02 14:35:53 +0100544BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NchwWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000545{
narpra0155a97bc2018-10-02 14:35:53 +0100546 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100547}
548
narpra0155a97bc2018-10-02 14:35:53 +0100549BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100550{
narpra0155a97bc2018-10-02 14:35:53 +0100551 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
552}
553
554BOOST_AUTO_TEST_CASE(CreateNormalizationFloat32NhwcWorkload)
555{
556 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
557}
558
559BOOST_AUTO_TEST_CASE(CreateNormalizationFloat16NhwcWorkload)
560{
561 ClNormalizationWorkloadTest<ClNormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100562}
563
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100564template <typename armnn::DataType DataType>
Nina Drozdb48e6862018-10-09 12:09:56 +0100565static void ClPooling2dWorkloadTest(DataLayout dataLayout)
telsoa01c577f2c2018-08-31 09:22:23 +0100566{
567 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000568 ClWorkloadFactory factory =
569 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000570
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100571 auto workload = CreatePooling2dWorkloadTest<ClPooling2dWorkload, DataType>(factory, graph, dataLayout);
Nina Drozdb48e6862018-10-09 12:09:56 +0100572
Mike Kellydb482882019-06-14 12:35:24 +0100573 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 5, 5})
574 : std::initializer_list<unsigned int>({3, 5, 5, 2});
575 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({3, 2, 2, 4})
576 : std::initializer_list<unsigned int>({3, 2, 4, 2});
telsoa014fcda012018-03-09 14:13:49 +0000577
telsoa01c577f2c2018-08-31 09:22:23 +0100578 // Check that inputs/outputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000579 Pooling2dQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100580 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
581 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000582
Mike Kellydb482882019-06-14 12:35:24 +0100583 BOOST_TEST((inputHandle->GetShape() == inputShape));
584 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000585}
586
Nina Drozdb48e6862018-10-09 12:09:56 +0100587BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNchwWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100588{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100589 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NCHW);
telsoa01c577f2c2018-08-31 09:22:23 +0100590}
591
Nina Drozdb48e6862018-10-09 12:09:56 +0100592BOOST_AUTO_TEST_CASE(CreatePooling2dFloatNhwcWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100593{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100594 ClPooling2dWorkloadTest<armnn::DataType::Float32>(DataLayout::NHWC);
Nina Drozdb48e6862018-10-09 12:09:56 +0100595}
596
597BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NchwWorkload)
598{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100599 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NCHW);
Nina Drozdb48e6862018-10-09 12:09:56 +0100600}
601
602BOOST_AUTO_TEST_CASE(CreatePooling2dFloat16NhwcWorkload)
603{
Nattapat Chaimanowongac9e0962018-10-10 17:18:35 +0100604 ClPooling2dWorkloadTest<armnn::DataType::Float16>(DataLayout::NHWC);
telsoa01c577f2c2018-08-31 09:22:23 +0100605}
606
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100607static void ClCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
608 const armnn::TensorShape& alphaShape,
609 const armnn::TensorShape& outputShape,
610 armnn::DataType dataType)
611{
612 Graph graph;
613 ClWorkloadFactory factory =
614 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
615
616 auto workload = CreatePreluWorkloadTest<ClPreluWorkload>(factory,
617 graph,
618 inputShape,
619 alphaShape,
620 outputShape,
621 dataType);
622
623 // Checks that outputs and inputs are as we expect them (see definition of CreatePreluWorkloadTest).
624 PreluQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100625 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
626 auto alphaHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
627 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100628
629 BOOST_TEST((inputHandle->GetShape() == inputShape));
630 BOOST_TEST((alphaHandle->GetShape() == alphaShape));
631 BOOST_TEST((outputHandle->GetShape() == outputShape));
632}
633
634BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
635{
636 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float16);
637}
638
639BOOST_AUTO_TEST_CASE(CreatePreluFloatWorkload)
640{
641 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::Float32);
642}
643
644BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
645{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000646 ClCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, DataType::QAsymmU8);
Nikhil Raj91e4c6d2019-07-05 12:22:58 +0100647}
648
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100649template <typename armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000650static void ClCreateReshapeWorkloadTest()
651{
telsoa01c577f2c2018-08-31 09:22:23 +0100652 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000653 ClWorkloadFactory factory =
654 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000655
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100656 auto workload = CreateReshapeWorkloadTest<ClReshapeWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000657
telsoa01c577f2c2018-08-31 09:22:23 +0100658 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000659 ReshapeQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100660 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
661 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000662
663 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
Matthew Bentham89105282018-11-20 14:33:33 +0000664 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {1, 4}));
telsoa014fcda012018-03-09 14:13:49 +0000665}
666
arovir019e53a352018-08-31 15:26:35 +0100667BOOST_AUTO_TEST_CASE(CreateReshapeFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000668{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100669 ClCreateReshapeWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100670}
671
672BOOST_AUTO_TEST_CASE(CreateReshapeFloat16Workload)
673{
Nattapat Chaimanowonga76698c2018-10-11 10:29:15 +0100674 ClCreateReshapeWorkloadTest<armnn::DataType::Float16>();
telsoa014fcda012018-03-09 14:13:49 +0000675}
676
677BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
678{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000679 ClCreateReshapeWorkloadTest<armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000680}
681
telsoa01c577f2c2018-08-31 09:22:23 +0100682template <typename SoftmaxWorkloadType, typename armnn::DataType DataType>
683static void ClSoftmaxWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000684{
telsoa01c577f2c2018-08-31 09:22:23 +0100685 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000686 ClWorkloadFactory factory =
687 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000688
telsoa01c577f2c2018-08-31 09:22:23 +0100689 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000690
arovir019e53a352018-08-31 15:26:35 +0100691 // Checks that inputs/outputs are as we expect them (see definition of ClSoftmaxFloatWorkload).
telsoa014fcda012018-03-09 14:13:49 +0000692 SoftmaxQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100693 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
694 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000695
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100696 armnn::TensorInfo tensorInfo({4, 1}, DataType);
697 if (DataType == armnn::DataType::QAsymmU8)
698 {
699 tensorInfo.SetQuantizationOffset(0);
700 tensorInfo.SetQuantizationScale(1.f / 256);
701 }
702 else if (DataType == armnn::DataType::QAsymmS8)
703 {
704 tensorInfo.SetQuantizationOffset(-128);
705 tensorInfo.SetQuantizationScale(1.f / 256);
706 }
707
telsoa014fcda012018-03-09 14:13:49 +0000708 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
709 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
710}
711
telsoa01c577f2c2018-08-31 09:22:23 +0100712
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100713BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32WorkloadTest)
telsoa01c577f2c2018-08-31 09:22:23 +0100714{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100715 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100716}
717
718BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16WorkloadTest)
719{
Teresa Charlinc1f6b092020-05-11 16:10:38 +0100720 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::Float16>();
721}
722
723BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmU8Workload)
724{
725 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmU8>();
726}
727
728BOOST_AUTO_TEST_CASE(CreateSoftmaxQAsymmS8Workload)
729{
730 ClSoftmaxWorkloadTest<ClSoftmaxWorkload, armnn::DataType::QAsymmS8>();
telsoa01c577f2c2018-08-31 09:22:23 +0100731}
732
Matthew Bentham29cadb32018-10-01 17:22:32 +0100733template <typename armnn::DataType DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100734static void ClSplitterWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000735{
736 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000737 ClWorkloadFactory factory =
738 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000739
Matthew Bentham29cadb32018-10-01 17:22:32 +0100740 auto workload = CreateSplitterWorkloadTest<ClSplitterWorkload, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000741
telsoa01c577f2c2018-08-31 09:22:23 +0100742 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000743 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100744 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
surmeh013537c2c2018-05-18 16:31:43 +0100745 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {5, 7, 7}));
746
Jan Eilersbb446e52020-04-02 13:56:54 +0100747 auto outputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
surmeh013537c2c2018-05-18 16:31:43 +0100748 BOOST_TEST(CompareIClTensorHandleShape(outputHandle1, {2, 7, 7}));
749
Jan Eilersbb446e52020-04-02 13:56:54 +0100750 auto outputHandle2 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[2]);
surmeh013537c2c2018-05-18 16:31:43 +0100751 BOOST_TEST(CompareIClTensorHandleShape(outputHandle2, {2, 7, 7}));
752
Jan Eilersbb446e52020-04-02 13:56:54 +0100753 auto outputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Bentham89105282018-11-20 14:33:33 +0000754 BOOST_TEST(CompareIClTensorHandleShape(outputHandle0, {1, 7, 7}));
telsoa014fcda012018-03-09 14:13:49 +0000755}
756
arovir019e53a352018-08-31 15:26:35 +0100757BOOST_AUTO_TEST_CASE(CreateSplitterFloatWorkload)
telsoa014fcda012018-03-09 14:13:49 +0000758{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100759 ClSplitterWorkloadTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100760}
761
762BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
763{
Matthew Bentham29cadb32018-10-01 17:22:32 +0100764 ClSplitterWorkloadTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100765}
766
Nattapat Chaimanowong02f8bc12018-10-11 16:16:17 +0100767template <typename armnn::DataType DataType>
Jim Flynne242f2d2019-05-22 14:24:13 +0100768static void ClSplitterConcatTest()
telsoa01c577f2c2018-08-31 09:22:23 +0100769{
770 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100771 // should be lined to which input of the concat layer.
telsoa014fcda012018-03-09 14:13:49 +0000772 // We test that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100773 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
774 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000775
776 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000777 ClWorkloadFactory factory =
778 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
telsoa014fcda012018-03-09 14:13:49 +0000779
780 auto workloads =
Jim Flynne242f2d2019-05-22 14:24:13 +0100781 CreateSplitterConcatWorkloadTest<ClSplitterWorkload, ClConcatWorkload, DataType>
telsoa01c577f2c2018-08-31 09:22:23 +0100782 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000783
784 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100785 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000786
telsoa01c577f2c2018-08-31 09:22:23 +0100787 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000788 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
789 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
Jim Flynne242f2d2019-05-22 14:24:13 +0100790 armnn::ClSubTensorHandle* mIn0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
791 armnn::ClSubTensorHandle* mIn1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000792
793 BOOST_TEST(sOut0);
794 BOOST_TEST(sOut1);
795 BOOST_TEST(mIn0);
796 BOOST_TEST(mIn1);
797
telsoa01c577f2c2018-08-31 09:22:23 +0100798 //Fliped order of inputs/outputs.
telsoa014fcda012018-03-09 14:13:49 +0000799 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
800 BOOST_TEST(validDataPointers);
801
802
telsoa01c577f2c2018-08-31 09:22:23 +0100803 //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 +0000804 bool validSubTensorParents = (mIn0->GetTensor().parent() == mIn1->GetTensor().parent())
805 && (sOut0->GetTensor().parent() == sOut1->GetTensor().parent());
806
807 BOOST_TEST(validSubTensorParents);
808}
809
Jim Flynne242f2d2019-05-22 14:24:13 +0100810BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100811{
Jim Flynne242f2d2019-05-22 14:24:13 +0100812 ClSplitterConcatTest<armnn::DataType::Float32>();
telsoa01c577f2c2018-08-31 09:22:23 +0100813}
814
Jim Flynne242f2d2019-05-22 14:24:13 +0100815BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16Workload)
telsoa01c577f2c2018-08-31 09:22:23 +0100816{
Jim Flynne242f2d2019-05-22 14:24:13 +0100817 ClSplitterConcatTest<armnn::DataType::Float16>();
telsoa01c577f2c2018-08-31 09:22:23 +0100818}
819
820
telsoa014fcda012018-03-09 14:13:49 +0000821BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputs)
822{
823 // 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 +0100824 // 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 +0000825
826 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000827 ClWorkloadFactory factory =
828 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
829
Matthew Bentham29cadb32018-10-01 17:22:32 +0100830 std::unique_ptr<ClSplitterWorkload> wlSplitter;
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100831 std::unique_ptr<ClActivationWorkload> wlActiv0_0;
832 std::unique_ptr<ClActivationWorkload> wlActiv0_1;
833 std::unique_ptr<ClActivationWorkload> wlActiv1_0;
834 std::unique_ptr<ClActivationWorkload> wlActiv1_1;
telsoa014fcda012018-03-09 14:13:49 +0000835
Matthew Bentham29cadb32018-10-01 17:22:32 +0100836 CreateSplitterMultipleInputsOneOutputWorkloadTest<ClSplitterWorkload,
Nattapat Chaimanowonge06757e2018-10-11 15:39:18 +0100837 ClActivationWorkload, armnn::DataType::Float32>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1,
telsoa01c577f2c2018-08-31 09:22:23 +0100838 wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000839
telsoa01c577f2c2018-08-31 09:22:23 +0100840 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000841 armnn::ClSubTensorHandle* sOut0 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
842 armnn::ClSubTensorHandle* sOut1 = dynamic_cast<armnn::ClSubTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
843 armnn::ClSubTensorHandle* activ0_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
844 armnn::ClSubTensorHandle* activ0_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
845 armnn::ClSubTensorHandle* activ1_0Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
846 armnn::ClSubTensorHandle* activ1_1Im = dynamic_cast<armnn::ClSubTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
847
848
849 BOOST_TEST(sOut0);
850 BOOST_TEST(sOut1);
851 BOOST_TEST(activ0_0Im);
852 BOOST_TEST(activ0_1Im);
853 BOOST_TEST(activ1_0Im);
854 BOOST_TEST(activ1_1Im);
855
856 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
857 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
858
859 BOOST_TEST(validDataPointers);
860}
861
Matteo Martincighdb16dd32019-08-27 16:41:11 +0100862#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +0100863
864// This test unit needs the reference backend, it's not available if the reference backend is not built
865
telsoa014fcda012018-03-09 14:13:49 +0000866BOOST_AUTO_TEST_CASE(CreateMemCopyWorkloadsCl)
867{
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000868 ClWorkloadFactory factory =
869 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
870
telsoa01c577f2c2018-08-31 09:22:23 +0100871 CreateMemCopyWorkloads<IClTensorHandle>(factory);
telsoa014fcda012018-03-09 14:13:49 +0000872}
873
Matteo Martincighe67edb22019-08-14 14:05:46 +0100874#endif
875
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100876template <typename L2NormalizationWorkloadType, typename armnn::DataType DataType>
877static void ClL2NormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000878{
telsoa01c577f2c2018-08-31 09:22:23 +0100879 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000880 ClWorkloadFactory factory =
881 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
882
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100883 auto workload =
884 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
telsoa014fcda012018-03-09 14:13:49 +0000885
telsoa01c577f2c2018-08-31 09:22:23 +0100886 // Checks that inputs/outputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000887 L2NormalizationQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100888 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
889 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000890
Mike Kellydb482882019-06-14 12:35:24 +0100891 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
892 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
893 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 5, 20, 50, 67 })
894 : std::initializer_list<unsigned int>({ 5, 50, 67, 20 });
Matteo Martincigh2400b6d2018-10-09 18:19:20 +0100895
Mike Kellydb482882019-06-14 12:35:24 +0100896 BOOST_TEST((inputHandle->GetShape() == inputShape));
897 BOOST_TEST((outputHandle->GetShape() == outputShape));
telsoa014fcda012018-03-09 14:13:49 +0000898}
899
Matteo Martincighbcd3c852018-09-28 14:14:12 +0100900BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNchwWorkload)
901{
902 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
903}
904
905BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloatNhwcWorkload)
906{
907 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
908}
909
910BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NchwWorkload)
911{
912 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
913}
914
915BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat16NhwcWorkload)
916{
917 ClL2NormalizationWorkloadTest<ClL2NormalizationFloatWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
918}
919
Teresa Charlin8398edc2020-07-20 14:23:02 +0100920template <typename LogSoftmaxWorkloadType, typename armnn::DataType DataType>
921static void ClCreateLogSoftmaxWorkloadTest()
922{
923 Graph graph;
924 ClWorkloadFactory factory =
925 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
926
927 auto workload = CreateLogSoftmaxWorkloadTest<LogSoftmaxWorkloadType, DataType>(factory, graph);
928
929 // Checks that outputs and inputs are as we expect them (see definition of CreateLogSoftmaxWorkloadTest).
930 LogSoftmaxQueueDescriptor queueDescriptor = workload->GetData();
931 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
932 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
933
934 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, {4, 1}));
935 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, {4, 1}));
936}
937
938BOOST_AUTO_TEST_CASE(CreateLogSoftmaxFloat32WorkloadTest)
939{
940 ClCreateLogSoftmaxWorkloadTest<ClLogSoftmaxWorkload, armnn::DataType::Float32>();
941}
942
telsoa01c577f2c2018-08-31 09:22:23 +0100943template <typename LstmWorkloadType>
944static void ClCreateLstmWorkloadTest()
945{
946 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000947 ClWorkloadFactory factory =
948 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
949
telsoa01c577f2c2018-08-31 09:22:23 +0100950 auto workload = CreateLstmWorkloadTest<LstmWorkloadType>(factory, graph);
951
952 LstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100953 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
954 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100955 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 2 }));
956 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 4 }));
957}
958
arovir019e53a352018-08-31 15:26:35 +0100959BOOST_AUTO_TEST_CASE(CreateLSTMWorkloadFloatWorkload)
telsoa01c577f2c2018-08-31 09:22:23 +0100960{
arovir019e53a352018-08-31 15:26:35 +0100961 ClCreateLstmWorkloadTest<ClLstmFloatWorkload>();
telsoa01c577f2c2018-08-31 09:22:23 +0100962}
963
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100964template <typename ResizeWorkloadType, typename armnn::DataType DataType>
965static void ClResizeWorkloadTest(DataLayout dataLayout)
James Conroy074f3712018-10-03 09:32:03 +0100966{
967 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +0000968 ClWorkloadFactory factory =
969 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
James Conroy074f3712018-10-03 09:32:03 +0100970
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100971 auto workload = CreateResizeBilinearWorkloadTest<ResizeWorkloadType, DataType>(factory, graph, dataLayout);
James Conroy074f3712018-10-03 09:32:03 +0100972
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100973 auto queueDescriptor = workload->GetData();
974
Jan Eilersbb446e52020-04-02 13:56:54 +0100975 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
976 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy074f3712018-10-03 09:32:03 +0100977
978 switch (dataLayout)
979 {
980 case DataLayout::NHWC:
981 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 4, 4, 3 }));
982 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 2, 2, 3 }));
983 break;
James Conroy69482272018-10-19 10:41:35 +0100984 case DataLayout::NCHW:
985 default:
James Conroy074f3712018-10-03 09:32:03 +0100986 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 2, 3, 4, 4 }));
987 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 2, 3, 2, 2 }));
988 }
989}
990
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100991BOOST_AUTO_TEST_CASE(CreateResizeFloat32NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100992{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100993 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100994}
995
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100996BOOST_AUTO_TEST_CASE(CreateResizeFloat16NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +0100997{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +0100998 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +0100999}
1000
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001001BOOST_AUTO_TEST_CASE(CreateResizeUint8NchwWorkload)
James Conroy074f3712018-10-03 09:32:03 +01001002{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001003 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy074f3712018-10-03 09:32:03 +01001004}
1005
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001006BOOST_AUTO_TEST_CASE(CreateResizeFloat32NhwcWorkload)
James Conroy074f3712018-10-03 09:32:03 +01001007{
Aron Virginas-Tarcc0cefb2019-07-02 17:25:47 +01001008 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
1009}
1010
1011BOOST_AUTO_TEST_CASE(CreateResizeFloat16NhwcWorkload)
1012{
1013 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::Float16>(DataLayout::NHWC);
1014}
1015
1016BOOST_AUTO_TEST_CASE(CreateResizeUint8NhwcWorkload)
1017{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001018 ClResizeWorkloadTest<ClResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
James Conroy074f3712018-10-03 09:32:03 +01001019}
telsoa01c577f2c2018-08-31 09:22:23 +01001020
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001021template <typename MeanWorkloadType, typename armnn::DataType DataType>
1022static void ClMeanWorkloadTest()
1023{
1024 Graph graph;
Aron Virginas-Tar5caf9072018-11-14 18:35:18 +00001025 ClWorkloadFactory factory =
1026 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1027
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001028 auto workload = CreateMeanWorkloadTest<MeanWorkloadType, DataType>(factory, graph);
1029
1030 // Checks that inputs/outputs are as we expect them (see definition of CreateMeanWorkloadTest).
1031 MeanQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001032 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1033 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001034
1035 // 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 +00001036 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 3, 7, 4 }));
1037 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 4 }));
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001038}
1039
1040BOOST_AUTO_TEST_CASE(CreateMeanFloat32Workload)
1041{
1042 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float32>();
1043}
1044
1045BOOST_AUTO_TEST_CASE(CreateMeanFloat16Workload)
1046{
1047 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::Float16>();
1048}
1049
1050BOOST_AUTO_TEST_CASE(CreateMeanUint8Workload)
1051{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001052 ClMeanWorkloadTest<ClMeanWorkload, armnn::DataType::QAsymmU8>();
Matteo Martincigh28dcab62018-10-19 16:40:03 +01001053}
1054
Jim Flynne242f2d2019-05-22 14:24:13 +01001055template <typename ConcatWorkloadType, armnn::DataType DataType>
1056static void ClCreateConcatWorkloadTest(std::initializer_list<unsigned int> outputShape,
narpra015cdda352018-11-19 15:30:27 +00001057 unsigned int concatAxis)
1058{
1059 Graph graph;
1060 ClWorkloadFactory factory =
1061 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1062
Jim Flynne242f2d2019-05-22 14:24:13 +01001063 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +00001064
Jim Flynne242f2d2019-05-22 14:24:13 +01001065 ConcatQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001066 auto inputHandle0 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1067 auto inputHandle1 = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[1]);
1068 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
narpra015cdda352018-11-19 15:30:27 +00001069
1070 BOOST_TEST(CompareIClTensorHandleShape(inputHandle0, { 2, 3, 2, 5 }));
1071 BOOST_TEST(CompareIClTensorHandleShape(inputHandle1, { 2, 3, 2, 5 }));
1072 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
1073}
1074
Jim Flynne242f2d2019-05-22 14:24:13 +01001075BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001076{
Jim Flynne242f2d2019-05-22 14:24:13 +01001077 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001078}
1079
Jim Flynne242f2d2019-05-22 14:24:13 +01001080BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001081{
Jim Flynne242f2d2019-05-22 14:24:13 +01001082 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001083}
1084
Jim Flynne242f2d2019-05-22 14:24:13 +01001085BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001086{
Jim Flynne242f2d2019-05-22 14:24:13 +01001087 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001088}
1089
Jim Flynne242f2d2019-05-22 14:24:13 +01001090BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +00001091{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001092 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
narpra0163b08822018-11-20 11:29:12 +00001093}
1094
Jim Flynne242f2d2019-05-22 14:24:13 +01001095BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +00001096{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001097 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra0163b08822018-11-20 11:29:12 +00001098}
1099
Jim Flynne242f2d2019-05-22 14:24:13 +01001100BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra0163b08822018-11-20 11:29:12 +00001101{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001102 ClCreateConcatWorkloadTest<ClConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra0163b08822018-11-20 11:29:12 +00001103}
1104
James Conroy60597842019-07-02 10:57:56 +01001105template <typename SpaceToDepthWorkloadType, typename armnn::DataType DataType>
1106static void ClSpaceToDepthWorkloadTest()
1107{
1108 Graph graph;
1109 ClWorkloadFactory factory =
1110 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1111
1112 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1113
1114 SpaceToDepthQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001115 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[0]);
1116 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
James Conroy60597842019-07-02 10:57:56 +01001117
1118 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, { 1, 2, 2, 1 }));
1119 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, { 1, 1, 1, 4 }));
1120}
1121
1122BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat32Workload)
1123{
1124 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float32>();
1125}
1126
1127BOOST_AUTO_TEST_CASE(CreateSpaceToDepthFloat16Workload)
1128{
1129 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::Float16>();
1130}
1131
1132BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQAsymm8Workload)
1133{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001134 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001135}
1136
1137BOOST_AUTO_TEST_CASE(CreateSpaceToDepthQSymm16Workload)
1138{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001139 ClSpaceToDepthWorkloadTest<ClSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001140}
1141
Matthew Jacksond5166102019-07-31 14:06:28 +01001142template <armnn::DataType DataType>
1143static void ClCreateStackWorkloadTest(const std::initializer_list<unsigned int>& inputShape,
1144 const std::initializer_list<unsigned int>& outputShape,
1145 unsigned int axis,
1146 unsigned int numInputs)
1147{
1148 armnn::Graph graph;
1149 ClWorkloadFactory factory =
1150 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1151
1152 auto workload = CreateStackWorkloadTest<ClStackWorkload, DataType>(factory,
1153 graph,
1154 TensorShape(inputShape),
1155 TensorShape(outputShape),
1156 axis,
1157 numInputs);
1158
1159 // Check inputs and output are as expected
1160 StackQueueDescriptor queueDescriptor = workload->GetData();
1161 for (unsigned int i = 0; i < numInputs; ++i)
1162 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001163 auto inputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001164 BOOST_TEST(CompareIClTensorHandleShape(inputHandle, inputShape));
1165 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001166 auto outputHandle = PolymorphicDowncast<IClTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001167 BOOST_TEST(CompareIClTensorHandleShape(outputHandle, outputShape));
1168}
1169
1170BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1171{
1172 ClCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1173}
1174
Matthew Jacksone69c3992019-09-09 14:31:21 +01001175BOOST_AUTO_TEST_CASE(CreateStackFloat16Workload)
1176{
1177 ClCreateStackWorkloadTest<armnn::DataType::Float16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
1178}
1179
Matthew Jacksond5166102019-07-31 14:06:28 +01001180BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1181{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001182 ClCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jacksond5166102019-07-31 14:06:28 +01001183}
1184
Ryan OShea2323af42020-05-13 16:36:19 +01001185
1186template <typename QLstmWorkloadType>
1187static void ClCreateQLstmWorkloadTest()
1188{
1189 Graph graph;
1190 ClWorkloadFactory factory = ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1191
1192 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1193 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1194
1195 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
1196 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 4})));
1197 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1198
1199 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
1200 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1201 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1202
1203 IAclTensorHandle* outputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[2]);
1204 BOOST_TEST((outputHandle->GetShape() == TensorShape({2, 4})));
1205 BOOST_TEST((outputHandle->GetDataType() == arm_compute::DataType::QASYMM8_SIGNED));
1206}
1207
1208BOOST_AUTO_TEST_CASE(CreateQLstmWorkloadTest)
1209{
1210 ClCreateQLstmWorkloadTest<ClQLstmWorkload>();
1211}
1212
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001213template <typename QuantizedLstmWorkloadType>
1214static void ClCreateQuantizedLstmWorkloadTest()
1215{
1216 using namespace armnn::armcomputetensorutils;
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001217
1218 Graph graph;
1219 ClWorkloadFactory factory =
1220 ClWorkloadFactoryHelper::GetFactory(ClWorkloadFactoryHelper::GetMemoryManager());
1221
1222 auto workload = CreateQuantizedLstmWorkloadTest<QuantizedLstmWorkloadType>(factory, graph);
1223
1224 QuantizedLstmQueueDescriptor queueDescriptor = workload->GetData();
1225
Jan Eilersbb446e52020-04-02 13:56:54 +01001226 IAclTensorHandle* inputHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001227 BOOST_TEST((inputHandle->GetShape() == TensorShape({2, 2})));
1228 BOOST_TEST((inputHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1229
Jan Eilersbb446e52020-04-02 13:56:54 +01001230 IAclTensorHandle* cellStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001231 BOOST_TEST((cellStateInHandle->GetShape() == TensorShape({2, 4})));
1232 BOOST_TEST((cellStateInHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1233
Jan Eilersbb446e52020-04-02 13:56:54 +01001234 IAclTensorHandle* outputStateInHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Inputs[2]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001235 BOOST_TEST((outputStateInHandle->GetShape() == TensorShape({2, 4})));
1236 BOOST_TEST((outputStateInHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1237
Jan Eilersbb446e52020-04-02 13:56:54 +01001238 IAclTensorHandle* cellStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[0]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001239 BOOST_TEST((cellStateOutHandle->GetShape() == TensorShape({2, 4})));
1240 BOOST_TEST((cellStateOutHandle->GetDataType() == arm_compute::DataType::QSYMM16));
1241
Jan Eilersbb446e52020-04-02 13:56:54 +01001242 IAclTensorHandle* outputStateOutHandle = PolymorphicDowncast<IAclTensorHandle*>(queueDescriptor.m_Outputs[1]);
Ferran Balaguer737d9ff2019-08-01 09:58:08 +01001243 BOOST_TEST((outputStateOutHandle->GetShape() == TensorShape({2, 4})));
1244 BOOST_TEST((outputStateOutHandle->GetDataType() == arm_compute::DataType::QASYMM8));
1245}
1246
1247BOOST_AUTO_TEST_CASE(CreateQuantizedLstmWorkload)
1248{
1249 ClCreateQuantizedLstmWorkloadTest<ClQuantizedLstmWorkload>();
1250}
1251
telsoa014fcda012018-03-09 14:13:49 +00001252BOOST_AUTO_TEST_SUITE_END()