aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorgios Pinitas <georgios.pinitas@arm.com>2019-01-21 18:38:21 +0000
committerGeorgios Pinitas <georgios.pinitas@arm.com>2019-01-23 11:45:28 +0000
commit734151d20bef56cbedce2ae67945f42cb4e265c8 (patch)
treeb51f5fb5ead440e0f7a5f38785f2f2564442d0f5 /src
parente8c0c4397a508169282e5859410d5d6cdc87edbe (diff)
downloadComputeLibrary-734151d20bef56cbedce2ae67945f42cb4e265c8.tar.gz
COMPMID-1848: Account alignment in Offset-based pool allocations
Change-Id: I061d612341bf951a7d0e7ddd04a42139c8400d41 Reviewed-on: https://review.mlplatform.org/554 Tested-by: Arm Jenkins <bsgcomp@arm.com> Reviewed-by: Michalis Spyrou <michalis.spyrou@arm.com>
Diffstat (limited to 'src')
-rw-r--r--src/graph/backends/NEON/NEDeviceBackend.cpp4
-rw-r--r--src/runtime/BlobLifetimeManager.cpp3
-rw-r--r--src/runtime/OffsetLifetimeManager.cpp28
-rw-r--r--src/runtime/OffsetMemoryPool.cpp12
4 files changed, 30 insertions, 17 deletions
diff --git a/src/graph/backends/NEON/NEDeviceBackend.cpp b/src/graph/backends/NEON/NEDeviceBackend.cpp
index 7b1f6bf2a7..f94cd97cd2 100644
--- a/src/graph/backends/NEON/NEDeviceBackend.cpp
+++ b/src/graph/backends/NEON/NEDeviceBackend.cpp
@@ -83,8 +83,8 @@ void NEDeviceBackend::setup_backend_context(GraphContext &ctx)
{
MemoryManagerContext mm_ctx;
mm_ctx.target = Target::NEON;
- mm_ctx.intra_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
- mm_ctx.cross_mm = create_memory_manager(MemoryManagerAffinity::Buffer);
+ 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;
diff --git a/src/runtime/BlobLifetimeManager.cpp b/src/runtime/BlobLifetimeManager.cpp
index 9fef943fb5..c5d42b1be1 100644
--- a/src/runtime/BlobLifetimeManager.cpp
+++ b/src/runtime/BlobLifetimeManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -32,7 +32,6 @@
#include <algorithm>
#include <cmath>
#include <map>
-#include <vector>
using namespace arm_compute;
diff --git a/src/runtime/OffsetLifetimeManager.cpp b/src/runtime/OffsetLifetimeManager.cpp
index d0b3bde724..ad23220c0e 100644
--- a/src/runtime/OffsetLifetimeManager.cpp
+++ b/src/runtime/OffsetLifetimeManager.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -34,8 +34,16 @@
#include <map>
#include <vector>
-using namespace arm_compute;
-
+namespace arm_compute
+{
+namespace
+{
+size_t align_offset(size_t offset, size_t alignment)
+{
+ const size_t remainder = (alignment != 0U) ? offset % alignment : 0U;
+ return (remainder != 0U) ? offset + (alignment - remainder) : offset;
+}
+} // namespace
OffsetLifetimeManager::OffsetLifetimeManager()
: _blob(0)
{
@@ -58,11 +66,15 @@ void OffsetLifetimeManager::update_blobs_and_mappings()
ARM_COMPUTE_ERROR_ON(_active_group == nullptr);
// Update blob size
- size_t max_group_size = std::accumulate(std::begin(_free_blobs), std::end(_free_blobs), static_cast<size_t>(0), [](size_t s, const Blob & b)
+ size_t max_aggregated_size = 0;
+ std::for_each(std::begin(_free_blobs), std::end(_free_blobs), [&](const Blob & b)
{
- return s + b.max_size;
+ max_aggregated_size += b.max_size;
+ _blob.alignment = std::max(_blob.alignment, b.max_alignment);
});
- _blob = std::max(_blob, max_group_size);
+ max_aggregated_size += _free_blobs.size() * _blob.alignment;
+ _blob.owners = std::max(_blob.owners, _free_blobs.size());
+ _blob.size = std::max(_blob.size, max_aggregated_size);
// Calculate group mappings
auto &group_mappings = _active_group->mappings();
@@ -76,6 +88,8 @@ void OffsetLifetimeManager::update_blobs_and_mappings()
group_mappings[bound_element.handle] = offset;
}
offset += free_blob.max_size;
- ARM_COMPUTE_ERROR_ON(offset > _blob);
+ offset = align_offset(offset, _blob.alignment);
+ ARM_COMPUTE_ERROR_ON(offset > _blob.size);
}
}
+} // namespace arm_compute
diff --git a/src/runtime/OffsetMemoryPool.cpp b/src/runtime/OffsetMemoryPool.cpp
index 36eaf0ba1a..70cbe90bf0 100644
--- a/src/runtime/OffsetMemoryPool.cpp
+++ b/src/runtime/OffsetMemoryPool.cpp
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2017-2018 ARM Limited.
+ * Copyright (c) 2017-2019 ARM Limited.
*
* SPDX-License-Identifier: MIT
*
@@ -34,11 +34,11 @@
using namespace arm_compute;
-OffsetMemoryPool::OffsetMemoryPool(IAllocator *allocator, size_t blob_size)
- : _allocator(allocator), _blob(), _blob_size(blob_size)
+OffsetMemoryPool::OffsetMemoryPool(IAllocator *allocator, BlobInfo blob_info)
+ : _allocator(allocator), _blob(), _blob_info(blob_info)
{
ARM_COMPUTE_ERROR_ON(!allocator);
- _blob = _allocator->make_region(blob_size, 0);
+ _blob = _allocator->make_region(blob_info.size, blob_info.alignment);
}
void OffsetMemoryPool::acquire(MemoryMappings &handles)
@@ -49,7 +49,7 @@ void OffsetMemoryPool::acquire(MemoryMappings &handles)
for(auto &handle : handles)
{
ARM_COMPUTE_ERROR_ON(handle.first == nullptr);
- handle.first->set_owned_region(_blob->extract_subregion(handle.second, _blob_size - handle.second));
+ handle.first->set_owned_region(_blob->extract_subregion(handle.second, _blob_info.size - handle.second));
}
}
@@ -70,5 +70,5 @@ MappingType OffsetMemoryPool::mapping_type() const
std::unique_ptr<IMemoryPool> OffsetMemoryPool::duplicate()
{
ARM_COMPUTE_ERROR_ON(!_allocator);
- return support::cpp14::make_unique<OffsetMemoryPool>(_allocator, _blob_size);
+ return support::cpp14::make_unique<OffsetMemoryPool>(_allocator, _blob_info);
} \ No newline at end of file