| @@ -356,6 +356,14 @@ void CachingAllocator::FreeBlocks() { | |||||
| (void) FreeCachedBlocks(); | (void) FreeCachedBlocks(); | ||||
| } | } | ||||
| void CachingAllocator::TryFreeBlocks() { | |||||
| GELOGI("Try free blocks."); | |||||
| std::lock_guard<std::recursive_mutex> lock(mutex_); | |||||
| if (allocated_blocks_.empty()) { | |||||
| (void) FreeCachedBlocks(); | |||||
| } | |||||
| } | |||||
| void CachingAllocator::FreeBlockBins() { | void CachingAllocator::FreeBlockBins() { | ||||
| GELOGI("Free block bins."); | GELOGI("Free block bins."); | ||||
| std::lock_guard<std::recursive_mutex> lock(mutex_); | std::lock_guard<std::recursive_mutex> lock(mutex_); | ||||
| @@ -94,6 +94,13 @@ class CachingAllocator { | |||||
| /// | /// | ||||
| Status Free(uint8_t *memory_addr, uint32_t device_id = 0); | Status Free(uint8_t *memory_addr, uint32_t device_id = 0); | ||||
| /// | |||||
| /// @ingroup ge_graph | |||||
| /// @brief try to free memory when no memory is referenced | |||||
| /// @return void | |||||
| /// | |||||
| void TryFreeBlocks(); | |||||
| private: | private: | ||||
| /// | /// | ||||
| @@ -19,6 +19,9 @@ | |||||
| #include <mutex> | #include <mutex> | ||||
| #include <string> | #include <string> | ||||
| #include "graph/manager/graph_mem_allocator.h" | |||||
| #include "graph/manager/graph_caching_allocator.h" | |||||
| namespace ge { | namespace ge { | ||||
| FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY SingleOpManager::~SingleOpManager() { | FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY SingleOpManager::~SingleOpManager() { | ||||
| for (auto &it : stream_resources_) { | for (auto &it : stream_resources_) { | ||||
| @@ -69,6 +72,7 @@ FMK_FUNC_HOST_VISIBILITY FMK_FUNC_DEV_VISIBILITY Status SingleOpManager::Release | |||||
| delete it->second; | delete it->second; | ||||
| it->second = nullptr; | it->second = nullptr; | ||||
| (void)stream_resources_.erase(it); | (void)stream_resources_.erase(it); | ||||
| MemManager::Instance().CachingInstance(RT_MEMORY_HBM).TryFreeBlocks(); | |||||
| return SUCCESS; | return SUCCESS; | ||||
| } | } | ||||
| @@ -58,6 +58,7 @@ TEST_F(UtestGraphCachingAllocatorTest, malloc_success) { | |||||
| EXPECT_EQ(MemManager::Instance().Initialize(mem_type), SUCCESS); | EXPECT_EQ(MemManager::Instance().Initialize(mem_type), SUCCESS); | ||||
| uint8_t *ptr = MemManager::Instance().CachingInstance(RT_MEMORY_HBM).Malloc(kMByteSize); | uint8_t *ptr = MemManager::Instance().CachingInstance(RT_MEMORY_HBM).Malloc(kMByteSize); | ||||
| EXPECT_NE(nullptr, ptr); | EXPECT_NE(nullptr, ptr); | ||||
| MemManager::Instance().CachingInstance(RT_MEMORY_HBM).TryFreeBlocks(); | |||||
| MemManager::Instance().Finalize(); | MemManager::Instance().Finalize(); | ||||
| } | } | ||||