blob: ed000885499c0f1a319382f0a94e29ba120b02c6 [file] [log] [blame]
Jan Eilers146b2e12019-08-16 10:45:30 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include <boost/test/unit_test.hpp>
7
8#include <cl/ClBackend.hpp>
9#include <neon/NeonBackend.hpp>
Sadik Armaganf0a6dec2021-03-25 07:46:55 +000010#include <reference/RefBackend.hpp>
Finn Williamsb9af86e2021-05-26 18:38:12 +010011#include <armnn/BackendHelper.hpp>
Jan Eilers146b2e12019-08-16 10:45:30 +010012
13#include <Network.hpp>
14
15#include <vector>
16#include <string>
17
18using namespace armnn;
19
Narumol Prangnawarat265e53e2020-10-30 16:06:55 +000020BOOST_AUTO_TEST_SUITE(BackendsCompatibility, * boost::unit_test::disabled())
Jan Eilers146b2e12019-08-16 10:45:30 +010021
Finn Williamsb9af86e2021-05-26 18:38:12 +010022#if defined(ARMCOMPUTENEON_ENABLED)
Jan Eilers146b2e12019-08-16 10:45:30 +010023BOOST_AUTO_TEST_CASE(Neon_Cl_DirectCompatibility_Test)
24{
25 auto neonBackend = std::make_unique<NeonBackend>();
26 auto clBackend = std::make_unique<ClBackend>();
27
28 TensorHandleFactoryRegistry registry;
29 neonBackend->RegisterTensorHandleFactories(registry);
30 clBackend->RegisterTensorHandleFactories(registry);
31
32 const BackendId& neonBackendId = neonBackend->GetId();
33 const BackendId& clBackendId = clBackend->GetId();
34
35 BackendsMap backends;
36 backends[neonBackendId] = std::move(neonBackend);
37 backends[clBackendId] = std::move(clBackend);
38
39 armnn::Graph graph;
40
41 armnn::InputLayer* const inputLayer = graph.AddLayer<armnn::InputLayer>(0, "input");
42
43 inputLayer->SetBackendId(neonBackendId);
44
45 armnn::SoftmaxDescriptor smDesc;
46 armnn::SoftmaxLayer* const softmaxLayer1 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax1");
47 softmaxLayer1->SetBackendId(clBackendId);
48
49 armnn::SoftmaxLayer* const softmaxLayer2 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax2");
50 softmaxLayer2->SetBackendId(neonBackendId);
51
52 armnn::SoftmaxLayer* const softmaxLayer3 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax3");
53 softmaxLayer3->SetBackendId(clBackendId);
54
55 armnn::SoftmaxLayer* const softmaxLayer4 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax4");
56 softmaxLayer4->SetBackendId(neonBackendId);
57
58 armnn::OutputLayer* const outputLayer = graph.AddLayer<armnn::OutputLayer>(0, "output");
59 outputLayer->SetBackendId(clBackendId);
60
61 inputLayer->GetOutputSlot(0).Connect(softmaxLayer1->GetInputSlot(0));
62 softmaxLayer1->GetOutputSlot(0).Connect(softmaxLayer2->GetInputSlot(0));
63 softmaxLayer2->GetOutputSlot(0).Connect(softmaxLayer3->GetInputSlot(0));
64 softmaxLayer3->GetOutputSlot(0).Connect(softmaxLayer4->GetInputSlot(0));
65 softmaxLayer4->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
66
67 graph.TopologicalSort();
68
69 std::vector<std::string> errors;
Narumol Prangnawarata2493a02020-08-19 14:39:07 +010070 auto result = SelectTensorHandleStrategy(graph, backends, registry, true, errors);
Jan Eilers146b2e12019-08-16 10:45:30 +010071
72 BOOST_TEST(result.m_Error == false);
73 BOOST_TEST(result.m_Warning == false);
74
75 OutputSlot& inputLayerOut = inputLayer->GetOutputSlot(0);
76 OutputSlot& softmaxLayer1Out = softmaxLayer1->GetOutputSlot(0);
77 OutputSlot& softmaxLayer2Out = softmaxLayer2->GetOutputSlot(0);
78 OutputSlot& softmaxLayer3Out = softmaxLayer3->GetOutputSlot(0);
79 OutputSlot& softmaxLayer4Out = softmaxLayer4->GetOutputSlot(0);
80
81 // Check that the correct factory was selected
82 BOOST_TEST(inputLayerOut.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
83 BOOST_TEST(softmaxLayer1Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
84 BOOST_TEST(softmaxLayer2Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
85 BOOST_TEST(softmaxLayer3Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
86 BOOST_TEST(softmaxLayer4Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
87
88 // Check that the correct strategy was selected
89 BOOST_TEST((inputLayerOut.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
90 BOOST_TEST((softmaxLayer1Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
91 BOOST_TEST((softmaxLayer2Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
92 BOOST_TEST((softmaxLayer3Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
93 BOOST_TEST((softmaxLayer4Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
94
95 graph.AddCompatibilityLayers(backends, registry);
96
97 // Test for copy layers
98 int copyCount= 0;
99 graph.ForEachLayer([&copyCount](Layer* layer)
100 {
101 if (layer->GetType() == LayerType::MemCopy)
102 {
103 copyCount++;
104 }
105 });
106 BOOST_TEST(copyCount == 0);
107
108 // Test for import layers
109 int importCount= 0;
110 graph.ForEachLayer([&importCount](Layer *layer)
111 {
112 if (layer->GetType() == LayerType::MemImport)
113 {
114 importCount++;
115 }
116 });
117 BOOST_TEST(importCount == 0);
118}
Finn Williamsb9af86e2021-05-26 18:38:12 +0100119#endif
Jan Eilers146b2e12019-08-16 10:45:30 +0100120BOOST_AUTO_TEST_SUITE_END()
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000121
122BOOST_AUTO_TEST_SUITE(BackendCapability)
123
Colm Donelan92c50722021-03-29 14:59:04 +0100124#if defined(ARMNNREF_ENABLED)
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000125
Colm Donelan92c50722021-03-29 14:59:04 +0100126BOOST_AUTO_TEST_CASE(Ref_Backends_Capability_Test)
127{
128 auto refBackend = std::make_unique<RefBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100129 auto refCapabilities = refBackend->GetCapabilities();
Sadik Armaganaede8ca2021-03-31 16:12:13 +0100130
Finn Williamsb9af86e2021-05-26 18:38:12 +0100131 BOOST_CHECK(armnn::HasCapability("NonConstWeights", refCapabilities));
132 BOOST_CHECK(armnn::HasCapability("AsyncExecution", refCapabilities));
133
134 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", true};
135 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", true};
136
137 BOOST_CHECK(armnn::HasCapability(nonConstWeights, refCapabilities));
138 BOOST_CHECK(armnn::HasCapability(AsyncExecution, refCapabilities));
139}
140
141BOOST_AUTO_TEST_CASE(Ref_Backends_Unkown_Capability_Test)
142{
143 auto refBackend = std::make_unique<RefBackend>();
144 auto refCapabilities = refBackend->GetCapabilities();
145
146 armnn::BackendOptions::BackendOption AsyncExecutionFalse{"AsyncExecution", false};
147 BOOST_CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
148
149 armnn::BackendOptions::BackendOption AsyncExecutionInt{"AsyncExecution", 50};
150 BOOST_CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
151
152 armnn::BackendOptions::BackendOption AsyncExecutionFloat{"AsyncExecution", 0.0f};
153 BOOST_CHECK(!armnn::HasCapability(AsyncExecutionFloat, refCapabilities));
154
155 armnn::BackendOptions::BackendOption AsyncExecutionString{"AsyncExecution", "true"};
156 BOOST_CHECK(!armnn::HasCapability(AsyncExecutionString, refCapabilities));
157
158 BOOST_CHECK(!armnn::HasCapability("Telekinesis", refCapabilities));
159 armnn::BackendOptions::BackendOption unkownCapability{"Telekinesis", true};
160 BOOST_CHECK(!armnn::HasCapability(unkownCapability, refCapabilities));
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000161}
162
Colm Donelan92c50722021-03-29 14:59:04 +0100163#endif
164
165#if defined(ARMCOMPUTENEON_ENABLED)
166
167BOOST_AUTO_TEST_CASE(Neon_Backends_Capability_Test)
168{
169 auto neonBackend = std::make_unique<NeonBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100170 auto neonCapabilities = neonBackend->GetCapabilities();
171
172 BOOST_CHECK(armnn::HasCapability("NonConstWeights", neonCapabilities));
173 BOOST_CHECK(armnn::HasCapability("AsyncExecution", neonCapabilities));
174
175 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
176 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
177
178 BOOST_CHECK(armnn::HasCapability(nonConstWeights, neonCapabilities));
179 BOOST_CHECK(armnn::HasCapability(AsyncExecution, neonCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100180}
181
182#endif
183
184#if defined(ARMCOMPUTECL_ENABLED)
185
186BOOST_AUTO_TEST_CASE(Cl_Backends_Capability_Test)
187{
Finn Williamsb9af86e2021-05-26 18:38:12 +0100188 auto clBackend = std::make_unique<ClBackend>();
189 auto clCapabilities = clBackend->GetCapabilities();
190
191 BOOST_CHECK(armnn::HasCapability("NonConstWeights", clCapabilities));
192 BOOST_CHECK(armnn::HasCapability("AsyncExecution", clCapabilities));
193
194 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
195 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
196
197 BOOST_CHECK(armnn::HasCapability(nonConstWeights, clCapabilities));
198 BOOST_CHECK(armnn::HasCapability(AsyncExecution, clCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100199}
200
201#endif
202
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000203BOOST_AUTO_TEST_SUITE_END()