diff options
author | telsoa01 <telmo.soares@arm.com> | 2018-08-31 09:22:23 +0100 |
---|---|---|
committer | telsoa01 <telmo.soares@arm.com> | 2018-08-31 09:22:23 +0100 |
commit | c577f2c6a3b4ddb6ba87a882723c53a248afbeba (patch) | |
tree | bd7d4c148df27f8be6649d313efb24f536b7cf34 /src/armnn/memory/BaseMemoryManager.cpp | |
parent | 4c7098bfeab1ffe1cdc77f6c15548d3e73274746 (diff) | |
download | armnn-c577f2c6a3b4ddb6ba87a882723c53a248afbeba.tar.gz |
Release 18.08
Diffstat (limited to 'src/armnn/memory/BaseMemoryManager.cpp')
-rw-r--r-- | src/armnn/memory/BaseMemoryManager.cpp | 125 |
1 files changed, 125 insertions, 0 deletions
diff --git a/src/armnn/memory/BaseMemoryManager.cpp b/src/armnn/memory/BaseMemoryManager.cpp new file mode 100644 index 0000000000..07f42333d6 --- /dev/null +++ b/src/armnn/memory/BaseMemoryManager.cpp @@ -0,0 +1,125 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// See LICENSE file in the project root for full license information. +// +#include "BaseMemoryManager.hpp" + +#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) +#include "memory/BlobLifetimeManager.hpp" +#include "memory/PoolManager.hpp" +#include "memory/OffsetLifetimeManager.hpp" +#endif + +#include <boost/polymorphic_cast.hpp> + +namespace armnn +{ + +#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) +BaseMemoryManager::BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, + MemoryAffinity memoryAffinity) +{ + // (Re)create the memory manager components. + m_Allocator = std::move(alloc); + + m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity); + m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity); +} + +std::shared_ptr<arm_compute::MemoryManagerOnDemand> +BaseMemoryManager::CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity) +{ + std::shared_ptr<arm_compute::ILifetimeManager> lifetimeManager = nullptr; + + if (memoryAffinity == MemoryAffinity::Buffer) + { + lifetimeManager = std::make_shared<BlobLifetimeManager>(); + } + else + { + lifetimeManager = std::make_shared<OffsetLifetimeManager>(); + } + + auto poolManager = std::make_shared<PoolManager>(); + auto memoryManager = std::make_shared<arm_compute::MemoryManagerOnDemand>(lifetimeManager, poolManager); + + // Set allocator that the memory manager will use + memoryManager->set_allocator(m_Allocator.get()); + + return memoryManager; +} + +void BaseMemoryManager::FinalizeMemoryManager(arm_compute::MemoryManagerOnDemand& memoryManager) +{ + // Number of pools that the manager will create. This specifies how many layers you want to run in parallel + memoryManager.set_num_pools(1); + + // Finalize the memory manager. (Validity checks, memory allocations, etc) + memoryManager.finalize(); +} + +void BaseMemoryManager::Finalize() +{ + BOOST_ASSERT(m_IntraLayerMemoryMgr); + FinalizeMemoryManager(*m_IntraLayerMemoryMgr.get()); + + BOOST_ASSERT(m_InterLayerMemoryMgr); + FinalizeMemoryManager(*m_InterLayerMemoryMgr.get()); +} + +void BaseMemoryManager::Acquire() +{ + // Allocate memory pools for intra-layer memory manager + BOOST_ASSERT(m_IntraLayerMemoryMgr); + IPoolManager* poolManager = boost::polymorphic_downcast<IPoolManager*>(m_IntraLayerMemoryMgr->pool_manager()); + BOOST_ASSERT(poolManager); + poolManager->AllocatePools(); + + // Allocate memory pools for inter-layer memory manager + BOOST_ASSERT(m_InterLayerMemoryMgr); + poolManager = boost::polymorphic_downcast<IPoolManager*>(m_InterLayerMemoryMgr->pool_manager()); + BOOST_ASSERT(poolManager); + poolManager->AllocatePools(); + + // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools + BOOST_ASSERT(m_InterLayerMemoryGroup); + m_InterLayerMemoryGroup->acquire(); +} + +void BaseMemoryManager::Release() +{ + // Release inter-layer memory group. NOTE: This has to come before releasing the pools + BOOST_ASSERT(m_InterLayerMemoryGroup); + m_InterLayerMemoryGroup->release(); + + // Release memory pools managed by intra-layer memory manager + BOOST_ASSERT(m_IntraLayerMemoryMgr); + IPoolManager* poolManager = boost::polymorphic_downcast<IPoolManager*>(m_IntraLayerMemoryMgr->pool_manager()); + BOOST_ASSERT(poolManager); + poolManager->ReleasePools(); + + // Release memory pools managed by inter-layer memory manager + BOOST_ASSERT(m_InterLayerMemoryMgr); + poolManager = boost::polymorphic_downcast<IPoolManager*>(m_InterLayerMemoryMgr->pool_manager()); + BOOST_ASSERT(poolManager); + poolManager->ReleasePools(); +} +#endif + +#ifdef ARMCOMPUTENEON_ENABLED +std::shared_ptr<arm_compute::IMemoryGroup> +NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) +{ + return std::make_shared<arm_compute::MemoryGroup>(memoryManager); +} +#endif + +#ifdef ARMCOMPUTECL_ENABLED +std::shared_ptr<arm_compute::IMemoryGroup> +ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) +{ + return std::make_shared<arm_compute::CLMemoryGroup>(memoryManager); +} +#endif + +} |