所有 librmm 设备内存分配的基类。 更多...
#include <device_memory_resource.hpp>
公共成员函数 | |
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 的比较运算符。 更多... | |
友元 | |
void | get_property (device_memory_resource const &, cuda::mr::device_accessible) noexcept |
启用 cuda::mr::device_accessible 属性。 更多... | |
所有 librmm 设备内存分配的基类。
此类作为所有自定义设备内存实现必须满足的接口。
所有派生类必须实现两个私有纯虚函数:do_allocate
和 do_deallocate
。派生类也可以选择覆盖 is_equal
。默认情况下,is_equal
仅执行身份比较。
公共的非虚函数 allocate
、deallocate
和 is_equal
仅调用私有虚函数。这样做的原因是为了允许在基类中实现共享的默认行为。例如,无论使用哪个派生类实现,基类的 allocate
函数都可以记录每次分配。
allocate
和 deallocate
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
,并将它们设置为该设备的每个设备资源。
|
inline |
分配至少 bytes
大小的内存。
返回的指针将至少具有 256 字节的对齐。
如果支持,此操作可以选择在流上执行。否则,该流将被忽略,并使用空流。
rmm::bad_alloc | 当无法在指定的 stream 上分配请求的 bytes 时。 |
bytes | 分配的大小 |
stream | 执行分配的流 |
|
inline |
分配至少 bytes
大小的内存。
返回的指针将至少具有 256 字节的对齐。
rmm::bad_alloc | 当无法在指定的 stream 上分配请求的 bytes 时。 |
bytes | 分配的大小 |
alignment | 分配的预期对齐 |
|
inline |
分配至少 bytes
大小的内存。
返回的指针将至少具有 256 字节的对齐。
rmm::bad_alloc | 当无法在指定的 stream 上分配请求的 bytes 时。 |
bytes | 分配的大小 |
stream | 执行分配的流 |
|
inline |
分配至少 bytes
大小的内存。
返回的指针将至少具有 256 字节的对齐。
rmm::bad_alloc | 当无法在指定的 stream 上分配请求的 bytes 时。 |
bytes | 分配的大小 |
alignment | 分配的预期对齐 |
stream | 执行分配的流 |
|
inline |
释放由 p
指向的内存。
p
必须是由之前对与 *this
相等的 device_memory_resource
调用 allocate(bytes, stream)
返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。
如果支持,此操作可以选择在流上执行。否则,该流将被忽略,并使用空流。
ptr | 要释放的指针 |
bytes | 分配的大小(字节)。这必须等于返回 p 的 allocate 调用中传递的 bytes 的值。 |
stream | 执行释放的流 |
|
inline |
释放由 p
指向的内存。
p
必须是由之前对与 *this
相等的 device_memory_resource
调用 allocate(bytes, stream)
返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。
ptr | 要释放的指针 |
bytes | 分配的大小(字节)。这必须等于返回 p 的 allocate 调用中传递的 bytes 的值。 |
alignment | 传递给返回 p 的 allocate 调用的对齐方式 |
|
inline |
释放由 p
指向的内存。
p
必须是由之前对与 *this
相等的 device_memory_resource
调用 allocate(bytes, stream)
返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。
ptr | 要释放的指针 |
bytes | 分配的大小(字节)。这必须等于返回 p 的 allocate 调用中传递的 bytes 的值。 |
stream | 执行分配的流 |
|
inline |
释放由 p
指向的内存。
p
必须是由之前对与 *this
相等的 device_memory_resource
调用 allocate(bytes, stream)
返回的,并且其指向的存储空间必须尚未释放,否则行为是未定义的。
ptr | 要释放的指针 |
bytes | 分配的大小(字节)。这必须等于返回 p 的 allocate 调用中传递的 bytes 的值。 |
alignment | 传递给返回 p 的 allocate 调用的对齐方式 |
stream | 执行分配的流 |
|
inlinenoexcept |
将此资源与另一个资源进行比较。
当且仅当从一个 device_memory_resource 分配的内存可以从另一个 device_memory_resource 释放,反之亦然,两个 device_memory_resources 才比较相等。
默认情况下,仅检查 *this
和 other
是否指向同一个对象,即不检查它们是否是同一类的两个对象。
other | 用于比较的另一个资源 |
|
inlinenoexcept |
|
defaultnoexcept |
默认移动赋值运算符。
|
default |
默认拷贝赋值运算符。
|
inlinenoexcept |
|
友元 |
启用 cuda::mr::device_accessible
属性。 更多...
此属性声明 device_memory_resource
提供设备可访问的内存