@@ -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_) { | ||||
@@ -67,6 +70,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; | ||||
} | } | ||||