// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "OffsetLifetimeManager.hpp" #include "OffsetMemoryPool.hpp" #include #include #include namespace armnn { OffsetLifetimeManager::OffsetLifetimeManager() : m_BlobSize(0) { } std::unique_ptr OffsetLifetimeManager::create_pool(arm_compute::IAllocator* allocator) { BOOST_ASSERT(allocator); return std::make_unique(allocator, m_BlobSize); } arm_compute::MappingType OffsetLifetimeManager::mapping_type() const { return arm_compute::MappingType::OFFSETS; } void OffsetLifetimeManager::update_blobs_and_mappings() { BOOST_ASSERT(are_all_finalized()); BOOST_ASSERT(_active_group); // Update blob size size_t maxGroupSize = std::accumulate(std::begin(_free_blobs), std::end(_free_blobs), static_cast(0), [](size_t s, const Blob& b) { return s + b.max_size; }); m_BlobSize = std::max(m_BlobSize, maxGroupSize); // Calculate group mappings auto& groupMappings = _active_group->mappings(); size_t offset = 0; for(auto& freeBlob : _free_blobs) { for(auto& boundElementId : freeBlob.bound_elements) { BOOST_ASSERT(_active_elements.find(boundElementId) != std::end(_active_elements)); Element& boundElement = _active_elements[boundElementId]; groupMappings[boundElement.handle] = offset; } offset += freeBlob.max_size; BOOST_ASSERT(offset <= m_BlobSize); } } } // namespace armnn