Skip to main content

CudaTile

Struct CudaTile 

Source
pub struct CudaTile {
    pub bm: usize,
    pub bn: usize,
    pub bk: usize,
    pub tm: usize,
    pub tn: usize,
}
Expand description

A point in the GEMM tiling lattice.

Fields§

§bm: usize

Block (output) tile height — rows of C computed per block.

§bn: usize

Block (output) tile width — cols of C computed per block.

§bk: usize

K-stage depth — contraction tiles staged through shared memory per iteration (bigger ⇒ more reuse per global load, up to the shared-memory budget).

§tm: usize

Per-thread register-tile height.

§tn: usize

Per-thread register-tile width.

Implementations§

Source§

impl CudaTile

Source

pub fn threads(&self) -> usize

Threads per block: one thread per tm×tn register sub-tile, so (bm/tm)·(bn/tn).

Source

pub fn smem_bytes(&self) -> usize

Shared-memory footprint in bytes: the A stage (bm×bk) + the B stage (bk×bn), int8 = 1 byte per element, double-buffered (×2) so the next K-stage streams in while the current one computes.

A point is legal iff it tiles the block evenly, is at least one warp, and fits the GPU’s thread and shared-memory budgets.

Source§

impl CudaTile

Source

pub fn regs_per_thread(&self) -> usize

Registers per thread ≈ the tm·tn int32 accumulator tile plus ~24 for indices/fragments/loop state.

Source

pub fn is_feasible(&self, gpu: &GpuLimits) -> bool

Feasible-for-construction: legal on the block budget AND at least one block fits the SM register file.

Source

pub fn blocks_per_sm(&self) -> usize

Estimated resident blocks per SM (Ampere sm_86: 100 KiB smem, 65,536 regs, 1536 threads, ≤16 blocks) — the min over the four limiters. Bigger tiles (more regs/smem) → fewer blocks → less latency hiding.

Source

pub fn occupancy(&self) -> f64

Occupancy fraction: resident warps / 48 (Ampere’s max warps per SM).

Source

pub fn dram_traffic(&self) -> f64

DRAM traffic per unit of work (lower = better): global→shared reuse from the block tile. Each A element is read N/BN times, each B element M/BM times, so operand bytes ∝ 1/BM + 1/BN. EXACT byte count — no fitted constant.

Source

pub fn smem_traffic(&self) -> f64

Shared-memory traffic per unit of work (lower = better): shared→register reuse from the thread tile. Each thread does TM·TN MACs per TM + TN shared loads, so shared bytes ∝ 1/TM + 1/TN. EXACT byte count — no fitted constant.

Source

pub fn dominates(&self, other: &CudaTile) -> bool

Pareto dominance over the THREE physical axes — DRAM traffic ↓, SMEM traffic ↓, occupancy ↑ — with NO weights, NO fitted constants, no assumption about which matters more. self dominates other iff it is weakly better on all three and strictly better on at least one. A dominated tile cannot be the optimum (under the monotonicity assumption: less traffic and more occupancy never hurt), so it need not be measured. This is the assumption-free pruning that shrinks the space WITHOUT telling it the answer.

Trait Implementations§

Source§

impl Clone for CudaTile

Source§

fn clone(&self) -> CudaTile

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 CudaTile

Source§

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

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

impl PartialEq for CudaTile

Source§

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

Source§

impl Eq for CudaTile

Source§

impl StructuralPartialEq for CudaTile

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,