blob: 6e2217c919ccc053850e7be6e3968a59cb6bca8e [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{
Finn Williamscbd2c232020-06-22 15:58:32 +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{
Finn Williamscbd2c232020-06-22 15:58:32 +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{
Finn Williamscbd2c232020-06-22 15:58:32 +0100110 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100111 AdditionQueueDescriptor,
112 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000113 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100114}
115
Finn Williamscbd2c232020-06-22 15:58:32 +0100116BOOST_AUTO_TEST_CASE(CreateAdditionInt32Workload)
117{
118 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<int32_t>,
119 AdditionQueueDescriptor,
120 AdditionLayer,
121 armnn::DataType::Signed32>();
122}
123
Matthew Jackson9bff1442019-09-12 09:08:23 +0100124BOOST_AUTO_TEST_CASE(CreateSubtractionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100125{
Finn Williamscbd2c232020-06-22 15:58:32 +0100126 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000127 SubtractionQueueDescriptor,
128 SubtractionLayer,
129 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100130}
131
Matthew Jackson9bff1442019-09-12 09:08:23 +0100132BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
133{
Finn Williamscbd2c232020-06-22 15:58:32 +0100134 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100135 SubtractionQueueDescriptor,
136 SubtractionLayer,
137 armnn::DataType::Float16>();
138}
139
David Beckbc392452018-09-10 14:47:28 +0100140BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
141{
Finn Williamscbd2c232020-06-22 15:58:32 +0100142 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000143 SubtractionQueueDescriptor,
144 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000145 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100146}
147
Sadik Armagan2999a022019-04-09 14:20:12 +0100148BOOST_AUTO_TEST_CASE(CreateSubtractionInt16Workload)
149{
Finn Williamscbd2c232020-06-22 15:58:32 +0100150 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100151 SubtractionQueueDescriptor,
152 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000153 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100154}
155
Finn Williamscbd2c232020-06-22 15:58:32 +0100156BOOST_AUTO_TEST_CASE(CreateSubtractionInt32Workload)
157{
158 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<int32_t>,
159 SubtractionQueueDescriptor,
160 SubtractionLayer,
161 armnn::DataType::Signed32>();
162}
163
David Beckbc392452018-09-10 14:47:28 +0100164BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
165{
Finn Williamscbd2c232020-06-22 15:58:32 +0100166 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000167 MultiplicationQueueDescriptor,
168 MultiplicationLayer,
169 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100170}
171
172BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
173{
Finn Williamscbd2c232020-06-22 15:58:32 +0100174 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000175 MultiplicationQueueDescriptor,
176 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000177 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100178}
179
Sadik Armagan2999a022019-04-09 14:20:12 +0100180BOOST_AUTO_TEST_CASE(CreateMultiplicationInt16Workload)
181{
Finn Williamscbd2c232020-06-22 15:58:32 +0100182 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100183 MultiplicationQueueDescriptor,
184 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000185 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100186}
187
Finn Williamscbd2c232020-06-22 15:58:32 +0100188BOOST_AUTO_TEST_CASE(CreateMultiplicationInt32Workload)
189{
190 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<int32_t>,
191 MultiplicationQueueDescriptor,
192 MultiplicationLayer,
193 armnn::DataType::Signed32>();
194}
195
Matthew Jackson9bff1442019-09-12 09:08:23 +0100196BOOST_AUTO_TEST_CASE(CreateDivisionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100197{
Finn Williamscbd2c232020-06-22 15:58:32 +0100198 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000199 DivisionQueueDescriptor,
200 DivisionLayer,
201 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100202}
203
Matthew Jackson9bff1442019-09-12 09:08:23 +0100204BOOST_AUTO_TEST_CASE(CreateDivisionFloat16Workload)
205{
Finn Williamscbd2c232020-06-22 15:58:32 +0100206 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100207 DivisionQueueDescriptor,
208 DivisionLayer,
209 armnn::DataType::Float16>();
210}
211
David Beckbc392452018-09-10 14:47:28 +0100212BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
213{
Finn Williamscbd2c232020-06-22 15:58:32 +0100214 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000215 DivisionQueueDescriptor,
216 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000217 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000218}
219
Sadik Armagan2999a022019-04-09 14:20:12 +0100220BOOST_AUTO_TEST_CASE(CreateDivisionInt16Workload)
221{
Finn Williamscbd2c232020-06-22 15:58:32 +0100222 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100223 DivisionQueueDescriptor,
224 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000225 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100226}
227
Finn Williamscbd2c232020-06-22 15:58:32 +0100228BOOST_AUTO_TEST_CASE(CreateDivisionInt32Workload)
229{
230 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<int32_t>,
231 DivisionQueueDescriptor,
232 DivisionLayer,
233 armnn::DataType::Signed32>();
234}
235
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100236template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
237static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000238{
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100239 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100240 RefWorkloadFactory factory = GetFactory();
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100241 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>(factory,
242 graph,
243 dataLayout);
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100244
245 TensorShape inputShape;
246 TensorShape outputShape;
247
248 switch (dataLayout)
249 {
250 case DataLayout::NHWC:
Nikhil Rajd1340932018-10-18 14:27:50 +0100251 inputShape = { 2, 4, 4, 3 };
252 outputShape = { 2, 4, 4, 3 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100253 break;
254 case DataLayout::NCHW:
255 default:
Nikhil Rajd1340932018-10-18 14:27:50 +0100256 inputShape = { 2, 3, 4, 4 };
257 outputShape = { 2, 3, 4, 4 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100258 break;
259 }
telsoa014fcda012018-03-09 14:13:49 +0000260
telsoa01c577f2c2018-08-31 09:22:23 +0100261 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100262 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
263}
264
265BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32Workload)
266{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100267 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100268 (DataLayout::NCHW);
269}
270
271BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32WorkloadNhwc)
272{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100273 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100274 (DataLayout::NHWC);
275}
276
Matthew Jackson9bff1442019-09-12 09:08:23 +0100277BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16Workload)
278{
279 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float16>
280 (DataLayout::NCHW);
281}
282
283BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16WorkloadNhwc)
284{
285 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float16>
286 (DataLayout::NHWC);
287}
288
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100289BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8Workload)
290{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000291 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100292 (DataLayout::NCHW);
293}
294
295BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8WorkloadNhwc)
296{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000297 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100298 (DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000299}
300
Matteo Martincighf5507132019-06-04 10:59:47 +0100301BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16Workload)
302{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000303 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100304 (DataLayout::NCHW);
305}
306
307BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc)
308{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000309 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100310 (DataLayout::NHWC);
311}
312
telsoa01c577f2c2018-08-31 09:22:23 +0100313BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
314{
315 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100316 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100317 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
318
319 // Checks that outputs and inputs are as we expect them
320 CheckInputOutput(
321 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
322}
323
324BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
325{
326 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100327 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100328 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
329
330 // Checks that outputs and inputs are as we expect them
331 CheckInputOutput(
332 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
333}
334
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100335static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000336{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100337 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100338 RefWorkloadFactory factory = GetFactory();
Mike Kelly9b398322019-05-22 17:21:49 +0100339 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100340 (factory, graph, dataLayout);
341
Mike Kellydb482882019-06-14 12:35:24 +0100342 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
343 : std::initializer_list<unsigned int>({2, 8, 16, 3});
344 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
345 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000346
telsoa01c577f2c2018-08-31 09:22:23 +0100347 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000348 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100349 TensorInfo(inputShape, DataType::Float32),
350 TensorInfo(outputShape, DataType::Float32));
351}
352
353BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
354{
355 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
356}
357
358BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
359{
360 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000361}
362
Ruomei Yan495852f2019-05-23 11:37:33 +0100363static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
364{
365 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100366 RefWorkloadFactory factory = GetFactory();
Ruomei Yan495852f2019-05-23 11:37:33 +0100367 auto workload = CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dWorkload, DataType::Float32>
368 (factory, graph, dataLayout);
369
Mike Kellydb482882019-06-14 12:35:24 +0100370 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
371 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
372 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
373 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
374
Ruomei Yan495852f2019-05-23 11:37:33 +0100375 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
376 CheckInputOutput(std::move(workload),
377 TensorInfo(inputShape, DataType::Float32),
378 TensorInfo(outputShape, DataType::Float32));
379}
380
381BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
382{
383 RefCreateDepthwiseConvolutionWorkloadTest(DataLayout::NHWC);
384}
385
telsoa01c577f2c2018-08-31 09:22:23 +0100386template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000387static void RefCreateFullyConnectedWorkloadTest()
388{
389 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100390 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100391 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000392
telsoa01c577f2c2018-08-31 09:22:23 +0100393 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
Derek Lambertif90c56d2020-01-10 17:14:08 +0000394 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
395 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000396 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100397 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
398 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000399}
400
Francis Murtagh43aec582019-05-27 12:14:10 +0100401BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000402{
Francis Murtagh43aec582019-05-27 12:14:10 +0100403 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000404}
405
Francis Murtagh43aec582019-05-27 12:14:10 +0100406BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000407{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000408 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000409}
410
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100411BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedSymm16)
Francis Murtagh46c09d02019-05-28 08:15:28 +0100412{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000413 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QSymmS16>();
Francis Murtagh46c09d02019-05-28 08:15:28 +0100414}
415
narpra0155a97bc2018-10-02 14:35:53 +0100416template <typename NormalizationWorkloadType, armnn::DataType DataType>
Matteo Martincigha160b242018-10-18 10:33:23 +0100417static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000418{
narpra0155a97bc2018-10-02 14:35:53 +0100419 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100420 RefWorkloadFactory factory = GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100421 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
422
423 TensorShape inputShape;
424 TensorShape outputShape;
425
426 switch (dataLayout)
427 {
428 case DataLayout::NHWC:
429 inputShape = { 3, 1, 5, 5 };
430 outputShape = { 3, 1, 5, 5 };
431 break;
432 case DataLayout::NCHW:
433 default:
434 inputShape = { 3, 5, 5, 1 };
435 outputShape = { 3, 5, 5, 1 };
436 break;
437 }
telsoa014fcda012018-03-09 14:13:49 +0000438
telsoa01c577f2c2018-08-31 09:22:23 +0100439 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
Matteo Martincigha160b242018-10-18 10:33:23 +0100440 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
narpra0155a97bc2018-10-02 14:35:53 +0100441}
442
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100443BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NchwWorkload)
narpra0155a97bc2018-10-02 14:35:53 +0100444{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100445 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincigha160b242018-10-18 10:33:23 +0100446}
447
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100448BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NhwcWorkload)
Matteo Martincigha160b242018-10-18 10:33:23 +0100449{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100450 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
451}
452
453BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NchwWorkload)
454{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000455 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100456}
457
458BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NhwcWorkload)
459{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000460 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000461}
462
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100463BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NchwWorkload)
464{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000465 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100466}
467
468BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NhwcWorkload)
469{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000470 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100471}
472
telsoa01c577f2c2018-08-31 09:22:23 +0100473template <typename Pooling2dWorkloadType, armnn::DataType DataType>
James Conroy69482272018-10-19 10:41:35 +0100474static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000475{
476 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100477 RefWorkloadFactory factory = GetFactory();
James Conroy69482272018-10-19 10:41:35 +0100478 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph, dataLayout);
479
480 TensorShape inputShape;
481 TensorShape outputShape;
482
483 switch (dataLayout)
484 {
485 case DataLayout::NHWC:
486 inputShape = { 3, 5, 5, 2 };
487 outputShape = { 3, 2, 4, 2 };
488 break;
489 case DataLayout::NCHW:
490 default:
491 inputShape = { 3, 2, 5, 5 };
492 outputShape = { 3, 2, 2, 4 };
493 }
telsoa014fcda012018-03-09 14:13:49 +0000494
telsoa01c577f2c2018-08-31 09:22:23 +0100495 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100496 CheckInputOutput(std::move(workload),
497 TensorInfo(inputShape, DataType),
498 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000499}
500
501BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
502{
Teresa Charlina3b20472019-06-06 11:12:32 +0100503 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100504}
505
506BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32NhwcWorkload)
507{
Teresa Charlina3b20472019-06-06 11:12:32 +0100508 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000509}
510
511BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
512{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000513 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100514}
515
516BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
517{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000518 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000519}
520
Teresa Charlin0434df62019-06-06 13:40:35 +0100521BOOST_AUTO_TEST_CASE(CreatePooling2dInt16Workload)
522{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000523 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Teresa Charlin0434df62019-06-06 13:40:35 +0100524}
525
526BOOST_AUTO_TEST_CASE(CreatePooling2dInt16NhwcWorkload)
527{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000528 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Teresa Charlin0434df62019-06-06 13:40:35 +0100529}
530
telsoa01c577f2c2018-08-31 09:22:23 +0100531template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000532static void RefCreateSoftmaxWorkloadTest()
533{
534 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100535 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100536 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000537
telsoa01c577f2c2018-08-31 09:22:23 +0100538 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
Sadik Armaganbe88a572020-04-30 11:39:37 +0100539
540 armnn::TensorInfo tensorInfo({4, 1}, DataType);
541 if (DataType == armnn::DataType::QAsymmU8)
542 {
543 tensorInfo.SetQuantizationOffset(0);
544 tensorInfo.SetQuantizationScale(1.f / 256);
545 }
546 else if (DataType == armnn::DataType::QAsymmS8)
547 {
548 tensorInfo.SetQuantizationOffset(-128);
549 tensorInfo.SetQuantizationScale(1.f / 256);
550 }
telsoa014fcda012018-03-09 14:13:49 +0000551 CheckInputOutput(
552 std::move(workload),
Sadik Armaganbe88a572020-04-30 11:39:37 +0100553 tensorInfo,
554 tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000555}
556
557BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
558{
nikraj01a121de32019-05-29 10:51:05 +0100559 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000560}
561
Matthew Jackson9bff1442019-09-12 09:08:23 +0100562BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
563{
564 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float16>();
565}
566
nikraj01a121de32019-05-29 10:51:05 +0100567BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000568{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000569 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000570}
571
nikraj01248683f2019-05-29 16:46:50 +0100572BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
573{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000574 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QSymmS16>();
nikraj01248683f2019-05-29 16:46:50 +0100575}
576
telsoa01c577f2c2018-08-31 09:22:23 +0100577template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000578static void RefCreateSplitterWorkloadTest()
579{
580 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100581 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100582 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000583
telsoa01c577f2c2018-08-31 09:22:23 +0100584 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000585 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100586 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100587 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100588
Jan Eilersbb446e52020-04-02 13:56:54 +0100589 auto outputHandle0 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100590 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100591
Jan Eilersbb446e52020-04-02 13:56:54 +0100592 auto outputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100593 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100594
Jan Eilersbb446e52020-04-02 13:56:54 +0100595 auto outputHandle2 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100596 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000597}
598
599BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
600{
Ruomei Yan25339c32019-05-28 16:48:20 +0100601 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000602}
603
Matthew Jackson9bff1442019-09-12 09:08:23 +0100604BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
605{
606 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float16>();
607}
608
telsoa014fcda012018-03-09 14:13:49 +0000609BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
610{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000611 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000612}
613
Jim Flynne242f2d2019-05-22 14:24:13 +0100614template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
615static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000616{
telsoa01c577f2c2018-08-31 09:22:23 +0100617 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100618 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100619 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100620 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
621 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000622
623 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100624 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100625 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
626 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000627
628 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100629 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000630
telsoa01c577f2c2018-08-31 09:22:23 +0100631 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100632 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
633 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
634 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
635 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000636
637 BOOST_TEST(sOut0);
638 BOOST_TEST(sOut1);
639 BOOST_TEST(mIn0);
640 BOOST_TEST(mIn1);
641
642 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
643
644 BOOST_TEST(validDataPointers);
645}
646
Jim Flynne242f2d2019-05-22 14:24:13 +0100647BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000648{
Ruomei Yan25339c32019-05-28 16:48:20 +0100649 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000650}
651
Matthew Jackson9bff1442019-09-12 09:08:23 +0100652BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16)
653{
654 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float16>();
655}
656
Jim Flynne242f2d2019-05-22 14:24:13 +0100657BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000658{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000659 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000660}
661
telsoa01c577f2c2018-08-31 09:22:23 +0100662template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000663static void RefCreateSingleOutputMultipleInputsTest()
664{
telsoa01c577f2c2018-08-31 09:22:23 +0100665 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
666 // 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 +0000667
668 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100669 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000670 std::unique_ptr<SplitterWorkloadType> wlSplitter;
671 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
672 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
673 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
674 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
675
676 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100677 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000678
Matthew Bentham4cefc412019-06-18 16:14:34 +0100679 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
680 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
681 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
682 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
683 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
684 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000685
686
687 BOOST_TEST(sOut0);
688 BOOST_TEST(sOut1);
689 BOOST_TEST(activ0_0Im);
690 BOOST_TEST(activ0_1Im);
691 BOOST_TEST(activ1_0Im);
692 BOOST_TEST(activ1_1Im);
693
694 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
695 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
696
697 BOOST_TEST(validDataPointers);
698}
699
700BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
701{
Ruomei Yan25339c32019-05-28 16:48:20 +0100702 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100703 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000704}
705
706BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
707{
Ruomei Yan25339c32019-05-28 16:48:20 +0100708 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000709 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000710}
711
telsoa01c577f2c2018-08-31 09:22:23 +0100712template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100713static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000714{
715 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100716 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100717 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
718
719 TensorShape inputShape;
720 TensorShape outputShape;
721
722 switch (dataLayout)
723 {
724 case DataLayout::NHWC:
725 inputShape = { 2, 4, 4, 3 };
726 outputShape = { 2, 2, 2, 3 };
727 break;
James Conroy69482272018-10-19 10:41:35 +0100728 case DataLayout::NCHW:
729 default:
James Conroy59540822018-10-11 12:39:05 +0100730 inputShape = { 2, 3, 4, 4 };
731 outputShape = { 2, 3, 2, 2 };
732 }
telsoa014fcda012018-03-09 14:13:49 +0000733
telsoa01c577f2c2018-08-31 09:22:23 +0100734 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100735 CheckInputOutput(std::move(workload),
736 TensorInfo(inputShape, DataType),
737 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000738}
739
740BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
741{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100742 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000743}
744
Matthew Jackson9bff1442019-09-12 09:08:23 +0100745BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16)
746{
747 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
748}
749
telsoa014fcda012018-03-09 14:13:49 +0000750BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
751{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000752 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100753}
754
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100755BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
756{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000757 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100758}
759
James Conroy59540822018-10-11 12:39:05 +0100760BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
761{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100762 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000763}
764
Francis Murtagh57f13d52019-06-24 14:24:36 +0100765template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
766static void RefCreateBatchToSpaceNdTest()
767{
768 Graph graph;
769 RefWorkloadFactory factory;
770
771 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
772
773 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100774 TensorInfo({ 1, 1, 1, 1 }, DataType),
775 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100776}
777
778BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
779{
780 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
781}
782
Matthew Jackson9bff1442019-09-12 09:08:23 +0100783BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat16)
784{
785 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float16>();
786}
787
Francis Murtagh57f13d52019-06-24 14:24:36 +0100788BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
789{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000790 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QAsymmU8>();
Francis Murtagh57f13d52019-06-24 14:24:36 +0100791}
792
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100793BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
794{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000795 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QSymmS16>();
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100796}
797
Matteo Martincighb63973e2018-10-16 16:23:33 +0100798template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
799static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000800{
801 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100802 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100803 auto workload =
804 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
805
806 TensorShape inputShape;
807 TensorShape outputShape;
808
809 switch (dataLayout)
810 {
811 case DataLayout::NHWC:
812 inputShape = { 5, 50, 67, 20 };
813 outputShape = { 5, 50, 67, 20 };
814 break;
815 case DataLayout::NCHW:
816 default:
817 inputShape = { 5, 20, 50, 67 };
818 outputShape = { 5, 20, 50, 67 };
819 break;
820 }
telsoa014fcda012018-03-09 14:13:49 +0000821
telsoa01c577f2c2018-08-31 09:22:23 +0100822 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100823 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
824}
825
826BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
827{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100828 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100829}
830
831BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
832{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100833 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
834}
835
836BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
837{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000838 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100839}
840
841BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
842{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000843 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000844}
845
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100846BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
847{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000848 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100849}
850
851BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
852{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000853 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100854}
855
telsoa01c577f2c2018-08-31 09:22:23 +0100856template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000857static void RefCreateReshapeWorkloadTest()
858{
859 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100860 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100861 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000862
telsoa01c577f2c2018-08-31 09:22:23 +0100863 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000864 CheckInputOutput(
865 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100866 TensorInfo({ 4, 1 }, DataType),
867 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000868}
869
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100870BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000871{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100872 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000873}
874
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100875BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000876{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000877 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000878}
879
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100880BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
881{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000882 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QSymmS16>();
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100883}
884
Jim Flynne242f2d2019-05-22 14:24:13 +0100885template <typename ConcatWorkloadType, armnn::DataType DataType>
886static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000887 unsigned int concatAxis)
888{
889 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100890 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100891 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000892
893 CheckInputsOutput(std::move(workload),
894 TensorInfo({ 2, 3, 2, 5 }, DataType),
895 TensorInfo({ 2, 3, 2, 5 }, DataType),
896 TensorInfo(outputShape, DataType));
897}
898
Jim Flynne242f2d2019-05-22 14:24:13 +0100899BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000900{
Jim Flynne242f2d2019-05-22 14:24:13 +0100901 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000902}
903
Matthew Jackson9bff1442019-09-12 09:08:23 +0100904BOOST_AUTO_TEST_CASE(CreateConcatDim0Float16Workload)
905{
906 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float16>({ 4, 3, 2, 5 }, 0);
907}
908
Jim Flynne242f2d2019-05-22 14:24:13 +0100909BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000910{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000911 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +0100912}
913
Jim Flynne242f2d2019-05-22 14:24:13 +0100914BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +0100915{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000916 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QSymmS16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +0000917}
918
Jim Flynne242f2d2019-05-22 14:24:13 +0100919BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000920{
Jim Flynne242f2d2019-05-22 14:24:13 +0100921 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000922}
923
Jim Flynne242f2d2019-05-22 14:24:13 +0100924BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000925{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000926 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +0000927}
928
Jim Flynne242f2d2019-05-22 14:24:13 +0100929BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000930{
Jim Flynne242f2d2019-05-22 14:24:13 +0100931 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000932}
933
Jim Flynne242f2d2019-05-22 14:24:13 +0100934BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000935{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000936 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +0000937}
938
Jim Flynne242f2d2019-05-22 14:24:13 +0100939BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +0000940{
Jim Flynne242f2d2019-05-22 14:24:13 +0100941 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000942}
943
Jim Flynne242f2d2019-05-22 14:24:13 +0100944BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +0000945{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000946 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +0000947}
948
Nina Drozd58ef2c62019-05-16 12:09:18 +0100949template <typename ConstantWorkloadType, armnn::DataType DataType>
950static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
951{
952 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100953 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +0100954 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
955
956 // Check output is as expected
957 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100958 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +0100959 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
960}
961
962BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
963{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000964 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100965}
966
967BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
968{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000969 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QSymmS16>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +0100970}
971
972BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
973{
974 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
975}
976
977BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
978{
979 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
980}
981
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100982static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
983 const armnn::TensorShape& alphaShape,
984 const armnn::TensorShape& outputShape,
985 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +0100986{
987 armnn::Graph graph;
988 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100989 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
990 graph,
991 inputShape,
992 alphaShape,
993 outputShape,
994 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +0100995
996 // Check output is as expected
997 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100998 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +0100999 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +01001000}
1001
1002BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
1003{
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001004 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001005}
1006
Matthew Jackson9bff1442019-09-12 09:08:23 +01001007BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
1008{
1009 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float16);
1010}
1011
Matteo Martincighab9e5252019-06-13 17:27:46 +01001012BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
1013{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001014 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QAsymmU8);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001015}
1016
1017BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
1018{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001019 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QSymmS16);
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001020}
1021
1022BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
1023{
1024 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1025 armnn::DataType::Float32),
1026 armnn::InvalidArgumentException);
1027}
1028
Matthew Jackson9bff1442019-09-12 09:08:23 +01001029BOOST_AUTO_TEST_CASE(CreatePreluFloat16NoBroadcastWorkload)
1030{
1031 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1032 armnn::DataType::Float16),
1033 armnn::InvalidArgumentException);
1034}
1035
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001036BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
1037{
1038 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001039 armnn::DataType::QAsymmU8),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001040 armnn::InvalidArgumentException);
1041}
1042
1043BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
1044{
1045 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001046 armnn::DataType::QSymmS16),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001047 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001048}
1049
James Conroy60597842019-07-02 10:57:56 +01001050template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
1051static void RefCreateSpaceToDepthWorkloadTest()
1052{
1053 Graph graph;
1054 RefWorkloadFactory factory;
1055
1056 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1057
1058 CheckInputOutput(std::move(workload),
1059 TensorInfo({ 1, 2, 2, 1 }, DataType),
1060 TensorInfo({ 1, 1, 1, 4 }, DataType));
1061}
1062
1063BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
1064{
1065 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
1066}
1067
Matthew Jackson9bff1442019-09-12 09:08:23 +01001068BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat16)
1069{
1070 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float16>();
1071}
1072
James Conroy60597842019-07-02 10:57:56 +01001073BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
1074{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001075 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001076}
1077
1078BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
1079{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001080 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001081}
1082
Matthew Jacksond5166102019-07-31 14:06:28 +01001083template <armnn::DataType DataType>
Matthew Jackson81e601c2019-07-11 12:07:09 +01001084static void RefCreateStackWorkloadTest(const armnn::TensorShape& inputShape,
1085 const armnn::TensorShape& outputShape,
1086 unsigned int axis,
Matthew Jacksond5166102019-07-31 14:06:28 +01001087 unsigned int numInputs)
Matthew Jackson81e601c2019-07-11 12:07:09 +01001088{
1089 armnn::Graph graph;
1090 RefWorkloadFactory factory;
Matthew Jacksond5166102019-07-31 14:06:28 +01001091 auto workload = CreateStackWorkloadTest<RefStackWorkload, DataType>(factory,
1092 graph,
1093 inputShape,
1094 outputShape,
1095 axis,
1096 numInputs);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001097
Matthew Jacksond5166102019-07-31 14:06:28 +01001098 // Check inputs and output are as expected
1099 StackQueueDescriptor queueDescriptor = workload->GetData();
1100 for (unsigned int i = 0; i < numInputs; ++i)
1101 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001102 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001103 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo(inputShape, DataType)));
1104 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001105 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001106 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
Matthew Jackson81e601c2019-07-11 12:07:09 +01001107}
1108
1109BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1110{
Matthew Jacksond5166102019-07-31 14:06:28 +01001111 RefCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001112}
1113
1114BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1115{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001116 RefCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001117}
1118
1119BOOST_AUTO_TEST_CASE(CreateStackUint16Workload)
1120{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001121 RefCreateStackWorkloadTest<armnn::DataType::QSymmS16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001122}
1123
James Conroy4f1f8992020-04-29 20:01:10 +01001124template <typename QLstmWorkloadType>
1125static void RefCreateQLstmWorkloadTest()
1126{
1127 Graph graph;
1128 RefWorkloadFactory factory;
1129
1130 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1131
1132 armnn::TensorInfo inputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.0078125f, 0);
1133
1134 armnn::TensorInfo cellStateInfo({2 , 4}, armnn::DataType::QSymmS16, 3.05176e-05f, 0);
1135
1136 armnn::TensorInfo outputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.007f, 0);
1137
1138 QLstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersaaf9a8f2020-07-01 16:35:35 +01001139 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
1140 auto cellStateOutHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
1141 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
James Conroy4f1f8992020-04-29 20:01:10 +01001142
1143 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
1144 BOOST_TEST((cellStateOutHandle->GetTensorInfo() == cellStateInfo));
1145 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
1146}
1147
Rob Hughes985ef1f2020-05-19 16:31:10 +01001148BOOST_AUTO_TEST_CASE(CreateQLstmWorkload)
James Conroy4f1f8992020-04-29 20:01:10 +01001149{
1150 RefCreateQLstmWorkloadTest<RefQLstmWorkload>();
1151}
1152
telsoa014fcda012018-03-09 14:13:49 +00001153BOOST_AUTO_TEST_SUITE_END()