2 // Copyright © 2017 Arm Ltd. All rights reserved.
3 // SPDX-License-Identifier: MIT
7 #include <backendsCommon/IMemoryManager.hpp>
8 #include <backendsCommon/WorkloadFactory.hpp>
10 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
11 #include <arm_compute/runtime/MemoryGroup.h>
14 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
15 #include <arm_compute/runtime/IAllocator.h>
16 #include <arm_compute/runtime/IMemoryGroup.h>
17 #include <arm_compute/runtime/MemoryManagerOnDemand.h>
23 class BaseMemoryManager : public IMemoryManager
26 enum class MemoryAffinity
32 BaseMemoryManager() { }
33 virtual ~BaseMemoryManager() { }
35 void Acquire() override;
36 void Release() override;
38 #if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED)
39 BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity);
41 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; }
42 std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; }
43 std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; }
46 std::unique_ptr<arm_compute::IAllocator> m_Allocator;
47 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr;
48 std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr;
49 std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup;
51 std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity);
53 virtual std::shared_ptr<arm_compute::IMemoryGroup>
54 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0;
58 #if defined(ARMCOMPUTENEON_ENABLED)
59 class NeonMemoryManager : public BaseMemoryManager
62 NeonMemoryManager() {}
63 virtual ~NeonMemoryManager() {}
65 NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity)
66 : BaseMemoryManager(std::move(alloc), memoryAffinity)
68 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
72 std::shared_ptr<arm_compute::IMemoryGroup>
73 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;
77 #if defined(ARMCOMPUTECL_ENABLED)
78 class ClMemoryManager : public BaseMemoryManager
82 virtual ~ClMemoryManager() {}
84 ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc)
85 : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer)
87 m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr);
91 std::shared_ptr<arm_compute::IMemoryGroup>
92 CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override;