blob: 4815529d6d04dbecd505bfaebacffc53968e02e5 [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//
Matteo Martincighd0dc7702019-08-01 17:09:03 +01005
David Becke97c6e02018-10-03 13:09:28 +01006#pragma once
7
David Beck9efb57d2018-11-05 13:40:33 +00008#include <armnn/Types.hpp>
David Beck1b61be52018-11-08 09:19:14 +00009#include <armnn/IRuntime.hpp>
Matteo Martincighfc598e12019-05-14 10:36:13 +010010#include <armnn/Deprecated.hpp>
Matteo Martincigh49124022019-01-11 13:25:59 +000011
Derek Lambertiff05cc52019-04-26 13:05:17 +010012#include <ISubgraphViewConverter.hpp>
13#include <SubgraphView.hpp>
Derek Lamberti84da38b2019-06-13 11:40:08 +010014#include <optimizations/Optimization.hpp>
Matteo Martincigh49124022019-01-11 13:25:59 +000015
Derek Lamberti84da38b2019-06-13 11:40:08 +010016#include "IBackendContext.hpp"
Colm Donelane49755b2020-01-29 15:22:43 +000017#include "armnn/backends/profiling/IBackendProfiling.hpp"
18#include "armnn/backends/profiling/IBackendProfilingContext.hpp"
Derek Lamberti84da38b2019-06-13 11:40:08 +010019#include "IMemoryManager.hpp"
20#include "ITensorHandleFactory.hpp"
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010021#include "OptimizationViews.hpp"
22
David Beck263e3492018-11-09 14:46:40 +000023#include <vector>
Matteo Martincighd0dc7702019-08-01 17:09:03 +010024#include <memory>
David Becke97c6e02018-10-03 13:09:28 +010025
26namespace armnn
27{
David Beck29c75de2018-10-23 13:35:58 +010028class IWorkloadFactory;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000029class IMemoryManager;
David Beck111b5d92018-11-12 14:59:37 +000030class ILayerSupport;
David Becke97c6e02018-10-03 13:09:28 +010031
Matteo Martincighac60d282019-07-25 15:25:44 +010032struct BackendVersion
33{
34 uint32_t m_Major;
35 uint32_t m_Minor;
36
Matteo Martincighd0dc7702019-08-01 17:09:03 +010037 constexpr BackendVersion()
Matteo Martincighac60d282019-07-25 15:25:44 +010038 : m_Major(0)
39 , m_Minor(0)
40 {}
Matteo Martincighd0dc7702019-08-01 17:09:03 +010041 constexpr BackendVersion(uint32_t major, uint32_t minor)
Matteo Martincighac60d282019-07-25 15:25:44 +010042 : m_Major(major)
43 , m_Minor(minor)
44 {}
45
46 bool operator==(const BackendVersion& other) const
47 {
48 return this == &other ||
49 (this->m_Major == other.m_Major &&
50 this->m_Minor == other.m_Minor);
51 }
52
53 bool operator<=(const BackendVersion& other) const
54 {
55 return this->m_Major < other.m_Major ||
56 (this->m_Major == other.m_Major &&
57 this->m_Minor <= other.m_Minor);
58 }
59};
60
61inline std::ostream& operator<<(std::ostream& os, const BackendVersion& backendVersion)
62{
63 os << "[" << backendVersion.m_Major << "." << backendVersion.m_Minor << "]";
64
65 return os;
66}
67
David Becke97c6e02018-10-03 13:09:28 +010068class IBackendInternal : public IBackend
69{
70protected:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000071 /// Creation must be done through a specific
72 /// backend interface.
David Beck6b779f02018-10-09 17:20:21 +010073 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010074
75public:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000076 /// Allow backends created by the factory function
77 /// to be destroyed through IBackendInternal.
David Beck29c75de2018-10-23 13:35:58 +010078 ~IBackendInternal() override = default;
79
80 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000081 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
Ryan OShea2bbfaa72020-02-12 16:15:27 +000082 /// This is the bridge between backend and backend profiling we'll keep it in the backend namespace.
Colm Donelan1aff3932020-02-05 17:48:59 +000083 using IBackendProfilingContextPtr = std::shared_ptr<armnn::profiling::IBackendProfilingContext>;
84 using IBackendProfilingPtr = std::unique_ptr<armnn::profiling::IBackendProfiling>;
David Beck263e3492018-11-09 14:46:40 +000085 using OptimizationPtr = std::unique_ptr<Optimization>;
86 using Optimizations = std::vector<OptimizationPtr>;
David Beck111b5d92018-11-12 14:59:37 +000087 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000088
Sadik Armagan045f6be2020-09-10 13:37:32 +010089 using IBackendSpecificModelContextPtr = std::shared_ptr<IBackendModelContext>;
90
Aron Virginas-Tar56055192018-11-12 18:10:43 +000091 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
92 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
93
Matteo Martincigh602af092019-05-01 10:31:27 +010094 using GraphUniquePtr = std::unique_ptr<Graph>;
Derek Lambertiff05cc52019-04-26 13:05:17 +010095 using SubgraphViewUniquePtr = std::unique_ptr<SubgraphView>;
Matteo Martincighadddddb2019-01-24 14:06:23 +000096
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010097 ARMNN_NO_DEPRECATE_WARN_BEGIN
98 using ISubGraphConverterPtr ARMNN_DEPRECATED_MSG("This type is no longer supported")
99 = std::unique_ptr<ISubGraphConverter>;
100 using SubGraphUniquePtr ARMNN_DEPRECATED_MSG("SubGraph is deprecated, use SubgraphView instead")
101 = std::unique_ptr<SubGraph>;
102
103 ARMNN_DEPRECATED_MSG("This method is no longer supported")
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100104 virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100105
106 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100107 virtual Optimizations GetOptimizations() const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100108
109 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100110 virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100111 ARMNN_NO_DEPRECATE_WARN_END
112
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100113 virtual IMemoryManagerUniquePtr CreateMemoryManager() const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000114
115 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
116 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
117
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +0100118 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
119 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const;
120
Sadik Armagan04a72972020-09-14 15:44:18 +0100121 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
122 const IMemoryManagerSharedPtr& memoryManager,
123 const ModelOptions& modelOptions) const;
124
125 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
126 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
127 const ModelOptions& modelOptions) const;
128
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000129 /// Create the runtime context of the backend
130 ///
131 /// Implementations may return a default-constructed IBackendContextPtr if
132 /// no context is needed at runtime.
133 /// Implementations must throw BackendUnavailableException if the backend
134 /// cannot be used (for example, necessary accelerator hardware is not present).
135 /// The default implementation always returns a default-constructed pointer.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100136 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000137
Sadik Armagan045f6be2020-09-10 13:37:32 +0100138 virtual IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions& modelOptions) const;
139
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000140 /// Create context specifically used for profiling interaction from backends.
Colm Donelane49755b2020-01-29 15:22:43 +0000141 virtual IBackendProfilingContextPtr CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
Colm Donelan1aff3932020-02-05 17:48:59 +0000142 IBackendProfilingPtr& backendProfiling);
Colm Donelane49755b2020-01-29 15:22:43 +0000143
David Beck111b5d92018-11-12 14:59:37 +0000144 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000145
Sadik Armagan045f6be2020-09-10 13:37:32 +0100146 virtual ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const
147 {
148 if (modelOptions.empty())
149 {
150 return GetLayerSupport();
151 }
152 return GetLayerSupport(modelOptions);
153 }
154
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100155 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const;
Matteo Martincighfc598e12019-05-14 10:36:13 +0100156
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100157 bool SupportsTensorAllocatorAPI() const;
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100158
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100159 ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory();
Derek Lamberti84da38b2019-06-13 11:40:08 +0100160
161 /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100162 virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const;
Derek Lamberti84da38b2019-06-13 11:40:08 +0100163
164 /// (Optional) Register TensorHandleFactories
165 /// Either this method or CreateMemoryManager() and
166 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
Derek Lamberti901ea112019-12-10 22:07:09 +0000167 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& /*registry*/) {}
Matteo Martincighac60d282019-07-25 15:25:44 +0100168
169 /// Returns the version of the Backend API
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100170 static constexpr BackendVersion GetApiVersion() { return BackendVersion(1, 0); }
David Becke97c6e02018-10-03 13:09:28 +0100171};
172
David Beck29c75de2018-10-23 13:35:58 +0100173using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
174
David Becke97c6e02018-10-03 13:09:28 +0100175} // namespace armnn