20 #include <rmm/detail/error.hpp>
21 #include <rmm/detail/exec_check_disable.hpp>
22 #include <rmm/detail/export.hpp>
28 #include <type_traits>
31 namespace RMM_NAMESPACE {
77 static_assert(std::is_trivially_copyable_v<T>,
78 "device_uvector 仅支持可平凡复制的类型。");
91 RMM_EXEC_CHECK_DISABLE
94 RMM_EXEC_CHECK_DISABLE
97 RMM_EXEC_CHECK_DISABLE
130 : _storage{elements_to_bytes(size), stream, mr}
146 : _storage{other._storage, stream, mr}
160 assert(element_index < size() &&
"尝试访问越界元素。");
161 return data() + element_index;
174 assert(element_index < size() &&
"尝试访问越界元素。");
175 return data() + element_index;
221 if constexpr (std::is_same_v<value_type, bool>) {
223 cudaMemsetAsync(element_ptr(element_index), value,
sizeof(value), stream.
value()));
227 if constexpr (std::is_fundamental_v<value_type>) {
229 set_element_to_zero_async(element_index, stream);
234 RMM_CUDA_TRY(cudaMemcpyAsync(
235 element_ptr(element_index), &value,
sizeof(value), cudaMemcpyDefault, stream.
value()));
241 void set_element_async(std::size_t, value_type
const&&,
cuda_stream_view) =
delete;
269 cudaMemsetAsync(element_ptr(element_index), 0,
sizeof(
value_type), stream.
value()));
303 set_element_async(element_index, value, stream);
324 RMM_CUDA_TRY(cudaMemcpyAsync(
325 &value, element_ptr(element_index),
sizeof(value), cudaMemcpyDefault, stream.
value()));
343 return element(0, stream);
359 return element(size() - 1, stream);
376 _storage.reserve(elements_to_bytes(new_capacity), stream);
397 _storage.resize(elements_to_bytes(new_size), stream);
422 [[nodiscard]] std::size_t
capacity() const noexcept
424 return bytes_to_elements(_storage.capacity());
510 [[nodiscard]] std::size_t
size() const noexcept {
return bytes_to_elements(_storage.size()); }
515 [[nodiscard]] std::int64_t
ssize() const noexcept
517 assert(size() <
static_cast<std::size_t
>(std::numeric_limits<int64_t>::max()) &&
519 return static_cast<int64_t
>(size());
525 [[nodiscard]]
bool is_empty() const noexcept {
return size() == 0; }
533 return _storage.memory_resource();
539 [[nodiscard]]
cuda_stream_view stream() const noexcept {
return _storage.stream(); }
552 void set_stream(
cuda_stream_view stream) noexcept { _storage.set_stream(stream); }
557 [[nodiscard]] std::size_t constexpr elements_to_bytes(std::size_t num_elements)
const noexcept
559 return num_elements *
sizeof(value_type);
562 [[nodiscard]] std::size_t constexpr bytes_to_elements(std::size_t num_bytes)
const noexcept
564 return num_bytes /
sizeof(value_type);
用于 CUDA stream 的强类型非拥有包装器,带默认构造函数。
定义: cuda_stream_view.hpp:39
constexpr cudaStream_t value() const noexcept
获取包装的 stream。
定义: cuda_stream_view.hpp:73
void synchronize() const
同步所查看的 CUDA stream。
定义: cuda_stream_view.hpp:106
void synchronize_no_throw() const noexcept
同步所查看的 CUDA stream。如果发生错误,不会抛出异常。
定义: cuda_stream_view.hpp:113
用于设备内存分配的 RAII 结构。
定义: device_buffer.hpp:82
设备内存中元素的未初始化向量。
定义: device_uvector.hpp:76
const_iterator cend() const noexcept
返回指向向量最后一个元素后一个元素的 const_iterator。
定义: device_uvector.hpp:495
std::size_t capacity() const noexcept
返回当前已分配存储中可容纳的元素数量。
定义: device_uvector.hpp:422
void resize(std::size_t new_size, cuda_stream_view stream)
将向量大小调整为包含 new_size 个元素。
定义: device_uvector.hpp:395
value_type * pointer
由 data() 返回的指针类型
定义: device_uvector.hpp:86
const_pointer element_ptr(std::size_t element_index) const noexcept
返回指向指定元素的指针。
定义: device_uvector.hpp:172
bool is_empty() const noexcept
如果向量不包含元素(即 size() == 0),则为 true
定义: device_uvector.hpp:525
const_pointer data() const noexcept
返回指向底层设备存储的 const 指针。
定义: device_uvector.hpp:445
std::size_t size() const noexcept
向量中的元素数量。
定义: device_uvector.hpp:510
pointer data() noexcept
返回指向底层设备存储的指针。
定义: device_uvector.hpp:435
void shrink_to_fit(cuda_stream_view stream)
强制解除分配未使用的设备内存。
定义: device_uvector.hpp:407
iterator end() noexcept
返回指向向量最后一个元素后一个元素的 iterator。
定义: device_uvector.hpp:485
std::size_t size_type
用于向量大小的类型。
定义: device_uvector.hpp:82
pointer element_ptr(std::size_t element_index) noexcept
返回指向指定元素的指针。
定义: device_uvector.hpp:158
std::int64_t ssize() const noexcept
向量中元素的带符号数量。
定义: device_uvector.hpp:515
T value_type
T;存储值的类型。
定义: device_uvector.hpp:81
const_iterator cbegin() const noexcept
返回指向第一个元素的 const_iterator。
定义: device_uvector.hpp:466
value_type back_element(cuda_stream_view stream) const
返回最后一个元素。
定义: device_uvector.hpp:357
void set_element_to_zero_async(std::size_t element_index, cuda_stream_view stream)
异步将设备内存中的指定元素设置为零。
定义: device_uvector.hpp:264
const_pointer const_iterator
由 cbegin() 返回的 const iterator 类型
定义: device_uvector.hpp:89
device_buffer release() noexcept
释放设备内存存储的所有权。
定义: device_uvector.hpp:414
void set_element_async(std::size_t element_index, value_type const &value, cuda_stream_view stream)
将 v 异步复制到设备内存中的指定元素。
定义: device_uvector.hpp:214
device_uvector(device_uvector &&) noexcept=default
默认移动构造函数。
pointer iterator
由 begin() 返回的 iterator 类型
定义: device_uvector.hpp:88
value_type & reference
value_type&;由 operator[](size_type) 返回的引用类型
定义: device_uvector.hpp:83
const_iterator end() const noexcept
返回指向向量最后一个元素后一个元素的 iterator。
定义: device_uvector.hpp:505
void reserve(std::size_t new_capacity, cuda_stream_view stream)
将向量的容量增加到 new_capacity 个元素。
定义: device_uvector.hpp:374
value_type element(std::size_t element_index, cuda_stream_view stream) const
从设备内存中返回指定的元素。
定义: device_uvector.hpp:319
value_type front_element(cuda_stream_view stream) const
返回第一个元素。
定义: device_uvector.hpp:341
value_type const * const_pointer
由 data() const 返回的指针类型。
定义: device_uvector.hpp:87
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。
定义: device_uvector.hpp:143
value_type const & const_reference
定义: device_uvector.hpp:85
void set_element(std::size_t element_index, T const &value, cuda_stream_view stream)
将 v 同步复制到设备内存中的指定元素。
定义: device_uvector.hpp:301
const_iterator begin() const noexcept
返回指向第一个元素的 const_iterator。
定义: device_uvector.hpp:475
iterator begin() noexcept
返回指向第一个元素的 iterator。
定义: device_uvector.hpp:457
尝试访问定义范围之外时抛出的异常。
定义: error.hpp:110
cuda::mr::async_resource_ref< cuda::mr::device_accessible > device_async_resource_ref
具有 cuda::mr::device_accessible 属性的 cuda::mr::async_resource_ref 的别名。
定义: resource_ref.hpp:40
device_async_resource_ref get_current_device_resource_ref()
获取当前设备的 device_async_resource_ref。
定义: per_device_resource.hpp:411
管理每个设备的 device_memory_resources。