blob: 12cb5e99562aac6fcc302388a6d8739df16f4683 [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
Jan Eilers146b2e12019-08-16 10:45:30 +01006#include <cl/ClBackend.hpp>
7#include <neon/NeonBackend.hpp>
Sadik Armaganf0a6dec2021-03-25 07:46:55 +00008#include <reference/RefBackend.hpp>
Finn Williamsb9af86e2021-05-26 18:38:12 +01009#include <armnn/BackendHelper.hpp>
Jan Eilers146b2e12019-08-16 10:45:30 +010010
11#include <Network.hpp>
12
Sadik Armagan1625efc2021-06-10 18:24:34 +010013#include <doctest/doctest.h>
14
Jan Eilers146b2e12019-08-16 10:45:30 +010015#include <vector>
16#include <string>
17
18using namespace armnn;
19
Finn Williams50f7b322021-06-15 15:42:17 +010020#if defined(ARMCOMPUTENEON_ENABLED) && defined(ARMCOMPUTECL_ENABLED)
21
22TEST_SUITE("BackendsCompatibility")
23{
24// Partially disabled Test Suite
25TEST_CASE("Neon_Cl_DirectCompatibility_Test")
26{
27 auto neonBackend = std::make_unique<NeonBackend>();
28 auto clBackend = std::make_unique<ClBackend>();
29
30 TensorHandleFactoryRegistry registry;
31 neonBackend->RegisterTensorHandleFactories(registry);
32 clBackend->RegisterTensorHandleFactories(registry);
33
34 const BackendId& neonBackendId = neonBackend->GetId();
35 const BackendId& clBackendId = clBackend->GetId();
36
37 BackendsMap backends;
38 backends[neonBackendId] = std::move(neonBackend);
39 backends[clBackendId] = std::move(clBackend);
40
41 armnn::Graph graph;
42
43 armnn::InputLayer* const inputLayer = graph.AddLayer<armnn::InputLayer>(0, "input");
44
45 inputLayer->SetBackendId(neonBackendId);
46
47 armnn::SoftmaxDescriptor smDesc;
48 armnn::SoftmaxLayer* const softmaxLayer1 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax1");
49 softmaxLayer1->SetBackendId(clBackendId);
50
51 armnn::SoftmaxLayer* const softmaxLayer2 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax2");
52 softmaxLayer2->SetBackendId(neonBackendId);
53
54 armnn::SoftmaxLayer* const softmaxLayer3 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax3");
55 softmaxLayer3->SetBackendId(clBackendId);
56
57 armnn::SoftmaxLayer* const softmaxLayer4 = graph.AddLayer<armnn::SoftmaxLayer>(smDesc, "softmax4");
58 softmaxLayer4->SetBackendId(neonBackendId);
59
60 armnn::OutputLayer* const outputLayer = graph.AddLayer<armnn::OutputLayer>(0, "output");
61 outputLayer->SetBackendId(clBackendId);
62
63 inputLayer->GetOutputSlot(0).Connect(softmaxLayer1->GetInputSlot(0));
64 softmaxLayer1->GetOutputSlot(0).Connect(softmaxLayer2->GetInputSlot(0));
65 softmaxLayer2->GetOutputSlot(0).Connect(softmaxLayer3->GetInputSlot(0));
66 softmaxLayer3->GetOutputSlot(0).Connect(softmaxLayer4->GetInputSlot(0));
67 softmaxLayer4->GetOutputSlot(0).Connect(outputLayer->GetInputSlot(0));
68
69 graph.TopologicalSort();
70
71 std::vector<std::string> errors;
72 auto result = SelectTensorHandleStrategy(graph, backends, registry, true, errors);
73
74 CHECK(result.m_Error == false);
75 CHECK(result.m_Warning == false);
76
77 // OutputSlot& inputLayerOut = inputLayer->GetOutputSlot(0);
78 // OutputSlot& softmaxLayer1Out = softmaxLayer1->GetOutputSlot(0);
79 // OutputSlot& softmaxLayer2Out = softmaxLayer2->GetOutputSlot(0);
80 // OutputSlot& softmaxLayer3Out = softmaxLayer3->GetOutputSlot(0);
81 // OutputSlot& softmaxLayer4Out = softmaxLayer4->GetOutputSlot(0);
82
83 // // Check that the correct factory was selected
84 // CHECK(inputLayerOut.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
85 // CHECK(softmaxLayer1Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
86 // CHECK(softmaxLayer2Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
87 // CHECK(softmaxLayer3Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
88 // CHECK(softmaxLayer4Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
89
90 // // Check that the correct strategy was selected
91 // CHECK((inputLayerOut.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
92 // CHECK((softmaxLayer1Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
93 // CHECK((softmaxLayer2Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
94 // CHECK((softmaxLayer3Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
95 // CHECK((softmaxLayer4Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
96
97 graph.AddCompatibilityLayers(backends, registry);
98
99 // Test for copy layers
100 int copyCount= 0;
101 graph.ForEachLayer([&copyCount](Layer* layer)
102 {
103 if (layer->GetType() == LayerType::MemCopy)
104 {
105 copyCount++;
106 }
107 });
108 // CHECK(copyCount == 0);
109
110 // Test for import layers
111 int importCount= 0;
112 graph.ForEachLayer([&importCount](Layer *layer)
113 {
114 if (layer->GetType() == LayerType::MemImport)
115 {
116 importCount++;
117 }
118 });
119 // CHECK(importCount == 0);
120}
121
122}
Finn Williamsb9af86e2021-05-26 18:38:12 +0100123#endif
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000124
Sadik Armagan1625efc2021-06-10 18:24:34 +0100125TEST_SUITE("BackendCapability")
126{
Colm Donelan92c50722021-03-29 14:59:04 +0100127#if defined(ARMNNREF_ENABLED)
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000128
Sadik Armagan1625efc2021-06-10 18:24:34 +0100129TEST_CASE("Ref_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100130{
131 auto refBackend = std::make_unique<RefBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100132 auto refCapabilities = refBackend->GetCapabilities();
Sadik Armaganaede8ca2021-03-31 16:12:13 +0100133
Sadik Armagan1625efc2021-06-10 18:24:34 +0100134 CHECK(armnn::HasCapability("NonConstWeights", refCapabilities));
135 CHECK(armnn::HasCapability("AsyncExecution", refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100136
137 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", true};
138 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", true};
139
Sadik Armagan1625efc2021-06-10 18:24:34 +0100140 CHECK(armnn::HasCapability(nonConstWeights, refCapabilities));
141 CHECK(armnn::HasCapability(AsyncExecution, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100142}
143
Sadik Armagan1625efc2021-06-10 18:24:34 +0100144TEST_CASE("Ref_Backends_Unkown_Capability_Test")
Finn Williamsb9af86e2021-05-26 18:38:12 +0100145{
146 auto refBackend = std::make_unique<RefBackend>();
147 auto refCapabilities = refBackend->GetCapabilities();
148
149 armnn::BackendOptions::BackendOption AsyncExecutionFalse{"AsyncExecution", false};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100150 CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100151
152 armnn::BackendOptions::BackendOption AsyncExecutionInt{"AsyncExecution", 50};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100153 CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100154
155 armnn::BackendOptions::BackendOption AsyncExecutionFloat{"AsyncExecution", 0.0f};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100156 CHECK(!armnn::HasCapability(AsyncExecutionFloat, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100157
158 armnn::BackendOptions::BackendOption AsyncExecutionString{"AsyncExecution", "true"};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100159 CHECK(!armnn::HasCapability(AsyncExecutionString, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100160
Sadik Armagan1625efc2021-06-10 18:24:34 +0100161 CHECK(!armnn::HasCapability("Telekinesis", refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100162 armnn::BackendOptions::BackendOption unkownCapability{"Telekinesis", true};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100163 CHECK(!armnn::HasCapability(unkownCapability, refCapabilities));
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000164}
165
Colm Donelan92c50722021-03-29 14:59:04 +0100166#endif
167
168#if defined(ARMCOMPUTENEON_ENABLED)
169
Sadik Armagan1625efc2021-06-10 18:24:34 +0100170TEST_CASE("Neon_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100171{
172 auto neonBackend = std::make_unique<NeonBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100173 auto neonCapabilities = neonBackend->GetCapabilities();
174
Sadik Armagan1625efc2021-06-10 18:24:34 +0100175 CHECK(armnn::HasCapability("NonConstWeights", neonCapabilities));
176 CHECK(armnn::HasCapability("AsyncExecution", neonCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100177
178 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
179 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
180
Sadik Armagan1625efc2021-06-10 18:24:34 +0100181 CHECK(armnn::HasCapability(nonConstWeights, neonCapabilities));
182 CHECK(armnn::HasCapability(AsyncExecution, neonCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100183}
184
185#endif
186
187#if defined(ARMCOMPUTECL_ENABLED)
188
Sadik Armagan1625efc2021-06-10 18:24:34 +0100189TEST_CASE("Cl_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100190{
Finn Williamsb9af86e2021-05-26 18:38:12 +0100191 auto clBackend = std::make_unique<ClBackend>();
192 auto clCapabilities = clBackend->GetCapabilities();
193
Sadik Armagan1625efc2021-06-10 18:24:34 +0100194 CHECK(armnn::HasCapability("NonConstWeights", clCapabilities));
195 CHECK(armnn::HasCapability("AsyncExecution", clCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100196
197 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
198 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
199
Sadik Armagan1625efc2021-06-10 18:24:34 +0100200 CHECK(armnn::HasCapability(nonConstWeights, clCapabilities));
201 CHECK(armnn::HasCapability(AsyncExecution, clCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100202}
203
204#endif
205
Sadik Armagan1625efc2021-06-10 18:24:34 +0100206}