Skip to main content

Tensor

Struct Tensor 

Source
pub struct Tensor {
    pub dtype: DataType,
    pub shape: Vec<usize>,
    pub layout: TensorLayout,
    /* private fields */
}
Expand description

An owned, host-resident, device-aware tensor (§5, §20.2).

Owns the DeviceBuffer that holds its elements and the EP that must free it. On Phase-1 CPU the buffer is a host allocation, so Tensor::as_bytes and the typed accessors read it directly; the design leaves room for non-host devices (the accessors gate on host accessibility).

Fields§

§dtype: DataType

Element type.

§shape: Vec<usize>

Logical shape (static dims).

§layout: TensorLayout

Physical layout of Tensor::buffer. Row-major contiguous for tensors this crate produces.

Implementations§

Source§

impl Tensor

Source

pub fn from_raw( dtype: DataType, shape: Vec<usize>, bytes: &[u8], ) -> Result<Self, SessionError>

Build a tensor from raw little-endian bytes on the shared CPU device.

Source

pub fn from_f32(shape: &[usize], data: &[f32]) -> Result<Self, SessionError>

Build an f32 tensor from a dense row-major slice.

Source

pub fn from_i64(shape: &[usize], data: &[i64]) -> Result<Self, SessionError>

Build an i64 tensor from a dense row-major slice.

Source

pub fn device(&self) -> DeviceId

The device this tensor lives on.

Source

pub fn from_borrowed_parts_with_guard( allocator: Arc<dyn ExecutionProvider>, dtype: DataType, shape: Vec<usize>, layout: TensorLayout, buffer: DeviceBuffer, guard: Box<dyn Any + Send + Sync>, ) -> Self

Wrap foreign, borrowed memory in a Tensor, with an opaque guard that releases the foreign allocation when the tensor is dropped.

This is the zero-copy import constructor: buffer must be a borrowed DeviceBuffer (built via DeviceBuffer::from_borrowed_parts) aliasing memory owned by whatever guard boxes up — for a DLPack import, guard owns the foreign DLManagedTensor and its Drop calls that tensor’s deleter exactly once. Because the buffer is borrowed, the owning EP’s deallocate is a no-op for it, so the only thing that frees the aliased memory is the guard.

§Ordering invariant

Drop deallocates buffer (a no-op for a borrowed buffer) and only then drops the guard, so the guard’s deleter never runs while the buffer still aliases the foreign memory. Do not rely on the guard freeing anything the buffer still points at before drop completes.

§Panics

Panics (debug builds) if buffer is not borrowed — an owned buffer here would be double-freed (once by the EP, once by the guard).

Source

pub fn numel(&self) -> usize

Number of elements.

Source

pub fn device_ptr(&self) -> *const c_void

Base pointer of this tensor’s backing allocation.

For host-accessible devices (CPU, MLX) this is a dereferenceable host pointer; for device memory (CUDA/ROCm) it is an opaque device address only meaningful inside the owning EP’s context — never dereference it on the host. This is the device-agnostic base the zero-copy DLPack export path hands to a consumer, so a CUDA-resident output can be borrowed as a kDLCUDA tensor without a host round-trip. Returns null for an empty (zero-element) tensor.

Source

pub fn sync(&self) -> Result<(), SessionError>

Block until all pending work on the owning EP’s stream completes.

Device-agnostic: the CPU EP’s sync is a no-op, while the CUDA EP fully synchronizes its compute stream. The DLPack export path calls this before handing a kDLCUDA buffer to a foreign consumer, so the producer’s device work is guaranteed complete (and thus the data valid) regardless of which stream the consumer reads on — the conservative, always-correct end of the DLPack stream handshake.

Source

pub fn as_bytes(&self) -> &[u8]

Borrow the raw little-endian element bytes (host tensors only).

Source

pub fn to_vec_f32(&self) -> Vec<f32>

Copy out the elements as f32. Panics if the dtype is not Float32.

Source

pub fn to_vec_i64(&self) -> Vec<i64>

Copy out the elements as i64. Panics if the dtype is not Int64.

Trait Implementations§

Source§

impl Clone for Tensor

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for Tensor

Source§

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

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

impl Drop for Tensor

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> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

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

Source§

type Error = Infallible

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

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

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.