Skip to main content

CudaKnobs

Struct CudaKnobs 

Source
pub struct CudaKnobs {
    pub gemv_load: LoadWidth,
    pub precision: MatmulPrecision,
    pub kv_cache: bool,
    pub cuda_graphs: bool,
    pub fuse_quant: bool,
    pub activations: Q8MatKind,
    pub chip: CudaChip,
    pub recurrent_state: StatePrecision,
    pub cache_precision: CachePrecision,
}
Expand description

The CUDA backend’s optimization knobs — one point in the lattice. Construct with CudaKnobs::default for the best-general point and flip individual knobs to trade off. Every field is a trade-off; there are deliberately no fields for strictly-better transforms (those are always applied, see STRICTLY_BETTER).

Fields§

§gemv_load: LoadWidth

Weight-load width for GEMV/GEMM. Default LoadWidth::Int4 (measured best-general on the projections).

§precision: MatmulPrecision

Contraction precision. Default MatmulPrecision::Auto (⇒ always-correct int64).

§kv_cache: bool

KV-cache for autoregressive generation — skip recomputing past K/V. A large win for generation, but costs VRAM and only applies to attention over a growing sequence. Default true.

§cuda_graphs: bool

Capture the steady-state (T=1) step as a CUDA graph and replay it — collapses ~540 launches/token to one. Wins when many tiny kernels make launch latency dominate; neutral-to-negative for one big kernel. Default true.

§fuse_quant: bool

Fuse activation-quantization into the preceding norm/elementwise kernel — saves a global round-trip at the cost of a slightly larger, less-reusable kernel. Default true.

§activations: Q8MatKind

The activation precision of a projection by Q8_0 weights in the compiled generation lane: f32 activations with f64 sums (Dequant), a high and a low int8 word per value (TwoPassInt8, ~14 bits), or one int8 word (Int8Act, llama.cpp’s precision). Default Q8MatKind::TwoPassInt8.

§chip: CudaChip

The GPU part this kernel targets — its SM arch, shared-memory budget, and realized precisions. Default CudaChip::rtx3060 (the local dev GPU). Flipping it to CudaChip::b200 retargets the SAME recognized op to Blackwell. A trade-off (portability vs hardware exploitation), hence a knob.

§recurrent_state: StatePrecision

The precision the compiled generation lane stores a gated-delta layer’s recurrent memory in between steps: f32, or bf16 — computed in f32, rounded to bf16 after every row the delta rule walks. Default StatePrecision::F32.

§cache_precision: CachePrecision

The precision the compiled generation lane stores an attention’s key and value cache in: f32, or binary16 — each row computed in f32 and rounded to the nearest as it is written, every read of the cache taking the rounded row. Default CachePrecision::F32.

Implementations§

Source§

impl CudaKnobs

Source

pub fn fabric_precision(&self) -> Precision

Map a MatmulPrecision to the fabric-level Precision descriptor (for FabricTarget gating).

Source

pub fn tradeoffs() -> &'static [KnobTradeoff]

The trade-off table — one row per knob, each naming the regime where the aggressive setting wins and the regime where it loses (the reason it can’t be baked in unconditionally). This is the lattice’s map; the knob-lattice lock asserts it stays complete and honest.

Trait Implementations§

Source§

impl Clone for CudaKnobs

Source§

fn clone(&self) -> CudaKnobs

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 CudaKnobs

Source§

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

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

impl Default for CudaKnobs

Source§

fn default() -> Self

The best general point of the lattice: wide loads, always-correct precision, and the generation-time wins (KV-cache, graph replay, quant fusion) enabled — each the right call for the common case, each overridable.

Source§

impl PartialEq for CudaKnobs

Source§

fn eq(&self, other: &CudaKnobs) -> 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 Copy for CudaKnobs

Source§

impl Eq for CudaKnobs

Source§

impl StructuralPartialEq for CudaKnobs

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

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
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,