提交 62c394ca 编写于 作者: M Megvii Engine Team

feat(cuda/comp_node): enable to query adjacent free blocks size

GitOrigin-RevId: 0cd1d202dd05c65c2231a469b511ca13974d43a6
上级 fd61f095
......@@ -269,6 +269,12 @@ class CudaCompNode::CompNodeImpl final: public CompNode::Impl {
return {tot, free};
}
#if !MGB_BUILD_SLIM_SERVING
std::pair<size_t, size_t> get_free_left_and_right(size_t begin_ptr, size_t end_ptr) override {
return m_mem_alloc->get_free_left_and_right(begin_ptr, end_ptr);
}
#endif
Locator locator() override {
return m_locator;
}
......
......@@ -21,6 +21,27 @@ using namespace mem_alloc;
/* ===================== MemAllocImplHelper ===================== */
#if !MGB_BUILD_SLIM_SERVING
std::pair<size_t, size_t> MemAllocImplHelper::get_free_left_and_right(size_t begin_ptr, size_t end_ptr) {
MGB_LOCK_GUARD(m_mutex);
auto iter = m_free_blk_addr.lower_bound(begin_ptr);
size_t left_free = 0, right_free = 0;
if (iter != m_free_blk_addr.begin()) {
auto prev = iter;
prev --;
if (prev->first + prev->second.size == begin_ptr) {
left_free = prev->second.size;
}
}
if (iter != m_free_blk_addr.end()) {
if (iter->first == end_ptr) {
right_free = iter->second.size;
}
}
return {left_free, right_free};
}
#endif
MemAllocImplHelper::MemAddr MemAllocImplHelper::do_alloc(
size_t size, bool allow_from_parent, bool log_stat_on_error) {
......
......@@ -115,6 +115,10 @@ class MemAllocImplHelper: virtual public MemAllocBase {
//! get free mem for this allocator, without locking
FreeMemStat get_free_memory_self_unsafe();
#if !MGB_BUILD_SLIM_SERVING
std::pair<size_t, size_t> get_free_left_and_right(size_t begin_ptr, size_t end_ptr) override;
#endif
public:
void print_memory_state() override;
......
......@@ -352,6 +352,10 @@ class CompNode {
}
#if !MGB_BUILD_SLIM_SERVING
std::pair<size_t, size_t> get_free_left_and_right(size_t begin_ptr, size_t end_ptr) {
return m_impl->get_free_left_and_right(begin_ptr, end_ptr);
}
size_t get_used_memory() const {
return m_impl->get_used_memory();
}
......@@ -535,6 +539,9 @@ class CompNode {
virtual std::pair<size_t, size_t> get_mem_status_bytes() = 0;
#if !MGB_BUILD_SLIM_SERVING
virtual std::pair<size_t, size_t> get_free_left_and_right(size_t x, size_t y) {
return {x - x, y - y};
}
virtual size_t get_used_memory() {
return 0;
}
......
......@@ -134,6 +134,15 @@ class MemAllocBase {
*/
virtual FreeMemStat get_free_memory_dev() = 0;
#if !MGB_BUILD_SLIM_SERVING
/*!
* \brief get free memory adjacent to interval [begin_ptr, end_ptr]
*/
virtual std::pair<size_t, size_t> get_free_left_and_right(size_t begin_ptr, size_t end_ptr) {
return {0, 0};
}
#endif
virtual ~MemAllocBase() = default;
};
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册