公共成员函数 | 友元 | 所有成员列表
rmm::mr::device_memory_resource 类参考抽象

所有 librmm 设备内存分配的基类。 更多...

#include <device_memory_resource.hpp>

rmm::mr::device_memory_resource 的继承图
Inheritance graph
[图例]

公共成员函数

 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 的比较运算符。 更多...
 

友元

void get_property (device_memory_resource const &, cuda::mr::device_accessible) noexcept
 启用 cuda::mr::device_accessible 属性。 更多...
 

详细描述

所有 librmm 设备内存分配的基类。

此类作为所有自定义设备内存实现必须满足的接口。

所有派生类必须实现两个私有纯虚函数:do_allocatedo_deallocate。派生类也可以选择覆盖 is_equal。默认情况下,is_equal 仅执行身份比较。

公共的非虚函数 allocatedeallocateis_equal 仅调用私有虚函数。这样做的原因是为了允许在基类中实现共享的默认行为。例如,无论使用哪个派生类实现,基类的 allocate 函数都可以记录每次分配。

allocatedeallocate API 及实现提供流有序的内存分配。这允许进行优化,例如在同一流上重复使用已释放的内存,而无需流同步的开销。

调用 allocate(bytes, stream_a)(在任何派生类上)返回一个指针,该指针在 stream_a 上有效。在不同的流(例如 stream_b)上使用内存是未定义行为,除非先同步这两个流,例如通过使用 cudaStreamSynchronize(stream_a) 或在 stream_a 上记录一个 CUDA 事件然后调用 cudaStreamWaitEvent(stream_b, event)

指定给 deallocate() 的流应该是一个可以在其上立即使用已释放内存进行另一次分配的有效流。通常,这是在调用 deallocate() 之前 *最后* 使用分配的流。传入的流可以由 device_memory_resource 内部使用,以便以最小的同步管理可用内存,并且也可以稍后同步,例如使用 cudaStreamSynchronize() 调用。

因此,销毁传递给 deallocate() 的 CUDA 流是未定义行为。如果在调用 deallocate() 之前,最后使用分配的流已被销毁,或者已知该流将被销毁,则最好同步该流(在销毁之前),然后将不同的流传递给 deallocate()(例如默认流)。

device_memory_resource 只能在创建 device_memory_resource 时处于活动状态的 CUDA 设备仍然处于活动状态时使用。否则行为是未定义的。

为每个设备创建 device_memory_resource 需要小心地在创建每个资源之前设置当前设备,并维护资源的生命周期,只要它们被设置为每个设备的资源。这里是一个示例循环,它为每个设备创建指向 pool_memory_resource 对象的 unique_ptr,并将它们设置为该设备的每个设备资源。

std::vector<unique_ptr<pool_mr>> per_device_pools;
for(int i = 0; i < N; ++i) {
cudaSetDevice(i);
// 注意:为简洁起见,省略了 upstream 的创建和 initial_size 的计算
per_device_pools.push_back(std::make_unique<pool_mr>(upstream, initial_size));
set_per_device_resource(cuda_device_id{i}, &per_device_pools.back());
}
一个使用从上游 memory_reso 分配的内存池的合并最佳匹配子分配器...
定义: pool_memory_resource.hpp:105
device_memory_resource * set_per_device_resource(cuda_device_id device_id, device_memory_resource *new_mr)
设置指定设备的 device_memory_resource。
定义: per_device_resource.hpp:248

成员函数文档

◆ allocate() [1/2]

void* rmm::mr::device_memory_resource::allocate ( std::size_t  bytes,
cuda_stream_view  stream = cuda_stream_view{} 
)
inline

分配至少 bytes 大小的内存。

返回的指针将至少具有 256 字节的对齐。

如果支持,此操作可以选择在流上执行。否则,该流将被忽略,并使用空流。

异常
rmm::bad_alloc当无法在指定的 stream 上分配请求的 bytes 时。
参数
bytes分配的大小
stream执行分配的流
返回值
void* 指向新分配内存的指针

◆ allocate() [2/2]

void* rmm::mr::device_memory_resource::allocate ( std::size_t  bytes,
std::size_t  alignment 
)
inline

分配至少 bytes 大小的内存。

返回的指针将至少具有 256 字节的对齐。

异常
rmm::bad_alloc当无法在指定的 stream 上分配请求的 bytes 时。
参数
bytes分配的大小
alignment分配的预期对齐
返回值
void* 指向新分配内存的指针

◆ allocate_async() [1/2]

void* rmm::mr::device_memory_resource::allocate_async ( std::size_t  bytes,
cuda_stream_view  stream 
)
inline

分配至少 bytes 大小的内存。

返回的指针将至少具有 256 字节的对齐。

异常
rmm::bad_alloc当无法在指定的 stream 上分配请求的 bytes 时。
参数
bytes分配的大小
stream执行分配的流
返回值
void* 指向新分配内存的指针

◆ allocate_async() [2/2]

void* rmm::mr::device_memory_resource::allocate_async ( std::size_t  bytes,
std::size_t  alignment,
cuda_stream_view  stream 
)
inline

分配至少 bytes 大小的内存。

返回的指针将至少具有 256 字节的对齐。

异常
rmm::bad_alloc当无法在指定的 stream 上分配请求的 bytes 时。
参数
bytes分配的大小
alignment分配的预期对齐
stream执行分配的流
返回值
void* 指向新分配内存的指针

◆ deallocate() [1/2]

void rmm::mr::device_memory_resource::deallocate ( void *  ptr,
std::size_t  bytes,
cuda_stream_view  stream = cuda_stream_view{} 
)
inline

释放由 p 指向的内存。

p 必须是由之前对与 *this 相等的 device_memory_resource 调用 allocate(bytes, stream) 返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。

如果支持,此操作可以选择在流上执行。否则,该流将被忽略,并使用空流。

参数
ptr要释放的指针
bytes分配的大小(字节)。这必须等于返回 pallocate 调用中传递的 bytes 的值。
stream执行释放的流

◆ deallocate() [2/2]

void rmm::mr::device_memory_resource::deallocate ( void *  ptr,
std::size_t  bytes,
std::size_t  alignment 
)
inline

释放由 p 指向的内存。

p 必须是由之前对与 *this 相等的 device_memory_resource 调用 allocate(bytes, stream) 返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。

参数
ptr要释放的指针
bytes分配的大小(字节)。这必须等于返回 pallocate 调用中传递的 bytes 的值。
alignment传递给返回 pallocate 调用的对齐方式

◆ deallocate_async() [1/2]

void rmm::mr::device_memory_resource::deallocate_async ( void *  ptr,
std::size_t  bytes,
cuda_stream_view  stream 
)
inline

释放由 p 指向的内存。

p 必须是由之前对与 *this 相等的 device_memory_resource 调用 allocate(bytes, stream) 返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。

参数
ptr要释放的指针
bytes分配的大小(字节)。这必须等于返回 pallocate 调用中传递的 bytes 的值。
stream执行分配的流

◆ deallocate_async() [2/2]

void rmm::mr::device_memory_resource::deallocate_async ( void *  ptr,
std::size_t  bytes,
std::size_t  alignment,
cuda_stream_view  stream 
)
inline

释放由 p 指向的内存。

p 必须是由之前对与 *this 相等的 device_memory_resource 调用 allocate(bytes, stream) 返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。

参数
ptr要释放的指针
bytes分配的大小(字节)。这必须等于返回 pallocate 调用中传递的 bytes 的值。
alignment传递给返回 pallocate 调用的对齐方式
stream执行分配的流

◆ is_equal()

bool rmm::mr::device_memory_resource::is_equal ( device_memory_resource const &  other) const
inlinenoexcept

将此资源与另一个资源进行比较。

当且仅当从一个 device_memory_resource 分配的内存可以从另一个 device_memory_resource 释放,反之亦然,两个 device_memory_resources 才比较相等。

默认情况下,仅检查 *thisother 是否指向同一个对象,即不检查它们是否是同一类的两个对象。

参数
other用于比较的另一个资源
返回值
如果两个资源相等

◆ operator!=()

bool rmm::mr::device_memory_resource::operator!= ( device_memory_resource const &  other) const
inlinenoexcept

与另一个 device_memory_resource 的比较运算符。

参数
other用于比较的另一个资源
返回值
false 如果两个资源相等
true 如果两个资源不相等

◆ operator=() [1/2]

device_memory_resource& rmm::mr::device_memory_resource::operator= ( device_memory_resource &&  )
defaultnoexcept

默认移动赋值运算符。

返回值
device_memory_resource& 对被赋值对象的引用

◆ operator=() [2/2]

device_memory_resource& rmm::mr::device_memory_resource::operator= ( device_memory_resource const &  )
default

默认拷贝赋值运算符。

返回值
device_memory_resource& 对被赋值对象的引用

◆ operator==()

bool rmm::mr::device_memory_resource::operator== ( device_memory_resource const &  other) const
inlinenoexcept

与另一个 device_memory_resource 的比较运算符。

参数
other用于比较的另一个资源
返回值
true 如果两个资源相等
false 如果两个资源不相等

友元和相关函数文档

◆ get_property

void get_property ( device_memory_resource const &  ,
cuda::mr::device_accessible   
)
友元

启用 cuda::mr::device_accessible 属性。 更多...

此属性声明 device_memory_resource 提供设备可访问的内存


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