blob: 9c08909e958eda75ad7aebdb422fdb99a35fc135 [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).
Sadik Armaganbe88a572020-04-30 11:39:37 +0100507
508 armnn::TensorInfo tensorInfo({4, 1}, DataType);
509 if (DataType == armnn::DataType::QAsymmU8)
510 {
511 tensorInfo.SetQuantizationOffset(0);
512 tensorInfo.SetQuantizationScale(1.f / 256);
513 }
514 else if (DataType == armnn::DataType::QAsymmS8)
515 {
516 tensorInfo.SetQuantizationOffset(-128);
517 tensorInfo.SetQuantizationScale(1.f / 256);
518 }
telsoa014fcda012018-03-09 14:13:49 +0000519 CheckInputOutput(
520 std::move(workload),
Sadik Armaganbe88a572020-04-30 11:39:37 +0100521 tensorInfo,
522 tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000523}
524
525BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
526{
nikraj01a121de32019-05-29 10:51:05 +0100527 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000528}
529
Matthew Jackson9bff1442019-09-12 09:08:23 +0100530BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
531{
532 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float16>();
533}
534
nikraj01a121de32019-05-29 10:51:05 +0100535BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000536{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000537 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000538}
539
nikraj01248683f2019-05-29 16:46:50 +0100540BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
541{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000542 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QSymmS16>();
nikraj01248683f2019-05-29 16:46:50 +0100543}
544
telsoa01c577f2c2018-08-31 09:22:23 +0100545template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000546static void RefCreateSplitterWorkloadTest()
547{
548 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100549 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100550 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000551
telsoa01c577f2c2018-08-31 09:22:23 +0100552 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000553 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100554 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100555 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100556
Jan Eilersbb446e52020-04-02 13:56:54 +0100557 auto outputHandle0 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100558 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100559
Jan Eilersbb446e52020-04-02 13:56:54 +0100560 auto outputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100561 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100562
Jan Eilersbb446e52020-04-02 13:56:54 +0100563 auto outputHandle2 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100564 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000565}
566
567BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
568{
Ruomei Yan25339c32019-05-28 16:48:20 +0100569 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000570}
571
Matthew Jackson9bff1442019-09-12 09:08:23 +0100572BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
573{
574 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float16>();
575}
576
telsoa014fcda012018-03-09 14:13:49 +0000577BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
578{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000579 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000580}
581
Jim Flynne242f2d2019-05-22 14:24:13 +0100582template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
583static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000584{
telsoa01c577f2c2018-08-31 09:22:23 +0100585 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100586 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100587 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100588 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
589 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000590
591 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100592 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100593 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
594 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000595
596 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100597 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000598
telsoa01c577f2c2018-08-31 09:22:23 +0100599 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100600 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
601 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
602 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
603 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000604
605 BOOST_TEST(sOut0);
606 BOOST_TEST(sOut1);
607 BOOST_TEST(mIn0);
608 BOOST_TEST(mIn1);
609
610 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
611
612 BOOST_TEST(validDataPointers);
613}
614
Jim Flynne242f2d2019-05-22 14:24:13 +0100615BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000616{
Ruomei Yan25339c32019-05-28 16:48:20 +0100617 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000618}
619
Matthew Jackson9bff1442019-09-12 09:08:23 +0100620BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16)
621{
622 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float16>();
623}
624
Jim Flynne242f2d2019-05-22 14:24:13 +0100625BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000626{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000627 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000628}
629
telsoa01c577f2c2018-08-31 09:22:23 +0100630template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000631static void RefCreateSingleOutputMultipleInputsTest()
632{
telsoa01c577f2c2018-08-31 09:22:23 +0100633 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
634 // 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 +0000635
636 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100637 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000638 std::unique_ptr<SplitterWorkloadType> wlSplitter;
639 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
640 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
641 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
642 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
643
644 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100645 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000646
Matthew Bentham4cefc412019-06-18 16:14:34 +0100647 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
648 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
649 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
650 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
651 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
652 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000653
654
655 BOOST_TEST(sOut0);
656 BOOST_TEST(sOut1);
657 BOOST_TEST(activ0_0Im);
658 BOOST_TEST(activ0_1Im);
659 BOOST_TEST(activ1_0Im);
660 BOOST_TEST(activ1_1Im);
661
662 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
663 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
664
665 BOOST_TEST(validDataPointers);
666}
667
668BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
669{
Ruomei Yan25339c32019-05-28 16:48:20 +0100670 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100671 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000672}
673
674BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
675{
Ruomei Yan25339c32019-05-28 16:48:20 +0100676 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000677 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000678}
679
telsoa01c577f2c2018-08-31 09:22:23 +0100680template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100681static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000682{
683 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100684 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100685 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
686
687 TensorShape inputShape;
688 TensorShape outputShape;
689
690 switch (dataLayout)
691 {
692 case DataLayout::NHWC:
693 inputShape = { 2, 4, 4, 3 };
694 outputShape = { 2, 2, 2, 3 };
695 break;
James Conroy69482272018-10-19 10:41:35 +0100696 case DataLayout::NCHW:
697 default:
James Conroy59540822018-10-11 12:39:05 +0100698 inputShape = { 2, 3, 4, 4 };
699 outputShape = { 2, 3, 2, 2 };
700 }
telsoa014fcda012018-03-09 14:13:49 +0000701
telsoa01c577f2c2018-08-31 09:22:23 +0100702 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100703 CheckInputOutput(std::move(workload),
704 TensorInfo(inputShape, DataType),
705 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000706}
707
708BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
709{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100710 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000711}
712
Matthew Jackson9bff1442019-09-12 09:08:23 +0100713BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16)
714{
715 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
716}
717
telsoa014fcda012018-03-09 14:13:49 +0000718BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
719{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000720 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100721}
722
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100723BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
724{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000725 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100726}
727
James Conroy59540822018-10-11 12:39:05 +0100728BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
729{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100730 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000731}
732
Francis Murtagh57f13d52019-06-24 14:24:36 +0100733template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
734static void RefCreateBatchToSpaceNdTest()
735{
736 Graph graph;
737 RefWorkloadFactory factory;
738
739 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
740
741 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100742 TensorInfo({ 1, 1, 1, 1 }, DataType),
743 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100744}
745
746BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
747{
748 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
749}
750
Matthew Jackson9bff1442019-09-12 09:08:23 +0100751BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat16)
752{
753 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float16>();
754}
755
Francis Murtagh57f13d52019-06-24 14:24:36 +0100756BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
757{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000758 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QAsymmU8>();
Francis Murtagh57f13d52019-06-24 14:24:36 +0100759}
760
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100761BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
762{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000763 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QSymmS16>();
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100764}
765
Matteo Martincighb63973e2018-10-16 16:23:33 +0100766template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
767static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000768{
769 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100770 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100771 auto workload =
772 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
773
774 TensorShape inputShape;
775 TensorShape outputShape;
776
777 switch (dataLayout)
778 {
779 case DataLayout::NHWC:
780 inputShape = { 5, 50, 67, 20 };
781 outputShape = { 5, 50, 67, 20 };
782 break;
783 case DataLayout::NCHW:
784 default:
785 inputShape = { 5, 20, 50, 67 };
786 outputShape = { 5, 20, 50, 67 };
787 break;
788 }
telsoa014fcda012018-03-09 14:13:49 +0000789
telsoa01c577f2c2018-08-31 09:22:23 +0100790 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100791 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
792}
793
794BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
795{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100796 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100797}
798
799BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
800{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100801 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
802}
803
804BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
805{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000806 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100807}
808
809BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
810{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000811 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000812}
813
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100814BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
815{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000816 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100817}
818
819BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
820{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000821 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100822}
823
telsoa01c577f2c2018-08-31 09:22:23 +0100824template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000825static void RefCreateReshapeWorkloadTest()
826{
827 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100828 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100829 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000830
telsoa01c577f2c2018-08-31 09:22:23 +0100831 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000832 CheckInputOutput(
833 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100834 TensorInfo({ 4, 1 }, DataType),
835 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000836}
837
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100838BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000839{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100840 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000841}
842
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100843BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000844{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000845 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000846}
847
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100848BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
849{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000850 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QSymmS16>();
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100851}
852
Jim Flynne242f2d2019-05-22 14:24:13 +0100853template <typename ConcatWorkloadType, armnn::DataType DataType>
854static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000855 unsigned int concatAxis)
856{
857 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100858 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100859 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000860
861 CheckInputsOutput(std::move(workload),
862 TensorInfo({ 2, 3, 2, 5 }, DataType),
863 TensorInfo({ 2, 3, 2, 5 }, DataType),
864 TensorInfo(outputShape, DataType));
865}
866
Jim Flynne242f2d2019-05-22 14:24:13 +0100867BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000868{
Jim Flynne242f2d2019-05-22 14:24:13 +0100869 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000870}
871
Matthew Jackson9bff1442019-09-12 09:08:23 +0100872BOOST_AUTO_TEST_CASE(CreateConcatDim0Float16Workload)
873{
874 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float16>({ 4, 3, 2, 5 }, 0);
875}
876
Jim Flynne242f2d2019-05-22 14:24:13 +0100877BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000878{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000879 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +0100880}
881
Jim Flynne242f2d2019-05-22 14:24:13 +0100882BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +0100883{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000884 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QSymmS16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000885}
886
Jim Flynne242f2d2019-05-22 14:24:13 +0100887BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000888{
Jim Flynne242f2d2019-05-22 14:24:13 +0100889 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000890}
891
Jim Flynne242f2d2019-05-22 14:24:13 +0100892BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000893{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000894 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000895}
896
Jim Flynne242f2d2019-05-22 14:24:13 +0100897BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000898{
Jim Flynne242f2d2019-05-22 14:24:13 +0100899 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000900}
901
Jim Flynne242f2d2019-05-22 14:24:13 +0100902BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000903{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000904 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000905}
906
Jim Flynne242f2d2019-05-22 14:24:13 +0100907BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000908{
Jim Flynne242f2d2019-05-22 14:24:13 +0100909 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000910}
911
Jim Flynne242f2d2019-05-22 14:24:13 +0100912BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000913{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000914 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000915}
916
Nina Drozd58ef2c62019-05-16 12:09:18 +0100917template <typename ConstantWorkloadType, armnn::DataType DataType>
918static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
919{
920 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100921 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +0100922 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
923
924 // Check output is as expected
925 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100926 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +0100927 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
928}
929
930BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
931{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000932 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100933}
934
935BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
936{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000937 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QSymmS16>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100938}
939
940BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
941{
942 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
943}
944
945BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
946{
947 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
948}
949
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100950static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
951 const armnn::TensorShape& alphaShape,
952 const armnn::TensorShape& outputShape,
953 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +0100954{
955 armnn::Graph graph;
956 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100957 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
958 graph,
959 inputShape,
960 alphaShape,
961 outputShape,
962 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100963
964 // Check output is as expected
965 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100966 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100967 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +0100968}
969
970BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
971{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100972 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100973}
974
Matthew Jackson9bff1442019-09-12 09:08:23 +0100975BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
976{
977 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float16);
978}
979
Matteo Martincighab9e5252019-06-13 17:27:46 +0100980BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
981{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000982 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QAsymmU8);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100983}
984
985BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
986{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000987 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QSymmS16);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100988}
989
990BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
991{
992 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
993 armnn::DataType::Float32),
994 armnn::InvalidArgumentException);
995}
996
Matthew Jackson9bff1442019-09-12 09:08:23 +0100997BOOST_AUTO_TEST_CASE(CreatePreluFloat16NoBroadcastWorkload)
998{
999 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1000 armnn::DataType::Float16),
1001 armnn::InvalidArgumentException);
1002}
1003
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001004BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
1005{
1006 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001007 armnn::DataType::QAsymmU8),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001008 armnn::InvalidArgumentException);
1009}
1010
1011BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
1012{
1013 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001014 armnn::DataType::QSymmS16),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001015 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001016}
1017
James Conroy60597842019-07-02 10:57:56 +01001018template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
1019static void RefCreateSpaceToDepthWorkloadTest()
1020{
1021 Graph graph;
1022 RefWorkloadFactory factory;
1023
1024 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1025
1026 CheckInputOutput(std::move(workload),
1027 TensorInfo({ 1, 2, 2, 1 }, DataType),
1028 TensorInfo({ 1, 1, 1, 4 }, DataType));
1029}
1030
1031BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
1032{
1033 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
1034}
1035
Matthew Jackson9bff1442019-09-12 09:08:23 +01001036BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat16)
1037{
1038 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float16>();
1039}
1040
James Conroy60597842019-07-02 10:57:56 +01001041BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
1042{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001043 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001044}
1045
1046BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
1047{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001048 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001049}
1050
Matthew Jacksond5166102019-07-31 14:06:28 +01001051template <armnn::DataType DataType>
Matthew Jackson81e601c2019-07-11 12:07:09 +01001052static void RefCreateStackWorkloadTest(const armnn::TensorShape& inputShape,
1053 const armnn::TensorShape& outputShape,
1054 unsigned int axis,
Matthew Jacksond5166102019-07-31 14:06:28 +01001055 unsigned int numInputs)
Matthew Jackson81e601c2019-07-11 12:07:09 +01001056{
1057 armnn::Graph graph;
1058 RefWorkloadFactory factory;
Matthew Jacksond5166102019-07-31 14:06:28 +01001059 auto workload = CreateStackWorkloadTest<RefStackWorkload, DataType>(factory,
1060 graph,
1061 inputShape,
1062 outputShape,
1063 axis,
1064 numInputs);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001065
Matthew Jacksond5166102019-07-31 14:06:28 +01001066 // Check inputs and output are as expected
1067 StackQueueDescriptor queueDescriptor = workload->GetData();
1068 for (unsigned int i = 0; i < numInputs; ++i)
1069 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001070 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001071 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo(inputShape, DataType)));
1072 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001073 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001074 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
Matthew Jackson81e601c2019-07-11 12:07:09 +01001075}
1076
1077BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1078{
Matthew Jacksond5166102019-07-31 14:06:28 +01001079 RefCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001080}
1081
1082BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1083{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001084 RefCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001085}
1086
1087BOOST_AUTO_TEST_CASE(CreateStackUint16Workload)
1088{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001089 RefCreateStackWorkloadTest<armnn::DataType::QSymmS16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001090}
1091
James Conroy4f1f8992020-04-29 20:01:10 +01001092template <typename QLstmWorkloadType>
1093static void RefCreateQLstmWorkloadTest()
1094{
1095 Graph graph;
1096 RefWorkloadFactory factory;
1097
1098 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1099
1100 armnn::TensorInfo inputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.0078125f, 0);
1101
1102 armnn::TensorInfo cellStateInfo({2 , 4}, armnn::DataType::QSymmS16, 3.05176e-05f, 0);
1103
1104 armnn::TensorInfo outputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.007f, 0);
1105
1106 QLstmQueueDescriptor queueDescriptor = workload->GetData();
1107 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
1108 auto cellStateOutHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
1109 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
1110
1111 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
1112 BOOST_TEST((cellStateOutHandle->GetTensorInfo() == cellStateInfo));
1113 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
1114}
1115
Rob Hughes985ef1f2020-05-19 16:31:10 +01001116BOOST_AUTO_TEST_CASE(CreateQLstmWorkload)
James Conroy4f1f8992020-04-29 20:01:10 +01001117{
1118 RefCreateQLstmWorkloadTest<RefQLstmWorkload>();
1119}
1120
telsoa014fcda012018-03-09 14:13:49 +00001121BOOST_AUTO_TEST_SUITE_END()