blob: 9313ee851f03f0720883ab7a6b73624a8c995d19 [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
telsoa014fcda012018-03-09 14:13:49 +0000230BOOST_AUTO_TEST_CASE(CreateNormalizationWorkload)
231{
232 Graph graph;
233 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100234 auto workload = CreateNormalizationWorkloadTest<RefNormalizationFloat32Workload,
235 armnn::DataType::Float32>(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),
239 TensorInfo({3, 5, 5, 1}, DataType::Float32),
240 TensorInfo({3, 5, 5, 1}, DataType::Float32));
241}
242
telsoa01c577f2c2018-08-31 09:22:23 +0100243template <typename Pooling2dWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000244static void RefCreatePooling2dWorkloadTest()
245{
246 Graph graph;
247 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100248 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000249
telsoa01c577f2c2018-08-31 09:22:23 +0100250 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000251 CheckInputOutput(
252 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100253 TensorInfo({3, 2, 5, 5}, DataType),
254 TensorInfo({3, 2, 2, 4}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000255}
256
257BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
258{
telsoa01c577f2c2018-08-31 09:22:23 +0100259 RefCreatePooling2dWorkloadTest<RefPooling2dFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000260}
261
262BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
263{
telsoa01c577f2c2018-08-31 09:22:23 +0100264 RefCreatePooling2dWorkloadTest<RefPooling2dUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000265}
266
telsoa01c577f2c2018-08-31 09:22:23 +0100267template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000268static void RefCreateSoftmaxWorkloadTest()
269{
270 Graph graph;
271 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100272 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000273
telsoa01c577f2c2018-08-31 09:22:23 +0100274 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000275 CheckInputOutput(
276 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100277 TensorInfo({4, 1}, DataType),
278 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000279}
280
281BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
282{
telsoa01c577f2c2018-08-31 09:22:23 +0100283 RefCreateSoftmaxWorkloadTest<RefSoftmaxFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000284}
285
286BOOST_AUTO_TEST_CASE(CreateSoftmaxUint8Workload)
287{
telsoa01c577f2c2018-08-31 09:22:23 +0100288 RefCreateSoftmaxWorkloadTest<RefSoftmaxUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000289}
290
telsoa01c577f2c2018-08-31 09:22:23 +0100291template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000292static void RefCreateSplitterWorkloadTest()
293{
294 Graph graph;
295 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100296 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000297
telsoa01c577f2c2018-08-31 09:22:23 +0100298 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000299 SplitterQueueDescriptor queueDescriptor = workload->GetData();
300 auto inputHandle = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100301 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100302
telsoa014fcda012018-03-09 14:13:49 +0000303 auto outputHandle0 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100304 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100305
telsoa014fcda012018-03-09 14:13:49 +0000306 auto outputHandle1 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100307 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100308
telsoa014fcda012018-03-09 14:13:49 +0000309 auto outputHandle2 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100310 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000311}
312
313BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
314{
telsoa01c577f2c2018-08-31 09:22:23 +0100315 RefCreateSplitterWorkloadTest<RefSplitterFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000316}
317
318BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
319{
telsoa01c577f2c2018-08-31 09:22:23 +0100320 RefCreateSplitterWorkloadTest<RefSplitterUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000321}
322
telsoa01c577f2c2018-08-31 09:22:23 +0100323template <typename SplitterWorkloadType, typename MergerWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000324static void RefCreateSplitterMergerWorkloadTest()
325{
telsoa01c577f2c2018-08-31 09:22:23 +0100326 // Tests that it is possible to decide which output of the splitter layer
327 // should be lined to which input of the merger layer.
328 // We tested that is is possible to specify 0th output
329 // 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 +0000330 // of the merger.
331
332 Graph graph;
333 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100334 auto workloads = CreateSplitterMergerWorkloadTest<SplitterWorkloadType, MergerWorkloadType, DataType>
335 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000336
337 auto wlSplitter = std::move(workloads.first);
338 auto wlMerger = std::move(workloads.second);
339
telsoa01c577f2c2018-08-31 09:22:23 +0100340 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000341 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
342 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
343 armnn::CpuTensorHandle* mIn0 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
344 armnn::CpuTensorHandle* mIn1 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
345
346 BOOST_TEST(sOut0);
347 BOOST_TEST(sOut1);
348 BOOST_TEST(mIn0);
349 BOOST_TEST(mIn1);
350
351 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
352
353 BOOST_TEST(validDataPointers);
354}
355
356BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat32)
357{
telsoa01c577f2c2018-08-31 09:22:23 +0100358 RefCreateSplitterMergerWorkloadTest<RefSplitterFloat32Workload, RefMergerFloat32Workload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000359}
360
361BOOST_AUTO_TEST_CASE(CreateSplitterMergerUint8)
362{
telsoa01c577f2c2018-08-31 09:22:23 +0100363 RefCreateSplitterMergerWorkloadTest<RefSplitterUint8Workload, RefMergerUint8Workload, DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000364}
365
telsoa01c577f2c2018-08-31 09:22:23 +0100366template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000367static void RefCreateSingleOutputMultipleInputsTest()
368{
telsoa01c577f2c2018-08-31 09:22:23 +0100369 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
370 // 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 +0000371
372 Graph graph;
373 RefWorkloadFactory factory;
374 std::unique_ptr<SplitterWorkloadType> wlSplitter;
375 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
376 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
377 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
378 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
379
380 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100381 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000382
383 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
384 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
385 armnn::CpuTensorHandle* activ0_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
386 armnn::CpuTensorHandle* activ0_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
387 armnn::CpuTensorHandle* activ1_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
388 armnn::CpuTensorHandle* activ1_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
389
390
391 BOOST_TEST(sOut0);
392 BOOST_TEST(sOut1);
393 BOOST_TEST(activ0_0Im);
394 BOOST_TEST(activ0_1Im);
395 BOOST_TEST(activ1_0Im);
396 BOOST_TEST(activ1_1Im);
397
398 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
399 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
400
401 BOOST_TEST(validDataPointers);
402}
403
404BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
405{
telsoa01c577f2c2018-08-31 09:22:23 +0100406 RefCreateSingleOutputMultipleInputsTest<RefSplitterFloat32Workload, RefActivationFloat32Workload,
407 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000408}
409
410BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
411{
telsoa01c577f2c2018-08-31 09:22:23 +0100412 RefCreateSingleOutputMultipleInputsTest<RefSplitterUint8Workload, RefActivationUint8Workload,
413 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000414}
415
telsoa01c577f2c2018-08-31 09:22:23 +0100416template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000417static void RefCreateResizeBilinearTest()
418{
419 Graph graph;
420 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100421 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000422
telsoa01c577f2c2018-08-31 09:22:23 +0100423 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000424 CheckInputOutput(
425 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100426 TensorInfo({ 2, 3, 4, 4 }, DataType),
427 TensorInfo({ 2, 3, 2, 2 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000428}
429
430BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
431{
telsoa01c577f2c2018-08-31 09:22:23 +0100432 RefCreateResizeBilinearTest<RefResizeBilinearFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000433}
434
435BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
436{
telsoa01c577f2c2018-08-31 09:22:23 +0100437 RefCreateResizeBilinearTest<RefResizeBilinearUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000438}
439
440BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
441{
442 Graph graph;
443 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100444 auto workload = CreateL2NormalizationWorkloadTest<RefL2NormalizationFloat32Workload, armnn::DataType::Float32>
445 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000446
telsoa01c577f2c2018-08-31 09:22:23 +0100447 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000448 CheckInputOutput(
449 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100450 TensorInfo({ 5, 20, 50, 67 }, armnn::DataType::Float32),
451 TensorInfo({ 5, 20, 50, 67 }, armnn::DataType::Float32));
telsoa014fcda012018-03-09 14:13:49 +0000452}
453
telsoa01c577f2c2018-08-31 09:22:23 +0100454template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000455static void RefCreateReshapeWorkloadTest()
456{
457 Graph graph;
458 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100459 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000460
telsoa01c577f2c2018-08-31 09:22:23 +0100461 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000462 CheckInputOutput(
463 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100464 TensorInfo({ 4, 1 }, DataType),
465 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000466}
467
468BOOST_AUTO_TEST_CASE(CreateReshapeFloat32Workload)
469{
telsoa01c577f2c2018-08-31 09:22:23 +0100470 RefCreateReshapeWorkloadTest<RefReshapeFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000471}
472
473BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
474{
telsoa01c577f2c2018-08-31 09:22:23 +0100475 RefCreateReshapeWorkloadTest<RefReshapeUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000476}
477
478BOOST_AUTO_TEST_SUITE_END()