9 #ifndef CUDA_API_WRAPPERS_EXTERNAL_HPP_ 10 #define CUDA_API_WRAPPERS_EXTERNAL_HPP_ 12 #if CUDA_VERSION >= 10000 15 #include "unique_region.hpp" 24 enum kind_t : ::std::underlying_type<CUexternalMemoryHandleType_enum>::type {
25 opaque_file_descriptor = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
26 opaque_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32,
27 opaque_globally_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT,
28 direct3d_12_heap = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP,
29 direct3d_12_committed_resource = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE,
30 #if CUDA_VERSION >= 10200 31 direct3d_resource_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE,
32 direct3d_resource_globally_shared_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT,
33 nvscibuf_object = CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF
34 #endif // CUDA_VERSION >= 10200 44 auto status = cuDestroyExternalMemory(handle);
48 inline ::std::string identify(subregion_spec_t subregion_spec)
50 return "subregion of size " + ::std::to_string(subregion_spec.size)
51 +
" at offset " + ::std::to_string(subregion_spec.offset);
54 inline ::std::string identify(
handle_t handle)
56 return "external memory resource at " + cuda::detail_::ptr_as_hex(handle);
61 return "external memory resource of kind " + ::std::to_string(descriptor.type);
66 return "external memory resource of kind " + ::std::to_string(descriptor.type)
67 +
" at " + cuda::detail_::ptr_as_hex(handle);
73 auto status = cuImportExternalMemory(&handle, &descriptor);
95 handle_t handle()
const {
return handle_; }
97 kind_t kind()
const {
return static_cast<kind_t
>(descriptor_.type); }
98 size_t size()
const {
return descriptor_.size; }
103 : handle_(handle), descriptor_(descriptor), owning_(is_owning)
107 resource_t(
const resource_t& other) =
delete;
109 resource_t(resource_t&& other) noexcept : resource_t(
110 other.handle_, other.descriptor_, other.owning_)
112 other.owning_ =
false;
119 cuDestroyExternalMemory(handle_);
122 detail_::destroy(handle_, descriptor_);
135 return { handle, ::std::move(descriptor), take_ownership };
141 handle_t handle = detail_::import(descriptor);
142 return wrap(handle, descriptor, do_take_ownership);
150 CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st buffer_desc;
151 buffer_desc.flags = 0u;
152 buffer_desc.offset = subregion.offset;
153 buffer_desc.size = subregion.size;
154 auto result = cuExternalMemoryGetMappedBuffer(&address, handle, &buffer_desc);
156 +
" within " + detail_::identify(handle) +
" to a device buffer");
164 using unique_region = memory::unique_region<device::detail_::deleter>;
173 inline unique_region map(
const resource_t& resource, subregion_spec_t subregion_to_map)
175 auto mapped_region = detail_::map(resource.handle(), subregion_to_map);
176 return wrap(mapped_region);
182 auto subregion_spec = subregion_spec_t { 0u, resource.size() };
183 return map(resource, subregion_spec);
192 #endif // CUDA_VERSION >= 10000 194 #endif // CUDA_API_WRAPPERS_EXTERNAL_HPP_ typename ::std::conditional< NumDimensions==2, CUDA_ARRAY_DESCRIPTOR, CUDA_ARRAY3D_DESCRIPTOR >::type descriptor_t
Raw CUDA driver descriptor structure for an array of dimension.
Definition: array.hpp:38
Definitions and functionality wrapping CUDA APIs.
Definition: array.hpp:22
memory::unique_region< detail_::deleter > unique_region
A unique region of device-global memory.
Definition: unique_region.hpp:153
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
#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
CUarray handle_t
Raw CUDA driver handle for arrays (of any dimension)
Definition: array.hpp:34
array_t< T, NumDimensions > wrap(device::id_t device_id, context::handle_t context_handle, handle_t handle, dimensions_t< NumDimensions > dimensions) noexcept
Wrap an existing CUDA array in an array_t instance.
Definition: array.hpp:264
address_t address(const void *device_ptr) noexcept
Definition: types.hpp:682
void * as_pointer(device::address_t address) noexcept
Definition: types.hpp:700
CUdeviceptr address_t
The numeric type which can represent the range of memory addresses on a CUDA device.
Definition: types.hpp:672