Skip to main content

ChoreoFault

Enum ChoreoFault 

Source
pub enum ChoreoFault {
Show 25 variants NotScheduled, MissingInput(TensorId), TripOutOfRange { trip: TripId, value: f64, admitted: (i64, i64), }, Deadlock { runnable: Vec<(Site, Engine)>, blocked_at: Vec<(Site, Engine, usize, ChoreoOp)>, }, BufferOverflow { buf: BufferId, at: (Site, Engine, usize), }, Underflow { buf: BufferId, at: (Site, Engine, usize), }, PushWithoutData { buf: BufferId, at: (Site, Engine, usize), }, ReadBeforeWait { buf: BufferId, at: (Site, Engine, usize), }, PopBeforeWait { buf: BufferId, at: (Site, Engine, usize), }, Unconsumed { buf: BufferId, pages_left: usize, }, OutstandingReservation { buf: BufferId, pages: usize, }, McastIntoUnreserved { group: GroupId, receiver: Site, }, SemaphoreProtocol { sem: SemId, expected: SemCond, found: usize, }, AccOverflow { requested: usize, available: usize, }, AliasClobber { buf: BufferId, alias: BufferId, at: (Site, Engine, usize), }, AccProtocol { at: (Site, Engine, usize), }, StoreConflict { tensor: TensorId, tile: usize, first: Site, second: Site, }, OutputTileNeverStored { tensor: TensorId, tile: usize, }, ReadOutOfRange { tensor: TensorId, tile: usize, }, StaleStateRead { tensor: TensorId, tile: usize, read_in: usize, written_in: usize, already_written: bool, }, NonDeterministic { scheduler_a: &'static str, scheduler_b: &'static str, tensor: TensorId, }, GatherOutOfRange { at: (Site, Engine, usize), index: f64, extent: usize, }, IntegerArithmetic { at: (Site, Engine, usize), what: &'static str, }, TileGatherOutOfBound { at: (Site, Engine, usize), index: f64, bound: (usize, usize), }, Unsupported(String),
}

Variants§

§

NotScheduled

§

MissingInput(TensorId)

§

TripOutOfRange

A trip’s input holds a value the program does not admit (Trip::count_of) — refused before any op runs, against the admitted range it names, so no loop ever runs a count its bound was not proved for.

Fields

§trip: TripId
§value: f64
§admitted: (i64, i64)
§

Deadlock

Fields

§runnable: Vec<(Site, Engine)>
§blocked_at: Vec<(Site, Engine, usize, ChoreoOp)>
§

BufferOverflow

Fields

§

Underflow

Fields

§

PushWithoutData

Fields

§

ReadBeforeWait

A consumer read a page it never waited for (hardware would read stale local memory).

Fields

§

PopBeforeWait

A consumer popped more pages than it had waited for.

Fields

§

Unconsumed

Fields

§pages_left: usize
§

OutstandingReservation

Fields

§pages: usize
§

McastIntoUnreserved

Fields

§group: GroupId
§receiver: Site
§

SemaphoreProtocol

Fields

§sem: SemId
§expected: SemCond
§found: usize
§

AccOverflow

Fields

§requested: usize
§available: usize
§

AliasClobber

A page was written into local memory an ALIAS of the buffer still holds: a page the alias pushed and its consumer has not popped. Two buffers sharing one region (Buffer::alias_of) keep separate counters, so nothing else stops a producer of one from overwriting what the consumer of the other is about to read.

Fields

§alias: BufferId
§

AccProtocol

Fields

§

StoreConflict

Fields

§tensor: TensorId
§tile: usize
§first: Site
§second: Site
§

OutputTileNeverStored

Fields

§tensor: TensorId
§tile: usize
§

ReadOutOfRange

Fields

§tensor: TensorId
§tile: usize
§

StaleStateRead

A CARRIED tensor was read out of step with its writer: a section after the writing section read a tile the writer has not produced yet (last step’s value), or a section before it read a tile the writer had already overwritten (this step’s value).

★ THIS FAULT EXISTS BECAUSE STATE CANNOT FAULT ANY OTHER WAY. An activation starts a run EMPTY, so reading it early is ReadOutOfRange and the evaluator notices for free. A state tensor starts a run FULL — that is what carrying means — so an unordered read returns a perfectly well-formed number from the previous token, and every check downstream passes. Dropping a barrier would be silently, plausibly wrong. So the read is checked against the section the writer lives in, which is a fact about the program, not about this scheduler’s luck.

Fields

§tensor: TensorId
§tile: usize
§read_in: usize
§written_in: usize
§already_written: bool
§

NonDeterministic

Fields

§scheduler_a: &'static str
§scheduler_b: &'static str
§tensor: TensorId
§

GatherOutOfRange

A GATHER read an index outside its declared extent — [0, modulus) of its IndirectTerm — or one that is not a whole number. ★ AN OUT-OF-RANGE INDEX IS A FAULT, NEVER A WRAP. A token id past the vocabulary, a cache position past the cache: a wrapped or clamped index reads SOMEBODY ELSE’S row and every check downstream passes. So the data run stops, naming the value and the extent.

Fields

§index: f64
§extent: usize
§

IntegerArithmetic

An integer stage’s arithmetic left i64 — a product, a sum or a shifted value past ±2⁶³ — or divided by zero. The VM carries such a value exactly, as a big integer, or refuses the division; an evaluator that wrapped or rounded would report another number as the answer, so the run stops here, naming the operation.

Fields

§what: &'static str
§

TileGatherOutOfBound

A TILE gather or scatter (IndirectTile) read an index outside its declared bound, or one that is not a whole number. The same promise as ChoreoFault::GatherOutOfRange at tile granularity: a row that is not the table’s is never read, and a write that has nowhere legal to land is never silently dropped.

Fields

§index: f64
§bound: (usize, usize)
§

Unsupported(String)

Trait Implementations§

Source§

impl Clone for ChoreoFault

Source§

fn clone(&self) -> ChoreoFault

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for ChoreoFault

Source§

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

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

impl PartialEq for ChoreoFault

Source§

fn eq(&self, other: &ChoreoFault) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl StructuralPartialEq for ChoreoFault

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

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Convert Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>. Box<dyn Any> can then be further downcast into Box<ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Convert Rc<Trait> (where Trait: Downcast) to Rc<Any>. Rc<Any> can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Convert &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Convert &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Convert Arc<Trait> (where Trait: Downcast) to Arc<Any>. Arc<Any> can then be further downcast into Arc<ConcreteType> where ConcreteType implements Trait.
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> Same for T

Source§

type Output = T

Should always be Self
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.
§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

§

fn vzip(self) -> V

§

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

§

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

§

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