diff options
author | Georgios Pinitas <georgios.pinitas@arm.com> | 2019-01-21 18:38:21 +0000 |
---|---|---|
committer | Georgios Pinitas <georgios.pinitas@arm.com> | 2019-01-23 11:45:28 +0000 |
commit | 734151d20bef56cbedce2ae67945f42cb4e265c8 (patch) | |
tree | b51f5fb5ead440e0f7a5f38785f2f2564442d0f5 /src | |
parent | e8c0c4397a508169282e5859410d5d6cdc87edbe (diff) | |
download | ComputeLibrary-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.cpp | 4 | ||||
-rw-r--r-- | src/runtime/BlobLifetimeManager.cpp | 3 | ||||
-rw-r--r-- | src/runtime/OffsetLifetimeManager.cpp | 28 | ||||
-rw-r--r-- | src/runtime/OffsetMemoryPool.cpp | 12 |
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 |