aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/ISimpleLifetimeManager.cpp
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2018-05-03 20:47:16 +0100
committerAnthony Barbier <anthony.barbier@arm.com>2018-11-02 16:51:50 +0000
commit3d1489de593574e65ef1e64a7ae64e4e56c2978b (patch)
treef87f3df521cb5ed8bd383dad89cbeb92c49670ac /src/runtime/ISimpleLifetimeManager.cpp
parent54d6fae4dbb4f556cc5ec484c51681ad84c015a7 (diff)
downloadComputeLibrary-3d1489de593574e65ef1e64a7ae64e4e56c2978b.tar.gz
COMPMID-605: Transition buffer memory manager
Change-Id: Ide7c6124eb19f13f15f517e62d705646a0cd1ecd Reviewed-on: https://eu-gerrit-1.euhpc.arm.com/130184 Reviewed-by: Georgios Pinitas <georgios.pinitas@arm.com> Tested-by: Jenkins <bsgcomp@arm.com> Reviewed-by: Anthony Barbier <anthony.barbier@arm.com>
Diffstat (limited to 'src/runtime/ISimpleLifetimeManager.cpp')
-rw-r--r--src/runtime/ISimpleLifetimeManager.cpp57
1 files changed, 39 insertions, 18 deletions
diff --git a/src/runtime/ISimpleLifetimeManager.cpp b/src/runtime/ISimpleLifetimeManager.cpp
index 2c64475b39..faaff8a63e 100644
--- a/src/runtime/ISimpleLifetimeManager.cpp
+++ b/src/runtime/ISimpleLifetimeManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017 ARM Limited.
+ * Copyright (c) 2017-2018 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -37,7 +37,7 @@
using namespace arm_compute;
ISimpleLifetimeManager::ISimpleLifetimeManager()
- : _active_group(nullptr), _active_elements(), _finalized_groups()
+ : _active_group(nullptr), _active_elements(), _free_blobs(), _occupied_blobs(), _finalized_groups()
{
}
@@ -53,14 +53,21 @@ void ISimpleLifetimeManager::register_group(IMemoryGroup *group)
void ISimpleLifetimeManager::start_lifetime(void *obj)
{
ARM_COMPUTE_ERROR_ON(obj == nullptr);
- ARM_COMPUTE_ERROR_ON_MSG(std::find_if(std::begin(_active_elements), std::end(_active_elements), [&obj](const Element & e)
+ ARM_COMPUTE_ERROR_ON_MSG(_active_elements.find(obj) != std::end(_active_elements), "Memory object is already registered!");
+
+ // Check if there is a free blob
+ if(_free_blobs.empty())
+ {
+ _occupied_blobs.emplace_front(Blob{ obj, 0, { obj } });
+ }
+ else
{
- return obj == e.id;
- }) != std::end(_active_elements),
- "Memory object is already registered!");
+ _occupied_blobs.splice(std::begin(_occupied_blobs), _free_blobs, std::begin(_free_blobs));
+ _occupied_blobs.front().id = obj;
+ }
// Insert object in groups and mark its finalized state to false
- _active_elements.emplace_back(obj);
+ _active_elements.insert(std::make_pair(obj, obj));
}
void ISimpleLifetimeManager::end_lifetime(void *obj, void **handle, size_t size)
@@ -68,36 +75,50 @@ void ISimpleLifetimeManager::end_lifetime(void *obj, void **handle, size_t size)
ARM_COMPUTE_ERROR_ON(obj == nullptr);
// Find object
- auto it = std::find_if(std::begin(_active_elements), std::end(_active_elements), [&obj](const Element & e)
+ auto active_object_it = _active_elements.find(obj);
+ ARM_COMPUTE_ERROR_ON(active_object_it == std::end(_active_elements));
+
+ // Update object fields and mark object as complete
+ Element &el = active_object_it->second;
+ el.handle = handle;
+ el.size = size;
+ el.status = true;
+
+ // Find object in the occupied lists
+ auto occupied_blob_it = std::find_if(std::begin(_occupied_blobs), std::end(_occupied_blobs), [&obj](const Blob & b)
{
- return obj == e.id;
+ return obj == b.id;
});
- ARM_COMPUTE_ERROR_ON(it == std::end(_active_elements));
+ ARM_COMPUTE_ERROR_ON(occupied_blob_it == std::end(_occupied_blobs));
- // Update object fields and mark object as complete
- it->handle = handle;
- it->size = size;
- it->status = true;
+ // Update occupied blob and return as free
+ occupied_blob_it->bound_elements.insert(obj);
+ occupied_blob_it->max_size = std::max(occupied_blob_it->max_size, size);
+ occupied_blob_it->id = nullptr;
+ _free_blobs.splice(std::begin(_free_blobs), _occupied_blobs, occupied_blob_it);
// Check if all object are finalized and reset active group
if(are_all_finalized())
{
- // Update finalized groups
- _finalized_groups[_active_group].insert(std::end(_finalized_groups[_active_group]), std::begin(_active_elements), std::end(_active_elements));
+ ARM_COMPUTE_ERROR_ON(!_occupied_blobs.empty());
// Update blobs and group mappings
update_blobs_and_mappings();
+ // Update finalized groups
+ _finalized_groups[_active_group] = std::move(_active_elements);
+
// Reset state
_active_elements.clear();
_active_group = nullptr;
+ _free_blobs.clear();
}
}
bool ISimpleLifetimeManager::are_all_finalized() const
{
- return !std::any_of(std::begin(_active_elements), std::end(_active_elements), [](const Element e)
+ return !std::any_of(std::begin(_active_elements), std::end(_active_elements), [](const std::pair<void *, Element> &e)
{
- return !e.status;
+ return !e.second.status;
});
}