一个合并最佳匹配子分配器,它使用从上游内存资源分配的内存池。 更多...
#include <pool_memory_resource.hpp>
公有成员函数 | |
pool_memory_resource (device_async_resource_ref upstream_mr, std::size_t initial_pool_size, std::optional< std::size_t > maximum_pool_size=std::nullopt) | |
构造一个 pool_memory_resource 并使用 upstream_mr 分配初始设备内存池。 更多... | |
pool_memory_resource (Upstream *upstream_mr, std::size_t initial_pool_size, std::optional< std::size_t > maximum_pool_size=std::nullopt) | |
构造一个 pool_memory_resource 并使用 upstream_mr 分配初始设备内存池。 更多... | |
template<typename Upstream2 = Upstream, cuda::std::enable_if_t< cuda::mr::async_resource< Upstream2 >, int > = 0> | |
pool_memory_resource (Upstream2 &upstream_mr, std::size_t initial_pool_size, std::optional< std::size_t > maximum_pool_size=std::nullopt) | |
构造一个 pool_memory_resource 并使用 upstream_mr 分配初始设备内存池。 更多... | |
~pool_memory_resource () override | |
销毁 pool_memory_resource 并使用上游资源释放它分配的所有内存。 | |
pool_memory_resource (pool_memory_resource const &)=delete | |
pool_memory_resource (pool_memory_resource &&)=delete | |
pool_memory_resource & | operator= (pool_memory_resource const &)=delete |
pool_memory_resource & | operator= (pool_memory_resource &&)=delete |
device_async_resource_ref | get_upstream_resource () const noexcept |
上游资源的 rmm::device_async_resource_ref 引用 更多... | |
std::size_t | pool_size () const noexcept |
计算当前内存池的大小。 更多... | |
保护类型 | |
using | free_list = detail::coalescing_free_list |
空闲列表实现。 | |
using | block_type = free_list::block_type |
空闲列表返回的块类型。 | |
using | lock_guard = std::lock_guard< std::mutex > |
用于同步访问的锁类型。 | |
保护成员函数 | |
std::size_t | get_maximum_allocation_size () const |
获取此内存资源支持的最大分配大小。 更多... | |
block_type | try_to_expand (std::size_t try_size, std::size_t min_size, cuda_stream_view stream) |
尝试通过从上游资源分配至少 min_size 字节的块来扩展内存池。 更多... | |
void | initialize_pool (std::size_t initial_size, std::optional< std::size_t > maximum_size) |
为内存池分配初始内存。 更多... | |
block_type | expand_pool (std::size_t size, free_list &blocks, cuda_stream_view stream) |
从上游资源分配空间以供应子分配池,并返回足够大小的块。 更多... | |
std::size_t | size_to_grow (std::size_t size) const |
给定最小大小,计算扩展内存池的适当大小。 更多... | |
block_type | block_from_upstream (std::size_t size, cuda_stream_view stream) |
从上游资源分配一个块以扩展子分配池。 更多... | |
split_block | allocate_from_block (block_type const &block, std::size_t size) |
如果需要,拆分 block 以返回指向 size 字节内存的指针。 更多... | |
block_type | free_block (void *ptr, std::size_t size) noexcept |
查找、释放并返回与指针 ptr 关联的块。 更多... | |
void | release () |
释放从上游内存资源分配的所有内存。 | |
std::pair< std::size_t, std::size_t > | free_list_summary (free_list const &blocks) |
获取指定空闲列表中的最大可用块大小和总空闲大小。 更多... | |
友元 | |
class | detail::stream_ordered_memory_resource< pool_memory_resource< Upstream >, detail::coalescing_free_list > |
一个合并最佳匹配子分配器,它使用从上游内存资源分配的内存池。
分配(do_allocate())和释放(do_deallocate())是线程安全的。此外,此类与 CUDA 每线程默认流兼容。
UpstreamResource | 用于分配内存池的内存资源。实现 rmm::mr::device_memory_resource 接口。 |
|
inlineexplicit |
构造一个 pool_memory_resource
并使用 upstream_mr
分配初始设备内存池。
rmm::logic_error | 如果 initial_pool_size 未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
rmm::logic_error | 如果 maximum_pool_size 既不是默认值,也未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
upstream_mr | 用于为内存池分配块的内存资源。 |
initial_pool_size | 初始内存池的最小大小(字节)。 |
maximum_pool_size | 内存池可以增长到的最大大小(字节)。默认为上游资源的所有可用内存。 |
|
inlineexplicit |
构造一个 pool_memory_resource
并使用 upstream_mr
分配初始设备内存池。
rmm::logic_error | 如果 upstream_mr == nullptr |
rmm::logic_error | 如果 initial_pool_size 未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
rmm::logic_error | 如果 maximum_pool_size 既不是默认值,也未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
upstream_mr | 用于为内存池分配块的内存资源。 |
initial_pool_size | 初始内存池的最小大小(字节)。 |
maximum_pool_size | 内存池可以增长到的最大大小(字节)。默认为上游资源的所有可用内存。 |
|
inlineexplicit |
构造一个 pool_memory_resource
并使用 upstream_mr
分配初始设备内存池。
rmm::logic_error | 如果 upstream_mr == nullptr |
rmm::logic_error | 如果 initial_pool_size 未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
rmm::logic_error | 如果 maximum_pool_size 既不是默认值,也未对齐到 pool_memory_resource::allocation_alignment 字节的倍数。 |
upstream_mr | 用于为内存池分配块的内存资源。 |
initial_pool_size | 初始内存池的最小大小(字节)。 |
maximum_pool_size | 内存池可以增长到的最大大小(字节)。默认为上游资源的所有可用内存。 |
|
inlineprotected |
如果需要,拆分 block
以返回指向 size
字节内存的指针。
如果块被拆分,剩余部分将返回到内存池。
block | 从中进行分配的块。 |
size | 请求分配的大小(字节)。 |
|
inlineprotected |
从上游资源分配一个块以扩展子分配池。
size | 从上游资源分配的大小(字节) |
stream | 将使用此内存的流。 |
如果 | 调用 allocate_async() 抛出异常 |
|
inlineprotected |
从上游资源分配空间以供应子分配池,并返回足够大小的块。
size | 要分配的最小大小 |
blocks | 空闲列表(在此实现中被忽略) |
stream | 将使用此内存的流。 |
size
字节的块
|
inlineprotectednoexcept |
查找、释放并返回与指针 ptr
关联的块。
ptr | 要释放内存的指针。 |
size | 要释放内存的大小。必须等于原始分配大小。 |
ptr
关联的块。调用者应将此块返回到内存池。
|
inlineprotected |
获取指定空闲列表中的最大可用块大小和总空闲大小。
这仅用于调试
blocks | 要返回摘要信息的空闲列表 |
|
inlineprotected |
获取此内存资源支持的最大分配大小。
注意:这不依赖于设备的内存大小。它只是返回 std::size_t
的最大值。
|
inlinenoexcept |
上游资源的 rmm::device_async_resource_ref 引用
|
inlineprotected |
为内存池分配初始内存。
initial_size | 内存池的可选初始大小 |
maximum_size | 内存池的可选最大大小 |
logic_error | 如果 initial_size 大于 maximum_size (如果已设置)。 |
|
inlinenoexcept |
计算当前内存池的大小。
包括已分配内存和空闲内存。
|
inlineprotected |
给定最小大小,计算扩展内存池的适当大小。
策略是:如果设置了最大内存池大小,则尝试将内存池大小增加配置的最大大小与当前大小之差的一半。如果未设置,则尝试将当前内存池大小加倍。
如果无法满足请求的大小,则返回 0。
size | 立即所需的最小分配大小 |
|
inlineprotected |
尝试通过从上游资源分配至少 min_size
字节的块来扩展内存池。
尝试从上游分配 try_size
字节。如果失败,它会迭代地将尝试分配的大小减半,直到达到 min_size
,成功后返回分配的块。
rmm::out_of_memory | 如果无法从上游分配 min_size 字节或超出最大内存池大小。 |
try_size | 尝试分配的初始请求大小。 |
min_size | 尝试分配的最小请求大小。 |
stream | 将使用此内存的流。 |
min_size
字节的块