blob: 98f0eaacd74aeb4f035f5b5a89aea358699967de [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>
Jim Flynn27761832022-03-20 21:52:17 +000019
20#include <client/include/backends/IBackendProfiling.hpp>
21#include <client/include/backends/IBackendProfilingContext.hpp>
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010022
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 }
Jan Eilers15fcc7e2021-07-14 13:50:15 +010059
60 bool operator>=(const BackendVersion& other) const
61 {
62 return this->m_Major > other.m_Major ||
63 (this->m_Major == other.m_Major &&
64 this->m_Minor >= other.m_Minor);
65 }
Matteo Martincighac60d282019-07-25 15:25:44 +010066};
67
68inline std::ostream& operator<<(std::ostream& os, const BackendVersion& backendVersion)
69{
70 os << "[" << backendVersion.m_Major << "." << backendVersion.m_Minor << "]";
71
72 return os;
73}
74
David Becke97c6e02018-10-03 13:09:28 +010075class IBackendInternal : public IBackend
76{
77protected:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000078 /// Creation must be done through a specific
79 /// backend interface.
David Beck6b779f02018-10-09 17:20:21 +010080 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010081
82public:
Ryan OShea2bbfaa72020-02-12 16:15:27 +000083 /// Allow backends created by the factory function
84 /// to be destroyed through IBackendInternal.
David Beck29c75de2018-10-23 13:35:58 +010085 ~IBackendInternal() override = default;
86
87 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000088 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
Ryan OShea2bbfaa72020-02-12 16:15:27 +000089 /// This is the bridge between backend and backend profiling we'll keep it in the backend namespace.
Cathal Corbett5aa9fd72022-02-25 15:33:28 +000090 using IBackendProfilingContextPtr = std::shared_ptr<arm::pipe::IBackendProfilingContext>;
91 using IBackendProfilingPtr = std::unique_ptr<arm::pipe::IBackendProfiling>;
David Beck111b5d92018-11-12 14:59:37 +000092 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000093
Sadik Armagan045f6be2020-09-10 13:37:32 +010094 using IBackendSpecificModelContextPtr = std::shared_ptr<IBackendModelContext>;
95
Aron Virginas-Tar56055192018-11-12 18:10:43 +000096 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
97 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
98
Matteo Martincighd0dc7702019-08-01 17:09:03 +010099 virtual IMemoryManagerUniquePtr CreateMemoryManager() const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000100
101 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
102 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
103
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +0100104 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
105 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const;
106
Sadik Armagan04a72972020-09-14 15:44:18 +0100107 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
108 const IMemoryManagerSharedPtr& memoryManager,
109 const ModelOptions& modelOptions) const;
110
111 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
112 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
113 const ModelOptions& modelOptions) const;
114
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +0100115 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
116 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry,
117 const ModelOptions& modelOptions,
118 MemorySourceFlags inputFlags,
119 MemorySourceFlags outputFlags) const;
120
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000121 /// Create the runtime context of the backend
122 ///
123 /// Implementations may return a default-constructed IBackendContextPtr if
124 /// no context is needed at runtime.
125 /// Implementations must throw BackendUnavailableException if the backend
126 /// cannot be used (for example, necessary accelerator hardware is not present).
127 /// The default implementation always returns a default-constructed pointer.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100128 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000129
Sadik Armagan045f6be2020-09-10 13:37:32 +0100130 virtual IBackendSpecificModelContextPtr CreateBackendSpecificModelContext(const ModelOptions& modelOptions) const;
131
Matthew Bentham9a61fa62020-02-04 10:03:55 +0000132 /// Create context specifically used for profiling interaction from backends.
Colm Donelane49755b2020-01-29 15:22:43 +0000133 virtual IBackendProfilingContextPtr CreateBackendProfilingContext(const IRuntime::CreationOptions& creationOptions,
Colm Donelan1aff3932020-02-05 17:48:59 +0000134 IBackendProfilingPtr& backendProfiling);
Colm Donelane49755b2020-01-29 15:22:43 +0000135
David Beck111b5d92018-11-12 14:59:37 +0000136 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000137
Sadik Armagana25886e2020-09-15 17:17:08 +0100138 virtual ILayerSupportSharedPtr GetLayerSupport(const ModelOptions& modelOptions) const;
Sadik Armagan045f6be2020-09-10 13:37:32 +0100139
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100140 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const;
Matteo Martincighfc598e12019-05-14 10:36:13 +0100141
Mike Kelly07810fc2020-11-12 10:58:48 +0000142 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph,
143 const ModelOptions& modelOptions) const;
144
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100145 bool SupportsTensorAllocatorAPI() const;
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100146
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100147 ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory();
Derek Lamberti84da38b2019-06-13 11:40:08 +0100148
149 /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100150 virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const;
Derek Lamberti84da38b2019-06-13 11:40:08 +0100151
152 /// (Optional) Register TensorHandleFactories
153 /// Either this method or CreateMemoryManager() and
154 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
Derek Lamberti901ea112019-12-10 22:07:09 +0000155 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& /*registry*/) {}
Matteo Martincighac60d282019-07-25 15:25:44 +0100156
Narumol Prangnawarate5f0b242021-05-07 17:52:36 +0100157 /// (Optional) Register TensorHandleFactories
158 /// Either this method or CreateMemoryManager() and
159 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
160 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry,
161 MemorySourceFlags inputFlags,
162 MemorySourceFlags outputFlags);
163
Matteo Martincighac60d282019-07-25 15:25:44 +0100164 /// Returns the version of the Backend API
Francis Murtagh72930662021-08-17 16:46:41 +0100165 static constexpr BackendVersion GetApiVersion() { return BackendVersion(1, 0); }
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000166
Finn Williamsb9af86e2021-05-26 18:38:12 +0100167 /// Returns a BackendCapability if the backend lists the capability
168 /// The BackendCapability must then be inspected to check whether or not that BackendCapability is supported
169 /// Otherwise returns an EmptyOptional if the BackendCapability is unlisted
170 virtual BackendCapabilities GetCapabilities() const
171 {
172 return BackendCapabilities("IBackendInternal NullCapabilities");
173 };
174
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000175 /// Returns true if backend support the capability false otherwise
Jan Eilers1b2654f2021-09-24 15:45:46 +0100176 ARMNN_DEPRECATED_MSG_REMOVAL_DATE("This function has been deprecated in favour of GetCapability", "22.05")
Sadik Armaganf0a6dec2021-03-25 07:46:55 +0000177 virtual bool HasCapability(BackendCapability /*capabilityClass*/) const { return false; }
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100178
179 /// Signals the backend to use a custom memory allocator provided by the user
180 ///
Jan Eilersc1c872f2021-07-22 13:17:04 +0100181 /// \param allocator - a pointer to the provided ICustomAllocator to use with this backend
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100182 /// \param errMsg - Optional string variable to return error messages
183 /// \return - Returns true if switching to custom allocator was successful
Jan Eilersc1c872f2021-07-22 13:17:04 +0100184 virtual bool UseCustomMemoryAllocator(std::shared_ptr<ICustomAllocator> allocator,
185 armnn::Optional<std::string&> errMsg)
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100186 {
Jan Eilersc1c872f2021-07-22 13:17:04 +0100187 IgnoreUnused(allocator);
Jan Eilers15fcc7e2021-07-14 13:50:15 +0100188 if (errMsg)
189 {
190 std::stringstream message;
191 message << "The backend " << GetId() << " doesn't support using a custom allocator. This error might"
192 " be related with the protected mode if the backend doesn't"
193 " fully support it.";
194
195 errMsg.value() = message.str();
196 }
197 return false;
198 }
Francis Murtaghe8d7ccb2021-10-14 17:30:24 +0100199
200 /// Returns the default memory allocator for the backend
201 ///
202 /// \return - Returns unique pointer to the Default Allocator of the Backend
203 virtual std::unique_ptr<ICustomAllocator> GetDefaultAllocator() const
204 {
205 throw armnn::Exception("GetDefaultAllocator: Function has not been implemented in backend.");
206 }
Sadik Armaganb7851f92021-10-06 16:37:02 +0100207
208 /// Returns the number of files cached if backend supports caching
209 ///
210 /// \return - Returns 0 if backend does not support caching otherwise number of files cached
211 virtual unsigned int GetNumberOfCacheFiles() const { return 0; }
David Becke97c6e02018-10-03 13:09:28 +0100212};
213
David Beck29c75de2018-10-23 13:35:58 +0100214using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
215
David Becke97c6e02018-10-03 13:09:28 +0100216} // namespace armnn