blob: d300960052905552aaef4012f02ada2d74b09b80 [file] [log] [blame]
arovir014424b0a2018-10-04 10:46:04 +01001//
2// Copyright © 2017 Arm Ltd. All rights reserved.
3// SPDX-License-Identifier: MIT
4//
5
6#include "NeonBackend.hpp"
David Beck3e9e1152018-10-17 14:17:50 +01007#include "NeonBackendId.hpp"
Sadik Armagan045f6be2020-09-10 13:37:32 +01008#include "NeonBackendModelContext.hpp"
arovir01a0944792018-10-11 15:00:58 +01009#include "NeonWorkloadFactory.hpp"
David Beck111b5d92018-11-12 14:59:37 +000010#include "NeonLayerSupport.hpp"
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +010011#include "NeonTensorHandleFactory.hpp"
arovir01a0944792018-10-11 15:00:58 +010012
Matteo Martincighc601aa62019-10-29 15:03:22 +000013#include <armnn/BackendRegistry.hpp>
14
Aron Virginas-Tar56055192018-11-12 18:10:43 +000015#include <aclCommon/BaseMemoryManager.hpp>
16
Matteo Martincighe5b8eb92019-11-28 15:45:42 +000017#include <armnn/backends/IBackendContext.hpp>
18#include <armnn/backends/IMemoryManager.hpp>
Aron Virginas-Tar56055192018-11-12 18:10:43 +000019
Jan Eilers3c9e0452020-04-10 13:00:44 +010020#include <armnn/utility/PolymorphicDowncast.hpp>
21
David Beck263e3492018-11-09 14:46:40 +000022#include <Optimizer.hpp>
arovir01a0944792018-10-11 15:00:58 +010023
Aron Virginas-Tar56055192018-11-12 18:10:43 +000024#include <arm_compute/runtime/Allocator.h>
25
David Beck9efb57d2018-11-05 13:40:33 +000026#include <boost/cast.hpp>
27
arovir014424b0a2018-10-04 10:46:04 +010028namespace armnn
29{
30
David Beck3cc9a622018-10-12 10:38:31 +010031const BackendId& NeonBackend::GetIdStatic()
arovir014424b0a2018-10-04 10:46:04 +010032{
David Beck3e9e1152018-10-17 14:17:50 +010033 static const BackendId s_Id{NeonBackendId()};
arovir014424b0a2018-10-04 10:46:04 +010034 return s_Id;
35}
36
Aron Virginas-Tar56055192018-11-12 18:10:43 +000037IBackendInternal::IMemoryManagerUniquePtr NeonBackend::CreateMemoryManager() const
arovir014424b0a2018-10-04 10:46:04 +010038{
Aron Virginas-Tar56055192018-11-12 18:10:43 +000039 return std::make_unique<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
Sadik Armagan13a9fa62019-04-26 16:04:34 +010040 BaseMemoryManager::MemoryAffinity::Offset);
Aron Virginas-Tar56055192018-11-12 18:10:43 +000041}
42
43IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
44 const IBackendInternal::IMemoryManagerSharedPtr& memoryManager) const
45{
46 return std::make_unique<NeonWorkloadFactory>(
Jan Eilers3c9e0452020-04-10 13:00:44 +010047 PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager));
arovir014424b0a2018-10-04 10:46:04 +010048}
49
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +010050IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
Sadik Armagan04a72972020-09-14 15:44:18 +010051 const IBackendInternal::IMemoryManagerSharedPtr& memoryManager, const ModelOptions& modelOptions) const
52{
53 return std::make_unique<NeonWorkloadFactory>(
54 PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
55}
56
57IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +010058 class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const
59{
60 auto memoryManager = std::make_shared<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
61 BaseMemoryManager::MemoryAffinity::Offset);
62
63 tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
Narumol Prangnawarat549cb7a2020-07-10 17:50:53 +010064 tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
65
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +010066 return std::make_unique<NeonWorkloadFactory>(
Jan Eilers3c9e0452020-04-10 13:00:44 +010067 PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager));
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +010068}
69
Sadik Armagan04a72972020-09-14 15:44:18 +010070IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
71 TensorHandleFactoryRegistry& tensorHandleFactoryRegistry, const ModelOptions& modelOptions) const
72{
73 auto memoryManager = std::make_shared<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
74 BaseMemoryManager::MemoryAffinity::Offset);
75
76 tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
77 tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
78
79 return std::make_unique<NeonWorkloadFactory>(
80 PolymorphicPointerDowncast<NeonMemoryManager>(memoryManager), CreateBackendSpecificModelContext(modelOptions));
81}
82
David Beck263e3492018-11-09 14:46:40 +000083IBackendInternal::IBackendContextPtr NeonBackend::CreateBackendContext(const IRuntime::CreationOptions&) const
84{
85 return IBackendContextPtr{};
86}
87
Colm Donelane49755b2020-01-29 15:22:43 +000088IBackendInternal::IBackendProfilingContextPtr NeonBackend::CreateBackendProfilingContext(
Colm Donelan1aff3932020-02-05 17:48:59 +000089 const IRuntime::CreationOptions&, IBackendProfilingPtr&)
Colm Donelane49755b2020-01-29 15:22:43 +000090{
91 return IBackendProfilingContextPtr{};
92}
93
David Beck263e3492018-11-09 14:46:40 +000094IBackendInternal::Optimizations NeonBackend::GetOptimizations() const
95{
96 return Optimizations{};
97}
98
Sadik Armagan045f6be2020-09-10 13:37:32 +010099IBackendInternal::IBackendSpecificModelContextPtr NeonBackend::CreateBackendSpecificModelContext(
100 const ModelOptions& modelOptions) const
101{
102 return IBackendSpecificModelContextPtr{new NeonBackendModelContext{modelOptions}};
103}
104
David Beck111b5d92018-11-12 14:59:37 +0000105IBackendInternal::ILayerSupportSharedPtr NeonBackend::GetLayerSupport() const
106{
Sadik Armagan045f6be2020-09-10 13:37:32 +0100107 static ILayerSupportSharedPtr layerSupport
108 {
109 new NeonLayerSupport(IBackendInternal::IBackendSpecificModelContextPtr{})
110 };
111 return layerSupport;
112}
113
114IBackendInternal::ILayerSupportSharedPtr NeonBackend::GetLayerSupport(const ModelOptions& modelOptions) const
115{
116 static ILayerSupportSharedPtr layerSupport
117 {
118 new NeonLayerSupport(CreateBackendSpecificModelContext(modelOptions))
119 };
David Beck111b5d92018-11-12 14:59:37 +0000120 return layerSupport;
121}
122
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100123OptimizationViews NeonBackend::OptimizeSubgraphView(const SubgraphView& subgraph) const
Matteo Martincighadddddb2019-01-24 14:06:23 +0000124{
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100125 OptimizationViews optimizationViews;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000126
Matteo Martincighc3ba50e2019-05-22 14:28:16 +0100127 optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
128
129 return optimizationViews;
Matteo Martincighadddddb2019-01-24 14:06:23 +0000130}
131
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +0100132std::vector<ITensorHandleFactory::FactoryId> NeonBackend::GetHandleFactoryPreferences() const
133{
Jan Eilers146b2e12019-08-16 10:45:30 +0100134 return std::vector<ITensorHandleFactory::FactoryId>() = {"Arm/Neon/TensorHandleFactory",
135 "Arm/Cl/TensorHandleFactory"};
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +0100136}
137
138void NeonBackend::RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry)
139{
140 auto memoryManager = std::make_shared<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
141 BaseMemoryManager::MemoryAffinity::Offset);
142
143 registry.RegisterMemoryManager(memoryManager);
Jan Eilerse9f0f0f2019-08-16 10:28:37 +0100144 registry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
Narumol Prangnawarat4e3e8182019-08-14 12:25:50 +0100145}
146
Matthew Bentham42bad952018-12-17 09:23:36 +0000147} // namespace armnn