10 #ifndef CUDA_API_WRAPPERS_EXTERNAL_HPP_ 11 #define CUDA_API_WRAPPERS_EXTERNAL_HPP_ 13 #if CUDA_VERSION >= 10000 16 #include "unique_region.hpp" 25 enum kind_t : ::std::underlying_type<CUexternalMemoryHandleType_enum>::type {
26 opaque_file_descriptor = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_FD,
27 opaque_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32,
28 opaque_globally_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_OPAQUE_WIN32_KMT,
29 direct3d_12_heap = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_HEAP,
30 direct3d_12_committed_resource = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D12_RESOURCE,
31 #if CUDA_VERSION >= 10200 32 direct3d_resource_shared_windows_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE,
33 direct3d_resource_globally_shared_handle = CU_EXTERNAL_MEMORY_HANDLE_TYPE_D3D11_RESOURCE_KMT,
34 nvscibuf_object = CU_EXTERNAL_MEMORY_HANDLE_TYPE_NVSCIBUF
35 #endif // CUDA_VERSION >= 10200 46 return cuDestroyExternalMemory(handle);
52 auto status = destroy_nowthrow(handle);
56 inline ::std::string identify(subregion_spec_t subregion_spec)
58 return "subregion of size " + ::std::to_string(subregion_spec.size)
59 +
" at offset " + ::std::to_string(subregion_spec.offset);
62 inline ::std::string identify(
handle_t handle)
64 return "external memory resource at " + cuda::detail_::ptr_as_hex(handle);
69 return "external memory resource of kind " + ::std::to_string(descriptor.type);
74 return "external memory resource of kind " + ::std::to_string(descriptor.type)
75 +
" at " + cuda::detail_::ptr_as_hex(handle);
81 auto status = cuImportExternalMemory(&handle, &descriptor);
103 handle_t handle()
const {
return handle_; }
105 kind_t kind()
const {
return static_cast<kind_t
>(descriptor_.type); }
106 size_t size()
const {
return descriptor_.size; }
111 : handle_(handle), descriptor_(descriptor), owning_(is_owning)
115 resource_t(
const resource_t& other) =
delete;
117 resource_t(resource_t&& other) noexcept : resource_t(
118 other.handle_, other.descriptor_, other.owning_)
120 other.owning_ =
false;
123 ~resource_t() DESTRUCTOR_EXCEPTION_SPEC
125 if (not owning_) {
return; }
126 #if THROW_IN_DESTRUCTORS 127 detail_::destroy(handle_, descriptor_);
129 detail_::destroy(handle_, descriptor_);
141 return { handle, ::std::move(descriptor), take_ownership };
147 handle_t handle = detail_::import(descriptor);
148 return wrap(handle, descriptor, do_take_ownership);
156 CUDA_EXTERNAL_MEMORY_BUFFER_DESC_st buffer_desc;
157 buffer_desc.flags = 0u;
158 buffer_desc.offset = subregion.offset;
159 buffer_desc.size = subregion.size;
160 auto result = cuExternalMemoryGetMappedBuffer(&address, handle, &buffer_desc);
162 +
" within " + detail_::identify(handle) +
" to a device buffer");
170 using unique_region = memory::unique_region<device::detail_::deleter>;
179 inline unique_region map(
const resource_t& resource, subregion_spec_t subregion_to_map)
181 auto mapped_region = detail_::map(resource.handle(), subregion_to_map);
182 return wrap(mapped_region);
188 auto subregion_spec = subregion_spec_t { 0u, resource.size() };
189 return map(resource, subregion_spec);
196 #endif // CUDA_VERSION >= 10000 198 #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:1974
#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:327
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:271
address_t address(const void *device_ptr) noexcept
Definition: types.hpp:684
void * as_pointer(device::address_t address) noexcept
Definition: types.hpp:702
CUdeviceptr address_t
The numeric type which can represent the range of memory addresses on a CUDA device.
Definition: types.hpp:674
CUresult status_t
Indicates either the result (success or error index) of a CUDA Runtime or Driver API call...
Definition: types.hpp:74