13 #include <cuda_runtime.h>
18 #include <rapidsmpf/cuda_event.hpp>
19 #include <rapidsmpf/error.hpp>
20 #include <rapidsmpf/memory/host_buffer.hpp>
21 #include <rapidsmpf/memory/memory_type.hpp>
22 #include <rapidsmpf/statistics.hpp>
23 #include <rapidsmpf/utils/misc.hpp>
85 [[nodiscard]] std::byte
const*
data()
const;
128 template <
typename F>
130 -> std::invoke_result_t<F, std::byte*, rmm::cuda_stream_view> {
131 using Fn = std::remove_reference_t<F>;
133 std::is_invocable_v<Fn, std::byte*, rmm::cuda_stream_view>,
134 "write_access() expects callable R(std::byte*, rmm::cuda_stream_view)"
136 using R = std::invoke_result_t<Fn, std::byte*, rmm::cuda_stream_view>;
138 auto* ptr =
const_cast<std::byte*
>(
data());
139 if constexpr (std::is_void_v<R>) {
140 std::invoke(std::forward<F>(f), ptr, stream_);
141 latest_write_event_.
record(stream_);
143 auto ret = std::invoke(std::forward<F>(f), ptr, stream_);
144 latest_write_event_.
record(stream_);
214 return latest_write_event_;
309 std::unique_ptr<HostBuffer> host_buffer,
343 void throw_if_locked()
const;
370 std::variant<DeviceBufferT, HostBufferT> storage_;
373 std::atomic<bool> lock_;
393 std::shared_ptr<Statistics> statistics,
397 std::ptrdiff_t dst_offset = 0,
398 std::ptrdiff_t src_offset = 0
Class managing buffer resources.
Buffer representing device or host memory.
auto write_access(F &&f) -> std::invoke_result_t< F, std::byte *, rmm::cuda_stream_view >
Provides stream-ordered write access to the buffer.
static constexpr std::array< MemoryType, 1 > device_buffer_types
Memory types suitable for constructing a device backed buffer.
CudaEvent const & latest_write_event() const noexcept
Get the CUDA event that tracks the latest write into the buffer.
std::byte * exclusive_data_access()
Acquire non-stream-ordered exclusive access to the buffer's memory.
void rebind_stream(rmm::cuda_stream_view new_stream)
Rebind the buffer to a new CUDA stream.
std::unique_ptr< rmm::device_buffer > DeviceBufferT
Storage type for a device buffer.
bool is_latest_write_done() const
Check whether the buffer's most recent write has completed.
std::byte const * data() const
Access the underlying memory buffer (host or device memory).
std::size_t const size
The size of the buffer in bytes.
static constexpr std::array< MemoryType, 2 > host_buffer_types
Memory types suitable for constructing a host backed buffer.
Buffer(Buffer &&)=delete
Delete move and copy constructors and assignment operators.
std::unique_ptr< HostBuffer > HostBufferT
Storage type for a host buffer.
constexpr rmm::cuda_stream_view stream() const noexcept
Get the associated CUDA stream.
void unlock()
Release the exclusive lock acquired by exclusive_data_access().
constexpr MemoryType mem_type() const
Get the memory type of the buffer.
RAII wrapper for a CUDA event with convenience methods.
void record(rmm::cuda_stream_view stream)
Record the event on a CUDA stream.
RAPIDS Multi-Processor interfaces.
MemoryType
Enum representing the type of memory sorted in decreasing order of preference.
@ PINNED_HOST
Pinned host memory.
void buffer_copy(std::shared_ptr< Statistics > statistics, Buffer &dst, Buffer const &src, std::size_t size, std::ptrdiff_t dst_offset=0, std::ptrdiff_t src_offset=0)
Asynchronously copy data between buffers.