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