Skip to main content

CudaChip

Struct CudaChip 

Source
pub struct CudaChip {
    pub name: &'static str,
    pub family: GpuFamily,
    pub sm_arch: u32,
    pub smem_kib_per_block: usize,
    pub max_threads_per_block: usize,
    pub sms: usize,
    pub mem_bytes: usize,
    pub precisions: &'static [Precision],
}
Expand description

A described CUDA target part — the hardware limits and realized numeric formats that make the fastest kernel chip-specific, plus the SM arch its kernels are compiled for. Construct with a named part (CudaChip::rtx3060, CudaChip::b200, …); the emitter reads it to pick the arch flag, the shared-memory budget, and which precisions are legal.

Fields§

§name: &'static str

Human-readable part name — carried into the emitted kernel’s provenance header.

§family: GpuFamily

The architecture family (tensor-core generation).

§sm_arch: u32

SM architecture number (80 / 86 / 89 / 90 / 100) — the sm_XX the kernel compiles for.

§smem_kib_per_block: usize

Opt-in dynamic shared-memory ceiling per block, in KiB (bounds the resident row/tile a kernel stages).

§max_threads_per_block: usize

Threads per block ceiling.

§sms: usize

Streaming multiprocessors: the blocks a launch must offer to fill the part.

§mem_bytes: usize

The part’s device memory, in bytes: what a lane plans its program’s weights, caches and arrays on, less what the driver and the program’s context take (lane::residence::CONTEXT_RESERVE).

§precisions: &'static [Precision]

The numeric formats this part’s tensor / CUDA cores realize — the precision legality gate (a lowering may pick a precision only if the target chip provides it).

Implementations§

Source§

impl CudaChip

Source

pub fn rtx3060() -> Self

RTX 3060 — the local dev GPU: Ampere, sm_86, 28 SMs, ~99 KiB opt-in shared memory, 12 GiB. Where we prove correctness and relative speed before spending B200 time.

Source

pub fn a100() -> Self

A100 — Ampere data-center part, sm_80, 108 SMs, ~164 KiB opt-in shared memory, the 80 GB part.

Source

pub fn h100() -> Self

H100 (SXM / NVL) — Hopper, sm_90, 132 SMs, ~228 KiB opt-in shared memory, 80 GB (the SXM part), fp8.

Source

pub fn b200() -> Self

B200 — Blackwell, sm_100, 148 SMs, ~228 KiB opt-in shared memory, 192 GB, fp8 (+ NVFP4 in Phase 5). The SOL-ExecBench target.

Source

pub fn nvcc_arch_flag(&self) -> String

The nvcc arch flag that targets this part. Hopper/Blackwell get the architecture-specific a suffix (required to unlock wgmma/TMA on Hopper and tcgen05 on Blackwell); Ampere/Ada use the plain form.

Source

pub fn supports(&self, p: Precision) -> bool

Whether this part’s tensor / CUDA path realizes a numeric format.

Source

pub fn runs_numerically_on(&self, host_sm: u32) -> bool

Can a kernel built for THIS chip be numerically executed on a host GPU of SM arch host_sm? Kernels are forward-compatible: a lower-arch kernel runs on a higher-arch host, never the reverse. This routes the run-vs-compile-check split — everything sm_86-legal is proven on the local 3060; a B200 kernel can only be compile-checked locally and is numerically validated on the cloud B200.

Trait Implementations§

Source§

impl Clone for CudaChip

Source§

fn clone(&self) -> CudaChip

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 CudaChip

Source§

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

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

impl PartialEq for CudaChip

Source§

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

Source§

impl Eq for CudaChip

Source§

impl StructuralPartialEq for CudaChip

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,