Skip to main content

CpuStorageBytes

Struct CpuStorageBytes 

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

CPU storage holding bytes addressable by Rust pointer.

Cloning is cheap — bumps the inner Arc’s refcount without copying bytes. Mutating through bytes_mut / as_slice_mut performs copy-on-write: if the Arc is uniquely held, the bytes are mutated in place; if shared, the bytes clone before mutation so other holders see the unchanged data.

Implementations§

Source§

impl CpuStorageBytes

Source

pub fn from_zero_bytes(len_bytes: usize) -> Self

Allocate len_bytes zero-initialized bytes, 64-byte aligned.

Source

pub fn alloc(byte_count: usize) -> Self

Phase 7.5 A4 substrate alloc. Allocates byte_count zero- initialized bytes, 64-byte aligned. Synonym for Self::from_zero_bytes; named alloc for symmetry with the GPU backend allocators.

Source

pub fn from_bytes(src: &[u8]) -> Self

Allocate a fresh aligned buffer and copy src into it.

Source

pub fn from_slice<T: Pod>(data: &[T]) -> Self

Allocate a fresh aligned buffer and copy a typed slice into it. T must be Pod (Copy + Zeroable + ’static + no padding); covers every standard ML dtype.

Source

pub fn len_bytes(&self) -> usize

Total byte count.

Source

pub fn align(&self) -> usize

Alignment in bytes (always CPU_ALIGN_BYTES).

Source

pub fn bytes(&self) -> &[u8] ⓘ

Borrow the raw bytes immutably.

Source

pub fn as_slice<T: Pod>(&self) -> Result<&[T]>

Borrow the bytes as a typed slice. Returns Err if the byte length isn’t a multiple of T’s size or the buffer alignment can’t satisfy T’s alignment requirement.

Production-correct: no panic. The 64-byte allocation alignment is sufficient for every Pod type up to and including u64/f64, so the alignment-check failure path is unreachable for standard dtypes — but we still surface it as Result for unusual Pod types (e.g., [u8; 128]).

Source

pub fn bytes_mut(&mut self) -> &mut [u8] ⓘ

Copy-on-write mutable byte access. If this storage is the sole holder of its Arc, returns a &mut [u8] into the existing buffer. If the Arc is shared, clones the bytes into a fresh Arc first so other holders are unaffected.

Centralized CoW boundary: every mutating call site goes through here, so callers don’t need to remember to clone manually. Cost when Arc is unique: one atomic load (no copy). Cost when shared: one allocation + one memcpy.

Source

pub fn as_slice_mut<T: Pod>(&mut self) -> Result<&mut [T]>

Copy-on-write typed mutable view. Same CoW semantics as bytes_mut; returns Err on a bytemuck cast failure.

Source

pub fn is_uniquely_owned(&self) -> bool

Whether this storage’s bytes are uniquely owned (no other CpuStorageBytes shares the same Arc). Useful for tests and for reasoning about CoW behavior.

Trait Implementations§

Source§

impl BackendStorage for CpuStorageBytes

Source§

fn len_bytes(&self) -> usize

Total addressable byte count, regardless of dtype. Read more
Source§

impl Clone for CpuStorageBytes

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 CpuStorageBytes

Source§

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

Formats the value using the given formatter. 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 = !

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V