公共成员函数 | 所有成员列表
rmm::device_buffer 类参考

用于设备内存分配的 RAII(资源获取即初始化)构造。更多...

#include <device_buffer.hpp>

公共成员函数

 device_buffer (device_buffer const &other)=delete
 
device_bufferoperator= (device_buffer const &other)=delete
 
 device_buffer ()
 默认构造函数创建一个空的 device_buffer
 
 device_buffer (std::size_t size, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
 构造一个大小为 size 字节、未初始化的新设备缓冲区。更多...
 
 device_buffer (void const *source_data, std::size_t size, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
 通过从现有主机或设备内存分配的原始指针复制来构造新的设备缓冲区。更多...
 
 device_buffer (device_buffer const &other, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
 通过深拷贝另一个 device_buffer 的内容来构造一个新的 device_buffer,可选择使用指定的流和内存资源。更多...
 
 device_buffer (device_buffer &&other) noexcept
 通过将另一个 device_buffer 的内容移动到新构造的缓冲区来构造一个新的 device_buffer更多...
 
device_bufferoperator= (device_buffer &&other) noexcept
 移动赋值运算符从 other 移动内容。更多...
 
 ~device_buffer () noexcept
 销毁设备缓冲区对象。更多...
 
void reserve (std::size_t new_capacity, cuda_stream_view stream)
 增加设备内存分配的容量。更多...
 
void resize (std::size_t new_size, cuda_stream_view stream)
 调整设备内存分配的大小。更多...
 
void shrink_to_fit (cuda_stream_view stream)
 强制释放未使用的内存。更多...
 
void const * data () const noexcept
 指向设备内存分配的常量指针。更多...
 
void * data () noexcept
 指向设备内存分配的指针。更多...
 
std::size_t size () const noexcept
 字节数。更多...
 
std::int64_t ssize () const noexcept
 带符号的字节数。更多...
 
bool is_empty () const noexcept
 缓冲区当前是否包含任何数据。更多...
 
std::size_t capacity () const noexcept
 返回设备内存分配的实际大小(字节)。更多...
 
cuda_stream_view stream () const noexcept
 最近为分配/释放指定的流。更多...
 
void set_stream (cuda_stream_view stream) noexcept
 设置用于释放的流。更多...
 
rmm::device_async_resource_ref memory_resource () const noexcept
 用于分配和释放的资源。更多...
 

详细描述

用于设备内存分配的 RAII(资源获取即初始化)构造。

此类使用 device_async_resource_ref 分配无类型且 未初始化 的设备内存。如果未明确指定,则使用 get_current_device_resource_ref() 返回的内存资源。

注意
std::vectorthrust::device_vector 不同,device_buffer 分配的设备内存是未初始化的。因此,在首次初始化之前读取 data() 的内容是未定义行为。

示例

//使用默认内存
//资源和默认流分配至少100字节的设备内存。
device_buffer buff(100);
//使用自定义内存资源和
//指定流分配至少100字节
custom_memory_resource mr;
cuda_stream_view stream = cuda_stream_view{};
device_buffer custom_buff(100, stream, &mr);
//使用指定流将 `buff` 深拷贝到一个新的设备缓冲区
device_buffer buff_copy(buff, stream);
//将 `from_buff` 中的内存移动到 `to_buff`。释放先前分配的
//在 `to_buff.stream()` 上的 `to_buff` 内存。
device_buffer to_buff(std::move(from_buff));
//使用指定流将 `buff` 深拷贝到一个新的设备缓冲区
device_buffer buff_copy(buff, stream);
//浅拷贝 `buff` 到一个新的 device_buffer,`buff` 现在为空
device_buffer buff_move(std::move(buff));
//默认构造。缓冲区为空
device_buffer buff_default{};
//如果请求的大小大于当前大小,则将分配调整为新大小并
//深拷贝先前的内容。否则,仅将 `size()` 的值更新为
//新请求的大小,不进行任何分配或拷贝。使用指定流。
buff_default.resize(100, stream);
cuda_stream_view stream() const noexcept
最近为分配/释放指定的流。
定义: device_buffer.hpp:392
device_buffer()
默认构造函数创建一个空的 device_buffer
定义: device_buffer.hpp:95

构造函数和析构函数文档

◆ device_buffer() [1/4]

rmm::device_buffer::device_buffer ( std::size_t  size,
cuda_stream_view  stream,
device_async_resource_ref  mr = mr::get_current_device_resource_ref() 
)
inlineexplicit

构造一个大小为 size 字节、未初始化的新设备缓冲区。

异常
rmm::bad_alloc如果分配失败。
参数
size在设备内存中分配的大小(字节)。
stream如果内存资源支持流,则内存可以在其上分配的 CUDA 流。
mr用于设备内存分配的内存资源。

◆ device_buffer() [2/4]

rmm::device_buffer::device_buffer ( void const *  source_data,
std::size_t  size,
cuda_stream_view  stream,
device_async_resource_ref  mr = mr::get_current_device_resource_ref() 
)
inline

通过从现有主机或设备内存分配的原始指针复制来构造新的设备缓冲区。

注意
此函数不同步 streamsource_datastream 上复制,因此调用者负责正确的同步,以确保复制发生时 source_data 有效。这包括在此函数调用后按流顺序销毁 source_data,或者在此函数返回后根据需要同步或等待 stream
异常
rmm::bad_alloc如果创建新的分配失败。
rmm::logic_error如果 source_data 为 null,且 size != 0
rmm::cuda_error如果从设备内存复制失败。
参数
source_data指向要复制的主机或设备内存的指针。
size要复制的大小(字节)。
stream如果内存资源支持流,则内存可以在其上分配的 CUDA 流。
mr用于设备内存分配的内存资源

◆ device_buffer() [3/4]

rmm::device_buffer::device_buffer ( device_buffer const &  other,
cuda_stream_view  stream,
device_async_resource_ref  mr = mr::get_current_device_resource_ref() 
)
inline

通过深拷贝另一个 device_buffer 的内容来构造一个新的 device_buffer,可选择使用指定的流和内存资源。

注意
仅从 other 复制 other.size() 字节,即如果 other.size() != other.capacity(),则新构造的 device_buffer 的大小和容量将等于 other.size()
此函数不同步 streamotherstream 上复制,因此调用者负责正确的同步,以确保复制发生时 other 有效。这包括在此函数调用后按流顺序销毁 other,或者在此函数返回后根据需要同步或等待 stream
异常
rmm::bad_alloc如果创建新的分配失败。
rmm::cuda_error如果从 other 复制失败。
参数
other其内容将被复制的 device_buffer
stream用于分配和复制的流
mr用于分配新 device_buffer 的资源

◆ device_buffer() [4/4]

rmm::device_buffer::device_buffer ( device_buffer &&  other)
inlinenoexcept

通过将另一个 device_buffer 的内容移动到新构造的缓冲区来构造一个新的 device_buffer

新的 device_buffer 构造后,other 被修改为一个有效的空 device_buffer,即 data() 返回 nullptr,并且 size()capacity() 为零。

参数
other其内容将被移动到新构造的缓冲区中的 device_buffer

◆ ~device_buffer()

rmm::device_buffer::~device_buffer ( )
inlinenoexcept

销毁设备缓冲区对象。

注意
如果内存资源支持流,则此析构函数使用最近传递给此设备缓冲区任何方法的流进行释放。

成员函数文档

◆ capacity()

std::size_t rmm::device_buffer::capacity ( ) const
inlinenoexcept

返回设备内存分配的实际大小(字节)。

不变量 size() <= capacity() 成立。

返回值
设备内存分配的实际大小(字节)

◆ data() [1/2]

void const* rmm::device_buffer::data ( ) const
inlinenoexcept

指向设备内存分配的常量指针。

返回值
指向设备内存分配的常量指针

◆ data() [2/2]

void* rmm::device_buffer::data ( )
inlinenoexcept

指向设备内存分配的指针。

返回值
指向设备内存分配的指针

◆ is_empty()

bool rmm::device_buffer::is_empty ( ) const
inlinenoexcept

缓冲区当前是否包含任何数据。

返回值
缓冲区当前是否包含任何数据

如果 is_empty() == true,即使 capacity() > 0device_buffer 可能仍然持有一个分配。

◆ memory_resource()

rmm::device_async_resource_ref rmm::device_buffer::memory_resource ( ) const
inlinenoexcept

用于分配和释放的资源。

返回值
用于分配和释放的资源

◆ operator=()

device_buffer& rmm::device_buffer::operator= ( device_buffer &&  other)
inlinenoexcept

移动赋值运算符从 other 移动内容。

device_buffer 当前的设备内存分配将在 stream() 上释放。

如果需要不同的流,请在赋值前对此实例调用 set_stream()。赋值后,此实例的流将替换为 other.stream()

参数
other其内容将被移动的 device_buffer
返回值
对此 device_buffer 的引用

◆ reserve()

void rmm::device_buffer::reserve ( std::size_t  new_capacity,
cuda_stream_view  stream 
)
inline

增加设备内存分配的容量。

如果请求的 new_capacity 小于或等于 capacity(),则不执行任何操作。

如果 new_capacity 大于 capacity(),则在 stream 上进行新的分配以满足 new_capacity,并将旧分配的内容在 stream 上复制到新的分配。然后释放旧的分配。从 [size(), new_capacity) 的字节是未初始化的。

异常
rmm::bad_alloc如果创建新的分配失败
rmm::cuda_error如果从旧分配复制到新分配失败
参数
new_capacity请求的新容量(字节)
stream用于分配和复制的流

◆ resize()

void rmm::device_buffer::resize ( std::size_t  new_size,
cuda_stream_view  stream 
)
inline

调整设备内存分配的大小。

如果请求的 new_size 小于或等于 capacity(),则除了更新 size() 返回的值外,不执行任何操作。具体而言,不分配也不复制内存。capacity() 的值仍为设备内存分配的实际大小。

注意
可以使用 shrink_to_fit() 强制释放未使用的 capacity()

如果 new_size 大于 capacity(),则在 stream 上进行新的分配以满足 new_size,并将旧分配的内容在 stream 上复制到新的分配。然后释放旧的分配。从 [old_size, new_size) 的字节是未初始化的。

不变量 size() <= capacity() 成立。

异常
rmm::bad_alloc如果创建新的分配失败
rmm::cuda_error如果从旧分配复制到新分配失败
参数
new_size请求的新大小(字节)
stream用于分配和复制的流

◆ set_stream()

void rmm::device_buffer::set_stream ( cuda_stream_view  stream)
inlinenoexcept

设置用于释放的流。

如果在此调用后没有使用不同流参数调用其他分配内存的 rmm::device_buffer 方法,则 stream 将用于 rmm::device_uvector 析构函数中的释放。但是,如果在此之后调用了 resize()shrink_to_fit(),则后面的流参数将被存储并在析构函数中使用。

参数
stream用于释放的流

◆ shrink_to_fit()

void rmm::device_buffer::shrink_to_fit ( cuda_stream_view  stream)
inline

强制释放未使用的内存。

在流 stream 上重新分配和复制设备内存分配的内容,以将 capacity() 减小到 size()

如果 size() == capacity(),则不发生任何分配或复制。

异常
rmm::bad_alloc如果创建新的分配失败
rmm::cuda_error如果从旧分配复制到新分配失败
参数
stream执行分配和复制的流

◆ size()

std::size_t rmm::device_buffer::size ( ) const
inlinenoexcept

字节数。

返回值
字节数

◆ ssize()

std::int64_t rmm::device_buffer::ssize ( ) const
inlinenoexcept

带符号的字节数。

返回值
带符号的字节数

◆ stream()

cuda_stream_view rmm::device_buffer::stream ( ) const
inlinenoexcept

最近为分配/释放指定的流。

返回值
最近为分配/释放指定的流

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