blob: a0d6569949052123de837fc9e94d00ffe953c4c3 [file] [log] [blame]
David Becke97c6e02018-10-03 13:09:28 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5#pragma once
6
David Beck9efb57d2018-11-05 13:40:33 +00007#include <armnn/Types.hpp>
David Beck1b61be52018-11-08 09:19:14 +00008#include <armnn/IRuntime.hpp>
Matteo Martincighfc598e12019-05-14 10:36:13 +01009#include <armnn/Deprecated.hpp>
Matteo Martincigh49124022019-01-11 13:25:59 +000010
Derek Lambertiff05cc52019-04-26 13:05:17 +010011#include <ISubgraphViewConverter.hpp>
12#include <SubgraphView.hpp>
Derek Lamberti84da38b2019-06-13 11:40:08 +010013#include <optimizations/Optimization.hpp>
Matteo Martincigh49124022019-01-11 13:25:59 +000014
Derek Lamberti84da38b2019-06-13 11:40:08 +010015#include "IBackendContext.hpp"
16#include "IMemoryManager.hpp"
17#include "ITensorHandleFactory.hpp"
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010018#include "OptimizationViews.hpp"
19
David Beck263e3492018-11-09 14:46:40 +000020#include <vector>
David Becke97c6e02018-10-03 13:09:28 +010021
22namespace armnn
23{
David Beck29c75de2018-10-23 13:35:58 +010024class IWorkloadFactory;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000025class IMemoryManager;
David Beck111b5d92018-11-12 14:59:37 +000026class ILayerSupport;
David Becke97c6e02018-10-03 13:09:28 +010027
28class IBackendInternal : public IBackend
29{
30protected:
David Beck9efb57d2018-11-05 13:40:33 +000031 // Creation must be done through a specific
32 // backend interface.
David Beck6b779f02018-10-09 17:20:21 +010033 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010034
35public:
David Beck29c75de2018-10-23 13:35:58 +010036 // Allow backends created by the factory function
37 // to be destroyed through IBackendInternal.
38 ~IBackendInternal() override = default;
39
40 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000041 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
David Beck263e3492018-11-09 14:46:40 +000042 using OptimizationPtr = std::unique_ptr<Optimization>;
43 using Optimizations = std::vector<OptimizationPtr>;
David Beck111b5d92018-11-12 14:59:37 +000044 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000045
Aron Virginas-Tar56055192018-11-12 18:10:43 +000046 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
47 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
48
Matteo Martincigh602af092019-05-01 10:31:27 +010049 using GraphUniquePtr = std::unique_ptr<Graph>;
Derek Lambertiff05cc52019-04-26 13:05:17 +010050 using SubgraphViewUniquePtr = std::unique_ptr<SubgraphView>;
Matteo Martincighadddddb2019-01-24 14:06:23 +000051
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010052 ARMNN_NO_DEPRECATE_WARN_BEGIN
53 using ISubGraphConverterPtr ARMNN_DEPRECATED_MSG("This type is no longer supported")
54 = std::unique_ptr<ISubGraphConverter>;
55 using SubGraphUniquePtr ARMNN_DEPRECATED_MSG("SubGraph is deprecated, use SubgraphView instead")
56 = std::unique_ptr<SubGraph>;
57
58 ARMNN_DEPRECATED_MSG("This method is no longer supported")
59 virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const
60 {
61 return ISubGraphConverterPtr{};
62 }
63
64 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Derek Lamberti84da38b2019-06-13 11:40:08 +010065 virtual Optimizations GetOptimizations() const
66 {
67 return Optimizations{};
68 }
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010069
70 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
71 virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const
72 {
73 optimizationAttempted = false;
74 return nullptr;
75 }
76 ARMNN_NO_DEPRECATE_WARN_END
77
Derek Lamberti84da38b2019-06-13 11:40:08 +010078
79 virtual IMemoryManagerUniquePtr CreateMemoryManager() const
80 {
81 return IMemoryManagerUniquePtr();
82 };
Aron Virginas-Tar56055192018-11-12 18:10:43 +000083
84 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
85 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
86
Derek Lamberti84da38b2019-06-13 11:40:08 +010087 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const
88 {
89 return IBackendContextPtr{};
90 }
Aron Virginas-Tar56055192018-11-12 18:10:43 +000091
David Beck111b5d92018-11-12 14:59:37 +000092 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +000093
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010094 // Default implementation of OptimizeSubgraphView for backward compatibility with the old API.
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010095 // Override this method with a custom optimization implementation.
Derek Lamberti8106b7c2019-05-07 21:33:30 +010096 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010097 {
Matteo Martincigh84924332019-05-09 12:46:16 +010098 bool optimizationAttempted = false;
Matteo Martincighfc598e12019-05-14 10:36:13 +010099
100 ARMNN_NO_DEPRECATE_WARN_BEGIN
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100101 SubGraphUniquePtr optSubgraph = OptimizeSubGraph(subgraph, optimizationAttempted);
Matteo Martincighfc598e12019-05-14 10:36:13 +0100102 ARMNN_NO_DEPRECATE_WARN_END
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100103
104 OptimizationViews result;
Matteo Martincigh84924332019-05-09 12:46:16 +0100105 if (!optimizationAttempted)
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100106 {
107 result.AddUntouchedSubgraph(SubgraphView(subgraph));
108 }
109 else
110 {
111 if (optSubgraph)
112 {
Matteo Martincigh88054f82019-05-17 12:15:30 +0100113 result.AddSubstitution({subgraph, SubgraphView(*optSubgraph.get())});
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100114 }
115 else
116 {
117 result.AddFailedSubgraph(SubgraphView(subgraph));
118 }
119 }
120 return result;
121 }
Derek Lamberti84da38b2019-06-13 11:40:08 +0100122
123 bool SupportsTensorAllocatorAPI() const { return GetHandleFactoryPreferences().empty() == false; }
124
125 ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory()
126 {
127 auto favorites = GetHandleFactoryPreferences();
128 if (favorites.empty())
129 {
130 return ITensorHandleFactory::LegacyFactoryId;
131 }
132 return favorites[0];
133 }
134
135 /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
136 virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const
137 {
138 return std::vector<ITensorHandleFactory::FactoryId>();
139 }
140
141 /// (Optional) Register TensorHandleFactories
142 /// Either this method or CreateMemoryManager() and
143 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
144 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) {}
David Becke97c6e02018-10-03 13:09:28 +0100145};
146
David Beck29c75de2018-10-23 13:35:58 +0100147using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
148
David Becke97c6e02018-10-03 13:09:28 +0100149} // namespace armnn