blob: 0f86e7eeff59b8f84463eec7b323a61b718def8d [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
Keith Davisdf04d232020-10-23 17:20:05 +010092BOOST_AUTO_TEST_CASE(CreateSubtractionWorkloadWithBlobTest)
93{
94 Graph graph;
95 RefWorkloadFactory factory = GetFactory();
96 armnn::DataType DataType = armnn::DataType::Float32;
97
98 auto workload = CreateSubtractionWithBlobWorkloadTest<RefSubtractionWorkload<>,
99 SubtractionQueueDescriptor,
100 armnn::DataType::Float32>
101 (factory, graph);
102
103 CheckInputsOutput(std::move(workload),
104 TensorInfo({ 2, 3 }, DataType),
105 TensorInfo({ 2, 3 }, DataType),
106 TensorInfo({ 2, 3 }, DataType));
107}
108
109BOOST_AUTO_TEST_CASE(CreateAdditionWorkloadWithBlobTest)
110{
111 Graph graph;
112 RefWorkloadFactory factory = GetFactory();
113 armnn::DataType DataType = armnn::DataType::Float32;
114
115 auto workload = CreateAdditionWithBlobWorkloadTest<RefAdditionWorkload<>,
116 AdditionQueueDescriptor,
117 armnn::DataType::Float32>(factory, graph);
118
119 CheckInputsOutput(std::move(workload),
120 TensorInfo({ 2, 3 }, DataType),
121 TensorInfo({ 2, 3 }, DataType),
122 TensorInfo({ 2, 3 }, DataType));
123}
124
125BOOST_AUTO_TEST_CASE(CreateMultiplicationWorkloadWithBlobTest)
126{
127 Graph graph;
128 RefWorkloadFactory factory = GetFactory();
129 armnn::DataType DataType = armnn::DataType::Float32;
130
131 auto workload = CreateMultiplicationWithBlobWorkloadTest<RefMultiplicationWorkload<>,
132 MultiplicationQueueDescriptor,
133 armnn::DataType::Float32>(factory, graph);
134
135 CheckInputsOutput(std::move(workload),
136 TensorInfo({2, 3}, DataType),
137 TensorInfo({2, 3}, DataType),
138 TensorInfo({2, 3}, DataType));
139}
140
telsoa014fcda012018-03-09 14:13:49 +0000141BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
142{
Finn Williamscbd2c232020-06-22 15:58:32 +0100143 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000144 AdditionQueueDescriptor,
145 AdditionLayer,
146 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000147}
148
149BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
150{
Finn Williamscbd2c232020-06-22 15:58:32 +0100151 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000152 AdditionQueueDescriptor,
153 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000154 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100155}
156
Sadik Armagan2999a022019-04-09 14:20:12 +0100157BOOST_AUTO_TEST_CASE(CreateAdditionInt16Workload)
158{
Finn Williamscbd2c232020-06-22 15:58:32 +0100159 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100160 AdditionQueueDescriptor,
161 AdditionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000162 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100163}
164
Finn Williamscbd2c232020-06-22 15:58:32 +0100165BOOST_AUTO_TEST_CASE(CreateAdditionInt32Workload)
166{
167 RefCreateElementwiseWorkloadTest<RefAdditionWorkload<int32_t>,
168 AdditionQueueDescriptor,
169 AdditionLayer,
170 armnn::DataType::Signed32>();
171}
172
Matthew Jackson9bff1442019-09-12 09:08:23 +0100173BOOST_AUTO_TEST_CASE(CreateSubtractionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100174{
Finn Williamscbd2c232020-06-22 15:58:32 +0100175 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000176 SubtractionQueueDescriptor,
177 SubtractionLayer,
178 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100179}
180
Matthew Jackson9bff1442019-09-12 09:08:23 +0100181BOOST_AUTO_TEST_CASE(CreateSubtractionFloat16Workload)
182{
Finn Williamscbd2c232020-06-22 15:58:32 +0100183 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100184 SubtractionQueueDescriptor,
185 SubtractionLayer,
186 armnn::DataType::Float16>();
187}
188
David Beckbc392452018-09-10 14:47:28 +0100189BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
190{
Finn Williamscbd2c232020-06-22 15:58:32 +0100191 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000192 SubtractionQueueDescriptor,
193 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000194 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100195}
196
Sadik Armagan2999a022019-04-09 14:20:12 +0100197BOOST_AUTO_TEST_CASE(CreateSubtractionInt16Workload)
198{
Finn Williamscbd2c232020-06-22 15:58:32 +0100199 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100200 SubtractionQueueDescriptor,
201 SubtractionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000202 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100203}
204
Finn Williamscbd2c232020-06-22 15:58:32 +0100205BOOST_AUTO_TEST_CASE(CreateSubtractionInt32Workload)
206{
207 RefCreateElementwiseWorkloadTest<RefSubtractionWorkload<int32_t>,
208 SubtractionQueueDescriptor,
209 SubtractionLayer,
210 armnn::DataType::Signed32>();
211}
212
David Beckbc392452018-09-10 14:47:28 +0100213BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
214{
Finn Williamscbd2c232020-06-22 15:58:32 +0100215 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000216 MultiplicationQueueDescriptor,
217 MultiplicationLayer,
218 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100219}
220
221BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
222{
Finn Williamscbd2c232020-06-22 15:58:32 +0100223 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000224 MultiplicationQueueDescriptor,
225 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000226 armnn::DataType::QAsymmU8>();
David Beckbc392452018-09-10 14:47:28 +0100227}
228
Sadik Armagan2999a022019-04-09 14:20:12 +0100229BOOST_AUTO_TEST_CASE(CreateMultiplicationInt16Workload)
230{
Finn Williamscbd2c232020-06-22 15:58:32 +0100231 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100232 MultiplicationQueueDescriptor,
233 MultiplicationLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000234 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100235}
236
Finn Williamscbd2c232020-06-22 15:58:32 +0100237BOOST_AUTO_TEST_CASE(CreateMultiplicationInt32Workload)
238{
239 RefCreateElementwiseWorkloadTest<RefMultiplicationWorkload<int32_t>,
240 MultiplicationQueueDescriptor,
241 MultiplicationLayer,
242 armnn::DataType::Signed32>();
243}
244
Matthew Jackson9bff1442019-09-12 09:08:23 +0100245BOOST_AUTO_TEST_CASE(CreateDivisionFloat32Workload)
David Beckbc392452018-09-10 14:47:28 +0100246{
Finn Williamscbd2c232020-06-22 15:58:32 +0100247 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000248 DivisionQueueDescriptor,
249 DivisionLayer,
250 armnn::DataType::Float32>();
David Beckbc392452018-09-10 14:47:28 +0100251}
252
Matthew Jackson9bff1442019-09-12 09:08:23 +0100253BOOST_AUTO_TEST_CASE(CreateDivisionFloat16Workload)
254{
Finn Williamscbd2c232020-06-22 15:58:32 +0100255 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Matthew Jackson9bff1442019-09-12 09:08:23 +0100256 DivisionQueueDescriptor,
257 DivisionLayer,
258 armnn::DataType::Float16>();
259}
260
David Beckbc392452018-09-10 14:47:28 +0100261BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
262{
Finn Williamscbd2c232020-06-22 15:58:32 +0100263 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Éanna Ó Catháind57415d2018-11-28 16:24:38 +0000264 DivisionQueueDescriptor,
265 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000266 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000267}
268
Sadik Armagan2999a022019-04-09 14:20:12 +0100269BOOST_AUTO_TEST_CASE(CreateDivisionInt16Workload)
270{
Finn Williamscbd2c232020-06-22 15:58:32 +0100271 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<>,
Sadik Armagan2999a022019-04-09 14:20:12 +0100272 DivisionQueueDescriptor,
273 DivisionLayer,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000274 armnn::DataType::QSymmS16>();
Sadik Armagan2999a022019-04-09 14:20:12 +0100275}
276
Finn Williamscbd2c232020-06-22 15:58:32 +0100277BOOST_AUTO_TEST_CASE(CreateDivisionInt32Workload)
278{
279 RefCreateElementwiseWorkloadTest<RefDivisionWorkload<int32_t>,
280 DivisionQueueDescriptor,
281 DivisionLayer,
282 armnn::DataType::Signed32>();
283}
284
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100285template <typename BatchNormalizationWorkloadType, armnn::DataType DataType>
286static void RefCreateBatchNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000287{
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100288 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100289 RefWorkloadFactory factory = GetFactory();
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100290 auto workload = CreateBatchNormalizationWorkloadTest<BatchNormalizationWorkloadType, DataType>(factory,
291 graph,
292 dataLayout);
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100293
294 TensorShape inputShape;
295 TensorShape outputShape;
296
297 switch (dataLayout)
298 {
299 case DataLayout::NHWC:
Nikhil Rajd1340932018-10-18 14:27:50 +0100300 inputShape = { 2, 4, 4, 3 };
301 outputShape = { 2, 4, 4, 3 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100302 break;
303 case DataLayout::NCHW:
304 default:
Nikhil Rajd1340932018-10-18 14:27:50 +0100305 inputShape = { 2, 3, 4, 4 };
306 outputShape = { 2, 3, 4, 4 };
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100307 break;
308 }
telsoa014fcda012018-03-09 14:13:49 +0000309
telsoa01c577f2c2018-08-31 09:22:23 +0100310 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100311 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
312}
313
Keith Davisdf04d232020-10-23 17:20:05 +0100314BOOST_AUTO_TEST_CASE(CreateBatchNormalizationWithBlobFloat32Workload)
315{
316 Graph graph;
317 RefWorkloadFactory factory = GetFactory();
318 auto dataType = armnn::DataType::Float32;
319 auto workload = CreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,
320 armnn::DataType::Float32>(factory, graph, DataLayout::NHWC);
321
322 TensorShape inputShape;
323 TensorShape outputShape;
324
325 inputShape = { 2, 4, 4, 3 };
326 outputShape = { 2, 4, 4, 3 };
327
328 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
329 CheckInputOutput(std::move(workload), TensorInfo(inputShape, dataType), TensorInfo(outputShape, dataType));
330}
331
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100332BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32Workload)
333{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100334 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100335 (DataLayout::NCHW);
336}
337
338BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat32WorkloadNhwc)
339{
Matteo Martincigh3122bd52019-06-03 16:54:25 +0100340 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float32>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100341 (DataLayout::NHWC);
342}
343
Matthew Jackson9bff1442019-09-12 09:08:23 +0100344BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16Workload)
345{
346 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload,armnn::DataType::Float16>
347 (DataLayout::NCHW);
348}
349
350BOOST_AUTO_TEST_CASE(CreateBatchNormalizationFloat16WorkloadNhwc)
351{
352 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::Float16>
353 (DataLayout::NHWC);
354}
355
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100356BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8Workload)
357{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000358 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100359 (DataLayout::NCHW);
360}
361
362BOOST_AUTO_TEST_CASE(CreateBatchNormalizationUint8WorkloadNhwc)
363{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000364 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QAsymmU8>
Matteo Martincigh3dc43032018-10-18 10:55:19 +0100365 (DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000366}
367
Matteo Martincighf5507132019-06-04 10:59:47 +0100368BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16Workload)
369{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000370 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100371 (DataLayout::NCHW);
372}
373
374BOOST_AUTO_TEST_CASE(CreateBatchNormalizationInt16WorkloadNhwc)
375{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000376 RefCreateBatchNormalizationWorkloadTest<RefBatchNormalizationWorkload, armnn::DataType::QSymmS16>
Matteo Martincighf5507132019-06-04 10:59:47 +0100377 (DataLayout::NHWC);
378}
379
telsoa01c577f2c2018-08-31 09:22:23 +0100380BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
381{
382 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100383 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100384 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
385
386 // Checks that outputs and inputs are as we expect them
387 CheckInputOutput(
388 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
389}
390
391BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
392{
393 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100394 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100395 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
396
397 // Checks that outputs and inputs are as we expect them
398 CheckInputOutput(
399 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
400}
401
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100402static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000403{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100404 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100405 RefWorkloadFactory factory = GetFactory();
Mike Kelly9b398322019-05-22 17:21:49 +0100406 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100407 (factory, graph, dataLayout);
408
Mike Kellydb482882019-06-14 12:35:24 +0100409 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
410 : std::initializer_list<unsigned int>({2, 8, 16, 3});
411 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
412 : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000413
telsoa01c577f2c2018-08-31 09:22:23 +0100414 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000415 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100416 TensorInfo(inputShape, DataType::Float32),
417 TensorInfo(outputShape, DataType::Float32));
418}
419
420BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
421{
422 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
423}
424
425BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
426{
427 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000428}
429
Keith Davisdf04d232020-10-23 17:20:05 +0100430BOOST_AUTO_TEST_CASE(CreateConvolution2dWithBlobWorkload)
431{
432 DataLayout dataLayout = DataLayout::NHWC;
433 Graph graph;
434 RefWorkloadFactory factory = GetFactory();
435 auto workload = CreateConvolution2dFusedActivationWithBlobWorkloadTest<RefConvolution2dWorkload, DataType::Float32>
436 (factory, graph, dataLayout);
437
438 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 3, 8, 16})
439 : std::initializer_list<unsigned int>({2, 8, 16, 3});
440 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({2, 2, 2, 10})
441 : std::initializer_list<unsigned int>({2, 2, 10, 2});
442
443 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
444 CheckInputOutput(std::move(workload),
445 TensorInfo(inputShape, DataType::Float32),
446 TensorInfo(outputShape, DataType::Float32));
447}
448
Ruomei Yan495852f2019-05-23 11:37:33 +0100449static void RefCreateDepthwiseConvolutionWorkloadTest(DataLayout dataLayout)
450{
451 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100452 RefWorkloadFactory factory = GetFactory();
Ruomei Yan495852f2019-05-23 11:37:33 +0100453 auto workload = CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dWorkload, DataType::Float32>
454 (factory, graph, dataLayout);
455
Mike Kellydb482882019-06-14 12:35:24 +0100456 TensorShape inputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
457 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
458 TensorShape outputShape = (dataLayout == DataLayout::NCHW) ? std::initializer_list<unsigned int>({ 2, 2, 5, 5 })
459 : std::initializer_list<unsigned int>({ 2, 5, 5, 2 });
460
Ruomei Yan495852f2019-05-23 11:37:33 +0100461 // Checks that inputs/outputs are as we expect them (see definition of CreateDepthwiseConvolution2dWorkloadTest).
462 CheckInputOutput(std::move(workload),
463 TensorInfo(inputShape, DataType::Float32),
464 TensorInfo(outputShape, DataType::Float32));
465}
466
467BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolutionFloat32NhwcWorkload)
468{
469 RefCreateDepthwiseConvolutionWorkloadTest(DataLayout::NHWC);
470}
471
Keith Davisdf04d232020-10-23 17:20:05 +0100472BOOST_AUTO_TEST_CASE(RefCreateFullyConnectedWithBlobWorkloadTest)
473{
474 Graph graph;
475 RefWorkloadFactory factory = GetFactory();
476 auto workload = CreateFullyConnectedWithBlobWorkloadTest<RefFullyConnectedWorkload,
477 armnn::DataType::Float32>(factory, graph);
478
479 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
480 float inputsQScale = 0.0f;
481 float outputQScale = 0.0f;
482 CheckInputOutput(std::move(workload),
483 TensorInfo({ 3, 1, 4, 5 }, armnn::DataType::Float32, inputsQScale),
484 TensorInfo({ 3, 7 }, armnn::DataType::Float32, outputQScale));
485}
486
telsoa01c577f2c2018-08-31 09:22:23 +0100487template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000488static void RefCreateFullyConnectedWorkloadTest()
489{
490 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100491 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100492 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000493
telsoa01c577f2c2018-08-31 09:22:23 +0100494 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
Derek Lambertif90c56d2020-01-10 17:14:08 +0000495 float inputsQScale = DataType == armnn::DataType::QAsymmU8 ? 1.0f : 0.0;
496 float outputQScale = DataType == armnn::DataType::QAsymmU8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000497 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100498 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
499 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000500}
501
Francis Murtagh43aec582019-05-27 12:14:10 +0100502BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000503{
Francis Murtagh43aec582019-05-27 12:14:10 +0100504 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000505}
506
Francis Murtagh43aec582019-05-27 12:14:10 +0100507BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000508{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000509 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000510}
511
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100512BOOST_AUTO_TEST_CASE(CreateFullyConnectedWorkloadQuantisedSymm16)
Francis Murtagh46c09d02019-05-28 08:15:28 +0100513{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000514 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedWorkload, armnn::DataType::QSymmS16>();
Francis Murtagh46c09d02019-05-28 08:15:28 +0100515}
516
narpra0155a97bc2018-10-02 14:35:53 +0100517template <typename NormalizationWorkloadType, armnn::DataType DataType>
Matteo Martincigha160b242018-10-18 10:33:23 +0100518static void RefCreateNormalizationWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000519{
narpra0155a97bc2018-10-02 14:35:53 +0100520 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100521 RefWorkloadFactory factory = GetFactory();
Matteo Martincigha160b242018-10-18 10:33:23 +0100522 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
523
524 TensorShape inputShape;
525 TensorShape outputShape;
526
527 switch (dataLayout)
528 {
529 case DataLayout::NHWC:
530 inputShape = { 3, 1, 5, 5 };
531 outputShape = { 3, 1, 5, 5 };
532 break;
533 case DataLayout::NCHW:
534 default:
535 inputShape = { 3, 5, 5, 1 };
536 outputShape = { 3, 5, 5, 1 };
537 break;
538 }
telsoa014fcda012018-03-09 14:13:49 +0000539
telsoa01c577f2c2018-08-31 09:22:23 +0100540 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
Matteo Martincigha160b242018-10-18 10:33:23 +0100541 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
narpra0155a97bc2018-10-02 14:35:53 +0100542}
543
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100544BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NchwWorkload)
narpra0155a97bc2018-10-02 14:35:53 +0100545{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100546 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincigha160b242018-10-18 10:33:23 +0100547}
548
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100549BOOST_AUTO_TEST_CASE(CreateRefNormalizationFloat32NhwcWorkload)
Matteo Martincigha160b242018-10-18 10:33:23 +0100550{
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100551 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
552}
553
554BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NchwWorkload)
555{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000556 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Matteo Martincigh2fc70c52019-06-05 14:12:48 +0100557}
558
559BOOST_AUTO_TEST_CASE(CreateRefNormalizationUint8NhwcWorkload)
560{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000561 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000562}
563
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100564BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NchwWorkload)
565{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000566 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100567}
568
569BOOST_AUTO_TEST_CASE(CreateRefNormalizationInt16NhwcWorkload)
570{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000571 RefCreateNormalizationWorkloadTest<RefNormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Matteo Martincigh6aeb7712019-06-05 17:23:29 +0100572}
573
telsoa01c577f2c2018-08-31 09:22:23 +0100574template <typename Pooling2dWorkloadType, armnn::DataType DataType>
James Conroy69482272018-10-19 10:41:35 +0100575static void RefCreatePooling2dWorkloadTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000576{
577 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100578 RefWorkloadFactory factory = GetFactory();
James Conroy69482272018-10-19 10:41:35 +0100579 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph, dataLayout);
580
581 TensorShape inputShape;
582 TensorShape outputShape;
583
584 switch (dataLayout)
585 {
586 case DataLayout::NHWC:
587 inputShape = { 3, 5, 5, 2 };
588 outputShape = { 3, 2, 4, 2 };
589 break;
590 case DataLayout::NCHW:
591 default:
592 inputShape = { 3, 2, 5, 5 };
593 outputShape = { 3, 2, 2, 4 };
594 }
telsoa014fcda012018-03-09 14:13:49 +0000595
telsoa01c577f2c2018-08-31 09:22:23 +0100596 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100597 CheckInputOutput(std::move(workload),
598 TensorInfo(inputShape, DataType),
599 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000600}
601
602BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
603{
Teresa Charlina3b20472019-06-06 11:12:32 +0100604 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100605}
606
607BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32NhwcWorkload)
608{
Teresa Charlina3b20472019-06-06 11:12:32 +0100609 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000610}
611
612BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
613{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000614 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy69482272018-10-19 10:41:35 +0100615}
616
617BOOST_AUTO_TEST_CASE(CreatePooling2dUint8NhwcWorkload)
618{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000619 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000620}
621
Teresa Charlin0434df62019-06-06 13:40:35 +0100622BOOST_AUTO_TEST_CASE(CreatePooling2dInt16Workload)
623{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000624 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Teresa Charlin0434df62019-06-06 13:40:35 +0100625}
626
627BOOST_AUTO_TEST_CASE(CreatePooling2dInt16NhwcWorkload)
628{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000629 RefCreatePooling2dWorkloadTest<RefPooling2dWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
Teresa Charlin0434df62019-06-06 13:40:35 +0100630}
631
telsoa01c577f2c2018-08-31 09:22:23 +0100632template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000633static void RefCreateSoftmaxWorkloadTest()
634{
635 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100636 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100637 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000638
telsoa01c577f2c2018-08-31 09:22:23 +0100639 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
Sadik Armaganbe88a572020-04-30 11:39:37 +0100640
641 armnn::TensorInfo tensorInfo({4, 1}, DataType);
642 if (DataType == armnn::DataType::QAsymmU8)
643 {
644 tensorInfo.SetQuantizationOffset(0);
645 tensorInfo.SetQuantizationScale(1.f / 256);
646 }
647 else if (DataType == armnn::DataType::QAsymmS8)
648 {
649 tensorInfo.SetQuantizationOffset(-128);
650 tensorInfo.SetQuantizationScale(1.f / 256);
651 }
telsoa014fcda012018-03-09 14:13:49 +0000652 CheckInputOutput(
653 std::move(workload),
Sadik Armaganbe88a572020-04-30 11:39:37 +0100654 tensorInfo,
655 tensorInfo);
telsoa014fcda012018-03-09 14:13:49 +0000656}
657
658BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
659{
nikraj01a121de32019-05-29 10:51:05 +0100660 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000661}
662
Matthew Jackson9bff1442019-09-12 09:08:23 +0100663BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat16Workload)
664{
665 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::Float16>();
666}
667
nikraj01a121de32019-05-29 10:51:05 +0100668BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedAsymm8Workload)
telsoa014fcda012018-03-09 14:13:49 +0000669{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000670 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000671}
672
nikraj01248683f2019-05-29 16:46:50 +0100673BOOST_AUTO_TEST_CASE(CreateSoftmaxQuantisedSymm16Workload)
674{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000675 RefCreateSoftmaxWorkloadTest<RefSoftmaxWorkload, armnn::DataType::QSymmS16>();
nikraj01248683f2019-05-29 16:46:50 +0100676}
677
telsoa01c577f2c2018-08-31 09:22:23 +0100678template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000679static void RefCreateSplitterWorkloadTest()
680{
681 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100682 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100683 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000684
telsoa01c577f2c2018-08-31 09:22:23 +0100685 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000686 SplitterQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +0100687 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100688 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100689
Jan Eilersbb446e52020-04-02 13:56:54 +0100690 auto outputHandle0 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100691 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100692
Jan Eilersbb446e52020-04-02 13:56:54 +0100693 auto outputHandle1 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100694 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100695
Jan Eilersbb446e52020-04-02 13:56:54 +0100696 auto outputHandle2 = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100697 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000698}
699
700BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
701{
Ruomei Yan25339c32019-05-28 16:48:20 +0100702 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000703}
704
Matthew Jackson9bff1442019-09-12 09:08:23 +0100705BOOST_AUTO_TEST_CASE(CreateSplitterFloat16Workload)
706{
707 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::Float16>();
708}
709
telsoa014fcda012018-03-09 14:13:49 +0000710BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
711{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000712 RefCreateSplitterWorkloadTest<RefSplitterWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000713}
714
Jim Flynne242f2d2019-05-22 14:24:13 +0100715template <typename SplitterWorkloadType, typename ConcatWorkloadType, armnn::DataType DataType>
716static void RefCreateSplitterConcatWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000717{
telsoa01c577f2c2018-08-31 09:22:23 +0100718 // Tests that it is possible to decide which output of the splitter layer
Jim Flynne242f2d2019-05-22 14:24:13 +0100719 // should be lined to which input of the concat layer.
telsoa01c577f2c2018-08-31 09:22:23 +0100720 // We tested that is is possible to specify 0th output
Jim Flynne242f2d2019-05-22 14:24:13 +0100721 // of the splitter to be the 1st input to the concat and the 1st output of the splitter to be 0th input
722 // of the concat.
telsoa014fcda012018-03-09 14:13:49 +0000723
724 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100725 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100726 auto workloads = CreateSplitterConcatWorkloadTest<SplitterWorkloadType, ConcatWorkloadType, DataType>
727 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000728
729 auto wlSplitter = std::move(workloads.first);
Jim Flynne242f2d2019-05-22 14:24:13 +0100730 auto wlConcat = std::move(workloads.second);
telsoa014fcda012018-03-09 14:13:49 +0000731
telsoa01c577f2c2018-08-31 09:22:23 +0100732 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
Matthew Bentham4cefc412019-06-18 16:14:34 +0100733 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
734 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
735 armnn::RefTensorHandle* mIn0 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[0]);
736 armnn::RefTensorHandle* mIn1 = dynamic_cast<armnn::RefTensorHandle*>(wlConcat->GetData().m_Inputs[1]);
telsoa014fcda012018-03-09 14:13:49 +0000737
738 BOOST_TEST(sOut0);
739 BOOST_TEST(sOut1);
740 BOOST_TEST(mIn0);
741 BOOST_TEST(mIn1);
742
743 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
744
745 BOOST_TEST(validDataPointers);
746}
747
Jim Flynne242f2d2019-05-22 14:24:13 +0100748BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000749{
Ruomei Yan25339c32019-05-28 16:48:20 +0100750 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000751}
752
Matthew Jackson9bff1442019-09-12 09:08:23 +0100753BOOST_AUTO_TEST_CASE(CreateSplitterConcatFloat16)
754{
755 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::Float16>();
756}
757
Jim Flynne242f2d2019-05-22 14:24:13 +0100758BOOST_AUTO_TEST_CASE(CreateSplitterConcatUint8)
telsoa014fcda012018-03-09 14:13:49 +0000759{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000760 RefCreateSplitterConcatWorkloadTest<RefSplitterWorkload, RefConcatWorkload, DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000761}
762
telsoa01c577f2c2018-08-31 09:22:23 +0100763template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000764static void RefCreateSingleOutputMultipleInputsTest()
765{
telsoa01c577f2c2018-08-31 09:22:23 +0100766 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
767 // 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 +0000768
769 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100770 RefWorkloadFactory factory = GetFactory();
telsoa014fcda012018-03-09 14:13:49 +0000771 std::unique_ptr<SplitterWorkloadType> wlSplitter;
772 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
773 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
774 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
775 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
776
777 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100778 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000779
Matthew Bentham4cefc412019-06-18 16:14:34 +0100780 armnn::RefTensorHandle* sOut0 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
781 armnn::RefTensorHandle* sOut1 = dynamic_cast<armnn::RefTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
782 armnn::RefTensorHandle* activ0_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
783 armnn::RefTensorHandle* activ0_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
784 armnn::RefTensorHandle* activ1_0Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
785 armnn::RefTensorHandle* activ1_1Im = dynamic_cast<armnn::RefTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
telsoa014fcda012018-03-09 14:13:49 +0000786
787
788 BOOST_TEST(sOut0);
789 BOOST_TEST(sOut1);
790 BOOST_TEST(activ0_0Im);
791 BOOST_TEST(activ0_1Im);
792 BOOST_TEST(activ1_0Im);
793 BOOST_TEST(activ1_1Im);
794
795 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
796 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
797
798 BOOST_TEST(validDataPointers);
799}
800
801BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
802{
Ruomei Yan25339c32019-05-28 16:48:20 +0100803 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
telsoa01c577f2c2018-08-31 09:22:23 +0100804 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000805}
806
807BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
808{
Ruomei Yan25339c32019-05-28 16:48:20 +0100809 RefCreateSingleOutputMultipleInputsTest<RefSplitterWorkload, RefActivationWorkload,
Derek Lambertif90c56d2020-01-10 17:14:08 +0000810 armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000811}
812
telsoa01c577f2c2018-08-31 09:22:23 +0100813template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100814static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000815{
816 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100817 RefWorkloadFactory factory = GetFactory();
James Conroy59540822018-10-11 12:39:05 +0100818 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
819
820 TensorShape inputShape;
821 TensorShape outputShape;
822
823 switch (dataLayout)
824 {
825 case DataLayout::NHWC:
826 inputShape = { 2, 4, 4, 3 };
827 outputShape = { 2, 2, 2, 3 };
828 break;
James Conroy69482272018-10-19 10:41:35 +0100829 case DataLayout::NCHW:
830 default:
James Conroy59540822018-10-11 12:39:05 +0100831 inputShape = { 2, 3, 4, 4 };
832 outputShape = { 2, 3, 2, 2 };
833 }
telsoa014fcda012018-03-09 14:13:49 +0000834
telsoa01c577f2c2018-08-31 09:22:23 +0100835 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
James Conroy69482272018-10-19 10:41:35 +0100836 CheckInputOutput(std::move(workload),
837 TensorInfo(inputShape, DataType),
838 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000839}
840
841BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
842{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100843 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000844}
845
Matthew Jackson9bff1442019-09-12 09:08:23 +0100846BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat16)
847{
848 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float16>(DataLayout::NCHW);
849}
850
telsoa014fcda012018-03-09 14:13:49 +0000851BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
852{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000853 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
James Conroy59540822018-10-11 12:39:05 +0100854}
855
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100856BOOST_AUTO_TEST_CASE(CreateResizeBilinearQuantisedAsymm16)
857{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000858 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ellen Norris-Thompson3cb85f32019-06-17 11:32:49 +0100859}
860
James Conroy59540822018-10-11 12:39:05 +0100861BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
862{
Aron Virginas-Tar169d2f12019-07-01 19:01:44 +0100863 RefCreateResizeBilinearTest<RefResizeWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000864}
865
Francis Murtagh57f13d52019-06-24 14:24:36 +0100866template <typename BatchToSpaceNdWorkloadType, armnn::DataType DataType>
867static void RefCreateBatchToSpaceNdTest()
868{
869 Graph graph;
870 RefWorkloadFactory factory;
871
872 auto workload = CreateBatchToSpaceNdWorkloadTest<BatchToSpaceNdWorkloadType, DataType>(factory, graph);
873
874 CheckInputOutput(std::move(workload),
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100875 TensorInfo({ 1, 1, 1, 1 }, DataType),
876 TensorInfo({ 1, 1, 1, 1 }, DataType));
Francis Murtagh57f13d52019-06-24 14:24:36 +0100877}
878
879BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat32)
880{
881 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float32>();
882}
883
Matthew Jackson9bff1442019-09-12 09:08:23 +0100884BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdFloat16)
885{
886 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::Float16>();
887}
888
Francis Murtagh57f13d52019-06-24 14:24:36 +0100889BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdUint8)
890{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000891 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QAsymmU8>();
Francis Murtagh57f13d52019-06-24 14:24:36 +0100892}
893
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100894BOOST_AUTO_TEST_CASE(CreateBatchToSpaceNdQSymm16)
895{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000896 RefCreateBatchToSpaceNdTest<RefBatchToSpaceNdWorkload, armnn::DataType::QSymmS16>();
Francis Murtaghd0dfe172019-06-25 10:57:10 +0100897}
898
Matteo Martincighb63973e2018-10-16 16:23:33 +0100899template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
900static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000901{
902 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100903 RefWorkloadFactory factory = GetFactory();
Matteo Martincighb63973e2018-10-16 16:23:33 +0100904 auto workload =
905 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
906
907 TensorShape inputShape;
908 TensorShape outputShape;
909
910 switch (dataLayout)
911 {
912 case DataLayout::NHWC:
913 inputShape = { 5, 50, 67, 20 };
914 outputShape = { 5, 50, 67, 20 };
915 break;
916 case DataLayout::NCHW:
917 default:
918 inputShape = { 5, 20, 50, 67 };
919 outputShape = { 5, 20, 50, 67 };
920 break;
921 }
telsoa014fcda012018-03-09 14:13:49 +0000922
telsoa01c577f2c2018-08-31 09:22:23 +0100923 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100924 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
925}
926
927BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
928{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100929 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NCHW);
Matteo Martincighb63973e2018-10-16 16:23:33 +0100930}
931
932BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
933{
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100934 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::Float32>(DataLayout::NHWC);
935}
936
937BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16)
938{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000939 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NCHW);
Ferran Balaguerd73d14f2019-06-10 10:29:54 +0100940}
941
942BOOST_AUTO_TEST_CASE(CreateL2NormalizationInt16Nhwc)
943{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000944 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QSymmS16>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000945}
946
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100947BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8)
948{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000949 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NCHW);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100950}
951
952BOOST_AUTO_TEST_CASE(CreateL2NormalizationUint8Nhwc)
953{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000954 RefCreateL2NormalizationTest<RefL2NormalizationWorkload, armnn::DataType::QAsymmU8>(DataLayout::NHWC);
Ferran Balaguerc6138d82019-06-13 17:23:50 +0100955}
956
telsoa01c577f2c2018-08-31 09:22:23 +0100957template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000958static void RefCreateReshapeWorkloadTest()
959{
960 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100961 RefWorkloadFactory factory = GetFactory();
telsoa01c577f2c2018-08-31 09:22:23 +0100962 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000963
telsoa01c577f2c2018-08-31 09:22:23 +0100964 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000965 CheckInputOutput(
966 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100967 TensorInfo({ 4, 1 }, DataType),
968 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000969}
970
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100971BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadFloat32)
telsoa014fcda012018-03-09 14:13:49 +0000972{
Nina Drozd2f2778f2019-05-27 10:37:05 +0100973 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000974}
975
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100976BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedAsymm8)
telsoa014fcda012018-03-09 14:13:49 +0000977{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000978 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QAsymmU8>();
telsoa014fcda012018-03-09 14:13:49 +0000979}
980
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100981BOOST_AUTO_TEST_CASE(CreateReshapeWorkloadQuantisedSymm16)
982{
Derek Lambertif90c56d2020-01-10 17:14:08 +0000983 RefCreateReshapeWorkloadTest<RefReshapeWorkload, armnn::DataType::QSymmS16>();
Nina Drozd8ed4b8c2019-05-29 10:41:04 +0100984}
985
Jim Flynne242f2d2019-05-22 14:24:13 +0100986template <typename ConcatWorkloadType, armnn::DataType DataType>
987static void RefCreateConcatWorkloadTest(const armnn::TensorShape& outputShape,
narpra015cdda352018-11-19 15:30:27 +0000988 unsigned int concatAxis)
989{
990 Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +0100991 RefWorkloadFactory factory = GetFactory();
Jim Flynne242f2d2019-05-22 14:24:13 +0100992 auto workload = CreateConcatWorkloadTest<ConcatWorkloadType, DataType>(factory, graph, outputShape, concatAxis);
narpra015cdda352018-11-19 15:30:27 +0000993
994 CheckInputsOutput(std::move(workload),
995 TensorInfo({ 2, 3, 2, 5 }, DataType),
996 TensorInfo({ 2, 3, 2, 5 }, DataType),
997 TensorInfo(outputShape, DataType));
998}
999
Jim Flynne242f2d2019-05-22 14:24:13 +01001000BOOST_AUTO_TEST_CASE(CreateConcatDim0Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001001{
Jim Flynne242f2d2019-05-22 14:24:13 +01001002 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001003}
1004
Matthew Jackson9bff1442019-09-12 09:08:23 +01001005BOOST_AUTO_TEST_CASE(CreateConcatDim0Float16Workload)
1006{
1007 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float16>({ 4, 3, 2, 5 }, 0);
1008}
1009
Jim Flynne242f2d2019-05-22 14:24:13 +01001010BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +00001011{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001012 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 4, 3, 2, 5 }, 0);
Jim Flynncbb66aa2019-05-15 13:03:54 +01001013}
1014
Jim Flynne242f2d2019-05-22 14:24:13 +01001015BOOST_AUTO_TEST_CASE(CreateConcatDim0Uint16Workload)
Jim Flynncbb66aa2019-05-15 13:03:54 +01001016{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001017 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QSymmS16>({ 4, 3, 2, 5 }, 0);
narpra015cdda352018-11-19 15:30:27 +00001018}
1019
Jim Flynne242f2d2019-05-22 14:24:13 +01001020BOOST_AUTO_TEST_CASE(CreateConcatDim1Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001021{
Jim Flynne242f2d2019-05-22 14:24:13 +01001022 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001023}
1024
Jim Flynne242f2d2019-05-22 14:24:13 +01001025BOOST_AUTO_TEST_CASE(CreateConcatDim1Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +00001026{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001027 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 6, 2, 5 }, 1);
narpra015cdda352018-11-19 15:30:27 +00001028}
1029
Jim Flynne242f2d2019-05-22 14:24:13 +01001030BOOST_AUTO_TEST_CASE(CreateConcatDim2Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001031{
Jim Flynne242f2d2019-05-22 14:24:13 +01001032 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +00001033}
1034
Jim Flynne242f2d2019-05-22 14:24:13 +01001035BOOST_AUTO_TEST_CASE(CreateConcatDim2Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +00001036{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001037 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 4, 5 }, 2);
narpra015cdda352018-11-19 15:30:27 +00001038}
1039
Jim Flynne242f2d2019-05-22 14:24:13 +01001040BOOST_AUTO_TEST_CASE(CreateConcatDim3Float32Workload)
narpra015cdda352018-11-19 15:30:27 +00001041{
Jim Flynne242f2d2019-05-22 14:24:13 +01001042 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001043}
1044
Jim Flynne242f2d2019-05-22 14:24:13 +01001045BOOST_AUTO_TEST_CASE(CreateConcatDim3Uint8Workload)
narpra015cdda352018-11-19 15:30:27 +00001046{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001047 RefCreateConcatWorkloadTest<RefConcatWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 }, 3);
narpra015cdda352018-11-19 15:30:27 +00001048}
1049
Nina Drozd58ef2c62019-05-16 12:09:18 +01001050template <typename ConstantWorkloadType, armnn::DataType DataType>
1051static void RefCreateConstantWorkloadTest(const armnn::TensorShape& outputShape)
1052{
1053 armnn::Graph graph;
Matthew Bentham7c1603a2019-06-21 17:22:23 +01001054 RefWorkloadFactory factory = GetFactory();
Nina Drozd58ef2c62019-05-16 12:09:18 +01001055 auto workload = CreateConstantWorkloadTest<ConstantWorkloadType, DataType>(factory, graph, outputShape);
1056
1057 // Check output is as expected
1058 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001059 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Nina Drozd58ef2c62019-05-16 12:09:18 +01001060 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
1061}
1062
1063BOOST_AUTO_TEST_CASE(CreateConstantUint8Workload)
1064{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001065 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QAsymmU8>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +01001066}
1067
1068BOOST_AUTO_TEST_CASE(CreateConstantInt16Workload)
1069{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001070 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::QSymmS16>({ 2, 3, 2, 10 });
Nina Drozd58ef2c62019-05-16 12:09:18 +01001071}
1072
1073BOOST_AUTO_TEST_CASE(CreateConstantFloat32Workload)
1074{
1075 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Float32>({ 2, 3, 2, 10 });
1076}
1077
1078BOOST_AUTO_TEST_CASE(CreateConstantSigned32Workload)
1079{
1080 RefCreateConstantWorkloadTest<RefConstantWorkload, armnn::DataType::Signed32>({ 2, 3, 2, 10 });
1081}
1082
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001083static void RefCreatePreluWorkloadTest(const armnn::TensorShape& inputShape,
1084 const armnn::TensorShape& alphaShape,
1085 const armnn::TensorShape& outputShape,
1086 armnn::DataType dataType)
Matteo Martincighab9e5252019-06-13 17:27:46 +01001087{
1088 armnn::Graph graph;
1089 RefWorkloadFactory factory;
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001090 auto workload = CreatePreluWorkloadTest<RefPreluWorkload>(factory,
1091 graph,
1092 inputShape,
1093 alphaShape,
1094 outputShape,
1095 dataType);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001096
1097 // Check output is as expected
1098 auto queueDescriptor = workload->GetData();
Jan Eilersbb446e52020-04-02 13:56:54 +01001099 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001100 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, dataType)));
Matteo Martincighab9e5252019-06-13 17:27:46 +01001101}
1102
1103BOOST_AUTO_TEST_CASE(CreatePreluFloat32Workload)
1104{
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001105 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float32);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001106}
1107
Matthew Jackson9bff1442019-09-12 09:08:23 +01001108BOOST_AUTO_TEST_CASE(CreatePreluFloat16Workload)
1109{
1110 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::Float16);
1111}
1112
Matteo Martincighab9e5252019-06-13 17:27:46 +01001113BOOST_AUTO_TEST_CASE(CreatePreluUint8Workload)
1114{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001115 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QAsymmU8);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001116}
1117
1118BOOST_AUTO_TEST_CASE(CreatePreluInt16Workload)
1119{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001120 RefCreatePreluWorkloadTest({ 1, 4, 1, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 }, armnn::DataType::QSymmS16);
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001121}
1122
1123BOOST_AUTO_TEST_CASE(CreatePreluFloat32NoBroadcastWorkload)
1124{
1125 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1126 armnn::DataType::Float32),
1127 armnn::InvalidArgumentException);
1128}
1129
Matthew Jackson9bff1442019-09-12 09:08:23 +01001130BOOST_AUTO_TEST_CASE(CreatePreluFloat16NoBroadcastWorkload)
1131{
1132 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
1133 armnn::DataType::Float16),
1134 armnn::InvalidArgumentException);
1135}
1136
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001137BOOST_AUTO_TEST_CASE(CreatePreluUint8NoBroadcastWorkload)
1138{
1139 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001140 armnn::DataType::QAsymmU8),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001141 armnn::InvalidArgumentException);
1142}
1143
1144BOOST_AUTO_TEST_CASE(CreatePreluInt16NoBroadcastWorkload)
1145{
1146 BOOST_CHECK_THROW(RefCreatePreluWorkloadTest({ 1, 4, 7, 2 }, { 5, 4, 3, 1 }, { 5, 4, 3, 2 },
Derek Lambertif90c56d2020-01-10 17:14:08 +00001147 armnn::DataType::QSymmS16),
Matteo Martincighbf0e7222019-06-20 17:17:45 +01001148 armnn::InvalidArgumentException);
Matteo Martincighab9e5252019-06-13 17:27:46 +01001149}
1150
James Conroy60597842019-07-02 10:57:56 +01001151template <typename SpaceToDepthWorkloadType, armnn::DataType DataType>
1152static void RefCreateSpaceToDepthWorkloadTest()
1153{
1154 Graph graph;
1155 RefWorkloadFactory factory;
1156
1157 auto workload = CreateSpaceToDepthWorkloadTest<SpaceToDepthWorkloadType, DataType>(factory, graph);
1158
1159 CheckInputOutput(std::move(workload),
1160 TensorInfo({ 1, 2, 2, 1 }, DataType),
1161 TensorInfo({ 1, 1, 1, 4 }, DataType));
1162}
1163
1164BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat32)
1165{
1166 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float32>();
1167}
1168
Matthew Jackson9bff1442019-09-12 09:08:23 +01001169BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadFloat16)
1170{
1171 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::Float16>();
1172}
1173
James Conroy60597842019-07-02 10:57:56 +01001174BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQASymm8)
1175{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001176 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QAsymmU8>();
James Conroy60597842019-07-02 10:57:56 +01001177}
1178
1179BOOST_AUTO_TEST_CASE(CreateSpaceToDepthWorkloadQSymm16)
1180{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001181 RefCreateSpaceToDepthWorkloadTest<RefSpaceToDepthWorkload, armnn::DataType::QSymmS16>();
James Conroy60597842019-07-02 10:57:56 +01001182}
1183
Matthew Jacksond5166102019-07-31 14:06:28 +01001184template <armnn::DataType DataType>
Matthew Jackson81e601c2019-07-11 12:07:09 +01001185static void RefCreateStackWorkloadTest(const armnn::TensorShape& inputShape,
1186 const armnn::TensorShape& outputShape,
1187 unsigned int axis,
Matthew Jacksond5166102019-07-31 14:06:28 +01001188 unsigned int numInputs)
Matthew Jackson81e601c2019-07-11 12:07:09 +01001189{
1190 armnn::Graph graph;
1191 RefWorkloadFactory factory;
Matthew Jacksond5166102019-07-31 14:06:28 +01001192 auto workload = CreateStackWorkloadTest<RefStackWorkload, DataType>(factory,
1193 graph,
1194 inputShape,
1195 outputShape,
1196 axis,
1197 numInputs);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001198
Matthew Jacksond5166102019-07-31 14:06:28 +01001199 // Check inputs and output are as expected
1200 StackQueueDescriptor queueDescriptor = workload->GetData();
1201 for (unsigned int i = 0; i < numInputs; ++i)
1202 {
Jan Eilersbb446e52020-04-02 13:56:54 +01001203 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[i]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001204 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo(inputShape, DataType)));
1205 }
Jan Eilersbb446e52020-04-02 13:56:54 +01001206 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[0]);
Matthew Jacksond5166102019-07-31 14:06:28 +01001207 BOOST_TEST((outputHandle->GetTensorInfo() == TensorInfo(outputShape, DataType)));
Matthew Jackson81e601c2019-07-11 12:07:09 +01001208}
1209
1210BOOST_AUTO_TEST_CASE(CreateStackFloat32Workload)
1211{
Matthew Jacksond5166102019-07-31 14:06:28 +01001212 RefCreateStackWorkloadTest<armnn::DataType::Float32>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001213}
1214
1215BOOST_AUTO_TEST_CASE(CreateStackUint8Workload)
1216{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001217 RefCreateStackWorkloadTest<armnn::DataType::QAsymmU8>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001218}
1219
1220BOOST_AUTO_TEST_CASE(CreateStackUint16Workload)
1221{
Derek Lambertif90c56d2020-01-10 17:14:08 +00001222 RefCreateStackWorkloadTest<armnn::DataType::QSymmS16>({ 3, 4, 5 }, { 3, 4, 2, 5 }, 2, 2);
Matthew Jackson81e601c2019-07-11 12:07:09 +01001223}
1224
James Conroy4f1f8992020-04-29 20:01:10 +01001225template <typename QLstmWorkloadType>
1226static void RefCreateQLstmWorkloadTest()
1227{
1228 Graph graph;
1229 RefWorkloadFactory factory;
1230
1231 auto workload = CreateQLstmWorkloadTest<QLstmWorkloadType>(factory, graph);
1232
1233 armnn::TensorInfo inputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.0078125f, 0);
1234
1235 armnn::TensorInfo cellStateInfo({2 , 4}, armnn::DataType::QSymmS16, 3.05176e-05f, 0);
1236
1237 armnn::TensorInfo outputInfo({2 , 4}, armnn::DataType::QAsymmS8, 0.007f, 0);
1238
1239 QLstmQueueDescriptor queueDescriptor = workload->GetData();
Jan Eilersaaf9a8f2020-07-01 16:35:35 +01001240 auto inputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Inputs[0]);
1241 auto cellStateOutHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[1]);
1242 auto outputHandle = PolymorphicDowncast<RefTensorHandle*>(queueDescriptor.m_Outputs[2]);
James Conroy4f1f8992020-04-29 20:01:10 +01001243
1244 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
1245 BOOST_TEST((cellStateOutHandle->GetTensorInfo() == cellStateInfo));
1246 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
1247}
1248
Rob Hughes985ef1f2020-05-19 16:31:10 +01001249BOOST_AUTO_TEST_CASE(CreateQLstmWorkload)
James Conroy4f1f8992020-04-29 20:01:10 +01001250{
1251 RefCreateQLstmWorkloadTest<RefQLstmWorkload>();
1252}
1253
telsoa014fcda012018-03-09 14:13:49 +00001254BOOST_AUTO_TEST_SUITE_END()