pub struct CudaHandle { /* private fields */ }Expand description
CUDA registration for a GPU-backed tensor. Held as Option on the tensor.
Implementations§
Source§impl CudaHandle
impl CudaHandle
Sourcepub fn new_gl(
resource: *mut c_void,
size: usize,
ops: Arc<dyn CudaGlOps>,
) -> Self
pub fn new_gl( resource: *mut c_void, size: usize, ops: Arc<dyn CudaGlOps>, ) -> Self
Construct a GL-buffer-backed CUDA handle. resource is the
cudaGraphicsResource_t returned by gl_register_buffer; ops
routes map/unmap/unregister back to the GL-context thread.
Sourcepub fn into_client_parts(self) -> Result<CudaClientParts>
pub fn into_client_parts(self) -> Result<CudaClientParts>
Decompose a GL-buffer registration into the callback channel
ef_tensor_cuda_attach takes.
Consumes self without unregistering: the library tensor’s
CudaHandle becomes the owner that will unregister on drop.
Sourcepub fn map(&self) -> Option<CudaMap<'_>>
pub fn map(&self) -> Option<CudaMap<'_>>
Map to a device pointer. GlBuffer routes to the GL worker;
ExternalMem is persistent (no per-call map/unmap); D3d11 copies the
texture’s array into its linear buffer, after waiting for the newest
fence value recorded on the tensor.
The D3d11 mapping is the texture’s tight rows: len() is
width * bytes_per_texel * height and row n starts at
n * width * bytes_per_texel, whatever the tensor’s
row_stride reports – that is the D3D11
staging pitch a CPU map sees, a different number on a padded backing.
A consumer that strides the device pointer by row_stride() walks off
the end of the mapping.
Semi-planar textures (NV12, NV16, NV24) are the exception: the texture
is as wide as its pitch by construction, so the mapping equals
row_stride() x combined_height bytes and striding by row_stride()
is exactly right.
One D3d11 handle has one linear buffer, so two live maps of the same
tensor hand out the same device pointer and the second map’s copy
refreshes what the first is reading. That is the same aliasing the GL
and external-memory backings have always had – one buffer per handle,
not one per map. A map() taken while a map_mut
guard is live is the case that also loses data: it refreshes the buffer
under the writer, and the writer’s release then publishes the array’s
pre-write contents back into the texture. Callers serialise the two.
Sourcepub fn map_mut(&self) -> Option<CudaMap<'_>>
pub fn map_mut(&self) -> Option<CudaMap<'_>>
Map to a device pointer for writing.
The GL and external-memory backings alias the same device memory for
reads and writes – a GL buffer’s CUDA mapping and an imported
external-memory allocation are each one address the caller may write
through – so for them this is map. A D3d11 texture is
the backing that does distinguish the two: its linear buffer is a copy
of an opaque array, so the map’s release copies it back into the
texture and synchronises, and later D3D11 and GL work on the immediate
context is ordered after that write.
The D3d11 mapping is the texture’s tight rows: len() is
width * bytes_per_texel * height and row n starts at
n * width * bytes_per_texel, whatever the tensor’s
row_stride reports – that is the D3D11
staging pitch a CPU map sees, a different number on a padded backing.
A consumer that strides the device pointer by row_stride() walks off
the end of the mapping.
Semi-planar textures (NV12, NV16, NV24) are the exception: the texture
is as wide as its pitch by construction, so the mapping equals
row_stride() x combined_height bytes and striding by row_stride()
is exactly right.
Trait Implementations§
Source§impl Debug for CudaHandle
impl Debug for CudaHandle
Source§impl Drop for CudaHandle
impl Drop for CudaHandle
Auto Trait Implementations§
impl !RefUnwindSafe for CudaHandle
impl !UnwindSafe for CudaHandle
impl Freeze for CudaHandle
impl Send for CudaHandle
impl Sync for CudaHandle
impl Unpin for CudaHandle
impl UnsafeUnpin for CudaHandle
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
fn instrument(self, span: Span) -> Instrumented<Self> ⓘ
Source§fn in_current_span(self) -> Instrumented<Self> ⓘ
fn in_current_span(self) -> Instrumented<Self> ⓘ
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read more