thrust_allocator_adaptor.hpp
Go to the documentation of this file.
1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2019-2025, NVIDIA CORPORATION.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #pragma once
7 
8 #include <rmm/cuda_device.hpp>
9 #include <rmm/detail/cuda_memory_resource.hpp>
10 #include <rmm/detail/export.hpp>
11 #include <rmm/detail/thrust_namespace.h>
13 #include <rmm/resource_ref.hpp>
14 
15 #include <thrust/device_malloc_allocator.h>
16 #include <thrust/device_ptr.h>
17 #include <thrust/memory.h>
18 
19 namespace RMM_NAMESPACE {
20 namespace mr {
39 template <typename T>
40 class thrust_allocator : public thrust::device_malloc_allocator<T> {
41  public:
42  using Base = thrust::device_malloc_allocator<T>;
43  using pointer = typename Base::pointer;
44  using size_type = typename Base::size_type;
45 
52  template <typename U>
53  struct rebind {
55  };
56 
61  thrust_allocator() = default;
62 
69  explicit thrust_allocator(cuda_stream_view stream) : _stream{stream} {}
70 
79  : _stream{stream}, _mr(mr)
80  {
81  }
82 
88  template <typename U>
90  : _mr(other.resource()), _stream{other.stream()}, _device{other._device}
91  {
92  }
93 
101  {
102  cuda_set_device_raii dev{_device};
103  return thrust::device_pointer_cast(static_cast<T*>(_mr.allocate(_stream, num * sizeof(T))));
104  }
105 
113  void deallocate(pointer ptr, size_type num) noexcept
114  {
115  cuda_set_device_raii dev{_device};
116  return _mr.deallocate(_stream, thrust::raw_pointer_cast(ptr), num * sizeof(T));
117  }
118 
123  {
124  return _mr;
125  }
126 
130  [[nodiscard]] cuda_stream_view stream() const noexcept { return _stream; }
131 
137  friend void get_property(thrust_allocator const&, cuda::mr::device_accessible) noexcept {}
138 
139  private:
140  cuda_stream_view _stream{};
142  cuda_device_id _device{get_current_cuda_device()};
143 }; // end of group
145 } // namespace mr
146 } // namespace RMM_NAMESPACE
Strongly-typed non-owning wrapper for CUDA streams with default constructor.
Definition: cuda_stream_view.hpp:28
An allocator compatible with Thrust containers and algorithms using a device_async_resource_ref for m...
Definition: thrust_allocator_adaptor.hpp:40
thrust_allocator(cuda_stream_view stream, rmm::device_async_resource_ref mr)
Constructs a thrust_allocator using a device memory resource and stream.
Definition: thrust_allocator_adaptor.hpp:78
typename Base::pointer pointer
The pointer type.
Definition: thrust_allocator_adaptor.hpp:43
thrust_allocator(thrust_allocator< U > const &other)
Copy constructor. Copies the resource pointer and stream.
Definition: thrust_allocator_adaptor.hpp:89
void deallocate(pointer ptr, size_type num) noexcept
Deallocates objects of type T
Definition: thrust_allocator_adaptor.hpp:113
pointer allocate(size_type num)
Allocate objects of type T
Definition: thrust_allocator_adaptor.hpp:100
cuda_stream_view stream() const noexcept
The stream used by this allocator.
Definition: thrust_allocator_adaptor.hpp:130
rmm::device_async_resource_ref get_upstream_resource() const noexcept
rmm::device_async_resource_ref to the upstream resource
Definition: thrust_allocator_adaptor.hpp:122
thrust_allocator()=default
Default constructor creates an allocator using the default memory resource and default stream.
typename Base::size_type size_type
The size type.
Definition: thrust_allocator_adaptor.hpp:44
thrust::device_malloc_allocator< T > Base
The base type of this allocator.
Definition: thrust_allocator_adaptor.hpp:42
friend void get_property(thrust_allocator const &, cuda::mr::device_accessible) noexcept
Enables the cuda::mr::device_accessible property.
Definition: thrust_allocator_adaptor.hpp:137
thrust_allocator(cuda_stream_view stream)
Constructs a thrust_allocator using the default device memory resource and specified stream.
Definition: thrust_allocator_adaptor.hpp:69
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:400
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.
RAII class that sets the current CUDA device to the specified device on construction and restores the...
Definition: cuda_device.hpp:115
Provides the type of a thrust_allocator instantiated with another type.
Definition: thrust_allocator_adaptor.hpp:53