blob: 23a8e9b9e92a2e253f9520d832ea87512d10da8b [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
arovir0143095f32018-10-09 18:04:24 +01005
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <test/CreateWorkload.hpp>
arovir0143095f32018-10-09 18:04:24 +01007
Matthew Bentham4cefc412019-06-18 16:14:34 +01008#include <reference/RefTensorHandle.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <reference/RefWorkloadFactory.hpp>
10#include <reference/workloads/RefWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
12namespace
13{
14
15template<typename Workload>
16void CheckInputOutput(std::unique_ptr<Workload> workload, const TensorInfo& inputInfo, const TensorInfo& outputInfo)
17{
18 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +010019 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
20 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000021 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
22 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
23}
24
25template <typename Workload>
26void CheckInputsOutput(std::unique_ptr<Workload> workload,
27 const TensorInfo& inputInfo0,
28 const TensorInfo& inputInfo1,
29 const TensorInfo& outputInfo)
30{
31 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +010032 auto inputHandle0 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
33 auto inputHandle1 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[1]);
34 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000035 BOOST_TEST((inputHandle0->GetTensorInfo() == inputInfo0));
36 BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1));
37 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
38}
Matthew Bentham7c1603a2019-06-21 17:22:23 +010039
40armnn::RefWorkloadFactory GetFactory()
41{
42 std::shared_ptr<RefMemoryManager> memoryManager = std::make_shared<RefMemoryManager>();
43 return RefWorkloadFactory(memoryManager);
44}
45
46
telsoa014fcda012018-03-09 14:13:49 +000047}
48
49BOOST_AUTO_TEST_SUITE(CreateWorkloadRef)
50
telsoa01c577f2c2018-08-31 09:22:23 +010051template <typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +000052static void RefCreateActivationWorkloadTest()
53{
54 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010055 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +010056 auto workload = CreateActivationWorkloadTest<ActivationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000057
telsoa01c577f2c2018-08-31 09:22:23 +010058 // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000059 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010060 TensorInfo({ 1, 1 }, DataType),
61 TensorInfo({ 1, 1 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000062}
63
64BOOST_AUTO_TEST_CASE(CreateActivationFloat32Workload)
65{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010066 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000067}
68
69BOOST_AUTO_TEST_CASE(CreateActivationUint8Workload)
70{
Derek Lambertif90c56d2020-01-10 17:14:08 +000071 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +000072}
73
David Beckbc392452018-09-10 14:47:28 +010074template <typename WorkloadType,
75 typename DescriptorType,
76 typename LayerType,
77 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078static void RefCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000079{
80 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010081 RefWorkloadFactory factory = GetFactory();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000082 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(
83 factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000084
telsoa014fcda012018-03-09 14:13:49 +000085 CheckInputsOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010086 TensorInfo({ 2, 3 }, DataType),
87 TensorInfo({ 2, 3 }, DataType),
88 TensorInfo({ 2, 3 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000089}
90
91BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
92{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010093 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000094 AdditionQueueDescriptor,
95 AdditionLayer,
96 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000097}
98
99BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
100{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100101 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000102 AdditionQueueDescriptor,
103 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000104 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100105}
106
Sadik Armagan2999a022019-04-09 14:20:12 +0100107BOOST_AUTO_TEST_CASE(CreateAdditionInt16Workload)
108{
109 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
110 AdditionQueueDescriptor,
111 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000112 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100113}
114
Matthew Jackson9bff1442019-09-12 09:08:23 +0100115BOOST_AUTO_TEST_CASE(CreateSubtractionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100116{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100117 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000118 SubtractionQueueDescriptor,
119 SubtractionLayer,
120 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100121}
122
Matthew Jackson9bff1442019-09-12 09:08:23 +0100123BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
124{
125 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
126 SubtractionQueueDescriptor,
127 SubtractionLayer,
128 armnn::DataType::Float16>();
129}
130
David Beckbc392452018-09-10 14:47:28 +0100131BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
132{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100133 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000134 SubtractionQueueDescriptor,
135 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000136 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100137}
138
Sadik Armagan2999a022019-04-09 14:20:12 +0100139BOOST_AUTO_TEST_CASE(CreateSubtractionInt16Workload)
140{
141 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
142 SubtractionQueueDescriptor,
143 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000144 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100145}
146
David Beckbc392452018-09-10 14:47:28 +0100147BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
148{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100149 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000150 MultiplicationQueueDescriptor,
151 MultiplicationLayer,
152 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100153}
154
155BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
156{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100157 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000158 MultiplicationQueueDescriptor,
159 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000160 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100161}
162
Sadik Armagan2999a022019-04-09 14:20:12 +0100163BOOST_AUTO_TEST_CASE(CreateMultiplicationInt16Workload)
164{
165 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
166 MultiplicationQueueDescriptor,
167 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000168 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100169}
170
Matthew Jackson9bff1442019-09-12 09:08:23 +0100171BOOST_AUTO_TEST_CASE(CreateDivisionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100172{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100173 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000174 DivisionQueueDescriptor,
175 DivisionLayer,
176 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100177}
178
Matthew Jackson9bff1442019-09-12 09:08:23 +0100179BOOST_AUTO_TEST_CASE(CreateDivisionFloat16Workload)
180{
181 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
182 DivisionQueueDescriptor,
183 DivisionLayer,
184 armnn::DataType::Float16>();
185}
186
David Beckbc392452018-09-10 14:47:28 +0100187BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
188{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100189 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000190 DivisionQueueDescriptor,
191 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000192 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000193}
194
Sadik Armagan2999a022019-04-09 14:20:12 +0100195BOOST_AUTO_TEST_CASE(CreateDivisionInt16Workload)
196{
197 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
198 DivisionQueueDescriptor,
199 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000200 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100201}
202
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100203template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
204static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000205{
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100206 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100207 RefWorkloadFactory factory = GetFactory();
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100208 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>(factory,
209 graph,
210 dataLayout);
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100211
212 TensorShape inputShape;
213 TensorShape outputShape;
214
215 switch (dataLayout)
216 {
217 case DataLayout::NHWC:
Nikhil Rajd1340932018-10-18 14:27:50 +0100218 inputShape = { 2, 4, 4, 3 };
219 outputShape = { 2, 4, 4, 3 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100220 break;
221 case DataLayout::NCHW:
222 default:
Nikhil Rajd1340932018-10-18 14:27:50 +0100223 inputShape = { 2, 3, 4, 4 };
224 outputShape = { 2, 3, 4, 4 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100225 break;
226 }
telsoa014fcda012018-03-09 14:13:49 +0000227
telsoa01c577f2c2018-08-31 09:22:23 +0100228 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100229 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
230}
231
232BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32Workload)
233{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100234 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100235 (DataLayout::NCHW);
236}
237
238BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32WorkloadNhwc)
239{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100240 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100241 (DataLayout::NHWC);
242}
243
Matthew Jackson9bff1442019-09-12 09:08:23 +0100244BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16Workload)
245{
246 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float16>
247 (DataLayout::NCHW);
248}
249
250BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16WorkloadNhwc)
251{
252 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float16>
253 (DataLayout::NHWC);
254}
255
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100256BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8Workload)
257{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000258 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100259 (DataLayout::NCHW);
260}
261
262BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8WorkloadNhwc)
263{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000264 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100265 (DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000266}
267
Matteo Martincighf5507132019-06-04 10:59:47 +0100268BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16Workload)
269{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000270 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100271 (DataLayout::NCHW);
272}
273
274BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc)
275{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000276 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100277 (DataLayout::NHWC);
278}
279
telsoa01c577f2c2018-08-31 09:22:23 +0100280BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
281{
282 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100283 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100284 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
285
286 // Checks that outputs and inputs are as we expect them
287 CheckInputOutput(
288 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
289}
290
291BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
292{
293 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100294 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100295 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
296
297 // Checks that outputs and inputs are as we expect them
298 CheckInputOutput(
299 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
300}
301
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100302static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000303{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100304 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100305 RefWorkloadFactory factory = GetFactory();
Mike Kelly9b398322019-05-22 17:21:49 +0100306 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100307 (factory, graph, dataLayout);
308
Mike Kellydb482882019-06-14 12:35:24 +0100309 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
310 : std::initializer_list<unsigned int>({2, 8, 16, 3});
311 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
312 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000313
telsoa01c577f2c2018-08-31 09:22:23 +0100314 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000315 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100316 TensorInfo(inputShape, DataType::Float32),
317 TensorInfo(outputShape, DataType::Float32));
318}
319
320BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
321{
322 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
323}
324
325BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
326{
327 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000328}
329
Ruomei Yan495852f2019-05-23 11:37:33 +0100330static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
331{
332 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100333 RefWorkloadFactory factory = GetFactory();
Ruomei Yan495852f2019-05-23 11:37:33 +0100334 auto workload = CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dWorkload, DataType::Float32>
335 (factory, graph, dataLayout);
336
Mike Kellydb482882019-06-14 12:35:24 +0100337 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
338 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
339 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
340 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
341
Ruomei Yan495852f2019-05-23 11:37:33 +0100342 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
343 CheckInputOutput(std::move(workload),
344 TensorInfo(inputShape, DataType::Float32),
345 TensorInfo(outputShape, DataType::Float32));
346}
347
348BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
349{
350 RefCreateDepthwiseConvolutionWorkloadTest(DataLayout::NHWC);
351}
352
telsoa01c577f2c2018-08-31 09:22:23 +0100353template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000354static void RefCreateFullyConnectedWorkloadTest()
355{
356 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100357 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100358 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000359
telsoa01c577f2c2018-08-31 09:22:23 +0100360 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
Derek Lambertif90c56d2020-01-10 17:14:08 +0000361 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
362 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000363 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100364 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
365 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000366}
367
Francis Murtagh43aec582019-05-27 12:14:10 +0100368BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000369{
Francis Murtagh43aec582019-05-27 12:14:10 +0100370 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000371}
372
Francis Murtagh43aec582019-05-27 12:14:10 +0100373BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000374{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000375 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000376}
377
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100378BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedSymm16)
Francis Murtagh46c09d02019-05-28 08:15:28 +0100379{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000380 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QSymmS16>();
Francis Murtagh46c09d02019-05-28 08:15:28 +0100381}
382
narpra0155a97bc2018-10-02 14:35:53 +0100383template <typename NormalizationWorkloadType, armnn::DataType DataType>
Matteo Martincigha160b242018-10-18 10:33:23 +0100384static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000385{
narpra0155a97bc2018-10-02 14:35:53 +0100386 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100387 RefWorkloadFactory factory = GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100388 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
389
390 TensorShape inputShape;
391 TensorShape outputShape;
392
393 switch (dataLayout)
394 {
395 case DataLayout::NHWC:
396 inputShape = { 3, 1, 5, 5 };
397 outputShape = { 3, 1, 5, 5 };
398 break;
399 case DataLayout::NCHW:
400 default:
401 inputShape = { 3, 5, 5, 1 };
402 outputShape = { 3, 5, 5, 1 };
403 break;
404 }
telsoa014fcda012018-03-09 14:13:49 +0000405
telsoa01c577f2c2018-08-31 09:22:23 +0100406 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
Matteo Martincigha160b242018-10-18 10:33:23 +0100407 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
narpra0155a97bc2018-10-02 14:35:53 +0100408}
409
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100410BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NchwWorkload)
narpra0155a97bc2018-10-02 14:35:53 +0100411{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100412 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincigha160b242018-10-18 10:33:23 +0100413}
414
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100415BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NhwcWorkload)
Matteo Martincigha160b242018-10-18 10:33:23 +0100416{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100417 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
418}
419
420BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NchwWorkload)
421{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000422 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100423}
424
425BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NhwcWorkload)
426{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000427 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000428}
429
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100430BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NchwWorkload)
431{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000432 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100433}
434
435BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NhwcWorkload)
436{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000437 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100438}
439
telsoa01c577f2c2018-08-31 09:22:23 +0100440template <typename Pooling2dWorkloadType, armnn::DataType DataType>
James Conroy69482272018-10-19 10:41:35 +0100441static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000442{
443 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100444 RefWorkloadFactory factory = GetFactory();
James Conroy69482272018-10-19 10:41:35 +0100445 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph, dataLayout);
446
447 TensorShape inputShape;
448 TensorShape outputShape;
449
450 switch (dataLayout)
451 {
452 case DataLayout::NHWC:
453 inputShape = { 3, 5, 5, 2 };
454 outputShape = { 3, 2, 4, 2 };
455 break;
456 case DataLayout::NCHW:
457 default:
458 inputShape = { 3, 2, 5, 5 };
459 outputShape = { 3, 2, 2, 4 };
460 }
telsoa014fcda012018-03-09 14:13:49 +0000461
telsoa01c577f2c2018-08-31 09:22:23 +0100462 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100463 CheckInputOutput(std::move(workload),
464 TensorInfo(inputShape, DataType),
465 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000466}
467
468BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
469{
Teresa Charlina3b20472019-06-06 11:12:32 +0100470 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100471}
472
473BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32NhwcWorkload)
474{
Teresa Charlina3b20472019-06-06 11:12:32 +0100475 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000476}
477
478BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
479{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000480 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100481}
482
483BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
484{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000485 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000486}
487
Teresa Charlin0434df62019-06-06 13:40:35 +0100488BOOST_AUTO_TEST_CASE(CreatePooling2dInt16Workload)
489{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000490 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Teresa Charlin0434df62019-06-06 13:40:35 +0100491}
492
493BOOST_AUTO_TEST_CASE(CreatePooling2dInt16NhwcWorkload)
494{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000495 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Teresa Charlin0434df62019-06-06 13:40:35 +0100496}
497
telsoa01c577f2c2018-08-31 09:22:23 +0100498template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000499static void RefCreateSoftmaxWorkloadTest()
500{
501 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100502 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100503 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000504
telsoa01c577f2c2018-08-31 09:22:23 +0100505 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000506 CheckInputOutput(
507 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100508 TensorInfo({4, 1}, DataType),
509 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000510}
511
512BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
513{
nikraj01a121de32019-05-29 10:51:05 +0100514 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000515}
516
Matthew Jackson9bff1442019-09-12 09:08:23 +0100517BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
518{
519 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float16>();
520}
521
nikraj01a121de32019-05-29 10:51:05 +0100522BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000523{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000524 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000525}
526
nikraj01248683f2019-05-29 16:46:50 +0100527BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
528{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000529 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QSymmS16>();
nikraj01248683f2019-05-29 16:46:50 +0100530}
531
telsoa01c577f2c2018-08-31 09:22:23 +0100532template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000533static void RefCreateSplitterWorkloadTest()
534{
535 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100536 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100537 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000538
telsoa01c577f2c2018-08-31 09:22:23 +0100539 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000540 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100541 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100542 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100543
Matthew Bentham4cefc412019-06-18 16:14:34 +0100544 auto outputHandle0 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100545 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100546
Matthew Bentham4cefc412019-06-18 16:14:34 +0100547 auto outputHandle1 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100548 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100549
Matthew Bentham4cefc412019-06-18 16:14:34 +0100550 auto outputHandle2 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100551 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000552}
553
554BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
555{
Ruomei Yan25339c32019-05-28 16:48:20 +0100556 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000557}
558
Matthew Jackson9bff1442019-09-12 09:08:23 +0100559BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
560{
561 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float16>();
562}
563
telsoa014fcda012018-03-09 14:13:49 +0000564BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
565{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000566 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000567}
568
Jim Flynne242f2d2019-05-22 14:24:13 +0100569template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
570static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000571{
telsoa01c577f2c2018-08-31 09:22:23 +0100572 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100573 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100574 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100575 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
576 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000577
578 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100579 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100580 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
581 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000582
583 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100584 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000585
telsoa01c577f2c2018-08-31 09:22:23 +0100586 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100587 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
588 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
589 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
590 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000591
592 BOOST_TEST(sOut0);
593 BOOST_TEST(sOut1);
594 BOOST_TEST(mIn0);
595 BOOST_TEST(mIn1);
596
597 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
598
599 BOOST_TEST(validDataPointers);
600}
601
Jim Flynne242f2d2019-05-22 14:24:13 +0100602BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000603{
Ruomei Yan25339c32019-05-28 16:48:20 +0100604 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000605}
606
Matthew Jackson9bff1442019-09-12 09:08:23 +0100607BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16)
608{
609 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float16>();
610}
611
Jim Flynne242f2d2019-05-22 14:24:13 +0100612BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000613{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000614 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000615}
616
telsoa01c577f2c2018-08-31 09:22:23 +0100617template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000618static void RefCreateSingleOutputMultipleInputsTest()
619{
telsoa01c577f2c2018-08-31 09:22:23 +0100620 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
621 // We created a splitter with two outputs. That each of those outputs is used by two different activation layers.
telsoa014fcda012018-03-09 14:13:49 +0000622
623 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100624 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000625 std::unique_ptr<SplitterWorkloadType> wlSplitter;
626 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
627 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
628 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
629 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
630
631 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100632 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000633
Matthew Bentham4cefc412019-06-18 16:14:34 +0100634 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
635 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
636 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
637 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
638 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
639 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000640
641
642 BOOST_TEST(sOut0);
643 BOOST_TEST(sOut1);
644 BOOST_TEST(activ0_0Im);
645 BOOST_TEST(activ0_1Im);
646 BOOST_TEST(activ1_0Im);
647 BOOST_TEST(activ1_1Im);
648
649 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
650 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
651
652 BOOST_TEST(validDataPointers);
653}
654
655BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
656{
Ruomei Yan25339c32019-05-28 16:48:20 +0100657 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100658 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000659}
660
661BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
662{
Ruomei Yan25339c32019-05-28 16:48:20 +0100663 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000664 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000665}
666
telsoa01c577f2c2018-08-31 09:22:23 +0100667template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100668static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000669{
670 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100671 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100672 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
673
674 TensorShape inputShape;
675 TensorShape outputShape;
676
677 switch (dataLayout)
678 {
679 case DataLayout::NHWC:
680 inputShape = { 2, 4, 4, 3 };
681 outputShape = { 2, 2, 2, 3 };
682 break;
James Conroy69482272018-10-19 10:41:35 +0100683 case DataLayout::NCHW:
684 default:
James Conroy59540822018-10-11 12:39:05 +0100685 inputShape = { 2, 3, 4, 4 };
686 outputShape = { 2, 3, 2, 2 };
687 }
telsoa014fcda012018-03-09 14:13:49 +0000688
telsoa01c577f2c2018-08-31 09:22:23 +0100689 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100690 CheckInputOutput(std::move(workload),
691 TensorInfo(inputShape, DataType),
692 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000693}
694
695BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
696{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100697 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000698}
699
Matthew Jackson9bff1442019-09-12 09:08:23 +0100700BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16)
701{
702 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
703}
704
telsoa014fcda012018-03-09 14:13:49 +0000705BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
706{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000707 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100708}
709
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100710BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
711{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000712 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100713}
714
James Conroy59540822018-10-11 12:39:05 +0100715BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
716{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100717 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000718}
719
nikraj0133732f62019-06-04 15:35:34 +0100720template <typename RsqrtWorkloadType, armnn::DataType DataType>
721static void RefCreateRsqrtTest()
722{
723 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100724 RefWorkloadFactory factory = GetFactory();
nikraj0133732f62019-06-04 15:35:34 +0100725
726 auto workload = CreateRsqrtWorkloadTest<RsqrtWorkloadType, DataType>(factory, graph);
727
728 // Checks that outputs are as we expect them (see definition of CreateRsqrtWorkloadTest).
729 CheckInputOutput(std::move(workload),
730 TensorInfo({ 1, 1 }, DataType),
731 TensorInfo({ 1, 1 }, DataType));
732
733}
734
735BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32)
736{
nikraj0199a66312019-06-06 10:31:27 +0100737 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::Float32>();
nikraj0133732f62019-06-04 15:35:34 +0100738}
739
Matthew Jackson9bff1442019-09-12 09:08:23 +0100740BOOST_AUTO_TEST_CASE(CreateRsqrtFloat16)
741{
742 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::Float16>();
743}
744
nikraj010421e7f2019-06-14 09:40:34 +0100745BOOST_AUTO_TEST_CASE(CreateRsqrtUint8)
746{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000747 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::QAsymmU8>();
nikraj010421e7f2019-06-14 09:40:34 +0100748}
749
nikraj0124d73212019-06-14 14:20:40 +0100750BOOST_AUTO_TEST_CASE(CreateRsqrtQsymm16)
751{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000752 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::QSymmS16>();
nikraj0124d73212019-06-14 14:20:40 +0100753}
754
Francis Murtagh57f13d52019-06-24 14:24:36 +0100755template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
756static void RefCreateBatchToSpaceNdTest()
757{
758 Graph graph;
759 RefWorkloadFactory factory;
760
761 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
762
763 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100764 TensorInfo({ 1, 1, 1, 1 }, DataType),
765 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100766}
767
768BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
769{
770 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
771}
772
Matthew Jackson9bff1442019-09-12 09:08:23 +0100773BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat16)
774{
775 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float16>();
776}
777
Francis Murtagh57f13d52019-06-24 14:24:36 +0100778BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
779{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000780 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QAsymmU8>();
Francis Murtagh57f13d52019-06-24 14:24:36 +0100781}
782
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100783BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
784{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000785 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QSymmS16>();
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100786}
787
Matteo Martincighb63973e2018-10-16 16:23:33 +0100788template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
789static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000790{
791 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100792 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100793 auto workload =
794 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
795
796 TensorShape inputShape;
797 TensorShape outputShape;
798
799 switch (dataLayout)
800 {
801 case DataLayout::NHWC:
802 inputShape = { 5, 50, 67, 20 };
803 outputShape = { 5, 50, 67, 20 };
804 break;
805 case DataLayout::NCHW:
806 default:
807 inputShape = { 5, 20, 50, 67 };
808 outputShape = { 5, 20, 50, 67 };
809 break;
810 }
telsoa014fcda012018-03-09 14:13:49 +0000811
telsoa01c577f2c2018-08-31 09:22:23 +0100812 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100813 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
814}
815
816BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
817{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100818 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100819}
820
821BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
822{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100823 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
824}
825
826BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
827{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000828 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100829}
830
831BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
832{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000833 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000834}
835
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100836BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
837{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000838 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100839}
840
841BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
842{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000843 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100844}
845
telsoa01c577f2c2018-08-31 09:22:23 +0100846template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000847static void RefCreateReshapeWorkloadTest()
848{
849 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100850 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100851 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000852
telsoa01c577f2c2018-08-31 09:22:23 +0100853 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000854 CheckInputOutput(
855 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100856 TensorInfo({ 4, 1 }, DataType),
857 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000858}
859
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100860BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000861{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100862 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000863}
864
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100865BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000866{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000867 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000868}
869
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100870BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
871{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000872 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QSymmS16>();
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100873}
874
Jim Flynne242f2d2019-05-22 14:24:13 +0100875template <typename ConcatWorkloadType, armnn::DataType DataType>
876static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000877 unsigned int concatAxis)
878{
879 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100880 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100881 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000882
883 CheckInputsOutput(std::move(workload),
884 TensorInfo({ 2, 3, 2, 5 }, DataType),
885 TensorInfo({ 2, 3, 2, 5 }, DataType),
886 TensorInfo(outputShape, DataType));
887}
888
Jim Flynne242f2d2019-05-22 14:24:13 +0100889BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000890{
Jim Flynne242f2d2019-05-22 14:24:13 +0100891 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000892}
893
Matthew Jackson9bff1442019-09-12 09:08:23 +0100894BOOST_AUTO_TEST_CASE(CreateConcatDim0Float16Workload)
895{
896 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float16>({ 4, 3, 2, 5 }, 0);
897}
898
Jim Flynne242f2d2019-05-22 14:24:13 +0100899BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000900{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000901 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +0100902}
903
Jim Flynne242f2d2019-05-22 14:24:13 +0100904BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +0100905{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000906 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QSymmS16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000907}
908
Jim Flynne242f2d2019-05-22 14:24:13 +0100909BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000910{
Jim Flynne242f2d2019-05-22 14:24:13 +0100911 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000912}
913
Jim Flynne242f2d2019-05-22 14:24:13 +0100914BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000915{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000916 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000917}
918
Jim Flynne242f2d2019-05-22 14:24:13 +0100919BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000920{
Jim Flynne242f2d2019-05-22 14:24:13 +0100921 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000922}
923
Jim Flynne242f2d2019-05-22 14:24:13 +0100924BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000925{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000926 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000927}
928
Jim Flynne242f2d2019-05-22 14:24:13 +0100929BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000930{
Jim Flynne242f2d2019-05-22 14:24:13 +0100931 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000932}
933
Jim Flynne242f2d2019-05-22 14:24:13 +0100934BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000935{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000936 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000937}
938
Nina Drozd58ef2c62019-05-16 12:09:18 +0100939template <typename ConstantWorkloadType, armnn::DataType DataType>
940static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
941{
942 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100943 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +0100944 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
945
946 // Check output is as expected
947 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100948 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +0100949 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
950}
951
952BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
953{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000954 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100955}
956
957BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
958{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000959 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QSymmS16>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100960}
961
962BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
963{
964 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
965}
966
967BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
968{
969 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
970}
971
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100972static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
973 const armnn::TensorShape& alphaShape,
974 const armnn::TensorShape& outputShape,
975 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +0100976{
977 armnn::Graph graph;
978 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100979 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
980 graph,
981 inputShape,
982 alphaShape,
983 outputShape,
984 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100985
986 // Check output is as expected
987 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100988 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100989 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +0100990}
991
992BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
993{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100994 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100995}
996
Matthew Jackson9bff1442019-09-12 09:08:23 +0100997BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
998{
999 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float16);
1000}
1001
Matteo Martincighab9e5252019-06-13 17:27:46 +01001002BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
1003{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001004 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QAsymmU8);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001005}
1006
1007BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
1008{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001009 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QSymmS16);
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001010}
1011
1012BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
1013{
1014 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1015 armnn::DataType::Float32),
1016 armnn::InvalidArgumentException);
1017}
1018
Matthew Jackson9bff1442019-09-12 09:08:23 +01001019BOOST_AUTO_TEST_CASE(CreatePreluFloat16NoBroadcastWorkload)
1020{
1021 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1022 armnn::DataType::Float16),
1023 armnn::InvalidArgumentException);
1024}
1025
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001026BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
1027{
1028 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001029 armnn::DataType::QAsymmU8),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001030 armnn::InvalidArgumentException);
1031}
1032
1033BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
1034{
1035 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001036 armnn::DataType::QSymmS16),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001037 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001038}
1039
James Conroy60597842019-07-02 10:57:56 +01001040template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
1041static void RefCreateSpaceToDepthWorkloadTest()
1042{
1043 Graph graph;
1044 RefWorkloadFactory factory;
1045
1046 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1047
1048 CheckInputOutput(std::move(workload),
1049 TensorInfo({ 1, 2, 2, 1 }, DataType),
1050 TensorInfo({ 1, 1, 1, 4 }, DataType));
1051}
1052
1053BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
1054{
1055 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
1056}
1057
Matthew Jackson9bff1442019-09-12 09:08:23 +01001058BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat16)
1059{
1060 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float16>();
1061}
1062
James Conroy60597842019-07-02 10:57:56 +01001063BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
1064{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001065 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001066}
1067
1068BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
1069{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001070 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001071}
1072
Matthew Jacksond5166102019-07-31 14:06:28 +01001073template <armnn::DataType DataType>
Matthew Jackson81e601c2019-07-11 12:07:09 +01001074static void RefCreateStackWorkloadTest(const armnn::TensorShape& inputShape,
1075 const armnn::TensorShape& outputShape,
1076 unsigned int axis,
Matthew Jacksond5166102019-07-31 14:06:28 +01001077 unsigned int numInputs)
Matthew Jackson81e601c2019-07-11 12:07:09 +01001078{
1079 armnn::Graph graph;
1080 RefWorkloadFactory factory;
Matthew Jacksond5166102019-07-31 14:06:28 +01001081 auto workload = CreateStackWorkloadTest<RefStackWorkload, DataType>(factory,
1082 graph,
1083 inputShape,
1084 outputShape,
1085 axis,
1086 numInputs);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001087
Matthew Jacksond5166102019-07-31 14:06:28 +01001088 // Check inputs and output are as expected
1089 StackQueueDescriptor queueDescriptor = workload->GetData();
1090 for (unsigned int i = 0; i < numInputs; ++i)
1091 {
1092 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[i]);
1093 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo(inputShape, DataType)));
1094 }
Matthew Jackson81e601c2019-07-11 12:07:09 +01001095 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001096 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
Matthew Jackson81e601c2019-07-11 12:07:09 +01001097}
1098
1099BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1100{
Matthew Jacksond5166102019-07-31 14:06:28 +01001101 RefCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001102}
1103
1104BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1105{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001106 RefCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001107}
1108
1109BOOST_AUTO_TEST_CASE(CreateStackUint16Workload)
1110{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001111 RefCreateStackWorkloadTest<armnn::DataType::QSymmS16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001112}
1113
telsoa014fcda012018-03-09 14:13:49 +00001114BOOST_AUTO_TEST_SUITE_END()