blob: fe9d62027825bc69b35dc5f9e20e5108ba5ec258 [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>
Matteo Martincigh49124022019-01-11 13:25:59 +000013
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010014#include "OptimizationViews.hpp"
15
David Beck263e3492018-11-09 14:46:40 +000016#include <vector>
David Becke97c6e02018-10-03 13:09:28 +010017
18namespace armnn
19{
David Beck29c75de2018-10-23 13:35:58 +010020class IWorkloadFactory;
David Beck1b61be52018-11-08 09:19:14 +000021class IBackendContext;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000022class IMemoryManager;
David Beck263e3492018-11-09 14:46:40 +000023class Optimization;
David Beck111b5d92018-11-12 14:59:37 +000024class ILayerSupport;
David Becke97c6e02018-10-03 13:09:28 +010025
26class IBackendInternal : public IBackend
27{
28protected:
David Beck9efb57d2018-11-05 13:40:33 +000029 // Creation must be done through a specific
30 // backend interface.
David Beck6b779f02018-10-09 17:20:21 +010031 IBackendInternal() = default;
David Becke97c6e02018-10-03 13:09:28 +010032
33public:
David Beck29c75de2018-10-23 13:35:58 +010034 // Allow backends created by the factory function
35 // to be destroyed through IBackendInternal.
36 ~IBackendInternal() override = default;
37
38 using IWorkloadFactoryPtr = std::unique_ptr<IWorkloadFactory>;
David Beck1b61be52018-11-08 09:19:14 +000039 using IBackendContextPtr = std::unique_ptr<IBackendContext>;
David Beck263e3492018-11-09 14:46:40 +000040 using OptimizationPtr = std::unique_ptr<Optimization>;
41 using Optimizations = std::vector<OptimizationPtr>;
David Beck111b5d92018-11-12 14:59:37 +000042 using ILayerSupportSharedPtr = std::shared_ptr<ILayerSupport>;
David Beck1b61be52018-11-08 09:19:14 +000043
Aron Virginas-Tar56055192018-11-12 18:10:43 +000044 using IMemoryManagerUniquePtr = std::unique_ptr<IMemoryManager>;
45 using IMemoryManagerSharedPtr = std::shared_ptr<IMemoryManager>;
46
Matteo Martincigh602af092019-05-01 10:31:27 +010047 using GraphUniquePtr = std::unique_ptr<Graph>;
Derek Lambertiff05cc52019-04-26 13:05:17 +010048 using SubgraphViewUniquePtr = std::unique_ptr<SubgraphView>;
Matteo Martincighadddddb2019-01-24 14:06:23 +000049
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010050 ARMNN_NO_DEPRECATE_WARN_BEGIN
51 using ISubGraphConverterPtr ARMNN_DEPRECATED_MSG("This type is no longer supported")
52 = std::unique_ptr<ISubGraphConverter>;
53 using SubGraphUniquePtr ARMNN_DEPRECATED_MSG("SubGraph is deprecated, use SubgraphView instead")
54 = std::unique_ptr<SubGraph>;
55
56 ARMNN_DEPRECATED_MSG("This method is no longer supported")
57 virtual ISubGraphConverterPtr CreateSubGraphConverter(const std::shared_ptr<SubGraph>& subGraph) const
58 {
59 return ISubGraphConverterPtr{};
60 }
61
62 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
63 virtual Optimizations GetOptimizations() const = 0;
64
65 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
66 virtual SubGraphUniquePtr OptimizeSubGraph(const SubGraph& subGraph, bool& optimizationAttempted) const
67 {
68 optimizationAttempted = false;
69 return nullptr;
70 }
71 ARMNN_NO_DEPRECATE_WARN_END
72
Aron Virginas-Tar56055192018-11-12 18:10:43 +000073 virtual IMemoryManagerUniquePtr CreateMemoryManager() const = 0;
74
75 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
76 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
77
David Beck1b61be52018-11-08 09:19:14 +000078 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const = 0;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000079
David Beck111b5d92018-11-12 14:59:37 +000080 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +000081
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010082 // Default implementation of OptimizeSubgraphView for backward compatibility with the old API.
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010083 // Override this method with a custom optimization implementation.
Derek Lamberti8106b7c2019-05-07 21:33:30 +010084 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010085 {
Matteo Martincigh84924332019-05-09 12:46:16 +010086 bool optimizationAttempted = false;
Matteo Martincighfc598e12019-05-14 10:36:13 +010087
88 ARMNN_NO_DEPRECATE_WARN_BEGIN
Matteo Martincighc3ba50e2019-05-22 14:28:16 +010089 SubGraphUniquePtr optSubgraph = OptimizeSubGraph(subgraph, optimizationAttempted);
Matteo Martincighfc598e12019-05-14 10:36:13 +010090 ARMNN_NO_DEPRECATE_WARN_END
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010091
92 OptimizationViews result;
Matteo Martincigh84924332019-05-09 12:46:16 +010093 if (!optimizationAttempted)
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010094 {
95 result.AddUntouchedSubgraph(SubgraphView(subgraph));
96 }
97 else
98 {
99 if (optSubgraph)
100 {
Matteo Martincigh88054f82019-05-17 12:15:30 +0100101 result.AddSubstitution({subgraph, SubgraphView(*optSubgraph.get())});
Derek Lambertic2fe5fb2019-05-08 10:23:08 +0100102 }
103 else
104 {
105 result.AddFailedSubgraph(SubgraphView(subgraph));
106 }
107 }
108 return result;
109 }
David Becke97c6e02018-10-03 13:09:28 +0100110};
111
David Beck29c75de2018-10-23 13:35:58 +0100112using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
113
David Becke97c6e02018-10-03 13:09:28 +0100114} // namespace armnn