diff options
author | Aron Virginas-Tar <Aron.Virginas-Tar@arm.com> | 2018-10-31 11:04:01 +0000 |
---|---|---|
committer | David Beck <david.beck@arm.com> | 2018-11-08 11:34:44 +0000 |
commit | 60578950322491e44b4203fe085c3230ead19c7a (patch) | |
tree | e68bd71cb7b90d66d69a3de25561e32a13dd4e17 /src/backends/aclCommon/BaseMemoryManager.hpp | |
parent | db49a8880ba869627e884b5ba5245a3932de218d (diff) | |
download | armnn-60578950322491e44b4203fe085c3230ead19c7a.tar.gz |
IVGCVSW-1709: Clean up memory manager bodge
* Added quick workaround for the memory management errors in the
CL/Neon unit tests
Change-Id: I56250db462cdbdc1acc0a5824807d288fb0c1d11
Diffstat (limited to 'src/backends/aclCommon/BaseMemoryManager.hpp')
-rw-r--r-- | src/backends/aclCommon/BaseMemoryManager.hpp | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/src/backends/aclCommon/BaseMemoryManager.hpp b/src/backends/aclCommon/BaseMemoryManager.hpp new file mode 100644 index 0000000000..ffa440b3ab --- /dev/null +++ b/src/backends/aclCommon/BaseMemoryManager.hpp @@ -0,0 +1,101 @@ +// +// Copyright © 2017 Arm Ltd. All rights reserved. +// SPDX-License-Identifier: MIT +// +#pragma once + +#include <backendsCommon/WorkloadFactory.hpp> + +#ifdef ARMCOMPUTENEON_ENABLED +#include <arm_compute/runtime/MemoryGroup.h> +#endif + +#ifdef ARMCOMPUTECL_ENABLED +#include <arm_compute/runtime/CL/CLMemoryGroup.h> +#endif + +#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) +#include <arm_compute/runtime/IAllocator.h> +#include <arm_compute/runtime/IMemoryGroup.h> +#include <arm_compute/runtime/MemoryManagerOnDemand.h> +#endif + +namespace armnn +{ + +class BaseMemoryManager +{ +public: + enum class MemoryAffinity + { + Buffer, + Offset + }; + + BaseMemoryManager() { } + virtual ~BaseMemoryManager() { } + +#if defined(ARMCOMPUTENEON_ENABLED) || defined(ARMCOMPUTECL_ENABLED) + + BaseMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity); + + std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetIntraLayerManager() { return m_IntraLayerMemoryMgr; } + std::shared_ptr<arm_compute::MemoryManagerOnDemand>& GetInterLayerManager() { return m_InterLayerMemoryMgr; } + std::shared_ptr<arm_compute::IMemoryGroup>& GetInterLayerMemoryGroup() { return m_InterLayerMemoryGroup; } + + void Acquire(); + void Release(); + +protected: + std::unique_ptr<arm_compute::IAllocator> m_Allocator; + std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_IntraLayerMemoryMgr; + std::shared_ptr<arm_compute::MemoryManagerOnDemand> m_InterLayerMemoryMgr; + std::shared_ptr<arm_compute::IMemoryGroup> m_InterLayerMemoryGroup; + + std::shared_ptr<arm_compute::MemoryManagerOnDemand> CreateArmComputeMemoryManager(MemoryAffinity memoryAffinity); + + virtual std::shared_ptr<arm_compute::IMemoryGroup> + CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) = 0; + +#endif +}; + +class NeonMemoryManager : public BaseMemoryManager +{ +public: + NeonMemoryManager() {} + virtual ~NeonMemoryManager() {} + +#ifdef ARMCOMPUTENEON_ENABLED + NeonMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc, MemoryAffinity memoryAffinity) + : BaseMemoryManager(std::move(alloc), memoryAffinity) + { + m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); + } + +protected: + virtual std::shared_ptr<arm_compute::IMemoryGroup> + CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; +#endif +}; + +class ClMemoryManager : public BaseMemoryManager +{ +public: + ClMemoryManager() {} + virtual ~ClMemoryManager() {} + +#ifdef ARMCOMPUTECL_ENABLED + ClMemoryManager(std::unique_ptr<arm_compute::IAllocator> alloc) + : BaseMemoryManager(std::move(alloc), MemoryAffinity::Buffer) + { + m_InterLayerMemoryGroup = CreateMemoryGroup(m_InterLayerMemoryMgr); + } + +protected: + virtual std::shared_ptr<arm_compute::IMemoryGroup> + CreateMemoryGroup(const std::shared_ptr<arm_compute::MemoryManagerOnDemand>& memoryManager) override; +#endif +}; + +} //namespace armnn |