8 #ifndef CUDA_API_WRAPPERS_MULTI_WRAPPER_IMPLS_VIRTUAL_MEMORY_HPP_ 9 #define CUDA_API_WRAPPERS_MULTI_WRAPPER_IMPLS_VIRTUAL_MEMORY_HPP_ 11 #include "../device.hpp" 12 #include "../virtual_memory.hpp" 18 #if CUDA_VERSION >= 10020 19 namespace physical_allocation {
21 inline device_t properties_t::device()
const 26 template<shared_handle_kind_t SharedHandleKind>
27 properties_t create_properties_for(
const device_t& device)
29 return detail_::create_properties<SharedHandleKind>(device.id());
32 template<shared_handle_kind_t SharedHandleKind>
33 inline physical_allocation_t create(
size_t size, device_t device)
35 auto properties = create_properties_for<SharedHandleKind>(device);
36 return create(size, properties);
43 inline void set_permissions(
45 const device_t& device,
46 permissions_t permissions)
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()));
55 inline void set_permissions(mapping_t mapping,
const device_t& device, permissions_t permissions)
57 set_permissions(mapping.address_range(), device, permissions);
60 template <
template <
typename...>
class Container>
61 inline void set_permissions(
63 const Container<device_t>&
devices,
64 permissions_t permissions)
66 auto descriptors = ::std::unique_ptr<CUmemAccessDesc[]>(
new CUmemAccessDesc[devices.size()]);
68 descriptors[i] = {{CU_MEM_LOCATION_TYPE_DEVICE, devices[i].id()}, CUmemAccess_flags(permissions)};
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()));
76 template <
template <
typename...>
class Container>
77 inline void set_permissions(
79 Container<device_t>&& devices,
80 permissions_t permissions)
82 return set_permissions(fully_mapped_region, devices, permissions);
85 template <
template <
typename...>
class Container>
86 inline void set_permissions(
88 const Container<device_t>&& devices,
89 permissions_t permissions)
91 set_permissions(mapping.address_range(),
devices, permissions);
94 template <
template <
typename...>
class Container>
95 inline void set_permissions(
97 Container<device_t>&& devices,
98 permissions_t permissions)
100 set_permissions(mapping, devices, permissions);
103 inline permissions_t get_permissions(
region_t fully_mapped_region,
const device_t& device)
105 return detail_::get_permissions(fully_mapped_region, device.id());
108 inline permissions_t get_permissions(
const mapping_t& fully_mapped_region,
const device_t& device)
110 return get_permissions(fully_mapped_region.address_range(), device);
113 inline permissions_t mapping_t::get_permissions(
const device_t& device)
const 115 return virtual_::get_permissions(*
this, device);
118 inline void mapping_t::set_permissions(
const device_t& device, permissions_t permissions)
const 120 virtual_::set_permissions(*
this, device, permissions);
123 template <
template <
typename...>
class ContiguousContainer>
124 void mapping_t::set_permissions(
125 const ContiguousContainer<device_t>& devices,
126 permissions_t permissions)
const 128 virtual_::set_permissions(*
this, devices, permissions);
131 template <
template <
typename...>
class ContiguousContainer>
132 void mapping_t::set_permissions(
133 ContiguousContainer<device_t>&& devices,
134 permissions_t permissions)
const 136 virtual_::set_permissions(*
this, devices, permissions);
141 #endif // CUDA_VERSION >= 10020 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'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