blob: 3296d81b7cca112d3c0b6d01bb58b446e9abf6fa [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"
17#include "IMemoryManager.hpp"
18#include "ITensorHandleFactory.hpp"
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010019#include "OptimizationViews.hpp"
20
David Beck263e3492018-11-09 14:46:40 +000021#include <vector>
Matteo Martincighd0dc7702019-08-01 17:09:03 +010022#include <memory>
David Becke97c6e02018-10-03 13:09:28 +010023
24namespace armnn
25{
David Beck29c75de2018-10-23 13:35:58 +010026class IWorkloadFactory;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000027class IMemoryManager;
David Beck111b5d92018-11-12 14:59:37 +000028class ILayerSupport;
David Becke97c6e02018-10-03 13:09:28 +010029
Matteo Martincighac60d282019-07-25 15:25:44 +010030struct BackendVersion
31{
32 uint32_t m_Major;
33 uint32_t m_Minor;
34
Matteo Martincighd0dc7702019-08-01 17:09:03 +010035 constexpr BackendVersion()
Matteo Martincighac60d282019-07-25 15:25:44 +010036 : m_Major(0)
37 , m_Minor(0)
38 {}
Matteo Martincighd0dc7702019-08-01 17:09:03 +010039 constexpr BackendVersion(uint32_t major, uint32_t minor)
Matteo Martincighac60d282019-07-25 15:25:44 +010040 : m_Major(major)
41 , m_Minor(minor)
42 {}
43
44 bool operator==(const BackendVersion& other) const
45 {
46 return this == &other ||
47 (this->m_Major == other.m_Major &&
48 this->m_Minor == other.m_Minor);
49 }
50
51 bool operator<=(const BackendVersion& other) const
52 {
53 return this->m_Major < other.m_Major ||
54 (this->m_Major == other.m_Major &&
55 this->m_Minor <= other.m_Minor);
56 }
57};
58
59inline std::ostream& operator<<(std::ostream& os, const BackendVersion& backendVersion)
60{
61 os << "[" << backendVersion.m_Major << "." << backendVersion.m_Minor << "]";
62
63 return os;
64}
65
David Becke97c6e02018-10-03 13:09:28 +010066class IBackendInternal : public IBackend
67{
68protected:
David Beck9efb57d2018-11-05 13:40:33 +000069 // Creation must be done through a specific
70 // backend interface.
David Beck6b779f02018-10-09 17:20:21 +010071 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010072
73public:
David Beck29c75de2018-10-23 13:35:58 +010074 // Allow backends created by the factory function
75 // to be destroyed through IBackendInternal.
76 ~IBackendInternal() override = default;
77
78 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000079 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
David Beck263e3492018-11-09 14:46:40 +000080 using OptimizationPtr = std::unique_ptr<Optimization>;
81 using Optimizations = std::vector<OptimizationPtr>;
David Beck111b5d92018-11-12 14:59:37 +000082 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000083
Aron Virginas-Tar56055192018-11-12 18:10:43 +000084 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
85 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
86
Matteo Martincigh602af092019-05-01 10:31:27 +010087 using GraphUniquePtr = std::unique_ptr<Graph>;
Derek Lambertiff05cc52019-04-26 13:05:17 +010088 using SubgraphViewUniquePtr = std::unique_ptr<SubgraphView>;
Matteo Martincighadddddb2019-01-24 14:06:23 +000089
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010090 ARMNN_NO_DEPRECATE_WARN_BEGIN
91 using ISubGraphConverterPtr ARMNN_DEPRECATED_MSG("This type is no longer supported")
92 = std::unique_ptr<ISubGraphConverter>;
93 using SubGraphUniquePtr ARMNN_DEPRECATED_MSG("SubGraph is deprecated, use SubgraphView instead")
94 = std::unique_ptr<SubGraph>;
95
96 ARMNN_DEPRECATED_MSG("This method is no longer supported")
Matteo Martincighd0dc7702019-08-01 17:09:03 +010097 virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010098
99 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100100 virtual Optimizations GetOptimizations() const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100101
102 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100103 virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const;
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100104 ARMNN_NO_DEPRECATE_WARN_END
105
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100106 virtual IMemoryManagerUniquePtr CreateMemoryManager() const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000107
108 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
109 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
110
Narumol Prangnawarat11bd2612019-08-13 10:26:53 +0100111 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
112 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const;
113
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100114 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const;
Aron Virginas-Tar56055192018-11-12 18:10:43 +0000115
David Beck111b5d92018-11-12 14:59:37 +0000116 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000117
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100118 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const;
Matteo Martincighfc598e12019-05-14 10:36:13 +0100119
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100120 bool SupportsTensorAllocatorAPI() const;
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100121
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100122 ITensorHandleFactory::FactoryId GetBackwardCompatibleFavoriteHandleFactory();
Derek Lamberti84da38b2019-06-13 11:40:08 +0100123
124 /// (Optional) Returns a vector of supported TensorHandleFactory ids in preference order.
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100125 virtual std::vector<ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const;
Derek Lamberti84da38b2019-06-13 11:40:08 +0100126
127 /// (Optional) Register TensorHandleFactories
128 /// Either this method or CreateMemoryManager() and
129 /// IWorkloadFactory::CreateTensor()/IWorkloadFactory::CreateSubtensor() methods must be implemented.
130 virtual void RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry) {}
Matteo Martincighac60d282019-07-25 15:25:44 +0100131
132 /// Returns the version of the Backend API
Matteo Martincighd0dc7702019-08-01 17:09:03 +0100133 static constexpr BackendVersion GetApiVersion() { return BackendVersion(1, 0); }
David Becke97c6e02018-10-03 13:09:28 +0100134};
135
David Beck29c75de2018-10-23 13:35:58 +0100136using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
137
David Becke97c6e02018-10-03 13:09:28 +0100138} // namespace armnn