blob: 06fa5edde8c7ea6a5fe8d52a514086ed0e745ded [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>
Matteo Martincigh49124022019-01-11 13:25:59 +000013
Francis Murtaghe8d7ccb2021-10-14 17:30:24 +010014#include <armnn/backends/IBackendContext.hpp>
15#include <armnn/backends/IMemoryManager.hpp>
16#include <armnn/backends/ITensorHandleFactory.hpp>
17#include <armnn/backends/OptimizationViews.hpp>
Francis Murtagha49ff082022-01-17 17:08:01 +000018#include <armnn/backends/SubgraphView.hpp>
Francis Murtaghe8d7ccb2021-10-14 17:30:24 +010019#include <armnn/backends/profiling/IBackendProfiling.hpp>
20#include <armnn/backends/profiling/IBackendProfilingContext.hpp>
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010021
David Beck263e3492018-11-09 14:46:40 +000022#include <vector>
Matteo Martincighd0dc7702019-08-01 17:09:03 +010023#include <memory>
David Becke97c6e02018-10-03 13:09:28 +010024
25namespace armnn
26{
David Beck29c75de2018-10-23 13:35:58 +010027class IWorkloadFactory;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000028class IMemoryManager;
David Beck111b5d92018-11-12 14:59:37 +000029class ILayerSupport;
David Becke97c6e02018-10-03 13:09:28 +010030
Matteo Martincighac60d282019-07-25 15:25:44 +010031struct BackendVersion
32{
33 uint32_t m_Major;
34 uint32_t m_Minor;
35
Matteo Martincighd0dc7702019-08-01 17:09:03 +010036 constexpr BackendVersion()
Matteo Martincighac60d282019-07-25 15:25:44 +010037 : m_Major(0)
38 , m_Minor(0)
39 {}
Matteo Martincighd0dc7702019-08-01 17:09:03 +010040 constexpr BackendVersion(uint32_t major, uint32_t minor)
Matteo Martincighac60d282019-07-25 15:25:44 +010041 : m_Major(major)
42 , m_Minor(minor)
43 {}
44
45 bool operator==(const BackendVersion& other) const
46 {
47 return this == &other ||
48 (this->m_Major == other.m_Major &&
49 this->m_Minor == other.m_Minor);
50 }
51
52 bool operator<=(const BackendVersion& other) const
53 {
54 return this->m_Major < other.m_Major ||
55 (this->m_Major == other.m_Major &&
56 this->m_Minor <= other.m_Minor);
57 }
Jan Eilers15fcc7e2021-07-14 13:50:15 +010058
59 bool operator>=(const BackendVersion& other) const
60 {
61 return this->m_Major > other.m_Major ||
62 (this->m_Major == other.m_Major &&
63 this->m_Minor >= other.m_Minor);
64 }
Matteo Martincighac60d282019-07-25 15:25:44 +010065};
66
67inline std::ostream& operator<<(std::ostream& os, const BackendVersion& backendVersion)
68{
69 os << "[" << backendVersion.m_Major << "." << backendVersion.m_Minor << "]";
70
71 return os;
72}
73
David Becke97c6e02018-10-03 13:09:28 +010074class IBackendInternal : public IBackend
75{
76protected:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000077 /// Creation must be done through a specific
78 /// backend interface.
David Beck6b779f02018-10-09 17:20:21 +010079 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010080
81public:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000082 /// Allow backends created by the factory function
83 /// to be destroyed through IBackendInternal.
David Beck29c75de2018-10-23 13:35:58 +010084 ~IBackendInternal() override = default;
85
86 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000087 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
Ryan OShea2bbfaa72020-02-12 16:15:27 +000088 /// This is the bridge between backend and backend profiling we'll keep it in the backend namespace.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000089 using IBackendProfilingContextPtr = std::shared_ptr<arm::pipe::IBackendProfilingContext>;
90 using IBackendProfilingPtr = std::unique_ptr<arm::pipe::IBackendProfiling>;
David Beck111b5d92018-11-12 14:59:37 +000091 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000092
Sadik Armagan045f6be2020-09-10 13:37:32 +010093 using IBackendSpecificModelContextPtr = std::shared_ptr<IBackendModelContext>;
94
Aron Virginas-Tar56055192018-11-12 18:10:43 +000095 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
96 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
97
Matteo Martincighd0dc7702019-08-01 17:09:03 +010098 virtual IMemoryManagerUniquePtr CreateMemoryManager() const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000099
100 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
101 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
102
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +0100103 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
104 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const;
105
Sadik Armagan04a72972020-09-14 15:44:18 +0100106 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
107 const IMemoryManagerSharedPtr& memoryManager,
108 const ModelOptions& modelOptions) const;
109
110 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
111 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
112 const ModelOptions& modelOptions) const;
113
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +0100114 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
115 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
116 const ModelOptions& modelOptions,
117 MemorySourceFlags inputFlags,
118 MemorySourceFlags outputFlags) const;
119
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000120 /// Create the runtime context of the backend
121 ///
122 /// Implementations may return a default-constructed IBackendContextPtr if
123 /// no context is needed at runtime.
124 /// Implementations must throw BackendUnavailableException if the backend
125 /// cannot be used (for example, necessary accelerator hardware is not present).
126 /// The default implementation always returns a default-constructed pointer.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100127 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000128
Sadik Armagan045f6be2020-09-10 13:37:32 +0100129 virtual IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions& modelOptions) const;
130
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000131 /// Create context specifically used for profiling interaction from backends.
Colm Donelane49755b2020-01-29 15:22:43 +0000132 virtual IBackendProfilingContextPtr CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
Colm Donelan1aff3932020-02-05 17:48:59 +0000133 IBackendProfilingPtr& backendProfiling);
Colm Donelane49755b2020-01-29 15:22:43 +0000134
David Beck111b5d92018-11-12 14:59:37 +0000135 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000136
Sadik Armagana25886e2020-09-15 17:17:08 +0100137 virtual ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const;
Sadik Armagan045f6be2020-09-10 13:37:32 +0100138
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100139 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const;
Matteo Martincighfc598e12019-05-14 10:36:13 +0100140
Mike Kelly07810fc2020-11-12 10:58:48 +0000141 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
142 const ModelOptions& modelOptions) const;
143
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100144 bool SupportsTensorAllocatorAPI() const;
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100145
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100146 ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory();
Derek Lamberti84da38b2019-06-13 11:40:08 +0100147
148 /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100149 virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const;
Derek Lamberti84da38b2019-06-13 11:40:08 +0100150
151 /// (Optional) Register TensorHandleFactories
152 /// Either this method or CreateMemoryManager() and
153 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
Derek Lamberti901ea112019-12-10 22:07:09 +0000154 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& /*registry*/) {}
Matteo Martincighac60d282019-07-25 15:25:44 +0100155
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +0100156 /// (Optional) Register TensorHandleFactories
157 /// Either this method or CreateMemoryManager() and
158 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
159 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry,
160 MemorySourceFlags inputFlags,
161 MemorySourceFlags outputFlags);
162
Matteo Martincighac60d282019-07-25 15:25:44 +0100163 /// Returns the version of the Backend API
Francis Murtagh72930662021-08-17 16:46:41 +0100164 static constexpr BackendVersion GetApiVersion() { return BackendVersion(1, 0); }
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000165
Finn Williamsb9af86e2021-05-26 18:38:12 +0100166 /// Returns a BackendCapability if the backend lists the capability
167 /// The BackendCapability must then be inspected to check whether or not that BackendCapability is supported
168 /// Otherwise returns an EmptyOptional if the BackendCapability is unlisted
169 virtual BackendCapabilities GetCapabilities() const
170 {
171 return BackendCapabilities("IBackendInternal NullCapabilities");
172 };
173
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000174 /// Returns true if backend support the capability false otherwise
Jan Eilers1b2654f2021-09-24 15:45:46 +0100175 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated in favour of GetCapability", "22.05")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000176 virtual bool HasCapability(BackendCapability /*capabilityClass*/) const { return false; }
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100177
178 /// Signals the backend to use a custom memory allocator provided by the user
179 ///
Jan Eilersc1c872f2021-07-22 13:17:04 +0100180 /// \param allocator - a pointer to the provided ICustomAllocator to use with this backend
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100181 /// \param errMsg - Optional string variable to return error messages
182 /// \return - Returns true if switching to custom allocator was successful
Jan Eilersc1c872f2021-07-22 13:17:04 +0100183 virtual bool UseCustomMemoryAllocator(std::shared_ptr<ICustomAllocator> allocator,
184 armnn::Optional<std::string&> errMsg)
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100185 {
Jan Eilersc1c872f2021-07-22 13:17:04 +0100186 IgnoreUnused(allocator);
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100187 if (errMsg)
188 {
189 std::stringstream message;
190 message << "The backend " << GetId() << " doesn't support using a custom allocator. This error might"
191 " be related with the protected mode if the backend doesn't"
192 " fully support it.";
193
194 errMsg.value() = message.str();
195 }
196 return false;
197 }
Francis Murtaghe8d7ccb2021-10-14 17:30:24 +0100198
199 /// Returns the default memory allocator for the backend
200 ///
201 /// \return - Returns unique pointer to the Default Allocator of the Backend
202 virtual std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const
203 {
204 throw armnn::Exception("GetDefaultAllocator: Function has not been implemented in backend.");
205 }
Sadik Armaganb7851f92021-10-06 16:37:02 +0100206
207 /// Returns the number of files cached if backend supports caching
208 ///
209 /// \return - Returns 0 if backend does not support caching otherwise number of files cached
210 virtual unsigned int GetNumberOfCacheFiles() const { return 0; }
David Becke97c6e02018-10-03 13:09:28 +0100211};
212
David Beck29c75de2018-10-23 13:35:58 +0100213using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
214
David Becke97c6e02018-10-03 13:09:28 +0100215} // namespace armnn