// // Copyright © 2017 Arm Ltd. All rights reserved. // SPDX-License-Identifier: MIT // #include "BlobLifetimeManager.hpp" #include "BlobMemoryPool.hpp" #include "arm_compute/runtime/IMemoryGroup.h" #include "boost/assert.hpp" #include namespace armnn { BlobLifetimeManager::BlobLifetimeManager() : m_BlobSizes() { } arm_compute::MappingType BlobLifetimeManager::mapping_type() const { return arm_compute::MappingType::BLOBS; } void BlobLifetimeManager::update_blobs_and_mappings() { using namespace arm_compute; BOOST_ASSERT(are_all_finalized()); BOOST_ASSERT(_active_group); // Sort free blobs requirements in descending order. _free_blobs.sort([](const Blob & ba, const Blob & bb) { return ba.max_size > bb.max_size; }); std::vector groupSizes; std::transform(std::begin(_free_blobs), std::end(_free_blobs), std::back_inserter(groupSizes), [](const Blob & b) { return b.max_size; }); // Update blob sizes size_t max_size = std::max(m_BlobSizes.size(), groupSizes.size()); m_BlobSizes.resize(max_size, 0); groupSizes.resize(max_size, 0); std::transform(std::begin(m_BlobSizes), std::end(m_BlobSizes), std::begin(groupSizes), std::begin(m_BlobSizes), [](size_t lhs, size_t rhs) { return std::max(lhs, rhs); }); // Calculate group mappings auto& groupMappings = _active_group->mappings(); unsigned int blobIdx = 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] = blobIdx; } ++blobIdx; } } std::unique_ptr BlobLifetimeManager::create_pool(arm_compute::IAllocator* allocator) { BOOST_ASSERT(allocator); return std::make_unique(allocator, m_BlobSizes); } } // namespace armnn