blob: 2fa6cbfd5d87bd031df472f2ef35940d461dd347 [file] [log] [blame]
telsoa014fcda012018-03-09 14:13:49 +00001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
David Beckecb56cd2018-09-05 12:52:57 +01003// SPDX-License-Identifier: MIT
telsoa014fcda012018-03-09 14:13:49 +00004//
arovir0143095f32018-10-09 18:04:24 +01005
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <test/CreateWorkload.hpp>
arovir0143095f32018-10-09 18:04:24 +01007
Matthew Bentham4cefc412019-06-18 16:14:34 +01008#include <reference/RefTensorHandle.hpp>
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00009#include <reference/RefWorkloadFactory.hpp>
10#include <reference/workloads/RefWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
12namespace
13{
14
15template<typename Workload>
16void CheckInputOutput(std::unique_ptr<Workload> workload, const TensorInfo& inputInfo, const TensorInfo& outputInfo)
17{
18 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +010019 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
20 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000021 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
22 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
23}
24
25template <typename Workload>
26void CheckInputsOutput(std::unique_ptr<Workload> workload,
27 const TensorInfo& inputInfo0,
28 const TensorInfo& inputInfo1,
29 const TensorInfo& outputInfo)
30{
31 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +010032 auto inputHandle0 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
33 auto inputHandle1 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[1]);
34 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa014fcda012018-03-09 14:13:49 +000035 BOOST_TEST((inputHandle0->GetTensorInfo() == inputInfo0));
36 BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1));
37 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
38}
Matthew Bentham7c1603a2019-06-21 17:22:23 +010039
40armnn::RefWorkloadFactory GetFactory()
41{
42 std::shared_ptr<RefMemoryManager> memoryManager = std::make_shared<RefMemoryManager>();
43 return RefWorkloadFactory(memoryManager);
44}
45
46
telsoa014fcda012018-03-09 14:13:49 +000047}
48
49BOOST_AUTO_TEST_SUITE(CreateWorkloadRef)
50
telsoa01c577f2c2018-08-31 09:22:23 +010051template <typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +000052static void RefCreateActivationWorkloadTest()
53{
54 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010055 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +010056 auto workload = CreateActivationWorkloadTest<ActivationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000057
telsoa01c577f2c2018-08-31 09:22:23 +010058 // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000059 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010060 TensorInfo({ 1, 1 }, DataType),
61 TensorInfo({ 1, 1 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000062}
63
64BOOST_AUTO_TEST_CASE(CreateActivationFloat32Workload)
65{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010066 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000067}
68
69BOOST_AUTO_TEST_CASE(CreateActivationUint8Workload)
70{
Nattapat Chaimanowongae2c5f02019-04-24 16:19:57 +010071 RefCreateActivationWorkloadTest<RefActivationWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +000072}
73
David Beckbc392452018-09-10 14:47:28 +010074template <typename WorkloadType,
75 typename DescriptorType,
76 typename LayerType,
77 armnn::DataType DataType>
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000078static void RefCreateElementwiseWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000079{
80 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +010081 RefWorkloadFactory factory = GetFactory();
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000082 auto workload = CreateElementwiseWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(
83 factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000084
telsoa014fcda012018-03-09 14:13:49 +000085 CheckInputsOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010086 TensorInfo({ 2, 3 }, DataType),
87 TensorInfo({ 2, 3 }, DataType),
88 TensorInfo({ 2, 3 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000089}
90
91BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
92{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +010093 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +000094 AdditionQueueDescriptor,
95 AdditionLayer,
96 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000097}
98
99BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
100{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100101 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000102 AdditionQueueDescriptor,
103 AdditionLayer,
104 armnn::DataType::QuantisedAsymm8>();
David Beckbc392452018-09-10 14:47:28 +0100105}
106
Sadik Armagan2999a022019-04-09 14:20:12 +0100107BOOST_AUTO_TEST_CASE(CreateAdditionInt16Workload)
108{
109 RefCreateElementwiseWorkloadTest<RefAdditionWorkload,
110 AdditionQueueDescriptor,
111 AdditionLayer,
112 armnn::DataType::QuantisedSymm16>();
113}
114
David Beckbc392452018-09-10 14:47:28 +0100115BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
116{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100117 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000118 SubtractionQueueDescriptor,
119 SubtractionLayer,
120 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100121}
122
123BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
124{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100125 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000126 SubtractionQueueDescriptor,
127 SubtractionLayer,
128 armnn::DataType::QuantisedAsymm8>();
David Beckbc392452018-09-10 14:47:28 +0100129}
130
Sadik Armagan2999a022019-04-09 14:20:12 +0100131BOOST_AUTO_TEST_CASE(CreateSubtractionInt16Workload)
132{
133 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload,
134 SubtractionQueueDescriptor,
135 SubtractionLayer,
136 armnn::DataType::QuantisedSymm16>();
137}
138
David Beckbc392452018-09-10 14:47:28 +0100139BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
140{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100141 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000142 MultiplicationQueueDescriptor,
143 MultiplicationLayer,
144 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100145}
146
147BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
148{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100149 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000150 MultiplicationQueueDescriptor,
151 MultiplicationLayer,
152 armnn::DataType::QuantisedAsymm8>();
David Beckbc392452018-09-10 14:47:28 +0100153}
154
Sadik Armagan2999a022019-04-09 14:20:12 +0100155BOOST_AUTO_TEST_CASE(CreateMultiplicationInt16Workload)
156{
157 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload,
158 MultiplicationQueueDescriptor,
159 MultiplicationLayer,
160 armnn::DataType::QuantisedSymm16>();
161}
162
David Beckbc392452018-09-10 14:47:28 +0100163BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkload)
164{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100165 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000166 DivisionQueueDescriptor,
167 DivisionLayer,
168 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100169}
170
171BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
172{
Sadik Armagan2e6dc3a2019-04-03 17:48:18 +0100173 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000174 DivisionQueueDescriptor,
175 DivisionLayer,
176 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000177}
178
Sadik Armagan2999a022019-04-09 14:20:12 +0100179BOOST_AUTO_TEST_CASE(CreateDivisionInt16Workload)
180{
181 RefCreateElementwiseWorkloadTest<RefDivisionWorkload,
182 DivisionQueueDescriptor,
183 DivisionLayer,
184 armnn::DataType::QuantisedSymm16>();
185}
186
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100187template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
188static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000189{
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100190 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100191 RefWorkloadFactory factory = GetFactory();
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100192 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>(factory,
193 graph,
194 dataLayout);
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100195
196 TensorShape inputShape;
197 TensorShape outputShape;
198
199 switch (dataLayout)
200 {
201 case DataLayout::NHWC:
Nikhil Rajd1340932018-10-18 14:27:50 +0100202 inputShape = { 2, 4, 4, 3 };
203 outputShape = { 2, 4, 4, 3 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100204 break;
205 case DataLayout::NCHW:
206 default:
Nikhil Rajd1340932018-10-18 14:27:50 +0100207 inputShape = { 2, 3, 4, 4 };
208 outputShape = { 2, 3, 4, 4 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100209 break;
210 }
telsoa014fcda012018-03-09 14:13:49 +0000211
telsoa01c577f2c2018-08-31 09:22:23 +0100212 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100213 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
214}
215
216BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32Workload)
217{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100218 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100219 (DataLayout::NCHW);
220}
221
222BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32WorkloadNhwc)
223{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100224 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100225 (DataLayout::NHWC);
226}
227
228BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8Workload)
229{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100230 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QuantisedAsymm8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100231 (DataLayout::NCHW);
232}
233
234BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8WorkloadNhwc)
235{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100236 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QuantisedAsymm8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100237 (DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000238}
239
Matteo Martincighf5507132019-06-04 10:59:47 +0100240BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16Workload)
241{
242 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QuantisedSymm16>
243 (DataLayout::NCHW);
244}
245
246BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc)
247{
248 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QuantisedSymm16>
249 (DataLayout::NHWC);
250}
251
telsoa01c577f2c2018-08-31 09:22:23 +0100252BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
253{
254 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100255 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100256 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
257
258 // Checks that outputs and inputs are as we expect them
259 CheckInputOutput(
260 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
261}
262
263BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
264{
265 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100266 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100267 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
268
269 // Checks that outputs and inputs are as we expect them
270 CheckInputOutput(
271 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
272}
273
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100274static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000275{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100276 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100277 RefWorkloadFactory factory = GetFactory();
Mike Kelly9b398322019-05-22 17:21:49 +0100278 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100279 (factory, graph, dataLayout);
280
Mike Kellydb482882019-06-14 12:35:24 +0100281 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
282 : std::initializer_list<unsigned int>({2, 8, 16, 3});
283 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
284 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000285
telsoa01c577f2c2018-08-31 09:22:23 +0100286 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000287 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100288 TensorInfo(inputShape, DataType::Float32),
289 TensorInfo(outputShape, DataType::Float32));
290}
291
292BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
293{
294 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
295}
296
297BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
298{
299 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000300}
301
Ruomei Yan495852f2019-05-23 11:37:33 +0100302static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
303{
304 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100305 RefWorkloadFactory factory = GetFactory();
Ruomei Yan495852f2019-05-23 11:37:33 +0100306 auto workload = CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dWorkload, DataType::Float32>
307 (factory, graph, dataLayout);
308
Mike Kellydb482882019-06-14 12:35:24 +0100309 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
310 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
311 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
312 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
313
Ruomei Yan495852f2019-05-23 11:37:33 +0100314 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
315 CheckInputOutput(std::move(workload),
316 TensorInfo(inputShape, DataType::Float32),
317 TensorInfo(outputShape, DataType::Float32));
318}
319
320BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
321{
322 RefCreateDepthwiseConvolutionWorkloadTest(DataLayout::NHWC);
323}
324
telsoa01c577f2c2018-08-31 09:22:23 +0100325template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000326static void RefCreateFullyConnectedWorkloadTest()
327{
328 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100329 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100330 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000331
telsoa01c577f2c2018-08-31 09:22:23 +0100332 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
333 float inputsQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 1.0f : 0.0;
334 float outputQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000335 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100336 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
337 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000338}
339
Francis Murtagh43aec582019-05-27 12:14:10 +0100340BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000341{
Francis Murtagh43aec582019-05-27 12:14:10 +0100342 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000343}
344
Francis Murtagh43aec582019-05-27 12:14:10 +0100345BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000346{
Francis Murtagh43aec582019-05-27 12:14:10 +0100347 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000348}
349
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100350BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedSymm16)
Francis Murtagh46c09d02019-05-28 08:15:28 +0100351{
352 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QuantisedSymm16>();
353}
354
narpra0155a97bc2018-10-02 14:35:53 +0100355template <typename NormalizationWorkloadType, armnn::DataType DataType>
Matteo Martincigha160b242018-10-18 10:33:23 +0100356static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000357{
narpra0155a97bc2018-10-02 14:35:53 +0100358 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100359 RefWorkloadFactory factory = GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100360 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
361
362 TensorShape inputShape;
363 TensorShape outputShape;
364
365 switch (dataLayout)
366 {
367 case DataLayout::NHWC:
368 inputShape = { 3, 1, 5, 5 };
369 outputShape = { 3, 1, 5, 5 };
370 break;
371 case DataLayout::NCHW:
372 default:
373 inputShape = { 3, 5, 5, 1 };
374 outputShape = { 3, 5, 5, 1 };
375 break;
376 }
telsoa014fcda012018-03-09 14:13:49 +0000377
telsoa01c577f2c2018-08-31 09:22:23 +0100378 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
Matteo Martincigha160b242018-10-18 10:33:23 +0100379 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
narpra0155a97bc2018-10-02 14:35:53 +0100380}
381
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100382BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NchwWorkload)
narpra0155a97bc2018-10-02 14:35:53 +0100383{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100384 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincigha160b242018-10-18 10:33:23 +0100385}
386
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100387BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NhwcWorkload)
Matteo Martincigha160b242018-10-18 10:33:23 +0100388{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100389 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
390}
391
392BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NchwWorkload)
393{
394 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
395}
396
397BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NhwcWorkload)
398{
399 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000400}
401
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100402BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NchwWorkload)
403{
404 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NCHW);
405}
406
407BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NhwcWorkload)
408{
409 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NHWC);
410}
411
telsoa01c577f2c2018-08-31 09:22:23 +0100412template <typename Pooling2dWorkloadType, armnn::DataType DataType>
James Conroy69482272018-10-19 10:41:35 +0100413static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000414{
415 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100416 RefWorkloadFactory factory = GetFactory();
James Conroy69482272018-10-19 10:41:35 +0100417 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph, dataLayout);
418
419 TensorShape inputShape;
420 TensorShape outputShape;
421
422 switch (dataLayout)
423 {
424 case DataLayout::NHWC:
425 inputShape = { 3, 5, 5, 2 };
426 outputShape = { 3, 2, 4, 2 };
427 break;
428 case DataLayout::NCHW:
429 default:
430 inputShape = { 3, 2, 5, 5 };
431 outputShape = { 3, 2, 2, 4 };
432 }
telsoa014fcda012018-03-09 14:13:49 +0000433
telsoa01c577f2c2018-08-31 09:22:23 +0100434 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100435 CheckInputOutput(std::move(workload),
436 TensorInfo(inputShape, DataType),
437 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000438}
439
440BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
441{
Teresa Charlina3b20472019-06-06 11:12:32 +0100442 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100443}
444
445BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32NhwcWorkload)
446{
Teresa Charlina3b20472019-06-06 11:12:32 +0100447 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000448}
449
450BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
451{
Teresa Charlina3b20472019-06-06 11:12:32 +0100452 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100453}
454
455BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
456{
Teresa Charlina3b20472019-06-06 11:12:32 +0100457 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000458}
459
Teresa Charlin0434df62019-06-06 13:40:35 +0100460BOOST_AUTO_TEST_CASE(CreatePooling2dInt16Workload)
461{
462 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NCHW);
463}
464
465BOOST_AUTO_TEST_CASE(CreatePooling2dInt16NhwcWorkload)
466{
467 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NHWC);
468}
469
telsoa01c577f2c2018-08-31 09:22:23 +0100470template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000471static void RefCreateSoftmaxWorkloadTest()
472{
473 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100474 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100475 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000476
telsoa01c577f2c2018-08-31 09:22:23 +0100477 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000478 CheckInputOutput(
479 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100480 TensorInfo({4, 1}, DataType),
481 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000482}
483
484BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
485{
nikraj01a121de32019-05-29 10:51:05 +0100486 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000487}
488
nikraj01a121de32019-05-29 10:51:05 +0100489BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000490{
nikraj01a121de32019-05-29 10:51:05 +0100491 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000492}
493
nikraj01248683f2019-05-29 16:46:50 +0100494BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
495{
496 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QuantisedSymm16>();
497}
498
telsoa01c577f2c2018-08-31 09:22:23 +0100499template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000500static void RefCreateSplitterWorkloadTest()
501{
502 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100503 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100504 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000505
telsoa01c577f2c2018-08-31 09:22:23 +0100506 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000507 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100508 auto inputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100509 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100510
Matthew Bentham4cefc412019-06-18 16:14:34 +0100511 auto outputHandle0 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100512 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100513
Matthew Bentham4cefc412019-06-18 16:14:34 +0100514 auto outputHandle1 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100515 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100516
Matthew Bentham4cefc412019-06-18 16:14:34 +0100517 auto outputHandle2 = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100518 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000519}
520
521BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
522{
Ruomei Yan25339c32019-05-28 16:48:20 +0100523 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000524}
525
526BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
527{
Ruomei Yan25339c32019-05-28 16:48:20 +0100528 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000529}
530
Jim Flynne242f2d2019-05-22 14:24:13 +0100531template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
532static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000533{
telsoa01c577f2c2018-08-31 09:22:23 +0100534 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100535 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100536 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100537 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
538 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000539
540 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100541 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100542 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
543 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000544
545 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100546 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000547
telsoa01c577f2c2018-08-31 09:22:23 +0100548 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100549 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
550 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
551 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
552 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000553
554 BOOST_TEST(sOut0);
555 BOOST_TEST(sOut1);
556 BOOST_TEST(mIn0);
557 BOOST_TEST(mIn1);
558
559 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
560
561 BOOST_TEST(validDataPointers);
562}
563
Jim Flynne242f2d2019-05-22 14:24:13 +0100564BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000565{
Ruomei Yan25339c32019-05-28 16:48:20 +0100566 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000567}
568
Jim Flynne242f2d2019-05-22 14:24:13 +0100569BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000570{
Ruomei Yan25339c32019-05-28 16:48:20 +0100571 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000572}
573
telsoa01c577f2c2018-08-31 09:22:23 +0100574template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000575static void RefCreateSingleOutputMultipleInputsTest()
576{
telsoa01c577f2c2018-08-31 09:22:23 +0100577 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
578 // 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 +0000579
580 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100581 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000582 std::unique_ptr<SplitterWorkloadType> wlSplitter;
583 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
584 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
585 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
586 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
587
588 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100589 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000590
Matthew Bentham4cefc412019-06-18 16:14:34 +0100591 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
592 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
593 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
594 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
595 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
596 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000597
598
599 BOOST_TEST(sOut0);
600 BOOST_TEST(sOut1);
601 BOOST_TEST(activ0_0Im);
602 BOOST_TEST(activ0_1Im);
603 BOOST_TEST(activ1_0Im);
604 BOOST_TEST(activ1_1Im);
605
606 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
607 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
608
609 BOOST_TEST(validDataPointers);
610}
611
612BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
613{
Ruomei Yan25339c32019-05-28 16:48:20 +0100614 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100615 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000616}
617
618BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
619{
Ruomei Yan25339c32019-05-28 16:48:20 +0100620 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100621 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000622}
623
telsoa01c577f2c2018-08-31 09:22:23 +0100624template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100625static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000626{
627 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100628 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100629 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
630
631 TensorShape inputShape;
632 TensorShape outputShape;
633
634 switch (dataLayout)
635 {
636 case DataLayout::NHWC:
637 inputShape = { 2, 4, 4, 3 };
638 outputShape = { 2, 2, 2, 3 };
639 break;
James Conroy69482272018-10-19 10:41:35 +0100640 case DataLayout::NCHW:
641 default:
James Conroy59540822018-10-11 12:39:05 +0100642 inputShape = { 2, 3, 4, 4 };
643 outputShape = { 2, 3, 2, 2 };
644 }
telsoa014fcda012018-03-09 14:13:49 +0000645
telsoa01c577f2c2018-08-31 09:22:23 +0100646 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100647 CheckInputOutput(std::move(workload),
648 TensorInfo(inputShape, DataType),
649 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000650}
651
652BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
653{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100654 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000655}
656
657BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
658{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100659 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100660}
661
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100662BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
663{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100664 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100665}
666
James Conroy59540822018-10-11 12:39:05 +0100667BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
668{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100669 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000670}
671
nikraj0133732f62019-06-04 15:35:34 +0100672template <typename RsqrtWorkloadType, armnn::DataType DataType>
673static void RefCreateRsqrtTest()
674{
675 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100676 RefWorkloadFactory factory = GetFactory();
nikraj0133732f62019-06-04 15:35:34 +0100677
678 auto workload = CreateRsqrtWorkloadTest<RsqrtWorkloadType, DataType>(factory, graph);
679
680 // Checks that outputs are as we expect them (see definition of CreateRsqrtWorkloadTest).
681 CheckInputOutput(std::move(workload),
682 TensorInfo({ 1, 1 }, DataType),
683 TensorInfo({ 1, 1 }, DataType));
684
685}
686
687BOOST_AUTO_TEST_CASE(CreateRsqrtFloat32)
688{
nikraj0199a66312019-06-06 10:31:27 +0100689 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::Float32>();
nikraj0133732f62019-06-04 15:35:34 +0100690}
691
nikraj010421e7f2019-06-14 09:40:34 +0100692BOOST_AUTO_TEST_CASE(CreateRsqrtUint8)
693{
694 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::QuantisedAsymm8>();
695}
696
nikraj0124d73212019-06-14 14:20:40 +0100697BOOST_AUTO_TEST_CASE(CreateRsqrtQsymm16)
698{
699 RefCreateRsqrtTest<RefRsqrtWorkload, armnn::DataType::QuantisedSymm16>();
700}
701
Francis Murtagh57f13d52019-06-24 14:24:36 +0100702template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
703static void RefCreateBatchToSpaceNdTest()
704{
705 Graph graph;
706 RefWorkloadFactory factory;
707
708 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
709
710 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100711 TensorInfo({ 1, 1, 1, 1 }, DataType),
712 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100713}
714
715BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
716{
717 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
718}
719
720BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
721{
722 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QuantisedAsymm8>();
723}
724
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100725BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
726{
727 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QuantisedSymm16>();
728}
729
Matteo Martincighb63973e2018-10-16 16:23:33 +0100730template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
731static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000732{
733 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100734 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100735 auto workload =
736 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
737
738 TensorShape inputShape;
739 TensorShape outputShape;
740
741 switch (dataLayout)
742 {
743 case DataLayout::NHWC:
744 inputShape = { 5, 50, 67, 20 };
745 outputShape = { 5, 50, 67, 20 };
746 break;
747 case DataLayout::NCHW:
748 default:
749 inputShape = { 5, 20, 50, 67 };
750 outputShape = { 5, 20, 50, 67 };
751 break;
752 }
telsoa014fcda012018-03-09 14:13:49 +0000753
telsoa01c577f2c2018-08-31 09:22:23 +0100754 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100755 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
756}
757
758BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
759{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100760 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100761}
762
763BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
764{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100765 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
766}
767
768BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
769{
770 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NCHW);
771}
772
773BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
774{
775 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QuantisedSymm16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000776}
777
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100778BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
779{
780 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
781}
782
783BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
784{
785 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QuantisedAsymm8>(DataLayout::NHWC);
786}
787
telsoa01c577f2c2018-08-31 09:22:23 +0100788template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000789static void RefCreateReshapeWorkloadTest()
790{
791 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100792 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100793 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000794
telsoa01c577f2c2018-08-31 09:22:23 +0100795 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000796 CheckInputOutput(
797 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100798 TensorInfo({ 4, 1 }, DataType),
799 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000800}
801
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100802BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000803{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100804 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000805}
806
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100807BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000808{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100809 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000810}
811
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100812BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
813{
814 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QuantisedSymm16>();
815}
816
Jim Flynne242f2d2019-05-22 14:24:13 +0100817template <typename ConcatWorkloadType, armnn::DataType DataType>
818static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000819 unsigned int concatAxis)
820{
821 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100822 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100823 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000824
825 CheckInputsOutput(std::move(workload),
826 TensorInfo({ 2, 3, 2, 5 }, DataType),
827 TensorInfo({ 2, 3, 2, 5 }, DataType),
828 TensorInfo(outputShape, DataType));
829}
830
Jim Flynne242f2d2019-05-22 14:24:13 +0100831BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000832{
Jim Flynne242f2d2019-05-22 14:24:13 +0100833 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000834}
835
Jim Flynne242f2d2019-05-22 14:24:13 +0100836BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000837{
Jim Flynne242f2d2019-05-22 14:24:13 +0100838 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +0100839}
840
Jim Flynne242f2d2019-05-22 14:24:13 +0100841BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +0100842{
Jim Flynne242f2d2019-05-22 14:24:13 +0100843 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedSymm16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000844}
845
Jim Flynne242f2d2019-05-22 14:24:13 +0100846BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000847{
Jim Flynne242f2d2019-05-22 14:24:13 +0100848 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000849}
850
Jim Flynne242f2d2019-05-22 14:24:13 +0100851BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000852{
Jim Flynne242f2d2019-05-22 14:24:13 +0100853 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000854}
855
Jim Flynne242f2d2019-05-22 14:24:13 +0100856BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000857{
Jim Flynne242f2d2019-05-22 14:24:13 +0100858 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000859}
860
Jim Flynne242f2d2019-05-22 14:24:13 +0100861BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000862{
Jim Flynne242f2d2019-05-22 14:24:13 +0100863 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000864}
865
Jim Flynne242f2d2019-05-22 14:24:13 +0100866BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000867{
Jim Flynne242f2d2019-05-22 14:24:13 +0100868 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000869}
870
Jim Flynne242f2d2019-05-22 14:24:13 +0100871BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000872{
Jim Flynne242f2d2019-05-22 14:24:13 +0100873 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000874}
875
Nina Drozd58ef2c62019-05-16 12:09:18 +0100876template <typename ConstantWorkloadType, armnn::DataType DataType>
877static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
878{
879 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100880 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +0100881 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
882
883 // Check output is as expected
884 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100885 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +0100886 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
887}
888
889BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
890{
891 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QuantisedAsymm8>({ 2, 3, 2, 10 });
892}
893
894BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
895{
896 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QuantisedSymm16>({ 2, 3, 2, 10 });
897}
898
899BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
900{
901 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
902}
903
904BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
905{
906 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
907}
908
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100909static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
910 const armnn::TensorShape& alphaShape,
911 const armnn::TensorShape& outputShape,
912 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +0100913{
914 armnn::Graph graph;
915 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100916 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
917 graph,
918 inputShape,
919 alphaShape,
920 outputShape,
921 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100922
923 // Check output is as expected
924 auto queueDescriptor = workload->GetData();
Matthew Bentham4cefc412019-06-18 16:14:34 +0100925 auto outputHandle = boost::polymorphic_downcast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100926 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +0100927}
928
929BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
930{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100931 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100932}
933
934BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
935{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100936 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QuantisedAsymm8);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100937}
938
939BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
940{
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100941 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QuantisedSymm16);
942}
943
944BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
945{
946 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
947 armnn::DataType::Float32),
948 armnn::InvalidArgumentException);
949}
950
951BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
952{
953 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
954 armnn::DataType::QuantisedAsymm8),
955 armnn::InvalidArgumentException);
956}
957
958BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
959{
960 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
961 armnn::DataType::QuantisedSymm16),
962 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100963}
964
James Conroy60597842019-07-02 10:57:56 +0100965template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
966static void RefCreateSpaceToDepthWorkloadTest()
967{
968 Graph graph;
969 RefWorkloadFactory factory;
970
971 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
972
973 CheckInputOutput(std::move(workload),
974 TensorInfo({ 1, 2, 2, 1 }, DataType),
975 TensorInfo({ 1, 1, 1, 4 }, DataType));
976}
977
978BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
979{
980 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
981}
982
983BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
984{
985 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QuantisedAsymm8>();
986}
987
988BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
989{
990 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QuantisedSymm16>();
991}
992
telsoa014fcda012018-03-09 14:13:49 +0000993BOOST_AUTO_TEST_SUITE_END()