9 #include <rmm/detail/error.hpp>
10 #include <rmm/detail/exec_check_disable.hpp>
11 #include <rmm/detail/export.hpp>
16 #include <cuda/std/iterator>
17 #include <cuda/std/span>
20 #include <type_traits>
23 namespace RMM_NAMESPACE {
69 static_assert(std::is_trivially_copyable_v<T>,
70 "device_uvector only supports types that are trivially copyable.");
83 cuda::std::reverse_iterator<iterator>;
85 cuda::std::reverse_iterator<const_iterator>;
88 RMM_EXEC_CHECK_DISABLE
91 RMM_EXEC_CHECK_DISABLE
94 RMM_EXEC_CHECK_DISABLE
127 : _storage{elements_to_bytes(size), stream, mr}
143 : _storage{other._storage, stream, mr}
157 assert(element_index < size());
158 return data() + element_index;
171 assert(element_index < size());
172 return data() + element_index;
211 element_index < size(),
"Attempt to access out of bounds element.",
rmm::out_of_range);
212 RMM_CUDA_TRY(cudaMemcpyAsync(
213 element_ptr(element_index), &value,
sizeof(value), cudaMemcpyDefault, stream.
value()));
218 void set_element_async(size_type, value_type
const&&,
cuda_stream_view) =
delete;
245 element_index < size(),
"Attempt to access out of bounds element.",
rmm::out_of_range);
247 cudaMemsetAsync(element_ptr(element_index), 0,
sizeof(
value_type), stream.
value()));
281 set_element_async(element_index, value, stream);
300 element_index < size(),
"Attempt to access out of bounds element.",
rmm::out_of_range);
302 RMM_CUDA_TRY(cudaMemcpyAsync(
303 &value, element_ptr(element_index),
sizeof(value), cudaMemcpyDefault, stream.
value()));
321 return element(0, stream);
337 return element(size() - 1, stream);
354 _storage.reserve(elements_to_bytes(new_capacity), stream);
375 _storage.resize(elements_to_bytes(new_size), stream);
402 return bytes_to_elements(_storage.capacity());
552 [[nodiscard]]
size_type size() const noexcept {
return bytes_to_elements(_storage.size()); }
557 [[nodiscard]] std::int64_t
ssize() const noexcept
559 assert(size() <
static_cast<size_type>(std::numeric_limits<int64_t>::max()) &&
560 "Size overflows signed integer");
561 return static_cast<int64_t
>(size());
567 [[nodiscard]]
bool is_empty() const noexcept {
return size() == 0; }
572 [[nodiscard]]
operator cuda::std::span<T const>() const noexcept
574 return cuda::std::span<T const>(data(), size());
580 [[nodiscard]]
operator cuda::std::span<T>() noexcept
582 return cuda::std::span<T>(data(), size());
591 return _storage.memory_resource();
597 [[nodiscard]]
cuda_stream_view stream() const noexcept {
return _storage.stream(); }
610 void set_stream(
cuda_stream_view stream) noexcept { _storage.set_stream(stream); }
615 [[nodiscard]] size_type constexpr elements_to_bytes(size_type num_elements)
const noexcept
617 return num_elements *
sizeof(value_type);
620 [[nodiscard]] size_type constexpr bytes_to_elements(size_type num_bytes)
const noexcept
622 return num_bytes /
sizeof(value_type);
Strongly-typed non-owning wrapper for CUDA streams with default constructor.
Definition: cuda_stream_view.hpp:28
void synchronize() const
Synchronize the viewed CUDA stream.
void synchronize_no_throw() const noexcept
Synchronize the viewed CUDA stream. Does not throw if there is an error.
cudaStream_t value() const noexcept
Get the wrapped stream.
RAII construct for device memory allocation.
Definition: device_buffer.hpp:71
An uninitialized vector of elements in device memory.
Definition: device_uvector.hpp:68
reverse_iterator rend() noexcept
Returns reverse_iterator to the element preceding the first element of the vector.
Definition: device_uvector.hpp:523
const_iterator cend() const noexcept
Returns a const_iterator to the element following the last element of the vector.
Definition: device_uvector.hpp:473
const_reverse_iterator crend() const noexcept
Returns a const_reverse_iterator to the element preceding the first element of the vector.
Definition: device_uvector.hpp:534
value_type * pointer
The type of the pointer returned by data()
Definition: device_uvector.hpp:78
cuda::std::reverse_iterator< iterator > reverse_iterator
The type of the iterator returned by rbegin()
Definition: device_uvector.hpp:83
void set_element_async(size_type element_index, value_type const &value, cuda_stream_view stream)
Performs an asynchronous copy of v to the specified element in device memory.
Definition: device_uvector.hpp:208
bool is_empty() const noexcept
true if the vector contains no elements, i.e. size() == 0
Definition: device_uvector.hpp:567
size_type size() const noexcept
The number of elements in the vector.
Definition: device_uvector.hpp:552
const_pointer data() const noexcept
Returns const pointer to underlying device storage.
Definition: device_uvector.hpp:423
void resize(size_type new_size, cuda_stream_view stream)
Resizes the vector to contain new_size elements.
Definition: device_uvector.hpp:373
void set_element(size_type element_index, T const &value, cuda_stream_view stream)
Performs a synchronous copy of v to the specified element in device memory.
Definition: device_uvector.hpp:279
reverse_iterator rbegin() noexcept
Returns a reverse_iterator to the last element.
Definition: device_uvector.hpp:492
pointer data() noexcept
Returns pointer to underlying device storage.
Definition: device_uvector.hpp:413
void shrink_to_fit(cuda_stream_view stream)
Forces deallocation of unused device memory.
Definition: device_uvector.hpp:385
iterator end() noexcept
Returns an iterator to the element following the last element of the vector.
Definition: device_uvector.hpp:463
std::size_t size_type
The type used for the size of the vector.
Definition: device_uvector.hpp:74
const_reverse_iterator crbegin() const noexcept
Returns a const_reverse_iterator to the last element.
Definition: device_uvector.hpp:501
size_type capacity() const noexcept
Returns the number of elements that can be held in currently allocated storage.
Definition: device_uvector.hpp:400
std::int64_t ssize() const noexcept
The signed number of elements in the vector.
Definition: device_uvector.hpp:557
T value_type
Stored value type.
Definition: device_uvector.hpp:73
const_iterator cbegin() const noexcept
Returns a const_iterator to the first element.
Definition: device_uvector.hpp:444
value_type back_element(cuda_stream_view stream) const
Returns the last element.
Definition: device_uvector.hpp:335
const_pointer const_iterator
The type of the const iterator returned by cbegin()
Definition: device_uvector.hpp:81
device_buffer release() noexcept
Release ownership of device memory storage.
Definition: device_uvector.hpp:392
void set_element_to_zero_async(size_type element_index, cuda_stream_view stream)
Asynchronously sets the specified element to zero in device memory.
Definition: device_uvector.hpp:242
device_uvector(device_uvector &&) noexcept=default
Default move constructor.
pointer iterator
The type of the iterator returned by begin()
Definition: device_uvector.hpp:80
void reserve(size_type new_capacity, cuda_stream_view stream)
Increases the capacity of the vector to new_capacity elements.
Definition: device_uvector.hpp:352
value_type & reference
Reference type returned by operator[](size_type)
Definition: device_uvector.hpp:75
const_reverse_iterator rend() const noexcept
Returns const_reverse_iterator to the element preceding the first element of the vector.
Definition: device_uvector.hpp:547
const_iterator end() const noexcept
Returns an iterator to the element following the last element of the vector.
Definition: device_uvector.hpp:483
pointer element_ptr(size_type element_index) noexcept
Returns pointer to the specified element.
Definition: device_uvector.hpp:155
value_type front_element(cuda_stream_view stream) const
Returns the first element.
Definition: device_uvector.hpp:319
value_type const * const_pointer
The type of the pointer returned by data() const.
Definition: device_uvector.hpp:79
device_uvector(device_uvector const &other, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
Construct a new device_uvector by deep copying the contents of another device_uvector.
Definition: device_uvector.hpp:140
value_type const & const_reference
Constant reference type returned by operator[](size_type) const.
Definition: device_uvector.hpp:77
const_reverse_iterator rbegin() const noexcept
Returns a const_reverse_iterator to the last element.
Definition: device_uvector.hpp:513
value_type element(size_type element_index, cuda_stream_view stream) const
Returns the specified element from device memory.
Definition: device_uvector.hpp:297
const_pointer element_ptr(size_type element_index) const noexcept
Returns pointer to the specified element.
Definition: device_uvector.hpp:169
cuda::std::reverse_iterator< const_iterator > const_reverse_iterator
Definition: device_uvector.hpp:86
const_iterator begin() const noexcept
Returns a const_iterator to the first element.
Definition: device_uvector.hpp:453
iterator begin() noexcept
Returns an iterator to the first element.
Definition: device_uvector.hpp:435
Exception thrown when attempting to access outside of a defined range.
Definition: error.hpp:99
device_async_resource_ref get_current_device_resource_ref()
Get the device_async_resource_ref for the current device.
Definition: per_device_resource.hpp:406
detail::cccl_async_resource_ref< cuda::mr::resource_ref< cuda::mr::device_accessible > > device_async_resource_ref
Alias for a cuda::mr::async_resource_ref with the property cuda::mr::device_accessible.
Definition: resource_ref.hpp:32
Management of per-device device_memory_resources.