aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2018-10-11 15:33:11 +0100
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:55:45 +0000
commit9da19e9da660057785fb736aba5c61b1ae773f2f (patch)
treeb51b30bed8266571178834367437bab0d8a7a517 /src
parentffb57a05d624c2efe1b32cf6ece112ee28726058 (diff)
downloadComputeLibrary-9da19e9da660057785fb736aba5c61b1ae773f2f.tar.gz
COMPMID-1605: API alignment for the MemoryManager with ARMNN
Change-Id: Iac6a95ba7f388e65b7f1c8865c3e9bf289b233ea Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/155490 Reviewed-by: Anthony Barbier <anthony.barbier@arm.com> Tested-by: bsgcomp <bsgcomp@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/graph/GraphContext.cpp8
-rw-r--r--src/graph/backends/CL/CLDeviceBackend.cpp3
-rw-r--r--src/graph/backends/GLES/GCDeviceBackend.cpp3
-rw-r--r--src/graph/backends/NEON/NEDeviceBackend.cpp3
-rw-r--r--src/runtime/MemoryManagerOnDemand.cpp45
-rw-r--r--src/runtime/PoolManager.cpp30
6 files changed, 54 insertions, 38 deletions
diff --git a/src/graph/GraphContext.cpp b/src/graph/GraphContext.cpp
index 5f33ed3537..037b40b68b 100644
--- a/src/graph/GraphContext.cpp
+++ b/src/graph/GraphContext.cpp
@@ -25,6 +25,7 @@
#include "arm_compute/graph.h"
#include "arm_compute/graph/Utils.h"
+#include "arm_compute/graph/backends/BackendRegistry.h"
namespace arm_compute
{
@@ -75,17 +76,20 @@ std::map<Target, MemoryManagerContext> &GraphContext::memory_managers()
void GraphContext::finalize()
{
+ const size_t num_pools = 1;
for(auto &mm_obj : _memory_managers)
{
+ ARM_COMPUTE_ERROR_ON(!mm_obj.second.allocator);
+
// Finalize intra layer memory manager
if(mm_obj.second.intra_mm != nullptr)
{
- mm_obj.second.intra_mm->finalize();
+ mm_obj.second.intra_mm->populate(*mm_obj.second.allocator, num_pools);
}
// Finalize cross layer memory manager
if(mm_obj.second.cross_mm != nullptr)
{
- mm_obj.second.cross_mm->finalize();
+ mm_obj.second.cross_mm->populate(*mm_obj.second.allocator, num_pools);
}
}
}
diff --git a/src/graph/backends/CL/CLDeviceBackend.cpp b/src/graph/backends/CL/CLDeviceBackend.cpp
index f35daf4ae5..ae7f0a50b3 100644
--- a/src/graph/backends/CL/CLDeviceBackend.cpp
+++ b/src/graph/backends/CL/CLDeviceBackend.cpp
@@ -127,6 +127,7 @@ void CLDeviceBackend::setup_backend_context(GraphContext &ctx)
mm_ctx.intra_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
mm_ctx.cross_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
mm_ctx.cross_group = std::make_shared<CLMemoryGroup>(mm_ctx.cross_mm);
+ mm_ctx.allocator = _allocator.get();
ctx.insert_memory_management_ctx(std::move(mm_ctx));
}
@@ -195,8 +196,6 @@ std::shared_ptr<arm_compute::IMemoryManager> CLDeviceBackend::create_memory_mana
auto pool_mgr = std::make_shared<PoolManager>();
auto mm = std::make_shared<MemoryManagerOnDemand>(lifetime_mgr, pool_mgr);
- mm->set_allocator(_allocator.get());
-
return mm;
}
} // namespace backends
diff --git a/src/graph/backends/GLES/GCDeviceBackend.cpp b/src/graph/backends/GLES/GCDeviceBackend.cpp
index ec3cf4f21e..5f0bf3f263 100644
--- a/src/graph/backends/GLES/GCDeviceBackend.cpp
+++ b/src/graph/backends/GLES/GCDeviceBackend.cpp
@@ -86,6 +86,7 @@ void GCDeviceBackend::setup_backend_context(GraphContext &ctx)
mm_ctx.intra_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
mm_ctx.cross_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
mm_ctx.cross_group = std::make_shared<GCMemoryGroup>(mm_ctx.cross_mm);
+ mm_ctx.allocator = &_allocator;
ctx.insert_memory_management_ctx(std::move(mm_ctx));
}
@@ -151,8 +152,6 @@ std::shared_ptr<arm_compute::IMemoryManager> GCDeviceBackend::create_memory_mana
auto pool_mgr = std::make_shared<PoolManager>();
auto mm = std::make_shared<MemoryManagerOnDemand>(lifetime_mgr, pool_mgr);
- mm->set_allocator(&_allocator);
-
return mm;
}
} // namespace backends
diff --git a/src/graph/backends/NEON/NEDeviceBackend.cpp b/src/graph/backends/NEON/NEDeviceBackend.cpp
index 5fc44d0c68..23ced2fef3 100644
--- a/src/graph/backends/NEON/NEDeviceBackend.cpp
+++ b/src/graph/backends/NEON/NEDeviceBackend.cpp
@@ -86,6 +86,7 @@ void NEDeviceBackend::setup_backend_context(GraphContext &ctx)
mm_ctx.intra_mm = create_memory_manager(MemoryManagerAffinity::Offset);
mm_ctx.cross_mm = create_memory_manager(MemoryManagerAffinity::Offset);
mm_ctx.cross_group = std::make_shared<MemoryGroup>(mm_ctx.cross_mm);
+ mm_ctx.allocator = &_allocator;
ctx.insert_memory_management_ctx(std::move(mm_ctx));
}
@@ -156,8 +157,6 @@ std::shared_ptr<arm_compute::IMemoryManager> NEDeviceBackend::create_memory_mana
auto pool_mgr = std::make_shared<PoolManager>();
auto mm = std::make_shared<MemoryManagerOnDemand>(lifetime_mgr, pool_mgr);
- mm->set_allocator(&_allocator);
-
return mm;
}
} // namespace backends
diff --git a/src/runtime/MemoryManagerOnDemand.cpp b/src/runtime/MemoryManagerOnDemand.cpp
index 4dfa28bddb..d9803a8caf 100644
--- a/src/runtime/MemoryManagerOnDemand.cpp
+++ b/src/runtime/MemoryManagerOnDemand.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2016, 2017 ARM Limited.
+ * Copyright (c) 2016-2018 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -29,33 +29,15 @@
#include <memory>
-using namespace arm_compute;
-
+namespace arm_compute
+{
MemoryManagerOnDemand::MemoryManagerOnDemand(std::shared_ptr<ILifetimeManager> lifetime_manager, std::shared_ptr<IPoolManager> pool_manager)
- : _lifetime_mgr(std::move(lifetime_manager)), _pool_mgr(std::move(pool_manager)), _allocator(nullptr), _is_finalized(false), _num_pools(1)
+ : _lifetime_mgr(std::move(lifetime_manager)), _pool_mgr(std::move(pool_manager))
{
ARM_COMPUTE_ERROR_ON_MSG(!_lifetime_mgr, "Lifetime manager not specified correctly!");
ARM_COMPUTE_ERROR_ON_MSG(!_pool_mgr, "Pool manager not specified correctly!");
}
-bool MemoryManagerOnDemand::is_finalized() const
-{
- return _is_finalized;
-}
-
-void MemoryManagerOnDemand::set_num_pools(unsigned int num_pools)
-{
- ARM_COMPUTE_ERROR_ON(num_pools == 0);
- _num_pools = num_pools;
-}
-
-void MemoryManagerOnDemand::set_allocator(IAllocator *allocator)
-{
- ARM_COMPUTE_ERROR_ON_MSG(is_finalized(), "Memory manager is already finalized!");
- ARM_COMPUTE_ERROR_ON(allocator == nullptr);
- _allocator = allocator;
-}
-
ILifetimeManager *MemoryManagerOnDemand::lifetime_manager()
{
return _lifetime_mgr.get();
@@ -66,23 +48,26 @@ IPoolManager *MemoryManagerOnDemand::pool_manager()
return _pool_mgr.get();
}
-void MemoryManagerOnDemand::finalize()
+void MemoryManagerOnDemand::populate(arm_compute::IAllocator &allocator, size_t num_pools)
{
- ARM_COMPUTE_ERROR_ON_MSG(is_finalized(), "Memory manager is already finalized!");
ARM_COMPUTE_ERROR_ON(!_lifetime_mgr);
ARM_COMPUTE_ERROR_ON(!_pool_mgr);
- ARM_COMPUTE_ERROR_ON_MSG(!_lifetime_mgr->are_all_finalized(), "All the objects have not been finalized! ");
- ARM_COMPUTE_ERROR_ON(_allocator == nullptr);
+ ARM_COMPUTE_ERROR_ON_MSG(!_lifetime_mgr->are_all_finalized(), "All the objects have not been finalized!");
+ ARM_COMPUTE_ERROR_ON_MSG(_pool_mgr->num_pools() != 0, "Pool manager already contains pools!");
// Create pools
- auto pool_template = _lifetime_mgr->create_pool(_allocator);
- for(int i = _num_pools; i > 1; --i)
+ auto pool_template = _lifetime_mgr->create_pool(&allocator);
+ for(int i = num_pools; i > 1; --i)
{
auto pool = pool_template->duplicate();
_pool_mgr->register_pool(std::move(pool));
}
_pool_mgr->register_pool(std::move(pool_template));
+}
- // Set finalized to true
- _is_finalized = true;
+void MemoryManagerOnDemand::clear()
+{
+ ARM_COMPUTE_ERROR_ON_MSG(!_pool_mgr, "Pool manager not specified correctly!");
+ _pool_mgr->clear_pools();
}
+} //namespace arm_compute
diff --git a/src/runtime/PoolManager.cpp b/src/runtime/PoolManager.cpp
index 293241d6f4..5ec2ce92c1 100644
--- a/src/runtime/PoolManager.cpp
+++ b/src/runtime/PoolManager.cpp
@@ -73,6 +73,36 @@ void PoolManager::register_pool(std::unique_ptr<IMemoryPool> pool)
_sem = arm_compute::support::cpp14::make_unique<arm_compute::Semaphore>(_free_pools.size());
}
+std::unique_ptr<IMemoryPool> PoolManager::release_pool()
+{
+ std::lock_guard<arm_compute::Mutex> lock(_mtx);
+ ARM_COMPUTE_ERROR_ON_MSG(!_occupied_pools.empty(), "All pools should be free in order to release one!");
+
+ if(!_free_pools.empty())
+ {
+ std::unique_ptr<IMemoryPool> pool = std::move(_free_pools.front());
+ ARM_COMPUTE_ERROR_ON(_free_pools.front() != nullptr);
+ _free_pools.pop_front();
+
+ // Update semaphore
+ _sem = arm_compute::support::cpp14::make_unique<arm_compute::Semaphore>(_free_pools.size());
+
+ return pool;
+ }
+
+ return nullptr;
+}
+
+void PoolManager::clear_pools()
+{
+ std::lock_guard<arm_compute::Mutex> lock(_mtx);
+ ARM_COMPUTE_ERROR_ON_MSG(!_occupied_pools.empty(), "All pools should be free in order to clear the PoolManager!");
+ _free_pools.clear();
+
+ // Update semaphore
+ _sem = nullptr;
+}
+
size_t PoolManager::num_pools() const
{
std::lock_guard<arm_compute::Mutex> lock(_mtx);