公共成员函数 | 所有成员列表
rmm::mr::arena_memory_resource< Upstream > 类模板参考final

一个子分配器,强调避免碎片和可伸缩的并发支持。更多...

#include <arena_memory_resource.hpp>

rmm::mr::arena_memory_resource< Upstream > 的继承图
Inheritance graph
[图例]
rmm::mr::arena_memory_resource< Upstream > 的协作图
Collaboration graph
[图例]

公共成员函数

 arena_memory_resource (device_async_resource_ref upstream_mr, std::optional< std::size_t > arena_size=std::nullopt, bool dump_log_on_failure=false)
 构造一个 arena_memory_resource更多...
 
 arena_memory_resource (Upstream *upstream_mr, std::optional< std::size_t > arena_size=std::nullopt, bool dump_log_on_failure=false)
 构造一个 arena_memory_resource更多...
 
 arena_memory_resource (arena_memory_resource const &)=delete
 
arena_memory_resourceoperator= (arena_memory_resource const &)=delete
 
 arena_memory_resource (arena_memory_resource &&) noexcept=delete
 
arena_memory_resourceoperator= (arena_memory_resource &&) noexcept=delete
 
- 继承自 rmm::mr::device_memory_resource 的公共成员函数
 device_memory_resource (device_memory_resource const &)=default
 默认拷贝构造函数。
 
 device_memory_resource (device_memory_resource &&) noexcept=default
 默认移动构造函数。
 
device_memory_resourceoperator= (device_memory_resource const &)=default
 默认拷贝赋值运算符。更多...
 
device_memory_resourceoperator= (device_memory_resource &&) noexcept=default
 默认移动赋值运算符。更多...
 
void * allocate (std::size_t bytes, cuda_stream_view stream=cuda_stream_view{})
 分配至少 bytes 大小的内存。更多...
 
void deallocate (void *ptr, std::size_t bytes, cuda_stream_view stream=cuda_stream_view{})
 释放由 p 指向的内存。更多...
 
bool is_equal (device_memory_resource const &other) const noexcept
 将此资源与另一个资源进行比较。更多...
 
void * allocate (std::size_t bytes, std::size_t alignment)
 分配至少 bytes 大小的内存。更多...
 
void deallocate (void *ptr, std::size_t bytes, std::size_t alignment)
 释放由 p 指向的内存。更多...
 
void * allocate_async (std::size_t bytes, std::size_t alignment, cuda_stream_view stream)
 分配至少 bytes 大小的内存。更多...
 
void * allocate_async (std::size_t bytes, cuda_stream_view stream)
 分配至少 bytes 大小的内存。更多...
 
void deallocate_async (void *ptr, std::size_t bytes, std::size_t alignment, cuda_stream_view stream)
 释放由 p 指向的内存。更多...
 
void deallocate_async (void *ptr, std::size_t bytes, cuda_stream_view stream)
 释放由 p 指向的内存。更多...
 
bool operator== (device_memory_resource const &other) const noexcept
 与另一个 device_memory_resource 进行比较的运算符。更多...
 
bool operator!= (device_memory_resource const &other) const noexcept
 与另一个 device_memory_resource 进行比较的运算符。更多...
 

详细描述

template<typename Upstream>
class rmm::mr::arena_memory_resource< Upstream >

一个子分配器,强调避免碎片和可伸缩的并发支持。

分配 (do_allocate()) 和释放 (do_deallocate()) 是线程安全的。此外,此类别与 CUDA 每线程默认流兼容。

GPU 内存分为全局 arena、默认流的每线程 arena 以及非默认流的每流 arena。每个 arena 从全局 arena 中以称为 superblocks 的块分配内存。

每个 arena 中的块使用地址顺序的首次适应法分配。当块被释放时,如果地址连续,则会与相邻的空闲块合并。空闲的 superblocks 返回到全局 arena。

在实际应用中,分配大小倾向于遵循幂律分布,其中大分配很少见,而小分配相当普遍。通过在每线程 arena 中处理小分配,可以在高并发下实现足够的性能,而不会引入过多的内存碎片。

此设计受到了针对多线程应用的几种现有 CPU 内存分配器(glibc malloc、Hoard、jemalloc、TCMalloc)的启发,尽管形式更简单。未来可能的改进包括使用大小类、分配缓存以及更细粒度的锁定或无锁方法。

另请参阅
Wilson, P. R., Johnstone, M. S., Neely, M., & Boles, D. (1995, September). Dynamic storage allocation: A survey and critical review. In International Workshop on Memory Management (pp. 1-116). Springer, Berlin, Heidelberg.
Berger, E. D., McKinley, K. S., Blumofe, R. D., & Wilson, P. R. (2000). Hoard: A scalable memory allocator for multithreaded applications. ACM Sigplan Notices, 35(11), 117-128.
Evans, J. (2006, April). A scalable concurrent malloc (3) implementation for FreeBSD. In Proc. of the bsdcan conference, ottawa, canada.
https://sourceware.org/glibc/wiki/MallocInternals
http://hoard.org/
http://jemalloc.net/
https://github.com/google/tcmalloc
模板参数
Upstream用于为全局 arena 分配内存的内存资源。实现 rmm::mr::device_memory_resource 接口。

构造函数和析构函数文档

◆ arena_memory_resource() [1/2]

template<typename Upstream >
rmm::mr::arena_memory_resource< Upstream >::arena_memory_resource ( device_async_resource_ref  upstream_mr,
std::optional< std::size_t >  arena_size = std::nullopt,
bool  dump_log_on_failure = false 
)
inlineexplicit

构造一个 arena_memory_resource

参数
upstream_mr用于为全局 arena 分配块的内存资源。
arena_size全局 arena 的大小(字节)。默认为当前设备可用内存的一半。
dump_log_on_failure如果为 true,则在内存不足时转储内存日志。

◆ arena_memory_resource() [2/2]

template<typename Upstream >
rmm::mr::arena_memory_resource< Upstream >::arena_memory_resource ( Upstream *  upstream_mr,
std::optional< std::size_t >  arena_size = std::nullopt,
bool  dump_log_on_failure = false 
)
inlineexplicit

构造一个 arena_memory_resource

异常
rmm::logic_error如果 upstream_mr == nullptr
参数
upstream_mr用于为全局 arena 分配块的内存资源。
arena_size全局 arena 的大小(字节)。默认为当前设备可用内存的一半。
dump_log_on_failure如果为 true,则在内存不足时转储内存日志。

本类的文档生成自以下文件