blob: 206cf9b2306cc2e27a56ee497815cbba1b8f0ba5 [file] [log] [blame]
Laurent Carlier749294b2020-06-01 09:03:17 +01001//
David Monahan8a570462023-11-22 13:24:25 +00002// Copyright © 2017-2023 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{
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010021 ARMNN_ASSERT(alloc);
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
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010053 ARMNN_ASSERT(m_IntraLayerMemoryMgr);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000054 m_IntraLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
55
56 // Allocate memory pools for inter-layer memory manager
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010057 ARMNN_ASSERT(m_InterLayerMemoryMgr);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000058 m_InterLayerMemoryMgr->populate(*m_Allocator, s_NumPools);
59
60 // Acquire inter-layer memory group. NOTE: This has to come after allocating the pools
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010061 ARMNN_ASSERT(m_InterLayerMemoryGroup);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000062 m_InterLayerMemoryGroup->acquire();
63}
64
65void BaseMemoryManager::Release()
66{
67 // Release inter-layer memory group. NOTE: This has to come before releasing the pools
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010068 ARMNN_ASSERT(m_InterLayerMemoryGroup);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000069 m_InterLayerMemoryGroup->release();
70
71 // Release memory pools managed by intra-layer memory manager
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010072 ARMNN_ASSERT(m_IntraLayerMemoryMgr);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000073 m_IntraLayerMemoryMgr->clear();
74
75 // Release memory pools managed by inter-layer memory manager
Narumol Prangnawaratac2770a2020-04-01 16:51:23 +010076 ARMNN_ASSERT(m_InterLayerMemoryMgr);
Aron Virginas-Tar60578952018-10-31 11:04:01 +000077 m_InterLayerMemoryMgr->clear();
78}
Aron Virginas-Tar56055192018-11-12 18:10:43 +000079#else
80void BaseMemoryManager::Acquire()
81{
82 // No-op if neither NEON nor CL enabled
83}
84
85void BaseMemoryManager::Release()
86{
87 // No-op if neither NEON nor CL enabled
88}
Aron Virginas-Tar60578952018-10-31 11:04:01 +000089#endif
90
Matteo Martincighd95e9062019-01-31 15:35:59 +000091#if defined(ARMCOMPUTENEON_ENABLED)
Aron Virginas-Tar60578952018-10-31 11:04:01 +000092std::shared_ptr<arm_compute::IMemoryGroup>
93NeonMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
94{
95 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
96}
97#endif
98
Matteo Martincighd95e9062019-01-31 15:35:59 +000099#if defined(ARMCOMPUTECL_ENABLED)
Aron Virginas-Tar60578952018-10-31 11:04:01 +0000100std::shared_ptr<arm_compute::IMemoryGroup>
101ClMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
102{
Narumol Prangnawarat680f9912019-10-01 11:32:10 +0100103 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
Aron Virginas-Tar60578952018-10-31 11:04:01 +0000104}
105#endif
106
David Monahan8a570462023-11-22 13:24:25 +0000107#if defined(ARMCOMPUTEGPUFSA_ENABLED)
108std::shared_ptr<arm_compute::IMemoryGroup>
109GpuFsaMemoryManager::CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager)
110{
111 return std::make_shared<arm_compute::MemoryGroup>(memoryManager);
112}
113#endif
114
Aron Virginas-Tar60578952018-10-31 11:04:01 +0000115}