blob: 4abab2724a8930506992358f25ff37895125d639 [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 Williamsb9af86e2021-05-26 18:38:12 +010020#if defined(ARMCOMPUTENEON_ENABLED)
Sadik Armagan1625efc2021-06-10 18:24:34 +010021// Disabled Test Suite
22//TEST_SUITE("BackendsCompatibility")
23//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;
70// auto result = SelectTensorHandleStrategy(graph, backends, registry, true, errors);
71//
72// CHECK(result.m_Error == false);
73// CHECK(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// CHECK(inputLayerOut.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
83// CHECK(softmaxLayer1Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
84// CHECK(softmaxLayer2Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
85// CHECK(softmaxLayer3Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
86// CHECK(softmaxLayer4Out.GetTensorHandleFactoryId() == "Arm/Cl/TensorHandleFactory");
87//
88// // Check that the correct strategy was selected
89// CHECK((inputLayerOut.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
90// CHECK((softmaxLayer1Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
91// CHECK((softmaxLayer2Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
92// CHECK((softmaxLayer3Out.GetEdgeStrategyForConnection(0) == EdgeStrategy::DirectCompatibility));
93// CHECK((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// CHECK(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// CHECK(importCount == 0);
118//}
119//
120//}
Finn Williamsb9af86e2021-05-26 18:38:12 +0100121#endif
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000122
Sadik Armagan1625efc2021-06-10 18:24:34 +0100123TEST_SUITE("BackendCapability")
124{
Colm Donelan92c50722021-03-29 14:59:04 +0100125#if defined(ARMNNREF_ENABLED)
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000126
Sadik Armagan1625efc2021-06-10 18:24:34 +0100127TEST_CASE("Ref_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100128{
129 auto refBackend = std::make_unique<RefBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100130 auto refCapabilities = refBackend->GetCapabilities();
Sadik Armaganaede8ca2021-03-31 16:12:13 +0100131
Sadik Armagan1625efc2021-06-10 18:24:34 +0100132 CHECK(armnn::HasCapability("NonConstWeights", refCapabilities));
133 CHECK(armnn::HasCapability("AsyncExecution", refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100134
135 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", true};
136 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", true};
137
Sadik Armagan1625efc2021-06-10 18:24:34 +0100138 CHECK(armnn::HasCapability(nonConstWeights, refCapabilities));
139 CHECK(armnn::HasCapability(AsyncExecution, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100140}
141
Sadik Armagan1625efc2021-06-10 18:24:34 +0100142TEST_CASE("Ref_Backends_Unkown_Capability_Test")
Finn Williamsb9af86e2021-05-26 18:38:12 +0100143{
144 auto refBackend = std::make_unique<RefBackend>();
145 auto refCapabilities = refBackend->GetCapabilities();
146
147 armnn::BackendOptions::BackendOption AsyncExecutionFalse{"AsyncExecution", false};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100148 CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100149
150 armnn::BackendOptions::BackendOption AsyncExecutionInt{"AsyncExecution", 50};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100151 CHECK(!armnn::HasCapability(AsyncExecutionFalse, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100152
153 armnn::BackendOptions::BackendOption AsyncExecutionFloat{"AsyncExecution", 0.0f};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100154 CHECK(!armnn::HasCapability(AsyncExecutionFloat, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100155
156 armnn::BackendOptions::BackendOption AsyncExecutionString{"AsyncExecution", "true"};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100157 CHECK(!armnn::HasCapability(AsyncExecutionString, refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100158
Sadik Armagan1625efc2021-06-10 18:24:34 +0100159 CHECK(!armnn::HasCapability("Telekinesis", refCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100160 armnn::BackendOptions::BackendOption unkownCapability{"Telekinesis", true};
Sadik Armagan1625efc2021-06-10 18:24:34 +0100161 CHECK(!armnn::HasCapability(unkownCapability, refCapabilities));
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000162}
163
Colm Donelan92c50722021-03-29 14:59:04 +0100164#endif
165
166#if defined(ARMCOMPUTENEON_ENABLED)
167
Sadik Armagan1625efc2021-06-10 18:24:34 +0100168TEST_CASE("Neon_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100169{
170 auto neonBackend = std::make_unique<NeonBackend>();
Finn Williamsb9af86e2021-05-26 18:38:12 +0100171 auto neonCapabilities = neonBackend->GetCapabilities();
172
Sadik Armagan1625efc2021-06-10 18:24:34 +0100173 CHECK(armnn::HasCapability("NonConstWeights", neonCapabilities));
174 CHECK(armnn::HasCapability("AsyncExecution", neonCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100175
176 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
177 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
178
Sadik Armagan1625efc2021-06-10 18:24:34 +0100179 CHECK(armnn::HasCapability(nonConstWeights, neonCapabilities));
180 CHECK(armnn::HasCapability(AsyncExecution, neonCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100181}
182
183#endif
184
185#if defined(ARMCOMPUTECL_ENABLED)
186
Sadik Armagan1625efc2021-06-10 18:24:34 +0100187TEST_CASE("Cl_Backends_Capability_Test")
Colm Donelan92c50722021-03-29 14:59:04 +0100188{
Finn Williamsb9af86e2021-05-26 18:38:12 +0100189 auto clBackend = std::make_unique<ClBackend>();
190 auto clCapabilities = clBackend->GetCapabilities();
191
Sadik Armagan1625efc2021-06-10 18:24:34 +0100192 CHECK(armnn::HasCapability("NonConstWeights", clCapabilities));
193 CHECK(armnn::HasCapability("AsyncExecution", clCapabilities));
Finn Williamsb9af86e2021-05-26 18:38:12 +0100194
195 armnn::BackendOptions::BackendOption nonConstWeights{"NonConstWeights", false};
196 armnn::BackendOptions::BackendOption AsyncExecution{"AsyncExecution", false};
197
Sadik Armagan1625efc2021-06-10 18:24:34 +0100198 CHECK(armnn::HasCapability(nonConstWeights, clCapabilities));
199 CHECK(armnn::HasCapability(AsyncExecution, clCapabilities));
Colm Donelan92c50722021-03-29 14:59:04 +0100200}
201
202#endif
203
Sadik Armagan1625efc2021-06-10 18:24:34 +0100204}