blob: 826730a800d01488c257ba54b6964792c6bf5619 [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
Aron Virginas-Tar56055192018-11-12 18:10:43 +000050 virtual IMemoryManagerUniquePtr CreateMemoryManager() const = 0;
51
52 virtual IWorkloadFactoryPtr CreateWorkloadFactory(
53 const IMemoryManagerSharedPtr& memoryManager = nullptr) const = 0;
54
David Beck1b61be52018-11-08 09:19:14 +000055 virtual IBackendContextPtr CreateBackendContext(const IRuntime::CreationOptions&) const = 0;
Aron Virginas-Tar56055192018-11-12 18:10:43 +000056
David Beck263e3492018-11-09 14:46:40 +000057 virtual Optimizations GetOptimizations() const = 0;
David Beck111b5d92018-11-12 14:59:37 +000058 virtual ILayerSupportSharedPtr GetLayerSupport() const = 0;
Matteo Martincighadddddb2019-01-24 14:06:23 +000059
Matteo Martincighfc598e12019-05-14 10:36:13 +010060 ARMNN_DEPRECATED_MSG("Use \"OptimizationViews OptimizeSubgraphView(const SubgraphView&)\" instead")
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010061 virtual SubgraphViewUniquePtr OptimizeSubgraphView(const SubgraphView& subgraph, bool& optimizationAttempted) const
62 {
Matteo Martincigh84924332019-05-09 12:46:16 +010063 optimizationAttempted = false;
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010064 return nullptr;
65 }
66
67 // Default implementation of OptimizeSubgraphView for backward compatibility with old API.
68 // Override this method with a custom optimization implementation.
Derek Lamberti8106b7c2019-05-07 21:33:30 +010069 virtual OptimizationViews OptimizeSubgraphView(const SubgraphView& subgraph) const
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010070 {
Matteo Martincigh84924332019-05-09 12:46:16 +010071 bool optimizationAttempted = false;
Matteo Martincighfc598e12019-05-14 10:36:13 +010072
73 ARMNN_NO_DEPRECATE_WARN_BEGIN
Matteo Martincigh84924332019-05-09 12:46:16 +010074 SubgraphViewUniquePtr optSubgraph = OptimizeSubgraphView(subgraph, optimizationAttempted);
Matteo Martincighfc598e12019-05-14 10:36:13 +010075 ARMNN_NO_DEPRECATE_WARN_END
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010076
77 OptimizationViews result;
Matteo Martincigh84924332019-05-09 12:46:16 +010078 if (!optimizationAttempted)
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010079 {
80 result.AddUntouchedSubgraph(SubgraphView(subgraph));
81 }
82 else
83 {
84 if (optSubgraph)
85 {
Matteo Martincigh84924332019-05-09 12:46:16 +010086 result.AddSubstituion({subgraph, SubgraphView(*optSubgraph.get())});
Derek Lambertic2fe5fb2019-05-08 10:23:08 +010087 }
88 else
89 {
90 result.AddFailedSubgraph(SubgraphView(subgraph));
91 }
92 }
93 return result;
94 }
David Becke97c6e02018-10-03 13:09:28 +010095};
96
David Beck29c75de2018-10-23 13:35:58 +010097using IBackendInternalUniquePtr = std::unique_ptr<IBackendInternal>;
98
David Becke97c6e02018-10-03 13:09:28 +010099} // namespace armnn