blob: 31706eb1e70ca13fc063ec33247ebc2f7f65be64 [file] [log] [blame]
Matteo Martincighd0dc7702019-08-01 17:09:03 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
Mike Kelly07810fc2020-11-12 10:58:48 +00006#include <armnn/BackendOptions.hpp>
Matteo Martincighe5b8eb92019-11-28 15:45:42 +00007#include <armnn/backends/IBackendInternal.hpp>
Matteo Martincighd0dc7702019-08-01 17:09:03 +01008
9namespace armnn
10{
11
12ARMNN_NO_DEPRECATE_WARN_BEGIN
13IBackendInternal::ISubGraphConverterPtr IBackendInternal::CreateSubGraphConverter(
Derek Lamberti901ea112019-12-10 22:07:09 +000014 const std::shared_ptr<SubGraph>& /*subGrapg*/) const
Matteo Martincighd0dc7702019-08-01 17:09:03 +010015{
16 return ISubGraphConverterPtr{};
17}
18
19IBackendInternal::Optimizations IBackendInternal::GetOptimizations() const
20{
21 return Optimizations{};
22}
23
Derek Lamberti901ea112019-12-10 22:07:09 +000024IBackendInternal::SubGraphUniquePtr IBackendInternal::OptimizeSubGraph(const SubGraph& /*subGraph*/,
Matteo Martincighd0dc7702019-08-01 17:09:03 +010025 bool& optimizationAttempted) const
26{
27 optimizationAttempted = false;
28 return nullptr;
29}
30ARMNN_NO_DEPRECATE_WARN_END
31
32IMemoryManagerUniquePtr IBackendInternal::CreateMemoryManager() const
33{
34 return IMemoryManagerUniquePtr();
35}
36
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +010037IBackendInternal::IWorkloadFactoryPtr IBackendInternal::CreateWorkloadFactory(
Derek Lamberti901ea112019-12-10 22:07:09 +000038 class TensorHandleFactoryRegistry& /*tensorHandleFactoryRegistry*/) const
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +010039{
40 return IWorkloadFactoryPtr{};
41}
42
Sadik Armagan04a72972020-09-14 15:44:18 +010043IBackendInternal::IWorkloadFactoryPtr IBackendInternal::CreateWorkloadFactory(
44 const IMemoryManagerSharedPtr& memoryManager,
45 const ModelOptions& modelOptions) const
46{
Sadik Armagana25886e2020-09-15 17:17:08 +010047 if (!modelOptions.empty())
Sadik Armagan04a72972020-09-14 15:44:18 +010048 {
Sadik Armagana25886e2020-09-15 17:17:08 +010049 for (auto optionsGroup : modelOptions)
50 {
51 if (optionsGroup.GetBackendId() == GetId())
52 {
53 return IWorkloadFactoryPtr{};
54 }
55 }
Sadik Armagan04a72972020-09-14 15:44:18 +010056 }
Sadik Armagana25886e2020-09-15 17:17:08 +010057
58 return CreateWorkloadFactory(memoryManager);
Sadik Armagan04a72972020-09-14 15:44:18 +010059}
60
61IBackendInternal::IWorkloadFactoryPtr IBackendInternal::CreateWorkloadFactory(
62 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
63 const ModelOptions& modelOptions) const
64{
Sadik Armagana25886e2020-09-15 17:17:08 +010065 if (!modelOptions.empty())
Sadik Armagan04a72972020-09-14 15:44:18 +010066 {
Sadik Armagana25886e2020-09-15 17:17:08 +010067 for (auto optionsGroup : modelOptions)
68 {
69 if (optionsGroup.GetBackendId() == GetId())
70 {
71 return IWorkloadFactoryPtr{};
72 }
73 }
Sadik Armagan04a72972020-09-14 15:44:18 +010074 }
Sadik Armagana25886e2020-09-15 17:17:08 +010075
76 return CreateWorkloadFactory(tensorHandleFactoryRegistry);
Sadik Armagan04a72972020-09-14 15:44:18 +010077}
78
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +010079IBackendInternal::IWorkloadFactoryPtr IBackendInternal::CreateWorkloadFactory(
80 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
81 const ModelOptions& modelOptions,
82 MemorySourceFlags inputFlags,
83 MemorySourceFlags outputFlags) const
84{
85 IgnoreUnused(inputFlags);
86 IgnoreUnused(outputFlags);
87 return CreateWorkloadFactory(tensorHandleFactoryRegistry, modelOptions);
88}
89
Matteo Martincighd0dc7702019-08-01 17:09:03 +010090IBackendInternal::IBackendContextPtr IBackendInternal::CreateBackendContext(const IRuntime::CreationOptions&) const
91{
92 return IBackendContextPtr{};
93}
94
Sadik Armagan045f6be2020-09-10 13:37:32 +010095IBackendInternal::IBackendSpecificModelContextPtr IBackendInternal::CreateBackendSpecificModelContext(
96 const ModelOptions&) const
97{
98 return IBackendSpecificModelContextPtr{};
99}
100
Colm Donelane49755b2020-01-29 15:22:43 +0000101IBackendInternal::IBackendProfilingContextPtr IBackendInternal::CreateBackendProfilingContext(
Colm Donelan1aff3932020-02-05 17:48:59 +0000102 const IRuntime::CreationOptions&, IBackendProfilingPtr&)
Colm Donelane49755b2020-01-29 15:22:43 +0000103{
104 return IBackendProfilingContextPtr{};
105}
106
Sadik Armagana25886e2020-09-15 17:17:08 +0100107IBackendInternal::ILayerSupportSharedPtr IBackendInternal::GetLayerSupport(const ModelOptions& modelOptions) const
108{
109 if (!modelOptions.empty())
110 {
111 for (auto optionsGroup : modelOptions)
112 {
113 if (optionsGroup.GetBackendId() == GetId())
114 {
115 return ILayerSupportSharedPtr{};
116 }
117 }
118 }
119
120 return GetLayerSupport();
121}
122
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100123// Default implementation of OptimizeSubgraphView for backward compatibility with the old API.
124// Override this method with a custom optimization implementation.
125OptimizationViews IBackendInternal::OptimizeSubgraphView(const SubgraphView& subgraph) const
126{
127 bool optimizationAttempted = false;
128
129 ARMNN_NO_DEPRECATE_WARN_BEGIN
130 SubGraphUniquePtr optSubgraph = OptimizeSubGraph(subgraph, optimizationAttempted);
131 ARMNN_NO_DEPRECATE_WARN_END
132
133 OptimizationViews result;
134 if (!optimizationAttempted)
135 {
136 result.AddUntouchedSubgraph(SubgraphView(subgraph));
137 }
138 else if (optSubgraph)
139 {
140 result.AddSubstitution({subgraph, SubgraphView(*optSubgraph.get())});
141 }
142 else
143 {
144 result.AddFailedSubgraph(SubgraphView(subgraph));
145 }
146
147 return result;
148}
149
Mike Kelly07810fc2020-11-12 10:58:48 +0000150OptimizationViews IBackendInternal::OptimizeSubgraphView(const SubgraphView& subgraph,
151 const ModelOptions& /*modelOptions*/) const
152{
153 return OptimizeSubgraphView(subgraph);
154}
155
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100156bool IBackendInternal::SupportsTensorAllocatorAPI() const
157{
158 return !GetHandleFactoryPreferences().empty();
159}
160
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +0100161void IBackendInternal::RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry,
162 MemorySourceFlags /*inputFlags*/,
163 MemorySourceFlags /*outputFlags*/)
164{
165 return RegisterTensorHandleFactories(registry);
166}
167
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100168ITensorHandleFactory::FactoryId IBackendInternal::GetBackwardCompatibleFavoriteHandleFactory()
169{
170 auto favorites = GetHandleFactoryPreferences();
171 if (favorites.empty())
172 {
173 return ITensorHandleFactory::LegacyFactoryId;
174 }
175
176 return favorites[0];
177}
178
179std::vector<ITensorHandleFactory::FactoryId> IBackendInternal::GetHandleFactoryPreferences() const
180{
181 return std::vector<ITensorHandleFactory::FactoryId>();
182}
183
184} // namespace armnn