blob: 29bfbc0ee2384406dcf10fc55a5602e68d214e34 [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
Jan Eilersbb446e52020-04-02 13:56:54 +01008#include <armnn/utility/PolymorphicDowncast.hpp>
Matthew Bentham4cefc412019-06-18 16:14:34 +01009#include <reference/RefTensorHandle.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +000010#include <reference/RefWorkloadFactory.hpp>
11#include <reference/workloads/RefWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000012
13namespace
14{
15
16template<typename Workload>
17void CheckInputOutput(std::unique_ptr<Workload> workload, const TensorInfo& inputInfo, const TensorInfo& outputInfo)
18{
19 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010020 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
21 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000022 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
23 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
24}
25
26template <typename Workload>
27void CheckInputsOutput(std::unique_ptr<Workload> workload,
28 const TensorInfo& inputInfo0,
29 const TensorInfo& inputInfo1,
30 const TensorInfo& outputInfo)
31{
32 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +010033 auto inputHandle0 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
34 auto inputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[1]);
35 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000036 BOOST_TEST((inputHandle0->GetTensorInfo() == inputInfo0));
37 BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1));
38 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
39}
Matthew Bentham7c1603a2019-06-21 17:22:23 +010040
41armnn::RefWorkloadFactory GetFactory()
42{
43 std::shared_ptr<RefMemoryManager> memoryManager = std::make_shared<RefMemoryManager>();
44 return RefWorkloadFactory(memoryManager);
45}
46
47
telsoa014fcda012018-03-09 14:13:49 +000048}
49
50BOOST_AUTO_TEST_SUITE(CreateWorkloadRef)
51
telsoa01c577f2c2018-08-31 09:22:23 +010052template <typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +000053static void RefCreateActivationWorkloadTest()
54{
55 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010056 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +010057 auto workload = CreateActivationWorkloadTest<ActivationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000058
telsoa01c577f2c2018-08-31 09:22:23 +010059 // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000060 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010061 TensorInfo({ 1, 1 }, DataType),
62 TensorInfo({ 1, 1 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000063}
64
65BOOST_AUTO_TEST_CASE(CreateActivationFloat32Workload)
66{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010067 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000068}
69
70BOOST_AUTO_TEST_CASE(CreateActivationUint8Workload)
71{
Derek Lambertif90c56d2020-01-10 17:14:08 +000072 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +000073}
74
David Beckbc392452018-09-10 14:47:28 +010075template <typename WorkloadType,
76 typename DescriptorType,
77 typename LayerType,
78 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000079static void RefCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000080{
81 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010082 RefWorkloadFactory factory = GetFactory();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000083 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(
84 factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000085
telsoa014fcda012018-03-09 14:13:49 +000086 CheckInputsOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010087 TensorInfo({ 2, 3 }, DataType),
88 TensorInfo({ 2, 3 }, DataType),
89 TensorInfo({ 2, 3 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000090}
91
92BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
93{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010094 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000095 AdditionQueueDescriptor,
96 AdditionLayer,
97 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000098}
99
100BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
101{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100102 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000103 AdditionQueueDescriptor,
104 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000105 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100106}
107
Sadik Armagan2999a022019-04-09 14:20:12 +0100108BOOST_AUTO_TEST_CASE(CreateAdditionInt16Workload)
109{
110 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
111 AdditionQueueDescriptor,
112 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000113 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100114}
115
Matthew Jackson9bff1442019-09-12 09:08:23 +0100116BOOST_AUTO_TEST_CASE(CreateSubtractionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100117{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100118 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000119 SubtractionQueueDescriptor,
120 SubtractionLayer,
121 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100122}
123
Matthew Jackson9bff1442019-09-12 09:08:23 +0100124BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
125{
126 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
127 SubtractionQueueDescriptor,
128 SubtractionLayer,
129 armnn::DataType::Float16>();
130}
131
David Beckbc392452018-09-10 14:47:28 +0100132BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
133{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100134 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000135 SubtractionQueueDescriptor,
136 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000137 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100138}
139
Sadik Armagan2999a022019-04-09 14:20:12 +0100140BOOST_AUTO_TEST_CASE(CreateSubtractionInt16Workload)
141{
142 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
143 SubtractionQueueDescriptor,
144 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000145 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100146}
147
David Beckbc392452018-09-10 14:47:28 +0100148BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
149{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100150 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000151 MultiplicationQueueDescriptor,
152 MultiplicationLayer,
153 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100154}
155
156BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
157{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100158 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000159 MultiplicationQueueDescriptor,
160 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000161 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100162}
163
Sadik Armagan2999a022019-04-09 14:20:12 +0100164BOOST_AUTO_TEST_CASE(CreateMultiplicationInt16Workload)
165{
166 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
167 MultiplicationQueueDescriptor,
168 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000169 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100170}
171
Matthew Jackson9bff1442019-09-12 09:08:23 +0100172BOOST_AUTO_TEST_CASE(CreateDivisionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100173{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100174 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000175 DivisionQueueDescriptor,
176 DivisionLayer,
177 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100178}
179
Matthew Jackson9bff1442019-09-12 09:08:23 +0100180BOOST_AUTO_TEST_CASE(CreateDivisionFloat16Workload)
181{
182 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
183 DivisionQueueDescriptor,
184 DivisionLayer,
185 armnn::DataType::Float16>();
186}
187
David Beckbc392452018-09-10 14:47:28 +0100188BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
189{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100190 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000191 DivisionQueueDescriptor,
192 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000193 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000194}
195
Sadik Armagan2999a022019-04-09 14:20:12 +0100196BOOST_AUTO_TEST_CASE(CreateDivisionInt16Workload)
197{
198 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
199 DivisionQueueDescriptor,
200 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000201 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100202}
203
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100204template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
205static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000206{
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100207 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100208 RefWorkloadFactory factory = GetFactory();
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100209 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>(factory,
210 graph,
211 dataLayout);
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100212
213 TensorShape inputShape;
214 TensorShape outputShape;
215
216 switch (dataLayout)
217 {
218 case DataLayout::NHWC:
Nikhil Rajd1340932018-10-18 14:27:50 +0100219 inputShape = { 2, 4, 4, 3 };
220 outputShape = { 2, 4, 4, 3 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100221 break;
222 case DataLayout::NCHW:
223 default:
Nikhil Rajd1340932018-10-18 14:27:50 +0100224 inputShape = { 2, 3, 4, 4 };
225 outputShape = { 2, 3, 4, 4 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100226 break;
227 }
telsoa014fcda012018-03-09 14:13:49 +0000228
telsoa01c577f2c2018-08-31 09:22:23 +0100229 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100230 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
231}
232
233BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32Workload)
234{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100235 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100236 (DataLayout::NCHW);
237}
238
239BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32WorkloadNhwc)
240{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100241 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100242 (DataLayout::NHWC);
243}
244
Matthew Jackson9bff1442019-09-12 09:08:23 +0100245BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16Workload)
246{
247 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float16>
248 (DataLayout::NCHW);
249}
250
251BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16WorkloadNhwc)
252{
253 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float16>
254 (DataLayout::NHWC);
255}
256
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100257BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8Workload)
258{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000259 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100260 (DataLayout::NCHW);
261}
262
263BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8WorkloadNhwc)
264{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000265 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100266 (DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000267}
268
Matteo Martincighf5507132019-06-04 10:59:47 +0100269BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16Workload)
270{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000271 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100272 (DataLayout::NCHW);
273}
274
275BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc)
276{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000277 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100278 (DataLayout::NHWC);
279}
280
telsoa01c577f2c2018-08-31 09:22:23 +0100281BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
282{
283 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100284 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100285 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
286
287 // Checks that outputs and inputs are as we expect them
288 CheckInputOutput(
289 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
290}
291
292BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
293{
294 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100295 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100296 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
297
298 // Checks that outputs and inputs are as we expect them
299 CheckInputOutput(
300 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
301}
302
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100303static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000304{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100305 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100306 RefWorkloadFactory factory = GetFactory();
Mike Kelly9b398322019-05-22 17:21:49 +0100307 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100308 (factory, graph, dataLayout);
309
Mike Kellydb482882019-06-14 12:35:24 +0100310 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
311 : std::initializer_list<unsigned int>({2, 8, 16, 3});
312 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
313 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000314
telsoa01c577f2c2018-08-31 09:22:23 +0100315 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000316 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100317 TensorInfo(inputShape, DataType::Float32),
318 TensorInfo(outputShape, DataType::Float32));
319}
320
321BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
322{
323 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
324}
325
326BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
327{
328 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000329}
330
Ruomei Yan495852f2019-05-23 11:37:33 +0100331static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
332{
333 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100334 RefWorkloadFactory factory = GetFactory();
Ruomei Yan495852f2019-05-23 11:37:33 +0100335 auto workload = CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dWorkload, DataType::Float32>
336 (factory, graph, dataLayout);
337
Mike Kellydb482882019-06-14 12:35:24 +0100338 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
339 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
340 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
341 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
342
Ruomei Yan495852f2019-05-23 11:37:33 +0100343 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
344 CheckInputOutput(std::move(workload),
345 TensorInfo(inputShape, DataType::Float32),
346 TensorInfo(outputShape, DataType::Float32));
347}
348
349BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
350{
351 RefCreateDepthwiseConvolutionWorkloadTest(DataLayout::NHWC);
352}
353
telsoa01c577f2c2018-08-31 09:22:23 +0100354template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000355static void RefCreateFullyConnectedWorkloadTest()
356{
357 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100358 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100359 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000360
telsoa01c577f2c2018-08-31 09:22:23 +0100361 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
Derek Lambertif90c56d2020-01-10 17:14:08 +0000362 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
363 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000364 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100365 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
366 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000367}
368
Francis Murtagh43aec582019-05-27 12:14:10 +0100369BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000370{
Francis Murtagh43aec582019-05-27 12:14:10 +0100371 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000372}
373
Francis Murtagh43aec582019-05-27 12:14:10 +0100374BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000375{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000376 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000377}
378
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100379BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedSymm16)
Francis Murtagh46c09d02019-05-28 08:15:28 +0100380{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000381 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QSymmS16>();
Francis Murtagh46c09d02019-05-28 08:15:28 +0100382}
383
narpra0155a97bc2018-10-02 14:35:53 +0100384template <typename NormalizationWorkloadType, armnn::DataType DataType>
Matteo Martincigha160b242018-10-18 10:33:23 +0100385static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000386{
narpra0155a97bc2018-10-02 14:35:53 +0100387 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100388 RefWorkloadFactory factory = GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100389 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
390
391 TensorShape inputShape;
392 TensorShape outputShape;
393
394 switch (dataLayout)
395 {
396 case DataLayout::NHWC:
397 inputShape = { 3, 1, 5, 5 };
398 outputShape = { 3, 1, 5, 5 };
399 break;
400 case DataLayout::NCHW:
401 default:
402 inputShape = { 3, 5, 5, 1 };
403 outputShape = { 3, 5, 5, 1 };
404 break;
405 }
telsoa014fcda012018-03-09 14:13:49 +0000406
telsoa01c577f2c2018-08-31 09:22:23 +0100407 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
Matteo Martincigha160b242018-10-18 10:33:23 +0100408 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
narpra0155a97bc2018-10-02 14:35:53 +0100409}
410
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100411BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NchwWorkload)
narpra0155a97bc2018-10-02 14:35:53 +0100412{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100413 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincigha160b242018-10-18 10:33:23 +0100414}
415
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100416BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NhwcWorkload)
Matteo Martincigha160b242018-10-18 10:33:23 +0100417{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100418 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
419}
420
421BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NchwWorkload)
422{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000423 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100424}
425
426BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NhwcWorkload)
427{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000428 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000429}
430
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100431BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NchwWorkload)
432{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000433 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100434}
435
436BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NhwcWorkload)
437{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000438 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100439}
440
telsoa01c577f2c2018-08-31 09:22:23 +0100441template <typename Pooling2dWorkloadType, armnn::DataType DataType>
James Conroy69482272018-10-19 10:41:35 +0100442static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000443{
444 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100445 RefWorkloadFactory factory = GetFactory();
James Conroy69482272018-10-19 10:41:35 +0100446 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph, dataLayout);
447
448 TensorShape inputShape;
449 TensorShape outputShape;
450
451 switch (dataLayout)
452 {
453 case DataLayout::NHWC:
454 inputShape = { 3, 5, 5, 2 };
455 outputShape = { 3, 2, 4, 2 };
456 break;
457 case DataLayout::NCHW:
458 default:
459 inputShape = { 3, 2, 5, 5 };
460 outputShape = { 3, 2, 2, 4 };
461 }
telsoa014fcda012018-03-09 14:13:49 +0000462
telsoa01c577f2c2018-08-31 09:22:23 +0100463 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100464 CheckInputOutput(std::move(workload),
465 TensorInfo(inputShape, DataType),
466 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000467}
468
469BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
470{
Teresa Charlina3b20472019-06-06 11:12:32 +0100471 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100472}
473
474BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32NhwcWorkload)
475{
Teresa Charlina3b20472019-06-06 11:12:32 +0100476 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000477}
478
479BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
480{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000481 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100482}
483
484BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
485{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000486 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000487}
488
Teresa Charlin0434df62019-06-06 13:40:35 +0100489BOOST_AUTO_TEST_CASE(CreatePooling2dInt16Workload)
490{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000491 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Teresa Charlin0434df62019-06-06 13:40:35 +0100492}
493
494BOOST_AUTO_TEST_CASE(CreatePooling2dInt16NhwcWorkload)
495{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000496 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Teresa Charlin0434df62019-06-06 13:40:35 +0100497}
498
telsoa01c577f2c2018-08-31 09:22:23 +0100499template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000500static void RefCreateSoftmaxWorkloadTest()
501{
502 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100503 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100504 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000505
telsoa01c577f2c2018-08-31 09:22:23 +0100506 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000507 CheckInputOutput(
508 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100509 TensorInfo({4, 1}, DataType),
510 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000511}
512
513BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
514{
nikraj01a121de32019-05-29 10:51:05 +0100515 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000516}
517
Matthew Jackson9bff1442019-09-12 09:08:23 +0100518BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
519{
520 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float16>();
521}
522
nikraj01a121de32019-05-29 10:51:05 +0100523BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000524{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000525 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000526}
527
nikraj01248683f2019-05-29 16:46:50 +0100528BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
529{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000530 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QSymmS16>();
nikraj01248683f2019-05-29 16:46:50 +0100531}
532
telsoa01c577f2c2018-08-31 09:22:23 +0100533template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000534static void RefCreateSplitterWorkloadTest()
535{
536 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100537 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100538 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000539
telsoa01c577f2c2018-08-31 09:22:23 +0100540 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000541 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100542 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100543 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100544
Jan Eilersbb446e52020-04-02 13:56:54 +0100545 auto outputHandle0 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100546 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100547
Jan Eilersbb446e52020-04-02 13:56:54 +0100548 auto outputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100549 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100550
Jan Eilersbb446e52020-04-02 13:56:54 +0100551 auto outputHandle2 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100552 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000553}
554
555BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
556{
Ruomei Yan25339c32019-05-28 16:48:20 +0100557 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000558}
559
Matthew Jackson9bff1442019-09-12 09:08:23 +0100560BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
561{
562 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float16>();
563}
564
telsoa014fcda012018-03-09 14:13:49 +0000565BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
566{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000567 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000568}
569
Jim Flynne242f2d2019-05-22 14:24:13 +0100570template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
571static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000572{
telsoa01c577f2c2018-08-31 09:22:23 +0100573 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100574 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100575 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100576 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
577 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000578
579 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100580 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100581 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
582 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000583
584 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100585 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000586
telsoa01c577f2c2018-08-31 09:22:23 +0100587 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100588 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
589 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
590 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
591 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000592
593 BOOST_TEST(sOut0);
594 BOOST_TEST(sOut1);
595 BOOST_TEST(mIn0);
596 BOOST_TEST(mIn1);
597
598 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
599
600 BOOST_TEST(validDataPointers);
601}
602
Jim Flynne242f2d2019-05-22 14:24:13 +0100603BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000604{
Ruomei Yan25339c32019-05-28 16:48:20 +0100605 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000606}
607
Matthew Jackson9bff1442019-09-12 09:08:23 +0100608BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16)
609{
610 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float16>();
611}
612
Jim Flynne242f2d2019-05-22 14:24:13 +0100613BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000614{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000615 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000616}
617
telsoa01c577f2c2018-08-31 09:22:23 +0100618template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000619static void RefCreateSingleOutputMultipleInputsTest()
620{
telsoa01c577f2c2018-08-31 09:22:23 +0100621 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
622 // 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 +0000623
624 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100625 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000626 std::unique_ptr<SplitterWorkloadType> wlSplitter;
627 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
628 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
629 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
630 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
631
632 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100633 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000634
Matthew Bentham4cefc412019-06-18 16:14:34 +0100635 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
636 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
637 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
638 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
639 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
640 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000641
642
643 BOOST_TEST(sOut0);
644 BOOST_TEST(sOut1);
645 BOOST_TEST(activ0_0Im);
646 BOOST_TEST(activ0_1Im);
647 BOOST_TEST(activ1_0Im);
648 BOOST_TEST(activ1_1Im);
649
650 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
651 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
652
653 BOOST_TEST(validDataPointers);
654}
655
656BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
657{
Ruomei Yan25339c32019-05-28 16:48:20 +0100658 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100659 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000660}
661
662BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
663{
Ruomei Yan25339c32019-05-28 16:48:20 +0100664 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000665 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000666}
667
telsoa01c577f2c2018-08-31 09:22:23 +0100668template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100669static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000670{
671 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100672 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100673 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
674
675 TensorShape inputShape;
676 TensorShape outputShape;
677
678 switch (dataLayout)
679 {
680 case DataLayout::NHWC:
681 inputShape = { 2, 4, 4, 3 };
682 outputShape = { 2, 2, 2, 3 };
683 break;
James Conroy69482272018-10-19 10:41:35 +0100684 case DataLayout::NCHW:
685 default:
James Conroy59540822018-10-11 12:39:05 +0100686 inputShape = { 2, 3, 4, 4 };
687 outputShape = { 2, 3, 2, 2 };
688 }
telsoa014fcda012018-03-09 14:13:49 +0000689
telsoa01c577f2c2018-08-31 09:22:23 +0100690 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100691 CheckInputOutput(std::move(workload),
692 TensorInfo(inputShape, DataType),
693 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000694}
695
696BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
697{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100698 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000699}
700
Matthew Jackson9bff1442019-09-12 09:08:23 +0100701BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16)
702{
703 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
704}
705
telsoa014fcda012018-03-09 14:13:49 +0000706BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
707{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000708 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100709}
710
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100711BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
712{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000713 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100714}
715
James Conroy59540822018-10-11 12:39:05 +0100716BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
717{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100718 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000719}
720
Francis Murtagh57f13d52019-06-24 14:24:36 +0100721template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
722static void RefCreateBatchToSpaceNdTest()
723{
724 Graph graph;
725 RefWorkloadFactory factory;
726
727 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
728
729 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100730 TensorInfo({ 1, 1, 1, 1 }, DataType),
731 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100732}
733
734BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
735{
736 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
737}
738
Matthew Jackson9bff1442019-09-12 09:08:23 +0100739BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat16)
740{
741 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float16>();
742}
743
Francis Murtagh57f13d52019-06-24 14:24:36 +0100744BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
745{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000746 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QAsymmU8>();
Francis Murtagh57f13d52019-06-24 14:24:36 +0100747}
748
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100749BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
750{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000751 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QSymmS16>();
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100752}
753
Matteo Martincighb63973e2018-10-16 16:23:33 +0100754template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
755static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000756{
757 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100758 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100759 auto workload =
760 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
761
762 TensorShape inputShape;
763 TensorShape outputShape;
764
765 switch (dataLayout)
766 {
767 case DataLayout::NHWC:
768 inputShape = { 5, 50, 67, 20 };
769 outputShape = { 5, 50, 67, 20 };
770 break;
771 case DataLayout::NCHW:
772 default:
773 inputShape = { 5, 20, 50, 67 };
774 outputShape = { 5, 20, 50, 67 };
775 break;
776 }
telsoa014fcda012018-03-09 14:13:49 +0000777
telsoa01c577f2c2018-08-31 09:22:23 +0100778 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100779 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
780}
781
782BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
783{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100784 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100785}
786
787BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
788{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100789 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
790}
791
792BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
793{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000794 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100795}
796
797BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
798{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000799 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000800}
801
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100802BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
803{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000804 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100805}
806
807BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
808{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000809 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100810}
811
telsoa01c577f2c2018-08-31 09:22:23 +0100812template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000813static void RefCreateReshapeWorkloadTest()
814{
815 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100816 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100817 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000818
telsoa01c577f2c2018-08-31 09:22:23 +0100819 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000820 CheckInputOutput(
821 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100822 TensorInfo({ 4, 1 }, DataType),
823 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000824}
825
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100826BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000827{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100828 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000829}
830
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100831BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000832{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000833 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000834}
835
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100836BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
837{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000838 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QSymmS16>();
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100839}
840
Jim Flynne242f2d2019-05-22 14:24:13 +0100841template <typename ConcatWorkloadType, armnn::DataType DataType>
842static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000843 unsigned int concatAxis)
844{
845 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100846 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100847 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000848
849 CheckInputsOutput(std::move(workload),
850 TensorInfo({ 2, 3, 2, 5 }, DataType),
851 TensorInfo({ 2, 3, 2, 5 }, DataType),
852 TensorInfo(outputShape, DataType));
853}
854
Jim Flynne242f2d2019-05-22 14:24:13 +0100855BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000856{
Jim Flynne242f2d2019-05-22 14:24:13 +0100857 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000858}
859
Matthew Jackson9bff1442019-09-12 09:08:23 +0100860BOOST_AUTO_TEST_CASE(CreateConcatDim0Float16Workload)
861{
862 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float16>({ 4, 3, 2, 5 }, 0);
863}
864
Jim Flynne242f2d2019-05-22 14:24:13 +0100865BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000866{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000867 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +0100868}
869
Jim Flynne242f2d2019-05-22 14:24:13 +0100870BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +0100871{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000872 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QSymmS16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000873}
874
Jim Flynne242f2d2019-05-22 14:24:13 +0100875BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000876{
Jim Flynne242f2d2019-05-22 14:24:13 +0100877 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000878}
879
Jim Flynne242f2d2019-05-22 14:24:13 +0100880BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000881{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000882 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000883}
884
Jim Flynne242f2d2019-05-22 14:24:13 +0100885BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000886{
Jim Flynne242f2d2019-05-22 14:24:13 +0100887 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000888}
889
Jim Flynne242f2d2019-05-22 14:24:13 +0100890BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000891{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000892 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000893}
894
Jim Flynne242f2d2019-05-22 14:24:13 +0100895BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000896{
Jim Flynne242f2d2019-05-22 14:24:13 +0100897 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000898}
899
Jim Flynne242f2d2019-05-22 14:24:13 +0100900BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000901{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000902 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000903}
904
Nina Drozd58ef2c62019-05-16 12:09:18 +0100905template <typename ConstantWorkloadType, armnn::DataType DataType>
906static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
907{
908 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100909 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +0100910 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
911
912 // Check output is as expected
913 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100914 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +0100915 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
916}
917
918BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
919{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000920 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100921}
922
923BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
924{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000925 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QSymmS16>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100926}
927
928BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
929{
930 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
931}
932
933BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
934{
935 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
936}
937
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100938static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
939 const armnn::TensorShape& alphaShape,
940 const armnn::TensorShape& outputShape,
941 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +0100942{
943 armnn::Graph graph;
944 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100945 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
946 graph,
947 inputShape,
948 alphaShape,
949 outputShape,
950 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100951
952 // Check output is as expected
953 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100954 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100955 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +0100956}
957
958BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
959{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100960 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100961}
962
Matthew Jackson9bff1442019-09-12 09:08:23 +0100963BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
964{
965 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float16);
966}
967
Matteo Martincighab9e5252019-06-13 17:27:46 +0100968BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
969{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000970 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QAsymmU8);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100971}
972
973BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
974{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000975 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QSymmS16);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100976}
977
978BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
979{
980 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
981 armnn::DataType::Float32),
982 armnn::InvalidArgumentException);
983}
984
Matthew Jackson9bff1442019-09-12 09:08:23 +0100985BOOST_AUTO_TEST_CASE(CreatePreluFloat16NoBroadcastWorkload)
986{
987 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
988 armnn::DataType::Float16),
989 armnn::InvalidArgumentException);
990}
991
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100992BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
993{
994 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +0000995 armnn::DataType::QAsymmU8),
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100996 armnn::InvalidArgumentException);
997}
998
999BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
1000{
1001 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001002 armnn::DataType::QSymmS16),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001003 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001004}
1005
James Conroy60597842019-07-02 10:57:56 +01001006template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
1007static void RefCreateSpaceToDepthWorkloadTest()
1008{
1009 Graph graph;
1010 RefWorkloadFactory factory;
1011
1012 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1013
1014 CheckInputOutput(std::move(workload),
1015 TensorInfo({ 1, 2, 2, 1 }, DataType),
1016 TensorInfo({ 1, 1, 1, 4 }, DataType));
1017}
1018
1019BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
1020{
1021 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
1022}
1023
Matthew Jackson9bff1442019-09-12 09:08:23 +01001024BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat16)
1025{
1026 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float16>();
1027}
1028
James Conroy60597842019-07-02 10:57:56 +01001029BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
1030{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001031 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001032}
1033
1034BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
1035{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001036 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001037}
1038
Matthew Jacksond5166102019-07-31 14:06:28 +01001039template <armnn::DataType DataType>
Matthew Jackson81e601c2019-07-11 12:07:09 +01001040static void RefCreateStackWorkloadTest(const armnn::TensorShape& inputShape,
1041 const armnn::TensorShape& outputShape,
1042 unsigned int axis,
Matthew Jacksond5166102019-07-31 14:06:28 +01001043 unsigned int numInputs)
Matthew Jackson81e601c2019-07-11 12:07:09 +01001044{
1045 armnn::Graph graph;
1046 RefWorkloadFactory factory;
Matthew Jacksond5166102019-07-31 14:06:28 +01001047 auto workload = CreateStackWorkloadTest<RefStackWorkload, DataType>(factory,
1048 graph,
1049 inputShape,
1050 outputShape,
1051 axis,
1052 numInputs);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001053
Matthew Jacksond5166102019-07-31 14:06:28 +01001054 // Check inputs and output are as expected
1055 StackQueueDescriptor queueDescriptor = workload->GetData();
1056 for (unsigned int i = 0; i < numInputs; ++i)
1057 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001058 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001059 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo(inputShape, DataType)));
1060 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001061 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001062 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
Matthew Jackson81e601c2019-07-11 12:07:09 +01001063}
1064
1065BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1066{
Matthew Jacksond5166102019-07-31 14:06:28 +01001067 RefCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001068}
1069
1070BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1071{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001072 RefCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001073}
1074
1075BOOST_AUTO_TEST_CASE(CreateStackUint16Workload)
1076{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001077 RefCreateStackWorkloadTest<armnn::DataType::QSymmS16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001078}
1079
telsoa014fcda012018-03-09 14:13:49 +00001080BOOST_AUTO_TEST_SUITE_END()