20 #include <rmm/detail/error.hpp>
24 #include <cuda_runtime_api.h>
31 #include <cuda/memory_resource>
85 using async_resource_ref = cuda::mr::async_resource_ref<cuda::mr::device_accessible>;
115 : _stream{
stream}, _mr{mr}
118 allocate_async(
size);
144 : _stream{
stream}, _mr{mr}
147 allocate_async(
size);
148 copy_async(source_data,
size);
191 : _data{other._data},
193 _capacity{other._capacity},
196 _device{other._device}
198 other._data =
nullptr;
202 other._device = cuda_device_id{-1};
221 if (&other !=
this) {
227 _capacity = other._capacity;
230 _device = other._device;
232 other._data =
nullptr;
279 auto const old_size =
size();
280 RMM_CUDA_TRY(cudaMemcpyAsync(tmp.data(),
data(),
size(), cudaMemcpyDefault,
stream.
value()));
281 *
this = std::move(tmp);
321 RMM_CUDA_TRY(cudaMemcpyAsync(tmp.data(),
data(),
size(), cudaMemcpyDefault,
stream.
value()));
322 *
this = std::move(tmp);
348 std::swap(tmp, *
this);
355 [[nodiscard]]
void const*
data() const noexcept {
return _data; }
360 void*
data() noexcept {
return _data; }
365 [[nodiscard]] std::size_t
size() const noexcept {
return _size; }
370 [[nodiscard]] std::int64_t
ssize() const noexcept
372 assert(
size() <
static_cast<std::size_t
>(std::numeric_limits<int64_t>::max()) &&
373 "Size overflows signed integer");
374 return static_cast<int64_t
>(
size());
392 [[nodiscard]] std::size_t
capacity() const noexcept {
return _capacity; }
418 void* _data{
nullptr};
420 std::size_t _capacity{};
421 cuda_stream_view _stream{};
423 async_resource_ref _mr{
437 void allocate_async(std::size_t bytes)
441 _data = (bytes > 0) ? _mr.allocate_async(bytes,
stream()) :
nullptr;
453 void deallocate_async() noexcept
473 void copy_async(
void const* source, std::size_t bytes)
476 RMM_EXPECTS(
nullptr != source,
"Invalid copy from nullptr.");
477 RMM_EXPECTS(
nullptr != _data,
"Invalid copy to nullptr.");
479 RMM_CUDA_TRY(cudaMemcpyAsync(_data, source, bytes, cudaMemcpyDefault,
stream().value()));
Strongly-typed non-owning wrapper for CUDA streams with default constructor.
Definition: cuda_stream_view.hpp:41
constexpr cudaStream_t value() const noexcept
Get the wrapped stream.
Definition: cuda_stream_view.hpp:75
RAII construct for device memory allocation.
Definition: device_buffer.hpp:84
cuda_stream_view stream() const noexcept
The stream most recently specified for allocation/deallocation.
Definition: device_buffer.hpp:397
void resize(std::size_t new_size, cuda_stream_view stream)
Resize the device memory allocation.
Definition: device_buffer.hpp:311
device_buffer(std::size_t size, cuda_stream_view stream, async_resource_ref mr=mr::get_current_device_resource())
Constructs a new device buffer of size uninitialized bytes.
Definition: device_buffer.hpp:112
async_resource_ref memory_resource() const noexcept
The async_resource_ref used to allocate and deallocate.
Definition: device_buffer.hpp:415
device_buffer(device_buffer const &other, cuda_stream_view stream, async_resource_ref mr=rmm::mr::get_current_device_resource())
Construct a new device_buffer by deep copying the contents of another device_buffer,...
Definition: device_buffer.hpp:172
void * data() noexcept
Pointer to the device memory allocation.
Definition: device_buffer.hpp:360
~device_buffer() noexcept
Destroy the device buffer object.
Definition: device_buffer.hpp:248
device_buffer & operator=(device_buffer &&other) noexcept
Move assignment operator moves the contents from other.
Definition: device_buffer.hpp:219
device_buffer()
Default constructor creates an empty device_buffer
Definition: device_buffer.hpp:100
std::size_t capacity() const noexcept
Returns actual size in bytes of device memory allocation.
Definition: device_buffer.hpp:392
void const * data() const noexcept
Const pointer to the device memory allocation.
Definition: device_buffer.hpp:355
void reserve(std::size_t new_capacity, cuda_stream_view stream)
Increase the capacity of the device memory allocation.
Definition: device_buffer.hpp:273
void set_stream(cuda_stream_view stream) noexcept
Sets the stream to be used for deallocation.
Definition: device_buffer.hpp:410
std::size_t size() const noexcept
The number of bytes.
Definition: device_buffer.hpp:365
device_buffer(device_buffer &&other) noexcept
Constructs a new device_buffer by moving the contents of another device_buffer into the newly constru...
Definition: device_buffer.hpp:190
device_buffer(void const *source_data, std::size_t size, cuda_stream_view stream, async_resource_ref mr=rmm::mr::get_current_device_resource())
Construct a new device buffer by copying from a raw pointer to an existing host or device memory allo...
Definition: device_buffer.hpp:140
void shrink_to_fit(cuda_stream_view stream)
Forces the deallocation of unused memory.
Definition: device_buffer.hpp:339
std::int64_t ssize() const noexcept
The signed number of bytes.
Definition: device_buffer.hpp:370
bool is_empty() const noexcept
Whether or not the buffer currently holds any data.
Definition: device_buffer.hpp:383
cuda_device_id get_current_cuda_device()
Returns a cuda_device_id for the current device.
Definition: cuda_device.hpp:86
device_memory_resource * get_current_device_resource()
Get the memory resource for the current device.
Definition: per_device_resource.hpp:207
Management of per-device device_memory_resources.
Strong type for a CUDA device identifier.
Definition: cuda_device.hpp:33
RAII class that sets the current CUDA device to the specified device on construction and restores the...
Definition: cuda_device.hpp:109