一个子分配器,强调避免碎片和可伸缩的并发支持。更多...
#include <arena_memory_resource.hpp>
公共成员函数 | |
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_resource & | operator= (arena_memory_resource const &)=delete |
arena_memory_resource (arena_memory_resource &&) noexcept=delete | |
arena_memory_resource & | operator= (arena_memory_resource &&) noexcept=delete |
![]() | |
device_memory_resource (device_memory_resource const &)=default | |
默认拷贝构造函数。 | |
device_memory_resource (device_memory_resource &&) noexcept=default | |
默认移动构造函数。 | |
device_memory_resource & | operator= (device_memory_resource const &)=default |
默认拷贝赋值运算符。更多... | |
device_memory_resource & | operator= (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 进行比较的运算符。更多... | |
一个子分配器,强调避免碎片和可伸缩的并发支持。
分配 (do_allocate()) 和释放 (do_deallocate()) 是线程安全的。此外,此类别与 CUDA 每线程默认流兼容。
GPU 内存分为全局 arena、默认流的每线程 arena 以及非默认流的每流 arena。每个 arena 从全局 arena 中以称为 superblocks 的块分配内存。
每个 arena 中的块使用地址顺序的首次适应法分配。当块被释放时,如果地址连续,则会与相邻的空闲块合并。空闲的 superblocks 返回到全局 arena。
在实际应用中,分配大小倾向于遵循幂律分布,其中大分配很少见,而小分配相当普遍。通过在每线程 arena 中处理小分配,可以在高并发下实现足够的性能,而不会引入过多的内存碎片。
此设计受到了针对多线程应用的几种现有 CPU 内存分配器(glibc malloc、Hoard、jemalloc、TCMalloc)的启发,尽管形式更简单。未来可能的改进包括使用大小类、分配缓存以及更细粒度的锁定或无锁方法。
Upstream | 用于为全局 arena 分配内存的内存资源。实现 rmm::mr::device_memory_resource 接口。 |
|
inlineexplicit |
构造一个 arena_memory_resource
。
upstream_mr | 用于为全局 arena 分配块的内存资源。 |
arena_size | 全局 arena 的大小(字节)。默认为当前设备可用内存的一半。 |
dump_log_on_failure | 如果为 true,则在内存不足时转储内存日志。 |
|
inlineexplicit |
构造一个 arena_memory_resource
。
rmm::logic_error | 如果 upstream_mr == nullptr 。 |
upstream_mr | 用于为全局 arena 分配块的内存资源。 |
arena_size | 全局 arena 的大小(字节)。默认为当前设备可用内存的一半。 |
dump_log_on_failure | 如果为 true,则在内存不足时转储内存日志。 |