Skip to main content

CudaHandle

Struct CudaHandle 

Source
pub struct CudaHandle { /* private fields */ }
Expand description

CUDA registration for a GPU-backed tensor. Held as Option on the tensor.

Implementations§

Source§

impl CudaHandle

Source

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.

Source

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.

Source

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

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Drop for CudaHandle

Source§

fn drop(&mut self)

Executes the destructor for this type. Read more
Source§

fn pin_drop(self: Pin<&mut Self>)

🔬This is a nightly-only experimental API. (pin_ergonomics)
Execute the destructor for this type, but different to Drop::drop, it requires self to be pinned. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self> ⓘ

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self> ⓘ

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts 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
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self> ⓘ
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self> ⓘ

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more