blob: 236267c177b23c696c4409af2fc50e4e5555a407 [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
6#include <armnn/test/CreateWorkload.hpp>
7
8#include <backends/CpuTensorHandle.hpp>
David Beckb4540be2018-09-24 13:18:27 +01009#include <backends/reference/RefWorkloadFactory.hpp>
10#include <backends/reference/workloads/RefWorkloads.hpp>
telsoa014fcda012018-03-09 14:13:49 +000011
12namespace
13{
14
15template<typename Workload>
16void CheckInputOutput(std::unique_ptr<Workload> workload, const TensorInfo& inputInfo, const TensorInfo& outputInfo)
17{
18 auto queueDescriptor = workload->GetData();
19 auto inputHandle = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
20 auto outputHandle = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
21 BOOST_TEST((inputHandle->GetTensorInfo() == inputInfo));
22 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
23}
24
25template <typename Workload>
26void CheckInputsOutput(std::unique_ptr<Workload> workload,
27 const TensorInfo& inputInfo0,
28 const TensorInfo& inputInfo1,
29 const TensorInfo& outputInfo)
30{
31 auto queueDescriptor = workload->GetData();
32 auto inputHandle0 = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
33 auto inputHandle1 = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[1]);
34 auto outputHandle = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
35 BOOST_TEST((inputHandle0->GetTensorInfo() == inputInfo0));
36 BOOST_TEST((inputHandle1->GetTensorInfo() == inputInfo1));
37 BOOST_TEST((outputHandle->GetTensorInfo() == outputInfo));
38}
39}
40
41BOOST_AUTO_TEST_SUITE(CreateWorkloadRef)
42
telsoa01c577f2c2018-08-31 09:22:23 +010043template <typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +000044static void RefCreateActivationWorkloadTest()
45{
46 Graph graph;
47 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +010048 auto workload = CreateActivationWorkloadTest<ActivationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000049
telsoa01c577f2c2018-08-31 09:22:23 +010050 // Checks that outputs are as we expect them (see definition of CreateActivationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +000051 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010052 TensorInfo({ 1, 1 }, DataType),
53 TensorInfo({ 1, 1 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000054}
55
56BOOST_AUTO_TEST_CASE(CreateActivationFloat32Workload)
57{
telsoa01c577f2c2018-08-31 09:22:23 +010058 RefCreateActivationWorkloadTest<RefActivationFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000059}
60
61BOOST_AUTO_TEST_CASE(CreateActivationUint8Workload)
62{
telsoa01c577f2c2018-08-31 09:22:23 +010063 RefCreateActivationWorkloadTest<RefActivationUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +000064}
65
David Beckbc392452018-09-10 14:47:28 +010066template <typename WorkloadType,
67 typename DescriptorType,
68 typename LayerType,
69 armnn::DataType DataType>
70static void RefCreateArithmethicWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +000071{
72 Graph graph;
73 RefWorkloadFactory factory;
David Beckbc392452018-09-10 14:47:28 +010074 auto workload = CreateArithmeticWorkloadTest<WorkloadType, DescriptorType, LayerType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +000075
telsoa014fcda012018-03-09 14:13:49 +000076 CheckInputsOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +010077 TensorInfo({ 2, 3 }, DataType),
78 TensorInfo({ 2, 3 }, DataType),
79 TensorInfo({ 2, 3 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +000080}
81
82BOOST_AUTO_TEST_CASE(CreateAdditionFloatWorkload)
83{
David Beckbc392452018-09-10 14:47:28 +010084 RefCreateArithmethicWorkloadTest<RefAdditionFloat32Workload,
85 AdditionQueueDescriptor,
86 AdditionLayer,
87 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +000088}
89
90BOOST_AUTO_TEST_CASE(CreateAdditionUint8Workload)
91{
David Beckbc392452018-09-10 14:47:28 +010092 RefCreateArithmethicWorkloadTest<RefAdditionUint8Workload,
93 AdditionQueueDescriptor,
94 AdditionLayer,
95 armnn::DataType::QuantisedAsymm8>();
96}
97
98BOOST_AUTO_TEST_CASE(CreateSubtractionFloatWorkload)
99{
100 RefCreateArithmethicWorkloadTest<RefSubtractionFloat32Workload,
101 SubtractionQueueDescriptor,
102 SubtractionLayer,
103 armnn::DataType::Float32>();
104}
105
106BOOST_AUTO_TEST_CASE(CreateSubtractionUint8Workload)
107{
108 RefCreateArithmethicWorkloadTest<RefSubtractionUint8Workload,
109 SubtractionQueueDescriptor,
110 SubtractionLayer,
111 armnn::DataType::QuantisedAsymm8>();
112}
113
114BOOST_AUTO_TEST_CASE(CreateMultiplicationFloatWorkload)
115{
116 RefCreateArithmethicWorkloadTest<RefMultiplicationFloat32Workload,
117 MultiplicationQueueDescriptor,
118 MultiplicationLayer,
119 armnn::DataType::Float32>();
120}
121
122BOOST_AUTO_TEST_CASE(CreateMultiplicationUint8Workload)
123{
124 RefCreateArithmethicWorkloadTest<RefMultiplicationUint8Workload,
125 MultiplicationQueueDescriptor,
126 MultiplicationLayer,
127 armnn::DataType::QuantisedAsymm8>();
128}
129
130BOOST_AUTO_TEST_CASE(CreateDivisionFloatWorkload)
131{
132 RefCreateArithmethicWorkloadTest<RefDivisionFloat32Workload,
133 DivisionQueueDescriptor,
134 DivisionLayer,
135 armnn::DataType::Float32>();
136}
137
138BOOST_AUTO_TEST_CASE(CreateDivisionUint8Workload)
139{
140 RefCreateArithmethicWorkloadTest<RefDivisionUint8Workload,
141 DivisionQueueDescriptor,
142 DivisionLayer,
143 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000144}
145
146BOOST_AUTO_TEST_CASE(CreateBatchNormalizationWorkload)
147{
148 Graph graph;
149 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100150 auto workload = CreateBatchNormalizationWorkloadTest<RefBatchNormalizationFloat32Workload, armnn::DataType::Float32>
151 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000152
telsoa01c577f2c2018-08-31 09:22:23 +0100153 // Checks that outputs and inputs are as we expect them (see definition of CreateBatchNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000154 CheckInputOutput(
155 std::move(workload), TensorInfo({2, 3, 1, 1}, DataType::Float32), TensorInfo({2, 3, 1, 1}, DataType::Float32));
156}
157
telsoa01c577f2c2018-08-31 09:22:23 +0100158BOOST_AUTO_TEST_CASE(CreateConvertFp16ToFp32Float32Workload)
159{
160 Graph graph;
161 RefWorkloadFactory factory;
162 auto workload = CreateConvertFp16ToFp32WorkloadTest<RefConvertFp16ToFp32Workload>(factory, graph);
163
164 // Checks that outputs and inputs are as we expect them
165 CheckInputOutput(
166 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float16), TensorInfo({1, 3, 2, 3}, DataType::Float32));
167}
168
169BOOST_AUTO_TEST_CASE(CreateConvertFp32ToFp16Float16Workload)
170{
171 Graph graph;
172 RefWorkloadFactory factory;
173 auto workload = CreateConvertFp32ToFp16WorkloadTest<RefConvertFp32ToFp16Workload>(factory, graph);
174
175 // Checks that outputs and inputs are as we expect them
176 CheckInputOutput(
177 std::move(workload), TensorInfo({1, 3, 2, 3}, DataType::Float32), TensorInfo({1, 3, 2, 3}, DataType::Float16));
178}
179
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100180static void RefCreateConvolution2dWorkloadTest(DataLayout dataLayout = DataLayout::NCHW)
telsoa014fcda012018-03-09 14:13:49 +0000181{
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100182 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000183 RefWorkloadFactory factory;
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100184 auto workload = CreateConvolution2dWorkloadTest<RefConvolution2dFloat32Workload, DataType::Float32>
185 (factory, graph, dataLayout);
186
187 std::initializer_list<unsigned int> inputShape = (dataLayout == DataLayout::NCHW) ?
188 std::initializer_list<unsigned int>({2, 3, 8, 16}) : std::initializer_list<unsigned int>({2, 8, 16, 3});
189 std::initializer_list<unsigned int> outputShape = (dataLayout == DataLayout::NCHW) ?
190 std::initializer_list<unsigned int>({2, 2, 2, 10}) : std::initializer_list<unsigned int>({2, 2, 10, 2});
telsoa014fcda012018-03-09 14:13:49 +0000191
telsoa01c577f2c2018-08-31 09:22:23 +0100192 // Checks that outputs and inputs are as we expect them (see definition of CreateConvolution2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000193 CheckInputOutput(std::move(workload),
Nikhil Raje4dfd6e2018-10-18 10:11:04 +0100194 TensorInfo(inputShape, DataType::Float32),
195 TensorInfo(outputShape, DataType::Float32));
196}
197
198BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNchwWorkload)
199{
200 RefCreateConvolution2dWorkloadTest(DataLayout::NCHW);
201}
202
203BOOST_AUTO_TEST_CASE(CreateConvolution2dFloatNhwcWorkload)
204{
205 RefCreateConvolution2dWorkloadTest(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000206}
207
telsoa01c577f2c2018-08-31 09:22:23 +0100208template <typename FullyConnectedWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000209static void RefCreateFullyConnectedWorkloadTest()
210{
211 Graph graph;
212 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100213 auto workload = CreateFullyConnectedWorkloadTest<FullyConnectedWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000214
telsoa01c577f2c2018-08-31 09:22:23 +0100215 // Checks that outputs and inputs are as we expect them (see definition of CreateFullyConnectedWorkloadTest).
216 float inputsQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 1.0f : 0.0;
217 float outputQScale = DataType == armnn::DataType::QuantisedAsymm8 ? 2.0f : 0.0;
telsoa014fcda012018-03-09 14:13:49 +0000218 CheckInputOutput(std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100219 TensorInfo({ 3, 1, 4, 5 }, DataType, inputsQScale),
220 TensorInfo({ 3, 7 }, DataType, outputQScale));
telsoa014fcda012018-03-09 14:13:49 +0000221}
222
223BOOST_AUTO_TEST_CASE(CreateFullyConnectedFloat32Workload)
224{
telsoa01c577f2c2018-08-31 09:22:23 +0100225 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000226}
227
228BOOST_AUTO_TEST_CASE(CreateFullyConnectedUint8Workload)
229{
telsoa01c577f2c2018-08-31 09:22:23 +0100230 RefCreateFullyConnectedWorkloadTest<RefFullyConnectedUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000231}
232
narpra0155a97bc2018-10-02 14:35:53 +0100233template <typename NormalizationWorkloadType, armnn::DataType DataType>
234static void RefCreateNormalizationWorkloadTest()
telsoa014fcda012018-03-09 14:13:49 +0000235{
narpra0155a97bc2018-10-02 14:35:53 +0100236 Graph graph;
telsoa014fcda012018-03-09 14:13:49 +0000237 RefWorkloadFactory factory;
narpra0155a97bc2018-10-02 14:35:53 +0100238 auto workload = CreateNormalizationWorkloadTest<NormalizationWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000239
telsoa01c577f2c2018-08-31 09:22:23 +0100240 // Checks that outputs and inputs are as we expect them (see definition of CreateNormalizationWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000241 CheckInputOutput(std::move(workload),
narpra0155a97bc2018-10-02 14:35:53 +0100242 TensorInfo({3, 5, 5, 1}, DataType),
243 TensorInfo({3, 5, 5, 1}, DataType));
244}
245
246BOOST_AUTO_TEST_CASE(CreateRefNormalizationNchwWorkload)
247{
248 RefCreateNormalizationWorkloadTest<RefNormalizationFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000249}
250
telsoa01c577f2c2018-08-31 09:22:23 +0100251template <typename Pooling2dWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000252static void RefCreatePooling2dWorkloadTest()
253{
254 Graph graph;
255 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100256 auto workload = CreatePooling2dWorkloadTest<Pooling2dWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000257
telsoa01c577f2c2018-08-31 09:22:23 +0100258 // Checks that outputs and inputs are as we expect them (see definition of CreatePooling2dWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000259 CheckInputOutput(
260 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100261 TensorInfo({3, 2, 5, 5}, DataType),
262 TensorInfo({3, 2, 2, 4}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000263}
264
265BOOST_AUTO_TEST_CASE(CreatePooling2dFloat32Workload)
266{
telsoa01c577f2c2018-08-31 09:22:23 +0100267 RefCreatePooling2dWorkloadTest<RefPooling2dFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000268}
269
270BOOST_AUTO_TEST_CASE(CreatePooling2dUint8Workload)
271{
telsoa01c577f2c2018-08-31 09:22:23 +0100272 RefCreatePooling2dWorkloadTest<RefPooling2dUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000273}
274
telsoa01c577f2c2018-08-31 09:22:23 +0100275template <typename SoftmaxWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000276static void RefCreateSoftmaxWorkloadTest()
277{
278 Graph graph;
279 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100280 auto workload = CreateSoftmaxWorkloadTest<SoftmaxWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000281
telsoa01c577f2c2018-08-31 09:22:23 +0100282 // Checks that outputs and inputs are as we expect them (see definition of CreateSoftmaxWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000283 CheckInputOutput(
284 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100285 TensorInfo({4, 1}, DataType),
286 TensorInfo({4, 1}, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000287}
288
289BOOST_AUTO_TEST_CASE(CreateSoftmaxFloat32Workload)
290{
telsoa01c577f2c2018-08-31 09:22:23 +0100291 RefCreateSoftmaxWorkloadTest<RefSoftmaxFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000292}
293
294BOOST_AUTO_TEST_CASE(CreateSoftmaxUint8Workload)
295{
telsoa01c577f2c2018-08-31 09:22:23 +0100296 RefCreateSoftmaxWorkloadTest<RefSoftmaxUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000297}
298
telsoa01c577f2c2018-08-31 09:22:23 +0100299template <typename SplitterWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000300static void RefCreateSplitterWorkloadTest()
301{
302 Graph graph;
303 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100304 auto workload = CreateSplitterWorkloadTest<SplitterWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000305
telsoa01c577f2c2018-08-31 09:22:23 +0100306 // Checks that outputs are as we expect them (see definition of CreateSplitterWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000307 SplitterQueueDescriptor queueDescriptor = workload->GetData();
308 auto inputHandle = boost::polymorphic_downcast<ConstCpuTensorHandle*>(queueDescriptor.m_Inputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100309 BOOST_TEST((inputHandle->GetTensorInfo() == TensorInfo({ 5, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100310
telsoa014fcda012018-03-09 14:13:49 +0000311 auto outputHandle0 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[0]);
telsoa01c577f2c2018-08-31 09:22:23 +0100312 BOOST_TEST((outputHandle0->GetTensorInfo() == TensorInfo({ 1, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100313
telsoa014fcda012018-03-09 14:13:49 +0000314 auto outputHandle1 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[1]);
telsoa01c577f2c2018-08-31 09:22:23 +0100315 BOOST_TEST((outputHandle1->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
surmeh013537c2c2018-05-18 16:31:43 +0100316
telsoa014fcda012018-03-09 14:13:49 +0000317 auto outputHandle2 = boost::polymorphic_downcast<CpuTensorHandle*>(queueDescriptor.m_Outputs[2]);
telsoa01c577f2c2018-08-31 09:22:23 +0100318 BOOST_TEST((outputHandle2->GetTensorInfo() == TensorInfo({ 2, 7, 7 }, DataType)));
telsoa014fcda012018-03-09 14:13:49 +0000319}
320
321BOOST_AUTO_TEST_CASE(CreateSplitterFloat32Workload)
322{
telsoa01c577f2c2018-08-31 09:22:23 +0100323 RefCreateSplitterWorkloadTest<RefSplitterFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000324}
325
326BOOST_AUTO_TEST_CASE(CreateSplitterUint8Workload)
327{
telsoa01c577f2c2018-08-31 09:22:23 +0100328 RefCreateSplitterWorkloadTest<RefSplitterUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000329}
330
telsoa01c577f2c2018-08-31 09:22:23 +0100331template <typename SplitterWorkloadType, typename MergerWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000332static void RefCreateSplitterMergerWorkloadTest()
333{
telsoa01c577f2c2018-08-31 09:22:23 +0100334 // Tests that it is possible to decide which output of the splitter layer
335 // should be lined to which input of the merger layer.
336 // We tested that is is possible to specify 0th output
337 // 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 +0000338 // of the merger.
339
340 Graph graph;
341 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100342 auto workloads = CreateSplitterMergerWorkloadTest<SplitterWorkloadType, MergerWorkloadType, DataType>
343 (factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000344
345 auto wlSplitter = std::move(workloads.first);
346 auto wlMerger = std::move(workloads.second);
347
telsoa01c577f2c2018-08-31 09:22:23 +0100348 //Checks that the index of inputs/outputs matches what we declared on InputDescriptor construction.
telsoa014fcda012018-03-09 14:13:49 +0000349 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
350 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
351 armnn::CpuTensorHandle* mIn0 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[0]);
352 armnn::CpuTensorHandle* mIn1 = dynamic_cast<armnn::CpuTensorHandle*>(wlMerger->GetData().m_Inputs[1]);
353
354 BOOST_TEST(sOut0);
355 BOOST_TEST(sOut1);
356 BOOST_TEST(mIn0);
357 BOOST_TEST(mIn1);
358
359 bool validDataPointers = (sOut0 == mIn1) && (sOut1 == mIn0);
360
361 BOOST_TEST(validDataPointers);
362}
363
364BOOST_AUTO_TEST_CASE(CreateSplitterMergerFloat32)
365{
telsoa01c577f2c2018-08-31 09:22:23 +0100366 RefCreateSplitterMergerWorkloadTest<RefSplitterFloat32Workload, RefMergerFloat32Workload, DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000367}
368
369BOOST_AUTO_TEST_CASE(CreateSplitterMergerUint8)
370{
telsoa01c577f2c2018-08-31 09:22:23 +0100371 RefCreateSplitterMergerWorkloadTest<RefSplitterUint8Workload, RefMergerUint8Workload, DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000372}
373
telsoa01c577f2c2018-08-31 09:22:23 +0100374template <typename SplitterWorkloadType, typename ActivationWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000375static void RefCreateSingleOutputMultipleInputsTest()
376{
telsoa01c577f2c2018-08-31 09:22:23 +0100377 // Tests that it is possible to assign multiple (two) different layers to each of the outputs of a splitter layer.
378 // 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 +0000379
380 Graph graph;
381 RefWorkloadFactory factory;
382 std::unique_ptr<SplitterWorkloadType> wlSplitter;
383 std::unique_ptr<ActivationWorkloadType> wlActiv0_0;
384 std::unique_ptr<ActivationWorkloadType> wlActiv0_1;
385 std::unique_ptr<ActivationWorkloadType> wlActiv1_0;
386 std::unique_ptr<ActivationWorkloadType> wlActiv1_1;
387
388 CreateSplitterMultipleInputsOneOutputWorkloadTest<SplitterWorkloadType,
telsoa01c577f2c2018-08-31 09:22:23 +0100389 ActivationWorkloadType, DataType>(factory, graph, wlSplitter, wlActiv0_0, wlActiv0_1, wlActiv1_0, wlActiv1_1);
telsoa014fcda012018-03-09 14:13:49 +0000390
391 armnn::CpuTensorHandle* sOut0 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[0]);
392 armnn::CpuTensorHandle* sOut1 = dynamic_cast<armnn::CpuTensorHandle*>(wlSplitter->GetData().m_Outputs[1]);
393 armnn::CpuTensorHandle* activ0_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_0->GetData().m_Inputs[0]);
394 armnn::CpuTensorHandle* activ0_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv0_1->GetData().m_Inputs[0]);
395 armnn::CpuTensorHandle* activ1_0Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_0->GetData().m_Inputs[0]);
396 armnn::CpuTensorHandle* activ1_1Im = dynamic_cast<armnn::CpuTensorHandle*>(wlActiv1_1->GetData().m_Inputs[0]);
397
398
399 BOOST_TEST(sOut0);
400 BOOST_TEST(sOut1);
401 BOOST_TEST(activ0_0Im);
402 BOOST_TEST(activ0_1Im);
403 BOOST_TEST(activ1_0Im);
404 BOOST_TEST(activ1_1Im);
405
406 bool validDataPointers = (sOut0 == activ0_0Im) && (sOut0 == activ0_1Im) &&
407 (sOut1 == activ1_0Im) && (sOut1 == activ1_1Im);
408
409 BOOST_TEST(validDataPointers);
410}
411
412BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsFloat32)
413{
telsoa01c577f2c2018-08-31 09:22:23 +0100414 RefCreateSingleOutputMultipleInputsTest<RefSplitterFloat32Workload, RefActivationFloat32Workload,
415 armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000416}
417
418BOOST_AUTO_TEST_CASE(CreateSingleOutputMultipleInputsUint8)
419{
telsoa01c577f2c2018-08-31 09:22:23 +0100420 RefCreateSingleOutputMultipleInputsTest<RefSplitterUint8Workload, RefActivationUint8Workload,
421 armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000422}
423
telsoa01c577f2c2018-08-31 09:22:23 +0100424template <typename ResizeBilinearWorkloadType, armnn::DataType DataType>
James Conroy59540822018-10-11 12:39:05 +0100425static void RefCreateResizeBilinearTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000426{
427 Graph graph;
428 RefWorkloadFactory factory;
James Conroy59540822018-10-11 12:39:05 +0100429 auto workload = CreateResizeBilinearWorkloadTest<ResizeBilinearWorkloadType, DataType>(factory, graph, dataLayout);
430
431 TensorShape inputShape;
432 TensorShape outputShape;
433
434 switch (dataLayout)
435 {
436 case DataLayout::NHWC:
437 inputShape = { 2, 4, 4, 3 };
438 outputShape = { 2, 2, 2, 3 };
439 break;
440 default: // NCHW
441 inputShape = { 2, 3, 4, 4 };
442 outputShape = { 2, 3, 2, 2 };
443 }
telsoa014fcda012018-03-09 14:13:49 +0000444
telsoa01c577f2c2018-08-31 09:22:23 +0100445 // Checks that outputs and inputs are as we expect them (see definition of CreateResizeBilinearWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000446 CheckInputOutput(
James Conroy59540822018-10-11 12:39:05 +0100447 std::move(workload),
448 TensorInfo(inputShape, DataType),
449 TensorInfo(outputShape, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000450}
451
452BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32)
453{
James Conroy59540822018-10-11 12:39:05 +0100454 RefCreateResizeBilinearTest<RefResizeBilinearFloat32Workload, armnn::DataType::Float32>(DataLayout::NCHW);
telsoa014fcda012018-03-09 14:13:49 +0000455}
456
457BOOST_AUTO_TEST_CASE(CreateResizeBilinearUint8)
458{
James Conroy59540822018-10-11 12:39:05 +0100459 RefCreateResizeBilinearTest<RefResizeBilinearUint8Workload, armnn::DataType::QuantisedAsymm8>(DataLayout::NCHW);
460}
461
462BOOST_AUTO_TEST_CASE(CreateResizeBilinearFloat32Nhwc)
463{
464 RefCreateResizeBilinearTest<RefResizeBilinearFloat32Workload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000465}
466
Matteo Martincighb63973e2018-10-16 16:23:33 +0100467template <typename L2NormalizationWorkloadType, armnn::DataType DataType>
468static void RefCreateL2NormalizationTest(DataLayout dataLayout)
telsoa014fcda012018-03-09 14:13:49 +0000469{
470 Graph graph;
471 RefWorkloadFactory factory;
Matteo Martincighb63973e2018-10-16 16:23:33 +0100472 auto workload =
473 CreateL2NormalizationWorkloadTest<L2NormalizationWorkloadType, DataType>(factory, graph, dataLayout);
474
475 TensorShape inputShape;
476 TensorShape outputShape;
477
478 switch (dataLayout)
479 {
480 case DataLayout::NHWC:
481 inputShape = { 5, 50, 67, 20 };
482 outputShape = { 5, 50, 67, 20 };
483 break;
484 case DataLayout::NCHW:
485 default:
486 inputShape = { 5, 20, 50, 67 };
487 outputShape = { 5, 20, 50, 67 };
488 break;
489 }
telsoa014fcda012018-03-09 14:13:49 +0000490
telsoa01c577f2c2018-08-31 09:22:23 +0100491 // Checks that outputs and inputs are as we expect them (see definition of CreateL2NormalizationWorkloadTest).
Matteo Martincighb63973e2018-10-16 16:23:33 +0100492 CheckInputOutput(std::move(workload), TensorInfo(inputShape, DataType), TensorInfo(outputShape, DataType));
493}
494
495BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32)
496{
497 RefCreateL2NormalizationTest<RefL2NormalizationFloat32Workload, armnn::DataType::Float32>(DataLayout::NCHW);
498}
499
500BOOST_AUTO_TEST_CASE(CreateL2NormalizationFloat32Nhwc)
501{
502 RefCreateL2NormalizationTest<RefL2NormalizationFloat32Workload, armnn::DataType::Float32>(DataLayout::NHWC);
telsoa014fcda012018-03-09 14:13:49 +0000503}
504
telsoa01c577f2c2018-08-31 09:22:23 +0100505template <typename ReshapeWorkloadType, armnn::DataType DataType>
telsoa014fcda012018-03-09 14:13:49 +0000506static void RefCreateReshapeWorkloadTest()
507{
508 Graph graph;
509 RefWorkloadFactory factory;
telsoa01c577f2c2018-08-31 09:22:23 +0100510 auto workload = CreateReshapeWorkloadTest<ReshapeWorkloadType, DataType>(factory, graph);
telsoa014fcda012018-03-09 14:13:49 +0000511
telsoa01c577f2c2018-08-31 09:22:23 +0100512 // Checks that outputs and inputs are as we expect them (see definition of CreateReshapeWorkloadTest).
telsoa014fcda012018-03-09 14:13:49 +0000513 CheckInputOutput(
514 std::move(workload),
telsoa01c577f2c2018-08-31 09:22:23 +0100515 TensorInfo({ 4, 1 }, DataType),
516 TensorInfo({ 1, 4 }, DataType));
telsoa014fcda012018-03-09 14:13:49 +0000517}
518
519BOOST_AUTO_TEST_CASE(CreateReshapeFloat32Workload)
520{
telsoa01c577f2c2018-08-31 09:22:23 +0100521 RefCreateReshapeWorkloadTest<RefReshapeFloat32Workload, armnn::DataType::Float32>();
telsoa014fcda012018-03-09 14:13:49 +0000522}
523
524BOOST_AUTO_TEST_CASE(CreateReshapeUint8Workload)
525{
telsoa01c577f2c2018-08-31 09:22:23 +0100526 RefCreateReshapeWorkloadTest<RefReshapeUint8Workload, armnn::DataType::QuantisedAsymm8>();
telsoa014fcda012018-03-09 14:13:49 +0000527}
528
529BOOST_AUTO_TEST_SUITE_END()