cuda-api-wrappers
Thin C++-flavored wrappers for the CUDA Runtime API
virtual_memory.hpp
Go to the documentation of this file.
1 
8 #ifndef CUDA_API_WRAPPERS_MULTI_WRAPPER_IMPLS_VIRTUAL_MEMORY_HPP_
9 #define CUDA_API_WRAPPERS_MULTI_WRAPPER_IMPLS_VIRTUAL_MEMORY_HPP_
10 
11 #include "../device.hpp"
12 #include "../virtual_memory.hpp"
13 
14 namespace cuda {
15 
16 namespace memory {
17 
18 #if CUDA_VERSION >= 10020
19 namespace physical_allocation {
20 
21 inline device_t properties_t::device() const
22 {
23  return cuda::device::wrap(raw.location.id);
24 }
25 
26 template<shared_handle_kind_t SharedHandleKind>
27 properties_t create_properties_for(const device_t& device)
28 {
29  return detail_::create_properties<SharedHandleKind>(device.id());
30 }
31 
32 template<shared_handle_kind_t SharedHandleKind>
33 inline physical_allocation_t create(size_t size, device_t device)
34 {
35  auto properties = create_properties_for<SharedHandleKind>(device);
36  return create(size, properties);
37 }
38 
39 } // namespace physical_allocation
40 
41 namespace virtual_ {
42 
43 inline void set_permissions(
44  region_t fully_mapped_region,
45  const device_t& device,
46  permissions_t permissions)
47 {
48  CUmemAccessDesc desc { { CU_MEM_LOCATION_TYPE_DEVICE, device.id() }, CUmemAccess_flags(permissions) };
49  static constexpr const size_t count { 1 };
50  auto result = cuMemSetAccess(device::address(fully_mapped_region), fully_mapped_region.size(), &desc, count);
51  throw_if_error_lazy(result, "Failed setting the access mode to the virtual memory mapping to the range of size "
52  + ::std::to_string(fully_mapped_region.size()) + " bytes at " + cuda::detail_::ptr_as_hex(fully_mapped_region.data()));
53 }
54 
55 inline void set_permissions(mapping_t mapping, const device_t& device, permissions_t permissions)
56 {
57  set_permissions(mapping.address_range(), device, permissions);
58 }
59 
60 template <template <typename...> class Container>
61 inline void set_permissions(
62  region_t fully_mapped_region,
63  const Container<device_t>& devices,
64  permissions_t permissions)
65 {
66  auto descriptors = ::std::unique_ptr<CUmemAccessDesc[]>(new CUmemAccessDesc[devices.size()]);
67  for(::std::size_t i = 0; i < devices.size(); i++) {
68  descriptors[i] = {{CU_MEM_LOCATION_TYPE_DEVICE, devices[i].id()}, CUmemAccess_flags(permissions)};
69  }
70  auto result = cuMemSetAccess(
71  device::address(fully_mapped_region.start()), fully_mapped_region.size(), descriptors.get(), devices.size());
72  throw_if_error_lazy(result, "Failed setting the access mode to the virtual memory mapping to the range of size "
73  + ::std::to_string(fully_mapped_region.size()) + " bytes at " + cuda::detail_::ptr_as_hex(fully_mapped_region.data()));
74 }
75 
76 template <template <typename...> class Container>
77 inline void set_permissions(
78  region_t fully_mapped_region,
79  Container<device_t>&& devices,
80  permissions_t permissions)
81 {
82  return set_permissions(fully_mapped_region, devices, permissions);
83 }
84 
85 template <template <typename...> class Container>
86 inline void set_permissions(
87  mapping_t mapping,
88  const Container<device_t>&& devices,
89  permissions_t permissions)
90 {
91  set_permissions(mapping.address_range(), devices, permissions);
92 }
93 
94 template <template <typename...> class Container>
95 inline void set_permissions(
96  mapping_t mapping,
97  Container<device_t>&& devices,
98  permissions_t permissions)
99 {
100  set_permissions(mapping, devices, permissions);
101 }
102 
103 inline permissions_t get_permissions(region_t fully_mapped_region, const device_t& device)
104 {
105  return detail_::get_permissions(fully_mapped_region, device.id());
106 }
107 
108 inline permissions_t get_permissions(const mapping_t& fully_mapped_region, const device_t& device)
109 {
110  return get_permissions(fully_mapped_region.address_range(), device);
111 }
112 
113 inline permissions_t mapping_t::get_permissions(const device_t& device) const
114 {
115  return virtual_::get_permissions(*this, device);
116 }
117 
118 inline void mapping_t::set_permissions(const device_t& device, permissions_t permissions) const
119 {
120  virtual_::set_permissions(*this, device, permissions);
121 }
122 
123 template <template <typename...> class ContiguousContainer>
124 void mapping_t::set_permissions(
125  const ContiguousContainer<device_t>& devices,
126  permissions_t permissions) const
127 {
128  virtual_::set_permissions(*this, devices, permissions);
129 }
130 
131 template <template <typename...> class ContiguousContainer>
132 void mapping_t::set_permissions(
133  ContiguousContainer<device_t>&& devices,
134  permissions_t permissions) const
135 {
136  virtual_::set_permissions(*this, devices, permissions);
137 }
138 
139 } // namespace virtual_
140 
141 #endif // CUDA_VERSION >= 10020
142 
143 } // namespace memory
144 
145 } // namespace cuda
146 
147 #endif //CUDA_API_WRAPPERS_MULTI_WRAPPER_IMPLS_VIRTUAL_MEMORY_HPP_
Definitions and functionality wrapping CUDA APIs.
Definition: array.hpp:22
device::id_t count()
Get the number of CUDA devices usable on the system (with the current CUDA library and kernel driver)...
Definition: miscellany.hpp:63
detail_::region_helper< memory::region_t > region_t
A child class of the generic region_t with some managed-memory-specific functionality.
Definition: memory.hpp:1960
::std::size_t size_t
A size type for use throughout the wrappers library (except when specific API functions limit the siz...
Definition: types.hpp:81
#define throw_if_error_lazy(status__,...)
A macro for only throwing an error if we&#39;ve failed - which also ensures no string is constructed unle...
Definition: error.hpp:316
address_t address(const void *device_ptr) noexcept
Definition: types.hpp:682
device_t wrap(id_t id) NOEXCEPT_IF_NDEBUG
Returns a wrapper for the CUDA device with a given id.
Definition: device.hpp:825
detail_::all_devices devices()
Definition: devices.hpp:224