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.
Deadlock
BufferOverflow
Underflow
PushWithoutData
ReadBeforeWait
A consumer read a page it never waited for (hardware would read stale local memory).
PopBeforeWait
A consumer popped more pages than it had waited for.
Unconsumed
OutstandingReservation
McastIntoUnreserved
SemaphoreProtocol
AccOverflow
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.
AccProtocol
StoreConflict
OutputTileNeverStored
ReadOutOfRange
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.
NonDeterministic
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.
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.
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.
Unsupported(String)
Trait Implementations§
Source§impl Clone for ChoreoFault
impl Clone for ChoreoFault
Source§fn clone(&self) -> ChoreoFault
fn clone(&self) -> ChoreoFault
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ChoreoFault
impl Debug for ChoreoFault
Source§impl PartialEq for ChoreoFault
impl PartialEq for ChoreoFault
impl StructuralPartialEq for ChoreoFault
Auto Trait Implementations§
impl Freeze for ChoreoFault
impl RefUnwindSafe for ChoreoFault
impl Send for ChoreoFault
impl Sync for ChoreoFault
impl Unpin for ChoreoFault
impl UnsafeUnpin for ChoreoFault
impl UnwindSafe for ChoreoFault
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
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
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>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
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)
fn as_any(&self) -> &(dyn Any + 'static)
&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)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot
generate &mut Any’s vtable from &mut Trait’s.