blob: c30093da92e3616858338c6759f50bdfbf92ef8b [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//
David Beckb4540be2018-09-24 13:18:27 +01005#include <backends/reference/RefWorkloadFactory.hpp>
6#include <backends/reference/workloads/RefWorkloads.hpp>
7#include <backends/CpuTensorHandle.hpp>
telsoa014fcda012018-03-09 14:13:49 +00008
9#include "test/CreateWorkload.hpp"
10
11namespace
12{
13
14template<typename Workload>
15void CheckInputOutput(std::unique_ptr<Workload> workload, const TensorInfo& inputInfo, const TensorInfo& outputInfo)
16{
17 auto queueDescriptor = workload->GetData();
18 auto inputHandle = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
19 auto outputHandle = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
20 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
21 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
22}
23
24template <typename Workload>
25void CheckInputsOutput(std::unique_ptr<Workload> workload,
26 const TensorInfo& inputInfo0,
27 const TensorInfo& inputInfo1,
28 const TensorInfo& outputInfo)
29{
30 auto queueDescriptor = workload->GetData();
31 auto inputHandle0 = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
32 auto inputHandle1 = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[1]);
33 auto outputHandle = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
34 BOOST_TEST((inputHandle0->GetTensorInfo() == inputInfo0));
35 BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1));
36 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
37}
38}
39
40BOOST_AUTO_TEST_SUITE(CreateWorkloadRef)
41
telsoa01c577f2c2018-08-31 09:22:23 +010042template <typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +000043static void RefCreateActivationWorkloadTest()
44{
45 Graph graph;
46 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +010047 auto workload = CreateActivationWorkloadTest<ActivationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000048
telsoa01c577f2c2018-08-31 09:22:23 +010049 // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000050 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010051 TensorInfo({ 1, 1 }, DataType),
52 TensorInfo({ 1, 1 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000053}
54
55BOOST_AUTO_TEST_CASE(CreateActivationFloat32Workload)
56{
telsoa01c577f2c2018-08-31 09:22:23 +010057 RefCreateActivationWorkloadTest<RefActivationFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000058}
59
60BOOST_AUTO_TEST_CASE(CreateActivationUint8Workload)
61{
telsoa01c577f2c2018-08-31 09:22:23 +010062 RefCreateActivationWorkloadTest<RefActivationUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +000063}
64
David Beckbc392452018-09-10 14:47:28 +010065template <typename WorkloadType,
66 typename DescriptorType,
67 typename LayerType,
68 armnn::DataType DataType>
69static void RefCreateArithmethicWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000070{
71 Graph graph;
72 RefWorkloadFactory factory;
David Beckbc392452018-09-10 14:47:28 +010073 auto workload = CreateArithmeticWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000074
telsoa014fcda012018-03-09 14:13:49 +000075 CheckInputsOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010076 TensorInfo({ 2, 3 }, DataType),
77 TensorInfo({ 2, 3 }, DataType),
78 TensorInfo({ 2, 3 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000079}
80
81BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
82{
David Beckbc392452018-09-10 14:47:28 +010083 RefCreateArithmethicWorkloadTest<RefAdditionFloat32Workload,
84 AdditionQueueDescriptor,
85 AdditionLayer,
86 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000087}
88
89BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
90{
David Beckbc392452018-09-10 14:47:28 +010091 RefCreateArithmethicWorkloadTest<RefAdditionUint8Workload,
92 AdditionQueueDescriptor,
93 AdditionLayer,
94 armnn::DataType::QuantisedAsymm8>();
95}
96
97BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
98{
99 RefCreateArithmethicWorkloadTest<RefSubtractionFloat32Workload,
100 SubtractionQueueDescriptor,
101 SubtractionLayer,
102 armnn::DataType::Float32>();
103}
104
105BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
106{
107 RefCreateArithmethicWorkloadTest<RefSubtractionUint8Workload,
108 SubtractionQueueDescriptor,
109 SubtractionLayer,
110 armnn::DataType::QuantisedAsymm8>();
111}
112
113BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
114{
115 RefCreateArithmethicWorkloadTest<RefMultiplicationFloat32Workload,
116 MultiplicationQueueDescriptor,
117 MultiplicationLayer,
118 armnn::DataType::Float32>();
119}
120
121BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
122{
123 RefCreateArithmethicWorkloadTest<RefMultiplicationUint8Workload,
124 MultiplicationQueueDescriptor,
125 MultiplicationLayer,
126 armnn::DataType::QuantisedAsymm8>();
127}
128
129BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkload)
130{
131 RefCreateArithmethicWorkloadTest<RefDivisionFloat32Workload,
132 DivisionQueueDescriptor,
133 DivisionLayer,
134 armnn::DataType::Float32>();
135}
136
137BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
138{
139 RefCreateArithmethicWorkloadTest<RefDivisionUint8Workload,
140 DivisionQueueDescriptor,
141 DivisionLayer,
142 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000143}
144
145BOOST_AUTO_TEST_CASE(CreateBatchNormalizationWorkload)
146{
147 Graph graph;
148 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100149 auto workload = CreateBatchNormalizationWorkloadTest<RefBatchNormalizationFloat32Workload, armnn::DataType::Float32>
150 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000151
telsoa01c577f2c2018-08-31 09:22:23 +0100152 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000153 CheckInputOutput(
154 std::move(workload), TensorInfo({2, 3, 1, 1}, DataType::Float32), TensorInfo({2, 3, 1, 1}, DataType::Float32));
155}
156
telsoa01c577f2c2018-08-31 09:22:23 +0100157BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
158{
159 Graph graph;
160 RefWorkloadFactory factory;
161 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
162
163 // Checks that outputs and inputs are as we expect them
164 CheckInputOutput(
165 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
166}
167
168BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
169{
170 Graph graph;
171 RefWorkloadFactory factory;
172 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
173
174 // Checks that outputs and inputs are as we expect them
175 CheckInputOutput(
176 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
177}
178
telsoa014fcda012018-03-09 14:13:49 +0000179BOOST_AUTO_TEST_CASE(CreateConvolution2dWorkload)
180{
181 Graph graph;
182 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100183 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dFloat32Workload,
184 DataType::Float32>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000185
telsoa01c577f2c2018-08-31 09:22:23 +0100186 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000187 CheckInputOutput(std::move(workload),
188 TensorInfo({2, 3, 8, 16}, DataType::Float32),
189 TensorInfo({2, 2, 2, 10}, DataType::Float32));
190}
191
192BOOST_AUTO_TEST_CASE(CreateDepthwiseConvolution2dWorkload)
193{
194 Graph graph;
195 RefWorkloadFactory factory;
196 auto workload =
197 CreateDepthwiseConvolution2dWorkloadTest<RefDepthwiseConvolution2dFloat32Workload>(factory, graph);
198
telsoa01c577f2c2018-08-31 09:22:23 +0100199 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000200 CheckInputOutput(std::move(workload),
201 TensorInfo({2, 3, 8, 16}, DataType::Float32),
202 TensorInfo({2, 9, 2, 10}, DataType::Float32));
203}
204
telsoa01c577f2c2018-08-31 09:22:23 +0100205template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000206static void RefCreateFullyConnectedWorkloadTest()
207{
208 Graph graph;
209 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100210 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000211
telsoa01c577f2c2018-08-31 09:22:23 +0100212 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
213 float inputsQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 1.0f : 0.0;
214 float outputQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000215 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100216 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
217 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000218}
219
220BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat32Workload)
221{
telsoa01c577f2c2018-08-31 09:22:23 +0100222 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000223}
224
225BOOST_AUTO_TEST_CASE(CreateFullyConnectedUint8Workload)
226{
telsoa01c577f2c2018-08-31 09:22:23 +0100227 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000228}
229
narpra0155a97bc2018-10-02 14:35:53 +0100230template <typename NormalizationWorkloadType, armnn::DataType DataType>
231static void RefCreateNormalizationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000232{
narpra0155a97bc2018-10-02 14:35:53 +0100233 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000234 RefWorkloadFactory factory;
narpra0155a97bc2018-10-02 14:35:53 +0100235 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000236
telsoa01c577f2c2018-08-31 09:22:23 +0100237 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000238 CheckInputOutput(std::move(workload),
narpra0155a97bc2018-10-02 14:35:53 +0100239 TensorInfo({3, 5, 5, 1}, DataType),
240 TensorInfo({3, 5, 5, 1}, DataType));
241}
242
243BOOST_AUTO_TEST_CASE(CreateRefNormalizationNchwWorkload)
244{
245 RefCreateNormalizationWorkloadTest<RefNormalizationFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000246}
247
telsoa01c577f2c2018-08-31 09:22:23 +0100248template <typename Pooling2dWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000249static void RefCreatePooling2dWorkloadTest()
250{
251 Graph graph;
252 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100253 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000254
telsoa01c577f2c2018-08-31 09:22:23 +0100255 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000256 CheckInputOutput(
257 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100258 TensorInfo({3, 2, 5, 5}, DataType),
259 TensorInfo({3, 2, 2, 4}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000260}
261
262BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
263{
telsoa01c577f2c2018-08-31 09:22:23 +0100264 RefCreatePooling2dWorkloadTest<RefPooling2dFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000265}
266
267BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
268{
telsoa01c577f2c2018-08-31 09:22:23 +0100269 RefCreatePooling2dWorkloadTest<RefPooling2dUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000270}
271
telsoa01c577f2c2018-08-31 09:22:23 +0100272template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000273static void RefCreateSoftmaxWorkloadTest()
274{
275 Graph graph;
276 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100277 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000278
telsoa01c577f2c2018-08-31 09:22:23 +0100279 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000280 CheckInputOutput(
281 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100282 TensorInfo({4, 1}, DataType),
283 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000284}
285
286BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
287{
telsoa01c577f2c2018-08-31 09:22:23 +0100288 RefCreateSoftmaxWorkloadTest<RefSoftmaxFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000289}
290
291BOOST_AUTO_TEST_CASE(CreateSoftmaxUint8Workload)
292{
telsoa01c577f2c2018-08-31 09:22:23 +0100293 RefCreateSoftmaxWorkloadTest<RefSoftmaxUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000294}
295
telsoa01c577f2c2018-08-31 09:22:23 +0100296template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000297static void RefCreateSplitterWorkloadTest()
298{
299 Graph graph;
300 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100301 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000302
telsoa01c577f2c2018-08-31 09:22:23 +0100303 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000304 SplitterQueueDescriptor queueDescriptor = workload->GetData();
305 auto inputHandle = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100306 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100307
telsoa014fcda012018-03-09 14:13:49 +0000308 auto outputHandle0 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100309 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100310
telsoa014fcda012018-03-09 14:13:49 +0000311 auto outputHandle1 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100312 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100313
telsoa014fcda012018-03-09 14:13:49 +0000314 auto outputHandle2 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100315 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000316}
317
318BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
319{
telsoa01c577f2c2018-08-31 09:22:23 +0100320 RefCreateSplitterWorkloadTest<RefSplitterFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000321}
322
323BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
324{
telsoa01c577f2c2018-08-31 09:22:23 +0100325 RefCreateSplitterWorkloadTest<RefSplitterUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000326}
327
telsoa01c577f2c2018-08-31 09:22:23 +0100328template <typename SplitterWorkloadType, typename MergerWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000329static void RefCreateSplitterMergerWorkloadTest()
330{
telsoa01c577f2c2018-08-31 09:22:23 +0100331 // Tests that it is possible to decide which output of the splitter layer
332 // should be lined to which input of the merger layer.
333 // We tested that is is possible to specify 0th output
334 // of the splitter to be the 1st input to the merger and the 1st output of the splitter to be 0th input
telsoa014fcda012018-03-09 14:13:49 +0000335 // of the merger.
336
337 Graph graph;
338 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100339 auto workloads = CreateSplitterMergerWorkloadTest<SplitterWorkloadType, MergerWorkloadType, DataType>
340 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000341
342 auto wlSplitter = std::move(workloads.first);
343 auto wlMerger = std::move(workloads.second);
344
telsoa01c577f2c2018-08-31 09:22:23 +0100345 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000346 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
347 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
348 armnn::CpuTensorHandle* mIn0 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
349 armnn::CpuTensorHandle* mIn1 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
350
351 BOOST_TEST(sOut0);
352 BOOST_TEST(sOut1);
353 BOOST_TEST(mIn0);
354 BOOST_TEST(mIn1);
355
356 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
357
358 BOOST_TEST(validDataPointers);
359}
360
361BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat32)
362{
telsoa01c577f2c2018-08-31 09:22:23 +0100363 RefCreateSplitterMergerWorkloadTest<RefSplitterFloat32Workload, RefMergerFloat32Workload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000364}
365
366BOOST_AUTO_TEST_CASE(CreateSplitterMergerUint8)
367{
telsoa01c577f2c2018-08-31 09:22:23 +0100368 RefCreateSplitterMergerWorkloadTest<RefSplitterUint8Workload, RefMergerUint8Workload, DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000369}
370
telsoa01c577f2c2018-08-31 09:22:23 +0100371template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000372static void RefCreateSingleOutputMultipleInputsTest()
373{
telsoa01c577f2c2018-08-31 09:22:23 +0100374 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
375 // 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 +0000376
377 Graph graph;
378 RefWorkloadFactory factory;
379 std::unique_ptr<SplitterWorkloadType> wlSplitter;
380 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
381 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
382 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
383 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
384
385 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100386 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000387
388 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
389 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
390 armnn::CpuTensorHandle* activ0_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
391 armnn::CpuTensorHandle* activ0_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
392 armnn::CpuTensorHandle* activ1_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
393 armnn::CpuTensorHandle* activ1_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
394
395
396 BOOST_TEST(sOut0);
397 BOOST_TEST(sOut1);
398 BOOST_TEST(activ0_0Im);
399 BOOST_TEST(activ0_1Im);
400 BOOST_TEST(activ1_0Im);
401 BOOST_TEST(activ1_1Im);
402
403 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
404 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
405
406 BOOST_TEST(validDataPointers);
407}
408
409BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
410{
telsoa01c577f2c2018-08-31 09:22:23 +0100411 RefCreateSingleOutputMultipleInputsTest<RefSplitterFloat32Workload, RefActivationFloat32Workload,
412 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000413}
414
415BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
416{
telsoa01c577f2c2018-08-31 09:22:23 +0100417 RefCreateSingleOutputMultipleInputsTest<RefSplitterUint8Workload, RefActivationUint8Workload,
418 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000419}
420
telsoa01c577f2c2018-08-31 09:22:23 +0100421template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000422static void RefCreateResizeBilinearTest()
423{
424 Graph graph;
425 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100426 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000427
telsoa01c577f2c2018-08-31 09:22:23 +0100428 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000429 CheckInputOutput(
430 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100431 TensorInfo({ 2, 3, 4, 4 }, DataType),
432 TensorInfo({ 2, 3, 2, 2 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000433}
434
435BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
436{
telsoa01c577f2c2018-08-31 09:22:23 +0100437 RefCreateResizeBilinearTest<RefResizeBilinearFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000438}
439
440BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
441{
telsoa01c577f2c2018-08-31 09:22:23 +0100442 RefCreateResizeBilinearTest<RefResizeBilinearUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000443}
444
445BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
446{
447 Graph graph;
448 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100449 auto workload = CreateL2NormalizationWorkloadTest<RefL2NormalizationFloat32Workload, armnn::DataType::Float32>
450 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000451
telsoa01c577f2c2018-08-31 09:22:23 +0100452 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000453 CheckInputOutput(
454 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100455 TensorInfo({ 5, 20, 50, 67 }, armnn::DataType::Float32),
456 TensorInfo({ 5, 20, 50, 67 }, armnn::DataType::Float32));
telsoa014fcda012018-03-09 14:13:49 +0000457}
458
telsoa01c577f2c2018-08-31 09:22:23 +0100459template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000460static void RefCreateReshapeWorkloadTest()
461{
462 Graph graph;
463 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100464 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000465
telsoa01c577f2c2018-08-31 09:22:23 +0100466 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000467 CheckInputOutput(
468 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100469 TensorInfo({ 4, 1 }, DataType),
470 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000471}
472
473BOOST_AUTO_TEST_CASE(CreateReshapeFloat32Workload)
474{
telsoa01c577f2c2018-08-31 09:22:23 +0100475 RefCreateReshapeWorkloadTest<RefReshapeFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000476}
477
478BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
479{
telsoa01c577f2c2018-08-31 09:22:23 +0100480 RefCreateReshapeWorkloadTest<RefReshapeUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000481}
482
483BOOST_AUTO_TEST_SUITE_END()