pub enum ComputeCap {
MatmulTile {
precisions: BTreeSet<Precision>,
fidelity: Fidelity,
fp32_acc: bool,
dataflows: BTreeSet<DataflowPolicy>,
block_api: Option<BlockApi>,
acc_int_bits: u32,
max_array: Option<(usize, usize)>,
packer_accumulate: PackerAccumulate,
wide_spill_reload: bool,
acc_in_registers: bool,
},
Elementwise {
precisions: BTreeSet<Precision>,
},
RowReduce {
precisions: BTreeSet<Precision>,
},
Scalar(FabricTarget),
}Expand description
A compute capability a site offers.
Variants§
MatmulTile
Fields
dataflows: BTreeSet<DataflowPolicy>block_api: Option<BlockApi>The engine accepts a whole sub-block per call (Tensix matmul_block), by this API; None takes one
tile pair per call, two loads.
acc_int_bits: u32Accumulator width of the integer path (64 on the exact fabrics, 32 on a tensor core).
max_array: Option<(usize, usize)>The largest PE array the engine builds, (contraction rows, output columns): a matmul’s block is cut to it
and its contraction runs across several passes. None where each matmul’s block sets the array (a fabric
sized per program) or the engine’s tile does (Tensix, a tensor core).
packer_accumulate: PackerAccumulateWhether the packer can ADD into a local-memory page instead of overwriting it, and into which.
wide_spill_reload: boolA spilled partial in the accumulator’s own width can be reloaded into the register file. On
Wormhole and Blackhole under this tt-metal build the simulator refuses the Float32 unpack that
reload needs (tensix_unpacr: unpack_to_dst=0 in_data_format=0 out_data_format=0) even with the
buffer marked UnpackToDestFp32, so an EXACT blocked plan may not spill there — it keeps its
partials in the register file (one K block) or streams.
acc_in_registers: bool★ THE ACCUMULATOR LIVES IN THE COMPUTE ENGINE’S OWN REGISTERS and survives the WHOLE reduction, so a blocked plan never spills a partial at all.
This is the GPU: a wmma fragment is register-resident and the K loop runs inside the
accumulate region, which is exactly what the CUDA lowering emits (and why it refuses an
accumulator spill outright — “the fragments never leave the registers”).
Tensix is the other case: DST is a shared register file that must be DRAINED per sub-block, so a multi-block reduction spills its partial to local memory and reloads it. Conflating the two made every blocked GPU plan illegal under exact numerics — the spill it was refused for is one it would never perform — leaving only the streaming family, which computes ONE output tile per item and measured 214 GOPS against the knob lattice’s 16,591 at 2048³.
Elementwise
RowReduce
Scalar(FabricTarget)
A per-site scalar datapath — the CGRA descriptor, embedded.
Trait Implementations§
Source§impl Clone for ComputeCap
impl Clone for ComputeCap
Source§fn clone(&self) -> ComputeCap
fn clone(&self) -> ComputeCap
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for ComputeCap
impl Debug for ComputeCap
Source§impl PartialEq for ComputeCap
impl PartialEq for ComputeCap
Source§impl Serialize for ComputeCap
impl Serialize for ComputeCap
impl StructuralPartialEq for ComputeCap
Auto Trait Implementations§
impl Freeze for ComputeCap
impl RefUnwindSafe for ComputeCap
impl Send for ComputeCap
impl Sync for ComputeCap
impl Unpin for ComputeCap
impl UnsafeUnpin for ComputeCap
impl UnwindSafe for ComputeCap
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.