20 #include <rmm/detail/error.hpp>
21 #include <rmm/detail/export.hpp>
28 #include <unordered_map>
30 namespace RMM_NAMESPACE {
56 template <
typename Upstream>
72 std::size_t alignment_threshold = default_alignment_threshold)
73 : upstream_{upstream}, alignment_{alignment}, alignment_threshold_{alignment_threshold}
76 "Allocation alignment is not a power of 2.");
92 std::size_t alignment_threshold = default_alignment_threshold)
94 alignment_{alignment},
95 alignment_threshold_{alignment_threshold}
98 "Allocation alignment is not a power of 2.");
118 static constexpr std::size_t default_alignment_threshold = 0;
121 using lock_guard = std::lock_guard<std::mutex>
138 return get_upstream_resource().allocate_async(bytes, 1, stream);
140 auto const size = upstream_allocation_size(bytes);
141 void* pointer = get_upstream_resource().allocate_async(size, 1, stream);
143 auto const address =
reinterpret_cast<std::size_t
>(pointer);
144 auto const aligned_address =
rmm::align_up(address, alignment_);
146 void* aligned_pointer =
reinterpret_cast<void*
>(aligned_address);
147 if (pointer != aligned_pointer) {
148 lock_guard lock(mtx_);
149 pointers_.emplace(aligned_pointer, pointer);
151 return aligned_pointer;
161 void do_deallocate(
void* ptr, std::size_t bytes,
cuda_stream_view stream)
override
164 get_upstream_resource().deallocate_async(ptr, bytes, 1, stream);
167 lock_guard lock(mtx_);
168 auto const iter = pointers_.find(ptr);
169 if (iter != pointers_.end()) {
171 pointers_.erase(iter);
174 get_upstream_resource().deallocate_async(ptr, upstream_allocation_size(bytes), 1, stream);
185 [[nodiscard]]
bool do_is_equal(device_memory_resource
const& other)
const noexcept
override
187 if (
this == &other) {
return true; }
188 auto cast =
dynamic_cast<aligned_resource_adaptor<Upstream> const*
>(&other);
189 if (cast ==
nullptr) {
return false; }
190 return get_upstream_resource() == cast->get_upstream_resource() &&
191 alignment_ == cast->alignment_ && alignment_threshold_ == cast->alignment_threshold_;
201 std::size_t upstream_allocation_size(std::size_t bytes)
const
208 std::unordered_map<void*, void*> pointers_;
209 std::size_t alignment_;
210 std::size_t alignment_threshold_;
211 mutable std::mutex mtx_;
CUDA 流的强类型非拥有包装器,带默认构造函数。
定义: cuda_stream_view.hpp:39
调整上游内存资源以指定对齐大小分配内存的资源。
定义: aligned_resource_adaptor.hpp:57
aligned_resource_adaptor(device_async_resource_ref upstream, std::size_t alignment=rmm::CUDA_ALLOCATION_ALIGNMENT, std::size_t alignment_threshold=default_alignment_threshold)
使用上游资源构造对齐资源适配器以满足分配请求。
定义: aligned_resource_adaptor.hpp:69
aligned_resource_adaptor(Upstream *upstream, std::size_t alignment=rmm::CUDA_ALLOCATION_ALIGNMENT, std::size_t alignment_threshold=default_alignment_threshold)
使用上游资源构造对齐资源适配器以满足分配请求。
定义: aligned_resource_adaptor.hpp:89
rmm::device_async_resource_ref get_upstream_resource() const noexcept
上游资源的 rmm::device_async_resource_ref 引用
定义: aligned_resource_adaptor.hpp:110
所有 librmm 设备内存分配的基类。
定义: device_memory_resource.hpp:92
cuda::mr::async_resource_ref< cuda::mr::device_accessible > device_async_resource_ref
带属性 cuda::mr::device_accessible 的 cuda::mr::async_resource_ref 别名。
定义: resource_ref.hpp:40
device_async_resource_ref to_device_async_resource_ref_checked(Resource *res)
将内存资源的指针转换为 device_async_resource_ref,检查是否为 nullptr
定义: resource_ref.hpp:78
static constexpr std::size_t CUDA_ALLOCATION_ALIGNMENT
CUDA 内存分配使用的默认对齐方式。
定义: aligned.hpp:43
constexpr bool is_supported_alignment(std::size_t alignment) noexcept
返回对齐方式是否为有效的内存对齐方式。
定义: aligned.hpp:64
constexpr std::size_t align_up(std::size_t value, std::size_t alignment) noexcept
向上对齐到指定 2 的幂的最近倍数。
定义: aligned.hpp:77
每设备 device_memory_resources 的管理。