All Classes Files Functions Variables Typedefs Enumerations Enumerator Friends Modules Pages
system_memory_resource.hpp
Go to the documentation of this file.
1 /*
2  * Copyright (c) 2024, 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 
24 namespace RMM_NAMESPACE {
25 namespace mr {
26 
27 namespace detail {
35 {
36  int pageableMemoryAccess;
37  RMM_CUDA_TRY(cudaDeviceGetAttribute(
38  &pageableMemoryAccess, cudaDevAttrPageableMemoryAccess, device_id.value()));
39  return pageableMemoryAccess == 1;
40 }
41 } // namespace detail
42 
71  public:
73  {
74  RMM_EXPECTS(rmm::mr::detail::is_system_memory_supported(rmm::get_current_cuda_device()),
75  "System memory allocator is not supported with this hardware/software version.");
76  }
77  ~system_memory_resource() override = default;
81  default;
83  default;
84 
85  private:
97  void* do_allocate(std::size_t bytes, [[maybe_unused]] cuda_stream_view stream) override
98  {
99  try {
100  return rmm::detail::aligned_host_allocate(
101  bytes, CUDA_ALLOCATION_ALIGNMENT, [](std::size_t size) { return ::operator new(size); });
102  } catch (std::bad_alloc const& e) {
103  RMM_FAIL("Failed to allocate memory: " + std::string{e.what()}, rmm::out_of_memory);
104  }
105  }
106 
117  void do_deallocate(void* ptr,
118  [[maybe_unused]] std::size_t bytes,
119  cuda_stream_view stream) override
120  {
121  // With `cudaFree`, the CUDA runtime keeps track of dependent operations and does implicit
122  // synchronization. However, with SAM, since `free` is immediate, we need to wait for in-flight
123  // CUDA operations to finish before freeing the memory, to avoid potential use-after-free errors
124  // or race conditions.
125  stream.synchronize();
126 
127  rmm::detail::aligned_host_deallocate(
128  ptr, bytes, CUDA_ALLOCATION_ALIGNMENT, [](void* ptr) { ::operator delete(ptr); });
129  }
130 
141  [[nodiscard]] bool do_is_equal(device_memory_resource const& other) const noexcept override
142  {
143  return dynamic_cast<system_memory_resource const*>(&other) != nullptr;
144  }
150  friend void get_property(system_memory_resource const&, cuda::mr::device_accessible) noexcept {}
151 
157  friend void get_property(system_memory_resource const&, cuda::mr::host_accessible) noexcept {}
158 };
159 
160 // static property checks
161 static_assert(cuda::mr::async_resource_with<system_memory_resource, cuda::mr::device_accessible>);
162 static_assert(cuda::mr::async_resource_with<system_memory_resource, cuda::mr::host_accessible>); // end of group
164 } // namespace mr
165 } // namespace RMM_NAMESPACE
Strongly-typed non-owning wrapper for CUDA streams with default constructor.
Definition: cuda_stream_view.hpp:41
void synchronize() const
Synchronize the viewed CUDA stream.
Definition: cuda_stream_view.hpp:108
Base class for all libcudf device memory allocation.
Definition: device_memory_resource.hpp:94
device_memory_resource derived class that uses malloc/free for allocation/deallocation.
Definition: system_memory_resource.hpp:70
system_memory_resource(system_memory_resource const &)=default
Default copy constructor.
system_memory_resource(system_memory_resource &&)=default
Default copy constructor.
system_memory_resource & operator=(system_memory_resource const &)=default
Default copy assignment operator.
friend void get_property(system_memory_resource const &, cuda::mr::device_accessible) noexcept
Enables the cuda::mr::device_accessible property.
Definition: system_memory_resource.hpp:150
friend void get_property(system_memory_resource const &, cuda::mr::host_accessible) noexcept
Enables the cuda::mr::host_accessible property.
Definition: system_memory_resource.hpp:157
system_memory_resource & operator=(system_memory_resource &&)=default
Default move assignment operator.
Exception thrown when RMM runs out of memory.
Definition: error.hpp:87
cuda_device_id get_current_cuda_device()
Returns a cuda_device_id for the current device.
Definition: cuda_device.hpp:96
static constexpr std::size_t CUDA_ALLOCATION_ALIGNMENT
Default alignment used for CUDA memory allocation.
Definition: aligned.hpp:43
Strong type for a CUDA device identifier.
Definition: cuda_device.hpp:38
constexpr value_type value() const noexcept
The wrapped integer value.
Definition: cuda_device.hpp:54
static bool is_system_memory_supported(cuda_device_id device_id)
Check if system allocated memory (SAM) is supported on the specified device.
Definition: system_memory_resource.hpp:34