blob: a09b95ed0ef2f3877a8bfcb45a376bbf02ba05b5 [file] [log] [blame]
Aron Virginas-Tar70104002018-10-24 15:33:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Aron Virginas-Tarc9cc8042018-11-01 16:15:57 +00006#include <backendsCommon/test/EndToEndTestImpl.hpp>
Narumol Prangnawarat8c7324d2019-05-31 16:42:11 +01007
Aron Virginas-Tar914e4db2019-09-09 13:36:45 +01008#include <backendsCommon/test/AbsEndToEndTestImpl.hpp>
kevmay01eed85922019-01-28 08:37:25 +00009#include <backendsCommon/test/ArithmeticTestImpl.hpp>
Aron Virginas-Tar00d306e2019-08-28 18:08:46 +010010#include <backendsCommon/test/ConcatEndToEndTestImpl.hpp>
Narumol Prangnawarat8c7324d2019-05-31 16:42:11 +010011#include <backendsCommon/test/DequantizeEndToEndTestImpl.hpp>
Nikhil Raj1c8adac2019-07-22 11:27:29 +010012#include <backendsCommon/test/PreluEndToEndTestImpl.hpp>
Francis Murtaghb3fc2522019-08-09 13:20:50 +010013#include <backendsCommon/test/QuantizedLstmEndToEndTestImpl.hpp>
Ellen Norris-Thompson29794572019-06-26 16:40:36 +010014#include <backendsCommon/test/SpaceToDepthEndToEndTestImpl.hpp>
Narumol Prangnawarat0be43382019-05-27 11:29:59 +010015#include <backendsCommon/test/SplitterEndToEndTestImpl.hpp>
Sadik Armagan581742d2019-08-12 14:11:37 +010016#include <backendsCommon/test/TransposeConvolution2dEndToEndTestImpl.hpp>
Aron Virginas-Tar70104002018-10-24 15:33:28 +010017
18#include <boost/test/unit_test.hpp>
19
20BOOST_AUTO_TEST_SUITE(NeonEndToEnd)
21
narpra01b9546cf2018-11-20 15:21:28 +000022std::vector<armnn::BackendId> defaultBackends = {armnn::Compute::CpuAcc};
23
Aron Virginas-Tar914e4db2019-09-09 13:36:45 +010024// Abs
25BOOST_AUTO_TEST_CASE(NeonAbsEndToEndTestFloat32)
26{
27 AbsEndToEnd<armnn::DataType::Float32>(defaultBackends);
28}
29
30// Constant
Aron Virginas-Tar70104002018-10-24 15:33:28 +010031BOOST_AUTO_TEST_CASE(ConstantUsage_Neon_Float32)
32{
narpra01b9546cf2018-11-20 15:21:28 +000033 BOOST_TEST(ConstantUsageFloat32Test(defaultBackends));
Aron Virginas-Tar70104002018-10-24 15:33:28 +010034}
35
Matteo Martincighdb16dd32019-08-27 16:41:11 +010036#if defined(ARMNNREF_ENABLED)
Matteo Martincighe67edb22019-08-14 14:05:46 +010037
38// This test unit needs the reference backend, it's not available if the reference backend is not built
39
Aron Virginas-Tar70104002018-10-24 15:33:28 +010040BOOST_AUTO_TEST_CASE(FallbackToCpuRef)
41{
42 using namespace armnn;
43
44 // Create runtime in which test will run and allow fallback to CpuRef.
45 IRuntime::CreationOptions options;
46 IRuntimePtr runtime(IRuntime::Create(options));
47
48 // Builds up the structure of the network.
49 INetworkPtr net(INetwork::Create());
50
51 IConnectableLayer* input = net->AddInputLayer(0);
52
53 // This layer configuration isn't supported by CpuAcc but we allow fallback to CpuRef so it shoud pass.
54 NormalizationDescriptor descriptor;
55 IConnectableLayer* pooling = net->AddNormalizationLayer(descriptor);
56
57 IConnectableLayer* output = net->AddOutputLayer(0);
58
59 input->GetOutputSlot(0).Connect(pooling->GetInputSlot(0));
60 pooling->GetOutputSlot(0).Connect(output->GetInputSlot(0));
61
62 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
63 pooling->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 4, 4 }, DataType::Float32));
64
65 // optimize the network
66 std::vector<BackendId> backends = {Compute::CpuAcc, Compute::CpuRef};
67 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
68
69 // Load it into the runtime. It should pass.
70 NetworkId netId;
71 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet)) == Status::Success);
72}
73
Matteo Martincighe67edb22019-08-14 14:05:46 +010074#endif
75
kevmay01eed85922019-01-28 08:37:25 +000076BOOST_AUTO_TEST_CASE(NeonGreaterSimpleEndToEndTest)
77{
78 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
79 0, 0, 0, 0, 0, 0, 0, 0 });
80
81 ArithmeticSimpleEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
82 LayerType::Greater,
83 expectedOutput);
84}
85
86BOOST_AUTO_TEST_CASE(NeonGreaterSimpleEndToEndUint8Test)
87{
88 const std::vector<uint8_t> expectedOutput({ 0, 0, 0, 0, 1, 1, 1, 1,
89 0, 0, 0, 0, 0, 0, 0, 0 });
90
91 ArithmeticSimpleEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
92 LayerType::Greater,
93 expectedOutput);
94}
95
96BOOST_AUTO_TEST_CASE(NeonGreaterBroadcastEndToEndTest)
97{
98 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
99 1, 1, 1, 1, 1, 1 });
100
101 ArithmeticBroadcastEndToEnd<armnn::DataType::Float32, armnn::DataType::Boolean>(defaultBackends,
102 LayerType::Greater,
103 expectedOutput);
104}
105
106BOOST_AUTO_TEST_CASE(NeonGreaterBroadcastEndToEndUint8Test)
107{
108 const std::vector<uint8_t> expectedOutput({ 0, 1, 0, 0, 0, 1,
109 1, 1, 1, 1, 1, 1 });
110
111 ArithmeticBroadcastEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Boolean>(defaultBackends,
112 LayerType::Greater,
113 expectedOutput);
114}
115
Jim Flynne242f2d2019-05-22 14:24:13 +0100116BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim0Test)
narpra01b9546cf2018-11-20 15:21:28 +0000117{
Jim Flynne242f2d2019-05-22 14:24:13 +0100118 ConcatDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000119}
120
Jim Flynne242f2d2019-05-22 14:24:13 +0100121BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim0Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000122{
Jim Flynne242f2d2019-05-22 14:24:13 +0100123 ConcatDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000124}
125
Jim Flynne242f2d2019-05-22 14:24:13 +0100126BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim1Test)
narpra01b9546cf2018-11-20 15:21:28 +0000127{
Jim Flynne242f2d2019-05-22 14:24:13 +0100128 ConcatDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000129}
130
Jim Flynne242f2d2019-05-22 14:24:13 +0100131BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim1Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000132{
Jim Flynne242f2d2019-05-22 14:24:13 +0100133 ConcatDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000134}
135
Jim Flynne242f2d2019-05-22 14:24:13 +0100136BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim3Test)
narpra01b9546cf2018-11-20 15:21:28 +0000137{
Jim Flynne242f2d2019-05-22 14:24:13 +0100138 ConcatDim3EndToEnd<armnn::DataType::Float32>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000139}
140
Jim Flynne242f2d2019-05-22 14:24:13 +0100141BOOST_AUTO_TEST_CASE(NeonConcatEndToEndDim3Uint8Test)
narpra01b9546cf2018-11-20 15:21:28 +0000142{
Jim Flynne242f2d2019-05-22 14:24:13 +0100143 ConcatDim3EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
narpra01b9546cf2018-11-20 15:21:28 +0000144}
145
Narumol Prangnawarat8c7324d2019-05-31 16:42:11 +0100146BOOST_AUTO_TEST_CASE(DequantizeEndToEndSimpleTest)
147{
148 DequantizeEndToEndSimple<armnn::DataType::QuantisedAsymm8>(defaultBackends);
149}
150
151BOOST_AUTO_TEST_CASE(DequantizeEndToEndOffsetTest)
152{
153 DequantizeEndToEndOffset<armnn::DataType::QuantisedAsymm8>(defaultBackends);
154}
155
Nikhil Raj1c8adac2019-07-22 11:27:29 +0100156BOOST_AUTO_TEST_CASE(NeonPreluEndToEndFloat32Test)
157{
158 PreluEndToEndNegativeTest<armnn::DataType::Float32>(defaultBackends);
159}
160
161BOOST_AUTO_TEST_CASE(NeonPreluEndToEndTestUint8Test)
162{
163 PreluEndToEndPositiveTest<armnn::DataType::QuantisedAsymm8>(defaultBackends);
164}
165
Ellen Norris-Thompson29794572019-06-26 16:40:36 +0100166BOOST_AUTO_TEST_CASE(NeonSpaceToDepthNHWCEndToEndTest1)
167{
168 SpaceToDepthNHWCEndToEndTest1(defaultBackends);
169}
170
171BOOST_AUTO_TEST_CASE(NeonSpaceToDepthNCHWEndToEndTest1)
172{
173 SpaceToDepthNCHWEndToEndTest1(defaultBackends);
174}
175
176BOOST_AUTO_TEST_CASE(NeonSpaceToDepthNHWCEndToEndTest2)
177{
178 SpaceToDepthNHWCEndToEndTest2(defaultBackends);
179}
180
181BOOST_AUTO_TEST_CASE(NeonSpaceToDepthNCHWEndToEndTest2)
182{
183 SpaceToDepthNCHWEndToEndTest2(defaultBackends);
184}
185
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100186BOOST_AUTO_TEST_CASE(NeonSplitter1dEndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100187{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100188 Splitter1dEndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100189}
190
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100191BOOST_AUTO_TEST_CASE(NeonSplitter1dEndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100192{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100193 Splitter1dEndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100194}
195
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100196BOOST_AUTO_TEST_CASE(NeonSplitter2dDim0EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100197{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100198 Splitter2dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100199}
200
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100201BOOST_AUTO_TEST_CASE(NeonSplitter2dDim1EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100202{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100203 Splitter2dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100204}
205
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100206BOOST_AUTO_TEST_CASE(NeonSplitter2dDim0EndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100207{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100208 Splitter2dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100209}
210
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100211BOOST_AUTO_TEST_CASE(NeonSplitter2dDim1EndToEndUint8Test)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100212{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100213 Splitter2dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100214}
215
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100216BOOST_AUTO_TEST_CASE(NeonSplitter3dDim0EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100217{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100218 Splitter3dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100219}
220
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100221BOOST_AUTO_TEST_CASE(NeonSplitter3dDim1EndToEndTest)
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100222{
Narumol Prangnawarat0f072ab2019-05-29 14:12:46 +0100223 Splitter3dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
224}
225
226BOOST_AUTO_TEST_CASE(NeonSplitter3dDim2EndToEndTest)
227{
228 Splitter3dDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
229}
230
231BOOST_AUTO_TEST_CASE(NeonSplitter3dDim0EndToEndUint8Test)
232{
233 Splitter3dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
234}
235
236BOOST_AUTO_TEST_CASE(NeonSplitter3dDim1EndToEndUint8Test)
237{
238 Splitter3dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
239}
240
241BOOST_AUTO_TEST_CASE(NeonSplitter3dDim2EndToEndUint8Test)
242{
243 Splitter3dDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
244}
245
246BOOST_AUTO_TEST_CASE(NeonSplitter4dDim0EndToEndTest)
247{
248 Splitter4dDim0EndToEnd<armnn::DataType::Float32>(defaultBackends);
249}
250
251BOOST_AUTO_TEST_CASE(NeonSplitter4dDim1EndToEndTest)
252{
253 Splitter4dDim1EndToEnd<armnn::DataType::Float32>(defaultBackends);
254}
255
256BOOST_AUTO_TEST_CASE(NeonSplitter4dDim2EndToEndTest)
257{
258 Splitter4dDim2EndToEnd<armnn::DataType::Float32>(defaultBackends);
259}
260
261BOOST_AUTO_TEST_CASE(NeonSplitter4dDim3EndToEndTest)
262{
263 Splitter4dDim3EndToEnd<armnn::DataType::Float32>(defaultBackends);
264}
265
266BOOST_AUTO_TEST_CASE(NeonSplitter4dDim0EndToEndUint8Test)
267{
268 Splitter4dDim0EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
269}
270
271BOOST_AUTO_TEST_CASE(NeonSplitter4dDim1EndToEndUint8Test)
272{
273 Splitter4dDim1EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
274}
275
276BOOST_AUTO_TEST_CASE(NeonSplitter4dDim2EndToEndUint8Test)
277{
278 Splitter4dDim2EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
279}
280
281BOOST_AUTO_TEST_CASE(NeonSplitter4dDim3EndToEndUint8Test)
282{
283 Splitter4dDim3EndToEnd<armnn::DataType::QuantisedAsymm8>(defaultBackends);
Narumol Prangnawarat0be43382019-05-27 11:29:59 +0100284}
285
Francis Murtaghb3fc2522019-08-09 13:20:50 +0100286BOOST_AUTO_TEST_CASE(NeonQuantizedLstmEndToEndTest)
287{
288 QuantizedLstmEndToEnd(defaultBackends);
289}
290
Sadik Armagan581742d2019-08-12 14:11:37 +0100291BOOST_AUTO_TEST_CASE(NeonTransposeConvolution2dEndToEndFloatNchwTest)
292{
293 TransposeConvolution2dEndToEnd<armnn::DataType::Float32, armnn::DataType::Float32>(
294 defaultBackends, armnn::DataLayout::NCHW);
295}
296
297BOOST_AUTO_TEST_CASE(NeonTransposeConvolution2dEndToEndUint8NchwTest)
298{
299 TransposeConvolution2dEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
300 defaultBackends, armnn::DataLayout::NCHW);
301}
302
303BOOST_AUTO_TEST_CASE(NeonTransposeConvolution2dEndToEndFloatNhwcTest)
304{
305 TransposeConvolution2dEndToEnd<armnn::DataType::Float32, armnn::DataType::Float32>(
306 defaultBackends, armnn::DataLayout::NHWC);
307}
308
309BOOST_AUTO_TEST_CASE(NeonTransposeConvolution2dEndToEndUint8NhwcTest)
310{
311 TransposeConvolution2dEndToEnd<armnn::DataType::QuantisedAsymm8, armnn::DataType::Signed32>(
312 defaultBackends, armnn::DataLayout::NHWC);
313}
314
David Monahan3fb7e102019-08-20 11:25:29 +0100315BOOST_AUTO_TEST_CASE(NeonImportNonAlignedInputPointerTest)
316{
317 ImportNonAlignedInputPointerTest(defaultBackends);
318}
319
320// Utility function to find the number of instances of a substring within a string.
321int SubStringCounter(std::string& string, std::string&& substring)
322{
323 std::size_t found = 0;
324 int count = 0;
325 // Look for the substring starting from where we last found the substring
326 while((found = string.find(substring, found)) != std::string::npos)
327 {
328 count++;
329 // Offset by substring length to avoid finding the same substring twice
330 found += substring.length();
331 }
332 return count;
333}
334
335BOOST_AUTO_TEST_CASE(NeonImportOnlyWorkload)
336{
337 using namespace armnn;
338
339 IRuntime::CreationOptions options;
340 IRuntimePtr runtime(IRuntime::Create(options));
341
342 // Builds up the structure of the network.
343 INetworkPtr net(INetwork::Create());
344
345 IConnectableLayer* input = net->AddInputLayer(0);
346
347 ActivationDescriptor descriptor;
348 descriptor.m_Function = ActivationFunction::Square;
349 IConnectableLayer* pooling = net->AddActivationLayer(descriptor);
350
351 IConnectableLayer* output = net->AddOutputLayer(0);
352
353 input->GetOutputSlot(0).Connect(pooling->GetInputSlot(0));
354 pooling->GetOutputSlot(0).Connect(output->GetInputSlot(0));
355
356 input->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 1, 4 }, DataType::Float32));
357 pooling->GetOutputSlot(0).SetTensorInfo(TensorInfo({ 1, 1, 1, 4 }, DataType::Float32));
358
359 // optimize the network
360 std::vector<BackendId> backends = {Compute::CpuAcc};
361 IOptimizedNetworkPtr optNet = Optimize(*net, backends, runtime->GetDeviceSpec());
362
363 BOOST_TEST_CHECKPOINT("Load Network");
364 // Load it into the runtime. It should pass.
365 NetworkId netId;
366 std::string ignoredErrorMessage;
367 INetworkProperties networkProperties(true, false);
368 BOOST_TEST(runtime->LoadNetwork(netId, std::move(optNet),ignoredErrorMessage, networkProperties)
369 == Status::Success);
370
371 BOOST_TEST_CHECKPOINT("Generate Data");
372 // Creates structures for input & output
373 std::vector<float> inputData
374 {
375 1.0f, 2.0f, 3.0f, 4.0f
376 };
377
378 std::vector<float> outputData(4);
379
380 std::vector<float> expectedOutput
381 {
382 1.0f, 4.0f, 9.0f, 16.0f
383 };
384
385 BOOST_TEST_CHECKPOINT("Create Network");
386 InputTensors inputTensors
387 {
388 {0,armnn::ConstTensor(runtime->GetInputTensorInfo(netId, 0), inputData.data())},
389 };
390 OutputTensors outputTensors
391 {
392 {0,armnn::Tensor(runtime->GetOutputTensorInfo(netId, 0), outputData.data())}
393 };
394
395 BOOST_TEST_CHECKPOINT("Get Profiler");
396
397 runtime->GetProfiler(netId)->EnableProfiling(true);
398
399 BOOST_TEST_CHECKPOINT("Run Inference");
400 // Do the inference
401 runtime->EnqueueWorkload(netId, inputTensors, outputTensors);
402
403 BOOST_TEST_CHECKPOINT("Print Profiler");
404 // Retrieve the Profiler.Print() output to get the workload execution
405 ProfilerManager& profilerManager = armnn::ProfilerManager::GetInstance();
406 std::stringstream ss;
407 profilerManager.GetProfiler()->Print(ss);;
408 std::string dump = ss.str();
409
410 // Check there are no SyncMemGeneric workloads as we didn't export
411 BOOST_TEST_CHECKPOINT("Find SyncMemGeneric");
412 int count = SubStringCounter(dump, "SyncMemGeneric");
413 BOOST_TEST(count == 0);
414
415 // Should only be 1 CopyMemGeneric for the output as we imported
416 BOOST_TEST_CHECKPOINT("Find CopyMemGeneric");
417 count = SubStringCounter(dump, "CopyMemGeneric");
418 BOOST_TEST(count == 1);
419
420 // Check the output is correct
421 BOOST_CHECK_EQUAL_COLLECTIONS(outputData.begin(), outputData.end(), expectedOutput.begin(), expectedOutput.end());
422}
423
Aron Virginas-Tar70104002018-10-24 15:33:28 +0100424BOOST_AUTO_TEST_SUITE_END()