设备内存中的未初始化元素向量。更多...
#include <device_uvector.hpp>
公共类型 | |
using | value_type = T |
T;存储的值类型。 | |
using | size_type = std::size_t |
用于向量大小的类型。 | |
using | reference = value_type & |
value_type&;operator[](size_type) 返回的引用类型 | |
using | const_reference = value_type const & |
using | pointer = value_type * |
data() 返回的指针类型 | |
using | const_pointer = value_type const * |
data() const 返回的指针类型。 | |
using | iterator = pointer |
begin() 返回的迭代器类型 | |
using | const_iterator = const_pointer |
cbegin() 返回的 const 迭代器类型 | |
公共成员函数 | |
device_uvector (device_uvector &&) noexcept=default | |
默认移动构造函数。 | |
device_uvector & | operator= (device_uvector &&) noexcept=default |
默认移动赋值运算符。更多... | |
device_uvector (device_uvector const &)=delete | |
拷贝构造函数被删除,因为它不允许流参数。 | |
device_uvector & | operator= (device_uvector const &)=delete |
拷贝赋值运算符被删除,因为它不允许流参数。 | |
device_uvector ()=delete | |
默认构造函数被删除,因为它不允许流参数。 | |
device_uvector (std::size_t size, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref()) | |
构造一个新的 device_uvector ,为 size 个元素分配足够的未初始化存储。 更多... | |
device_uvector (device_uvector const &other, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref()) | |
通过深度拷贝另一个 device_uvector 的内容来构造一个新的 device_uvector。 更多... | |
pointer | element_ptr (std::size_t element_index) noexcept |
返回指向指定元素的指针。更多... | |
const_pointer | element_ptr (std::size_t element_index) const noexcept |
返回指向指定元素的指针。更多... | |
void | set_element_async (std::size_t element_index, value_type const &value, cuda_stream_view stream) |
将 v 异步拷贝到设备内存中的指定元素。更多... | |
void | set_element_async (std::size_t, value_type const &&, cuda_stream_view)=delete |
void | set_element_to_zero_async (std::size_t element_index, cuda_stream_view stream) |
在设备内存中异步将指定元素设置为零。更多... | |
void | set_element (std::size_t element_index, T const &value, cuda_stream_view stream) |
将 v 同步拷贝到设备内存中的指定元素。更多... | |
value_type | element (std::size_t element_index, cuda_stream_view stream) const |
从设备内存中返回指定元素。更多... | |
value_type | front_element (cuda_stream_view stream) const |
返回第一个元素。更多... | |
value_type | back_element (cuda_stream_view stream) const |
返回最后一个元素。更多... | |
void | reserve (std::size_t new_capacity, cuda_stream_view stream) |
将向量的容量增加到 new_capacity 个元素。更多... | |
void | resize (std::size_t new_size, cuda_stream_view stream) |
将向量大小调整为包含 new_size 个元素。更多... | |
void | shrink_to_fit (cuda_stream_view stream) |
强制释放未使用的设备内存。更多... | |
device_buffer | release () noexcept |
释放设备内存存储的所有权。更多... | |
std::size_t | capacity () const noexcept |
返回当前分配的存储中可以容纳的元素数量。更多... | |
pointer | data () noexcept |
返回指向底层设备存储的指针。更多... | |
const_pointer | data () const noexcept |
返回指向底层设备存储的 const 指针。更多... | |
iterator | begin () noexcept |
返回指向第一个元素的迭代器。更多... | |
const_iterator | cbegin () const noexcept |
返回指向第一个元素的 const 迭代器。更多... | |
const_iterator | begin () const noexcept |
返回指向第一个元素的 const 迭代器。更多... | |
iterator | end () noexcept |
返回指向向量最后一个元素后一个元素的迭代器。更多... | |
const_iterator | cend () const noexcept |
返回指向向量最后一个元素后一个元素的 const 迭代器。更多... | |
const_iterator | end () const noexcept |
返回指向向量最后一个元素后一个元素的迭代器。更多... | |
std::size_t | size () const noexcept |
向量中的元素数量。更多... | |
std::int64_t | ssize () const noexcept |
向量中的带符号元素数量。更多... | |
bool | is_empty () const noexcept |
如果向量不包含元素,则为 true,即 size() == 0 更多... | |
rmm::device_async_resource_ref | memory_resource () const noexcept |
用于分配和释放设备存储的资源。更多... | |
cuda_stream_view | stream () const noexcept |
最近指定用于分配/释放的流。更多... | |
void | set_stream (cuda_stream_view stream) noexcept |
设置用于释放的流。更多... | |
设备内存中的未初始化元素向量。
类似于 thrust::device_vector
,device_uvector
是一个存储在设备内存中连续排列的元素的随机访问容器。然而,与 thrust::device_vector
不同,device_uvector
*不*默认初始化向量元素。
如果需要初始化,调用者必须显式地完成,例如使用 thrust::uninitialized_fill
。
示例
避免默认初始化可以提高性能,因为它消除了默认初始化元素所需的内核启动。这种初始化通常是不必要的,例如,当创建向量用于存放某个操作的输出时。
然而,这限制了元素类型 T
只能是可平凡拷贝类型。简而言之,可平凡拷贝类型可以使用 memcpy
安全地拷贝。更多信息,请参阅 https://cppreference.cn/w/cpp/types/is_trivially_copyable。
与 thrust::device_vector
的另一个主要区别在于,所有调用分配、内核或 memcpys 的操作都接受一个 CUDA 流参数,以指示操作将在哪个流上执行。
T | 可平凡拷贝元素类型 |
using rmm::device_uvector< T >::const_reference = value_type const& |
value_type const&;operator[](size_type) const 返回的常量引用类型
|
inlineexplicit |
构造一个新的 device_uvector
,为 size
个元素分配足够的未初始化存储。
元素是未初始化的。在初始化之前读取元素会导致未定义行为。
size | 要分配存储空间的元素数量 |
stream | 执行分配操作的流 |
mr | 用于分配设备存储的资源 |
|
inlineexplicit |
通过深度拷贝另一个 device_uvector
的内容来构造一个新的 device_uvector。
元素的拷贝方式类似于 memcpy
,即 T
的拷贝构造函数不会被调用。
other | 要从中拷贝的向量 |
stream | 执行拷贝操作的流 |
mr | 用于为新向量分配设备内存的资源 |
|
inline |
返回最后一个元素。
stream
。rmm::out_of_range | 如果向量为空,则抛出异常。 |
stream | 执行拷贝操作的流 |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
返回当前分配的存储中可以容纳的元素数量。
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
返回指向底层设备存储的 const 指针。
size() == 0
,对返回的指针解引用是未定义行为。此外,返回的指针可能等于也可能不等于 nullptr
。
|
inlinenoexcept |
|
inline |
从设备内存中返回指定元素。
stream
。rmm::out_of_range | 如果 element_index >= size() ,则抛出异常 |
element_index | 所需元素的索引 |
stream | 执行拷贝操作的流 |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inlinenoexcept |
|
inline |
返回第一个元素。
stream
。rmm::out_of_range | 如果向量为空,则抛出异常。 |
stream | 执行拷贝操作的流 |
|
inlinenoexcept |
|
inlinenoexcept |
用于分配和释放设备存储的资源。
|
defaultnoexcept |
默认移动赋值运算符。
|
inlinenoexcept |
释放设备内存存储的所有权。
device_buffer
|
inline |
将向量的容量增加到 new_capacity
个元素。
如果 new_capacity <= capacity()
,则不执行任何操作。
如果 new_capacity > capacity()
,则创建一个新的大小为 new_capacity
的分配,并将当前分配的前 size()
个元素拷贝到新分配中,就像使用 memcpy 一样。最后,旧的分配被释放,并被新的分配替换。
new_capacity | 所需的容量(元素数量) |
stream | 执行分配/拷贝操作的流(如果需要) |
|
inline |
将向量大小调整为包含 new_size
个元素。
如果 new_size > size()
,则附加的元素是未初始化的。
如果 new_size < capacity()
,则除了更新 size()
的值外,不执行任何操作。不分配也不拷贝内存。可以使用 shrink_to_fit()
强制释放未使用的内存。
如果 new_size > capacity()
,则元素会像使用 memcpy 一样被拷贝到一个新的分配中。
size() <= capacity()
的不变量成立。
new_size | 所需的元素数量 |
stream | 执行分配/拷贝操作的流(如果需要) |
|
inline |
将 v
同步拷贝到设备内存中的指定元素。
因为此函数会同步流 s
,所以在函数返回后销毁或修改 v
引用的对象是安全的。
stream
。示例
rmm::out_of_range | 如果 element_index >= size() ,则抛出异常 |
element_index | 目标元素的索引 |
value | 要拷贝到指定元素的值 |
stream | 执行拷贝操作的流 |
|
inline |
将 v
异步拷贝到设备内存中的指定元素。
对于基本类型的此特化版本已优化为在 host_value
为零时使用 cudaMemsetAsync
。
此函数在返回前不会同步流 s
。因此,在流同步之前,不应销毁或修改 v
引用的对象。否则,行为是未定义的。
v
调用此函数,以防止实现在字面量或其他隐式临时对象被删除或超出作用域后对其进行异步拷贝。示例
rmm::out_of_range | 如果 element_index >= size() ,则抛出异常 |
element_index | 目标元素的索引 |
value | 要拷贝到指定元素的值 |
stream | 执行拷贝操作的流 |
|
inline |
在设备内存中异步将指定元素设置为零。
此函数在返回前不会同步流 s
示例
rmm::out_of_range | 如果 element_index >= size() ,则抛出异常 |
element_index | 目标元素的索引 |
stream | 执行拷贝操作的流 |
|
inlinenoexcept |
设置用于释放的流。
如果在此调用之后没有使用不同的流参数调用其他分配内存的 rmm::device_uvector 方法,则 stream
将在 rmm::device_uvector
析构函数中用于释放。但是,如果在此之后调用了 resize()
或 shrink_to_fit()
,则后来的流参数将被存储并在析构函数中使用。
stream | 用于释放的流 |
|
inline |
|
inlinenoexcept |
向量中的元素数量。
|
inlinenoexcept |
向量中的带符号元素数量。
|
inlinenoexcept |
最近指定用于分配/释放的流。