device_buffer.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2019-2025, NVIDIA CORPORATION.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 #pragma once
17 
18 #include <rmm/cuda_device.hpp>
19 #include <rmm/cuda_stream_view.hpp>
20 #include <rmm/detail/error.hpp>
21 #include <rmm/detail/export.hpp>
23 #include <rmm/resource_ref.hpp>
24 
25 #include <cuda_runtime_api.h>
26 
27 #include <cassert>
28 #include <cstddef>
29 
30 namespace RMM_NAMESPACE {
82  public:
83  // The copy constructor and copy assignment operator without a stream are deleted because they
84  // provide no way to specify an explicit stream
85  device_buffer(device_buffer const& other) = delete;
86  device_buffer& operator=(device_buffer const& other) = delete;
87 
91  // Note: we cannot use `device_buffer() = default;` because nvcc implicitly adds
92  // `__host__ __device__` specifiers to the defaulted constructor when it is called within the
93  // context of both host and device functions.
95 
106  explicit device_buffer(std::size_t size,
107  cuda_stream_view stream,
109 
129  device_buffer(void const* source_data,
130  std::size_t size,
131  cuda_stream_view stream,
133 
156  cuda_stream_view stream,
158 
170  device_buffer(device_buffer&& other) noexcept;
171 
187 
195  ~device_buffer() noexcept;
196 
219  void reserve(std::size_t new_capacity, cuda_stream_view stream);
220 
250  void resize(std::size_t new_size, cuda_stream_view stream);
251 
269  void shrink_to_fit(cuda_stream_view stream);
270 
274  [[nodiscard]] void const* data() const noexcept { return _data; }
275 
279  void* data() noexcept { return _data; }
280 
284  [[nodiscard]] std::size_t size() const noexcept { return _size; }
285 
289  [[nodiscard]] std::int64_t ssize() const noexcept
290  {
291  assert(size() < static_cast<std::size_t>(std::numeric_limits<int64_t>::max()) &&
292  "Size overflows signed integer");
293  return static_cast<int64_t>(size());
294  }
295 
302  [[nodiscard]] bool is_empty() const noexcept { return 0 == size(); }
303 
311  [[nodiscard]] std::size_t capacity() const noexcept { return _capacity; }
312 
316  [[nodiscard]] cuda_stream_view stream() const noexcept { return _stream; }
317 
329  void set_stream(cuda_stream_view stream) noexcept { _stream = stream; }
330 
334  [[nodiscard]] rmm::device_async_resource_ref memory_resource() const noexcept { return _mr; }
335 
336  private:
337  void* _data{nullptr};
338  std::size_t _size{};
339  std::size_t _capacity{};
340  cuda_stream_view _stream{};
341 
345  cuda_device_id _device{get_current_cuda_device()};
346 
356  void allocate_async(std::size_t bytes);
357 
367  void deallocate_async() noexcept;
368 
381  void copy_async(void const* source, std::size_t bytes);
382 };
383  // end of group
385 } // namespace RMM_NAMESPACE
Strongly-typed non-owning wrapper for CUDA streams with default constructor.
Definition: cuda_stream_view.hpp:39
RAII construct for device memory allocation.
Definition: device_buffer.hpp:81
cuda_stream_view stream() const noexcept
The stream most recently specified for allocation/deallocation.
Definition: device_buffer.hpp:316
void * data() noexcept
Pointer to the device memory allocation.
Definition: device_buffer.hpp:279
~device_buffer() noexcept
Destroy the device buffer object.
device_buffer & operator=(device_buffer &&other) noexcept
Move assignment operator moves the contents from other.
device_buffer()
Default constructor creates an empty device_buffer
std::size_t capacity() const noexcept
Returns actual size in bytes of device memory allocation.
Definition: device_buffer.hpp:311
device_buffer(std::size_t size, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
Constructs a new device buffer of size uninitialized bytes.
void set_stream(cuda_stream_view stream) noexcept
Sets the stream to be used for deallocation.
Definition: device_buffer.hpp:329
std::size_t size() const noexcept
The number of bytes.
Definition: device_buffer.hpp:284
device_buffer(void const *source_data, std::size_t size, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
Construct a new device buffer by copying from a raw pointer to an existing host or device memory allo...
device_buffer(device_buffer &&other) noexcept
Constructs a new device_buffer by moving the contents of another device_buffer into the newly constru...
device_buffer(device_buffer const &other, cuda_stream_view stream, device_async_resource_ref mr=mr::get_current_device_resource_ref())
Construct a new device_buffer by deep copying the contents of another device_buffer,...
std::int64_t ssize() const noexcept
The signed number of bytes.
Definition: device_buffer.hpp:289
bool is_empty() const noexcept
Whether or not the buffer currently holds any data.
Definition: device_buffer.hpp:302
rmm::device_async_resource_ref memory_resource() const noexcept
The resource used to allocate and deallocate.
Definition: device_buffer.hpp:334
cuda_device_id get_current_cuda_device()
Returns a cuda_device_id for the current device.
device_async_resource_ref get_current_device_resource_ref()
Get the device_async_resource_ref for the current device.
Definition: per_device_resource.hpp:411
detail::cccl_async_resource_ref< cuda::mr::async_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:89
Management of per-device device_memory_resources.