1 // 2 // Copyright © 2020 Arm Ltd and Contributors. All rights reserved. 3 // SPDX-License-Identifier: MIT 4 // 5 6 #include "SampleDynamicBackend.hpp" 7 #include "SampleDynamicLayerSupport.hpp" 8 #include "SampleDynamicWorkloadFactory.hpp" 9 #include "SampleMemoryManager.hpp" 10 #include "SampleDynamicTensorHandleFactory.hpp" 11 12 #include <armnn/backends/IBackendInternal.hpp> 13 #include <armnn/backends/OptimizationViews.hpp> 14 15 namespace sdb // sample dynamic backend 16 { 17 SampleDynamicBackendId()18constexpr const char * SampleDynamicBackendId() { return "SampleDynamic"; } 19 20 class SampleDynamicBackend : public armnn::IBackendInternal 21 { 22 public: 23 SampleDynamicBackend() = default; 24 ~SampleDynamicBackend() = default; 25 GetIdStatic()26 static const armnn::BackendId& GetIdStatic() 27 { 28 static const armnn::BackendId s_Id{SampleDynamicBackendId()}; 29 return s_Id; 30 } 31 GetId() const32 const armnn::BackendId& GetId() const override { return GetIdStatic(); } 33 CreateMemoryManager() const34 IBackendInternal::IMemoryManagerUniquePtr CreateMemoryManager() const override 35 { 36 return std::make_unique<SampleMemoryManager>(); 37 } 38 CreateWorkloadFactory(const IMemoryManagerSharedPtr & memoryManager) const39 IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory( 40 const IMemoryManagerSharedPtr& memoryManager) const override 41 { 42 return std::make_unique<SampleDynamicWorkloadFactory>( 43 armnn::PolymorphicPointerDowncast<SampleMemoryManager>(memoryManager)); 44 } 45 CreateWorkloadFactory(class armnn::TensorHandleFactoryRegistry & tensorHandleFactoryRegistry) const46 IBackendInternal::IWorkloadFactoryPtr CreateWorkloadFactory( 47 class armnn::TensorHandleFactoryRegistry& tensorHandleFactoryRegistry) const override 48 { 49 auto memoryManager = std::make_shared<SampleMemoryManager>(); 50 51 tensorHandleFactoryRegistry.RegisterMemoryManager(memoryManager); 52 tensorHandleFactoryRegistry.RegisterFactory(std::make_unique<SampleDynamicTensorHandleFactory>(memoryManager)); 53 54 return std::make_unique<SampleDynamicWorkloadFactory>( 55 armnn::PolymorphicPointerDowncast<SampleMemoryManager>(memoryManager)); 56 } 57 CreateBackendProfilingContext(const armnn::IRuntime::CreationOptions &,IBackendProfilingPtr &)58 IBackendInternal::IBackendProfilingContextPtr CreateBackendProfilingContext( 59 const armnn::IRuntime::CreationOptions&, IBackendProfilingPtr&) override 60 { 61 return IBackendProfilingContextPtr{}; 62 } 63 GetLayerSupport() const64 IBackendInternal::ILayerSupportSharedPtr GetLayerSupport() const override 65 { 66 static ILayerSupportSharedPtr layerSupport{new SampleDynamicLayerSupport}; 67 return layerSupport; 68 } 69 GetHandleFactoryPreferences() const70 std::vector<armnn::ITensorHandleFactory::FactoryId> GetHandleFactoryPreferences() const override 71 { 72 return std::vector<armnn::ITensorHandleFactory::FactoryId> { SampleDynamicTensorHandleFactory::GetIdStatic() }; 73 } 74 CreateBackendContext(const armnn::IRuntime::CreationOptions &) const75 IBackendInternal::IBackendContextPtr CreateBackendContext(const armnn::IRuntime::CreationOptions&) const override 76 { 77 return IBackendContextPtr{}; 78 } 79 OptimizeSubgraphView(const armnn::SubgraphView & subgraph) const80 armnn::OptimizationViews OptimizeSubgraphView(const armnn::SubgraphView& subgraph) const override 81 { 82 armnn::OptimizationViews optimizationViews; 83 84 optimizationViews.AddUntouchedSubgraph(armnn::SubgraphView(subgraph)); 85 86 return optimizationViews; 87 } 88 RegisterTensorHandleFactories(class armnn::TensorHandleFactoryRegistry & registry)89 void RegisterTensorHandleFactories(class armnn::TensorHandleFactoryRegistry& registry) override 90 { 91 auto memoryManager = std::make_shared<SampleMemoryManager>(); 92 93 registry.RegisterMemoryManager(memoryManager); 94 registry.RegisterFactory(std::make_unique<SampleDynamicTensorHandleFactory>(memoryManager)); 95 } 96 97 }; 98 99 } // namespace sdb 100 GetBackendId()101const char* GetBackendId() 102 { 103 return sdb::SampleDynamicBackend::GetIdStatic().Get().c_str(); 104 } 105 GetVersion(uint32_t * outMajor,uint32_t * outMinor)106void GetVersion(uint32_t* outMajor, uint32_t* outMinor) 107 { 108 if (!outMajor || !outMinor) 109 { 110 return; 111 } 112 113 armnn::BackendVersion apiVersion = armnn::IBackendInternal::GetApiVersion(); 114 115 *outMajor = apiVersion.m_Major; 116 *outMinor = apiVersion.m_Minor; 117 } 118 BackendFactory()119void* BackendFactory() 120 { 121 return new sdb::SampleDynamicBackend(); 122 } 123 124 125