blob: 50517cb54c20d2cbb5a4b47516da56ddb597b9b9 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
Colm Donelanb4ef1632024-02-01 15:00:43 +00002// Copyright © 2017-2024 Arm Ltd. All rights reserved.
Aron Virginas-Tar60578952018-10-31 11:04:01 +00003// SPDX-License-Identifier: MIT
4//
5#include "BaseMemoryManager.hpp"
6
David Monahan8a570462023-11-22 13:24:25 +00007#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) || defined(ARMCOMPUTEGPUFSA_ENABLED)
Aron Virginas-Tar60578952018-10-31 11:04:01 +00008#include "arm_compute/runtime/BlobLifetimeManager.h"
9#include "arm_compute/runtime/PoolManager.h"
10#include "arm_compute/runtime/OffsetLifetimeManager.h"
11#endif
12
Aron Virginas-Tar60578952018-10-31 11:04:01 +000013
14namespace armnn
15{
16
David Monahan8a570462023-11-22 13:24:25 +000017#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) || defined(ARMCOMPUTEGPUFSA_ENABLED)
Jan Eilersc1c872f2021-07-22 13:17:04 +010018BaseMemoryManager::BaseMemoryManager(std::shared_ptr<arm_compute::IAllocator> alloc,
Aron Virginas-Tar60578952018-10-31 11:04:01 +000019 MemoryAffinity memoryAffinity)
20{
Colm Donelanb4ef1632024-02-01 15:00:43 +000021 ARMNN_THROW_INVALIDARG_MSG_IF_FALSE(alloc, "A null allocator has been passed to BaseMemoryManager.");
Aron Virginas-Tar60578952018-10-31 11:04:01 +000022 m_Allocator = std::move(alloc);
23
24 m_IntraLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
25 m_InterLayerMemoryMgr = CreateArmComputeMemoryManager(memoryAffinity);
26}
27
28std::shared_ptr<arm_compute::MemoryManagerOnDemand>
29BaseMemoryManager::CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity)
30{
31 std::shared_ptr<arm_compute::ILifetimeManager> lifetimeManager = nullptr;
32
33 if (memoryAffinity == MemoryAffinity::Buffer)
34 {
35 lifetimeManager = std::make_shared<arm_compute::BlobLifetimeManager>();
36 }
37 else
38 {
39 lifetimeManager = std::make_shared<arm_compute::OffsetLifetimeManager>();
40 }
41
42 auto poolManager = std::make_shared<arm_compute::PoolManager>();
43 auto memoryManager = std::make_shared<arm_compute::MemoryManagerOnDemand>(lifetimeManager, poolManager);
44
45 return memoryManager;
46}
47
48void BaseMemoryManager::Acquire()
49{
50 static const size_t s_NumPools = 1;
51
52 // Allocate memory pools for intra-layer memory manager
Aron Virginas-Tar60578952018-10-31 11:04:01 +000053 m_IntraLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
54
55 // Allocate memory pools for inter-layer memory manager
Aron Virginas-Tar60578952018-10-31 11:04:01 +000056 m_InterLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
57
58 // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools
Aron Virginas-Tar60578952018-10-31 11:04:01 +000059 m_InterLayerMemoryGroup->acquire();
60}
61
62void BaseMemoryManager::Release()
63{
64 // Release inter-layer memory group. NOTE: This has to come before releasing the pools
Aron Virginas-Tar60578952018-10-31 11:04:01 +000065 m_InterLayerMemoryGroup->release();
66
67 // Release memory pools managed by intra-layer memory manager
Aron Virginas-Tar60578952018-10-31 11:04:01 +000068 m_IntraLayerMemoryMgr->clear();
69
70 // Release memory pools managed by inter-layer memory manager
Aron Virginas-Tar60578952018-10-31 11:04:01 +000071 m_InterLayerMemoryMgr->clear();
72}
Aron Virginas-Tar56055192018-11-12 18:10:43 +000073#else
74void BaseMemoryManager::Acquire()
75{
76 // No-op if neither NEON nor CL enabled
77}
78
79void BaseMemoryManager::Release()
80{
81 // No-op if neither NEON nor CL enabled
82}
Aron Virginas-Tar60578952018-10-31 11:04:01 +000083#endif
84
Matteo Martincighd95e9062019-01-31 15:35:59 +000085#if defined(ARMCOMPUTENEON_ENABLED)
Aron Virginas-Tar60578952018-10-31 11:04:01 +000086std::shared_ptr<arm_compute::IMemoryGroup>
87NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
88{
89 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
90}
91#endif
92
Matteo Martincighd95e9062019-01-31 15:35:59 +000093#if defined(ARMCOMPUTECL_ENABLED)
Aron Virginas-Tar60578952018-10-31 11:04:01 +000094std::shared_ptr<arm_compute::IMemoryGroup>
95ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
96{
Narumol Prangnawarat680f9912019-10-01 11:32:10 +010097 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000098}
99#endif
100
David Monahan8a570462023-11-22 13:24:25 +0000101#if defined(ARMCOMPUTEGPUFSA_ENABLED)
102std::shared_ptr<arm_compute::IMemoryGroup>
103GpuFsaMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
104{
105 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
106}
107#endif
108
Aron Virginas-Tar60578952018-10-31 11:04:01 +0000109}