公共类型 | 公共成员函数 | 所有成员列表
rmm::device_uvector< T > 类模板参考

设备内存中的未初始化元素向量。更多...

#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_uvectoroperator= (device_uvector &&) noexcept=default
 默认移动赋值运算符。更多...
 
 device_uvector (device_uvector const &)=delete
 拷贝构造函数被删除,因为它不允许流参数。
 
device_uvectoroperator= (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
 设置用于释放的流。更多...
 

详细描述

template<typename T>
class rmm::device_uvector< T >

设备内存中的未初始化元素向量。

类似于 thrust::device_vectordevice_uvector 是一个存储在设备内存中连续排列的元素的随机访问容器。然而,与 thrust::device_vector 不同,device_uvector *不*默认初始化向量元素。

如果需要初始化,调用者必须显式地完成,例如使用 thrust::uninitialized_fill

示例

auto mr = new my_custom_resource();
// 在流 `s` 上使用提供的资源 `mr` 为 100 个 int 分配足够的 *未初始化* 设备内存
// supplied resource `mr`
rmm::device_uvector<int> uv(100, s, mr);
// 在流 `s` 上将所有元素初始化为 0
thrust::uninitialized_fill(thrust::cuda::par.on(s), uv.begin(), uv.end(), 0);
用于 CUDA 流的强类型非拥有包装器,带有默认构造函数。
定义: cuda_stream_view.hpp:39
设备内存中的未初始化元素向量。
定义: device_uvector.hpp:76

避免默认初始化可以提高性能,因为它消除了默认初始化元素所需的内核启动。这种初始化通常是不必要的,例如,当创建向量用于存放某个操作的输出时。

然而,这限制了元素类型 T 只能是可平凡拷贝类型。简而言之,可平凡拷贝类型可以使用 memcpy 安全地拷贝。更多信息,请参阅 https://cppreference.cn/w/cpp/types/is_trivially_copyable

thrust::device_vector 的另一个主要区别在于,所有调用分配、内核或 memcpys 的操作都接受一个 CUDA 流参数,以指示操作将在哪个流上执行。

模板参数
T可平凡拷贝元素类型

成员 Typedef 文档

◆ const_reference

template<typename T >
using rmm::device_uvector< T >::const_reference = value_type const&

value_type const&;operator[](size_type) const 返回的常量引用类型

构造函数与析构函数文档

◆ device_uvector() [1/2]

template<typename T >
rmm::device_uvector< T >::device_uvector ( std::size_t  size,
cuda_stream_view  stream,
device_async_resource_ref  mr = mr::get_current_device_resource_ref() 
)
inlineexplicit

构造一个新的 device_uvector,为 size 个元素分配足够的未初始化存储。

元素是未初始化的。在初始化之前读取元素会导致未定义行为。

参数
size要分配存储空间的元素数量
stream执行分配操作的流
mr用于分配设备存储的资源

◆ device_uvector() [2/2]

template<typename T >
rmm::device_uvector< T >::device_uvector ( device_uvector< T > const &  other,
cuda_stream_view  stream,
device_async_resource_ref  mr = mr::get_current_device_resource_ref() 
)
inlineexplicit

通过深度拷贝另一个 device_uvector 的内容来构造一个新的 device_uvector

元素的拷贝方式类似于 memcpy,即 T 的拷贝构造函数不会被调用。

参数
other要从中拷贝的向量
stream执行拷贝操作的流
mr用于为新向量分配设备内存的资源

成员函数文档

◆ back_element()

template<typename T >
value_type rmm::device_uvector< T >::back_element ( cuda_stream_view  stream) const
inline

返回最后一个元素。

注意
此函数会产生一次设备到主机的 memcpy 操作,应谨慎使用。
此函数会同步 stream
异常
rmm::out_of_range如果向量为空,则抛出异常。
参数
stream执行拷贝操作的流
返回值
最后一个元素的值

◆ begin() [1/2]

template<typename T >
const_iterator rmm::device_uvector< T >::begin ( ) const
inlinenoexcept

返回指向第一个元素的 const 迭代器。

如果向量为空,则 begin() == end()

返回值
指向第一个元素的不可变迭代器。

◆ begin() [2/2]

template<typename T >
iterator rmm::device_uvector< T >::begin ( )
inlinenoexcept

返回指向第一个元素的迭代器。

如果向量为空,则 begin() == end()

返回值
指向第一个元素的迭代器。

◆ capacity()

template<typename T >
std::size_t rmm::device_uvector< T >::capacity ( ) const
inlinenoexcept

返回当前分配的存储中可以容纳的元素数量。

返回值
std::size_t 无需重新分配即可存储的元素数量。

◆ cbegin()

template<typename T >
const_iterator rmm::device_uvector< T >::cbegin ( ) const
inlinenoexcept

返回指向第一个元素的 const 迭代器。

如果向量为空,则 cbegin() == cend()

返回值
指向第一个元素的不可变迭代器。

◆ cend()

template<typename T >
const_iterator rmm::device_uvector< T >::cend ( ) const
inlinenoexcept

返回指向向量最后一个元素后一个元素的 const 迭代器。

end() 引用的元素是一个占位符,对其解引用会导致未定义行为。

返回值
指向最后一个元素后一个元素的不可变迭代器。

◆ data() [1/2]

template<typename T >
const_pointer rmm::device_uvector< T >::data ( ) const
inlinenoexcept

返回指向底层设备存储的 const 指针。

注意
如果 size() == 0,对返回的指针解引用是未定义行为。此外,返回的指针可能等于也可能不等于 nullptr
返回值
const_pointer 指向设备内存中元素存储的原始 const 指针。

◆ data() [2/2]

template<typename T >
pointer rmm::device_uvector< T >::data ( )
inlinenoexcept

返回指向底层设备存储的指针。

注意
如果 size() == 0,对返回的指针解引用是未定义行为。此外,返回的指针可能等于也可能不等于 nullptr
返回值
指向设备内存中元素存储的原始指针。

◆ element()

template<typename T >
value_type rmm::device_uvector< T >::element ( std::size_t  element_index,
cuda_stream_view  stream 
) const
inline

从设备内存中返回指定元素。

注意
此函数会产生一次设备到主机的 memcpy 操作,应谨慎使用。
此函数会同步 stream
异常
rmm::out_of_range如果 element_index >= size(),则抛出异常
参数
element_index所需元素的索引
stream执行拷贝操作的流
返回值
指定元素的值

◆ element_ptr() [1/2]

template<typename T >
const_pointer rmm::device_uvector< T >::element_ptr ( std::size_t  element_index) const
inlinenoexcept

返回指向指定元素的指针。

如果 element_index >= size(),行为是未定义的。

参数
element_index指定元素的索引。
返回值
T* 指向所需元素的指针

◆ element_ptr() [2/2]

template<typename T >
pointer rmm::device_uvector< T >::element_ptr ( std::size_t  element_index)
inlinenoexcept

返回指向指定元素的指针。

如果 element_index >= size(),行为是未定义的。

参数
element_index指定元素的索引。
返回值
T* 指向所需元素的指针

◆ end() [1/2]

template<typename T >
const_iterator rmm::device_uvector< T >::end ( ) const
inlinenoexcept

返回指向向量最后一个元素后一个元素的迭代器。

end() 引用的元素是一个占位符,对其解引用会导致未定义行为。

返回值
指向最后一个元素后一个元素的不可变迭代器。

◆ end() [2/2]

template<typename T >
iterator rmm::device_uvector< T >::end ( )
inlinenoexcept

返回指向向量最后一个元素后一个元素的迭代器。

end() 引用的元素是一个占位符,对其解引用会导致未定义行为。

返回值
指向最后一个元素后一个元素的迭代器。

◆ front_element()

template<typename T >
value_type rmm::device_uvector< T >::front_element ( cuda_stream_view  stream) const
inline

返回第一个元素。

注意
此函数会产生一次设备到主机的 memcpy 操作,应谨慎使用。
此函数会同步 stream
异常
rmm::out_of_range如果向量为空,则抛出异常。
参数
stream执行拷贝操作的流
返回值
第一个元素的值

◆ is_empty()

template<typename T >
bool rmm::device_uvector< T >::is_empty ( ) const
inlinenoexcept

如果向量不包含元素,则为 true,即 size() == 0

返回值
如果向量不包含元素,则为 true,即 size() == 0

◆ memory_resource()

template<typename T >
rmm::device_async_resource_ref rmm::device_uvector< T >::memory_resource ( ) const
inlinenoexcept

用于分配和释放设备存储的资源。

返回值
用于分配和释放设备存储的资源

◆ operator=()

template<typename T >
device_uvector& rmm::device_uvector< T >::operator= ( device_uvector< T > &&  )
defaultnoexcept

默认移动赋值运算符。

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

◆ release()

template<typename T >
device_buffer rmm::device_uvector< T >::release ( )
inlinenoexcept

释放设备内存存储的所有权。

返回值
用于存储向量元素的 device_buffer

◆ reserve()

template<typename T >
void rmm::device_uvector< T >::reserve ( std::size_t  new_capacity,
cuda_stream_view  stream 
)
inline

将向量的容量增加到 new_capacity 个元素。

如果 new_capacity <= capacity(),则不执行任何操作。

如果 new_capacity > capacity(),则创建一个新的大小为 new_capacity 的分配,并将当前分配的前 size() 个元素拷贝到新分配中,就像使用 memcpy 一样。最后,旧的分配被释放,并被新的分配替换。

参数
new_capacity所需的容量(元素数量)
stream执行分配/拷贝操作的流(如果需要)

◆ resize()

template<typename T >
void rmm::device_uvector< T >::resize ( std::size_t  new_size,
cuda_stream_view  stream 
)
inline

将向量大小调整为包含 new_size 个元素。

如果 new_size > size(),则附加的元素是未初始化的。

如果 new_size < capacity(),则除了更新 size() 的值外,不执行任何操作。不分配也不拷贝内存。可以使用 shrink_to_fit() 强制释放未使用的内存。

如果 new_size > capacity(),则元素会像使用 memcpy 一样被拷贝到一个新的分配中。

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

参数
new_size所需的元素数量
stream执行分配/拷贝操作的流(如果需要)

◆ set_element()

template<typename T >
void rmm::device_uvector< T >::set_element ( std::size_t  element_index,
T const &  value,
cuda_stream_view  stream 
)
inline

v 同步拷贝到设备内存中的指定元素。

因为此函数会同步流 s,所以在函数返回后销毁或修改 v 引用的对象是安全的。

注意
此函数会产生一次主机到设备的 memcpy 操作,应谨慎使用。
此函数会同步 stream

示例

int v{42};
// 在 `stream` 上将 42 拷贝到索引 0 的元素并同步流
vec.set_element(0, v, stream);
// 销毁或修改 `v` 是安全的
v = 13;
cuda_stream_view stream() const noexcept
最近指定用于分配/释放的流。
定义: device_uvector.hpp:540
异常
rmm::out_of_range如果 element_index >= size(),则抛出异常
参数
element_index目标元素的索引
value要拷贝到指定元素的值
stream执行拷贝操作的流

◆ set_element_async()

template<typename T >
void rmm::device_uvector< T >::set_element_async ( std::size_t  element_index,
value_type const &  value,
cuda_stream_view  stream 
)
inline

v 异步拷贝到设备内存中的指定元素。

对于基本类型的此特化版本已优化为在 host_value 为零时使用 cudaMemsetAsync

此函数在返回前不会同步流 s。因此,在流同步之前,不应销毁或修改 v 引用的对象。否则,行为是未定义的。

注意
此函数会产生一次主机到设备的 memcpy 操作,应谨慎使用。
不允许使用字面量或其他右值引用作为 v 调用此函数,以防止实现在字面量或其他隐式临时对象被删除或超出作用域后对其进行异步拷贝。

示例

int v{42};
// 在 `stream` 上将 42 拷贝到索引 0 的元素。*不*同步
vec.set_element_async(0, v, stream);
...
cudaStreamSynchronize(stream);
// 在修改 `v` 之前需要同步
v = 13;
异常
rmm::out_of_range如果 element_index >= size(),则抛出异常
参数
element_index目标元素的索引
value要拷贝到指定元素的值
stream执行拷贝操作的流

◆ set_element_to_zero_async()

template<typename T >
void rmm::device_uvector< T >::set_element_to_zero_async ( std::size_t  element_index,
cuda_stream_view  stream 
)
inline

在设备内存中异步将指定元素设置为零。

此函数在返回前不会同步流 s

注意
此函数会产生一次设备 memset 操作,应谨慎使用。

示例

int v{42};
// 在 `stream` 上将索引 42 处的元素设置为 0。*不*同步
vec.set_element_to_zero_async(42, stream);
异常
rmm::out_of_range如果 element_index >= size(),则抛出异常
参数
element_index目标元素的索引
stream执行拷贝操作的流

◆ set_stream()

template<typename T >
void rmm::device_uvector< T >::set_stream ( cuda_stream_view  stream)
inlinenoexcept

设置用于释放的流。

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

参数
stream用于释放的流

◆ shrink_to_fit()

template<typename T >
void rmm::device_uvector< T >::shrink_to_fit ( cuda_stream_view  stream)
inline

强制释放未使用的设备内存。

如果 capacity() > size(),则重新分配并拷贝向量内容以消除未使用的内存。

参数
stream执行分配和拷贝操作的流

◆ size()

template<typename T >
std::size_t rmm::device_uvector< T >::size ( ) const
inlinenoexcept

向量中的元素数量。

返回值
向量中的元素数量

◆ ssize()

template<typename T >
std::int64_t rmm::device_uvector< T >::ssize ( ) const
inlinenoexcept

向量中的带符号元素数量。

返回值
向量中的带符号元素数量

◆ stream()

template<typename T >
cuda_stream_view rmm::device_uvector< T >::stream ( ) const
inlinenoexcept

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

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

此类的文档是根据以下文件生成的