IVGCVSW-3656 Make the reference backend optional
[platform/upstream/armnn.git] / src / backends / neon / NeonBackend.cpp
1 //
2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
4 //
5
6 #include "NeonBackend.hpp"
7 #include "NeonBackendId.hpp"
8 #include "NeonWorkloadFactory.hpp"
9 #include "NeonLayerSupport.hpp"
10 #include "NeonTensorHandleFactory.hpp"
11
12 #include <aclCommon/BaseMemoryManager.hpp>
13
14 #include <backendsCommon/BackendRegistry.hpp>
15 #include <backendsCommon/IBackendContext.hpp>
16 #include <backendsCommon/IMemoryManager.hpp>
17
18 #include <Optimizer.hpp>
19
20 #include <arm_compute/runtime/Allocator.h>
21
22 #include <boost/cast.hpp>
23 #include <boost/polymorphic_pointer_cast.hpp>
24
25 namespace armnn
26 {
27
28 const BackendId& NeonBackend::GetIdStatic()
29 {
30     static const BackendId s_Id{NeonBackendId()};
31     return s_Id;
32 }
33
34 IBackendInternal::IMemoryManagerUniquePtr NeonBackend::CreateMemoryManager() const
35 {
36     return std::make_unique<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
37                                                BaseMemoryManager::MemoryAffinity::Offset);
38 }
39
40 IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
41     const IBackendInternal::IMemoryManagerSharedPtr& memoryManager) const
42 {
43     return std::make_unique<NeonWorkloadFactory>(
44         boost::polymorphic_pointer_downcast<NeonMemoryManager>(memoryManager));
45 }
46
47 IBackendInternal::IWorkloadFactoryPtr NeonBackend::CreateWorkloadFactory(
48     class TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const
49 {
50     auto memoryManager = std::make_shared<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
51                                                              BaseMemoryManager::MemoryAffinity::Offset);
52
53     tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager);
54     return std::make_unique<NeonWorkloadFactory>(
55         boost::polymorphic_pointer_downcast<NeonMemoryManager>(memoryManager));
56 }
57
58 IBackendInternal::IBackendContextPtr NeonBackend::CreateBackendContext(const IRuntime::CreationOptions&) const
59 {
60     return IBackendContextPtr{};
61 }
62
63 IBackendInternal::Optimizations NeonBackend::GetOptimizations() const
64 {
65     return Optimizations{};
66 }
67
68 IBackendInternal::ILayerSupportSharedPtr NeonBackend::GetLayerSupport() const
69 {
70     static ILayerSupportSharedPtr layerSupport{new NeonLayerSupport};
71     return layerSupport;
72 }
73
74 OptimizationViews NeonBackend::OptimizeSubgraphView(const SubgraphView& subgraph) const
75 {
76     OptimizationViews optimizationViews;
77
78     optimizationViews.AddUntouchedSubgraph(SubgraphView(subgraph));
79
80     return optimizationViews;
81 }
82
83 std::vector<ITensorHandleFactory::FactoryId> NeonBackend::GetHandleFactoryPreferences() const
84 {
85     return std::vector<ITensorHandleFactory::FactoryId>() = {NeonTensorHandleFactory::GetIdStatic()};
86 }
87
88 void NeonBackend::RegisterTensorHandleFactories(class TensorHandleFactoryRegistry& registry)
89 {
90     auto memoryManager = std::make_shared<NeonMemoryManager>(std::make_unique<arm_compute::Allocator>(),
91                                                              BaseMemoryManager::MemoryAffinity::Offset);
92
93     registry.RegisterMemoryManager(memoryManager);
94     registry.RegisterFactory(std::make_unique<NeonTensorHandleFactory>(memoryManager));
95 }
96
97 } // namespace armnn