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