Skip to main content

Rates

Struct Rates 

Source
pub struct Rates {
Show 16 fields pub gemm_mac: Rate, pub gemm_single: Rate, pub block_apply_mac: Rate, pub lu_full_pivot: Rate, pub bunch_kaufman: Rate, pub qr_col_pivot: Rate, pub bidiag: Rate, pub hessenberg: Rate, pub tridiag: Rate, pub matvec: Rate, pub bidiag_svd_dc: Rate, pub tridiag_evd_dc: Rate, pub triangular_inverse: Rate, pub sparse_matmul: Rate, pub householder_rank_one: Rate, pub lu_swap: Rate,
}
Expand description

The serial throughput constants of the kernel families of one host class, one per family (design record: threadteam docs/design/thresholds.md, section 2.3). The unit is what the gate of the family counts. A step of a factorization is timed inside the whole serial factorization, so the constant includes the serial parts of a step (pivot search, Householder generation) and slightly overestimates the time of the part that is split.

The row of a class is Rates::for_class; rates is the row of the host. Sources:

  • x86_64-avx512: one thread on an AMD Ryzen AI 9 HX 470 (Zen 5) at 2.0 GHz, boost off, median over shapes and rounds (faer-benchmark data/probes/20261026-awake-team-linux/tables-consts-exec3.md); the divide and conquer and sparse product from the region constants of the same file (raw-exec3/rconsts-*.csv).
  • aarch64-apple: one thread on an Apple M5 Max, QoS UserInitiated, L2 resident shapes, median over the shapes 96 to 768 and two processes (data/probes/20261026-threshold-recalibration).
  • every other class is unmeasured and takes the generic row: per entry the smaller of the measured rows, so that an unknown host keeps work serial a little longer than it must rather than dispatching too early.

A row’s rates and the dispatch costs of the same class must come from the same machine and clock state (HostClass).

Fields§

§gemm_mac: Rate

GEMM and every kernel counted in multiply-adds (triangular products and solves), per multiply-add.

§gemm_single: Rate

GEMM in single precision, per multiply-add: real is f32, cplx is c32.

§block_apply_mac: Rate

The multiply-adds of the block Householder apply, per multiply-add.

§lu_full_pivot: Rate

Full-pivoting LU, one step: rank-one update fused with the pivot search, per element of the trailing block (m-k-1)*(n-k-1).

§bunch_kaufman: Rate

Bunch-Kaufman with full pivoting, one step: rank-1 or rank-2 update fused with the pivot search, per element of the trailing block rem*rem.

§qr_col_pivot: Rate

QR with column pivoting, one step: fused update of the trailing block and the norms, per element (m-k-1)*(n-k-1).

§bidiag: Rate

Bidiagonalization, one step: the fused two-sided update and the matrix-vector product, per element (m-k-1)*(n-k-1).

§hessenberg: Rate

Hessenberg reduction (unblocked), one step: two matrix-vector products and a rank-one update, per element n*n of the trailing block.

§tridiag: Rate

Tridiagonalization, one step: the symmetric fused update, per element rem*rem/2 of the triangle.

§matvec: Rate

Matrix-vector product, per matrix element (the mean of the column major and row major products).

§bidiag_svd_dc: Rate

Divide and conquer bidiagonal SVD (bidiag_svd, both singular vectors, non deflating data), the whole serial solve of size m per m^2; the join of size n has the two halves as work, 2 (n/2)^2. The m^2 term (secular equation, deflation, permutations) is larger than the merge products below m about 1900, so the unit is m^2; the constant is the median over m 64 to 512 (it is size dependent: 48 to 62 on the M5 fit, 145 to 178 on the Zen 5). Real types only (the complex value repeats the real one).

§tridiag_evd_dc: Rate

Divide and conquer symmetric tridiagonal EVD (tridiag_evd, eigenvectors on), the whole serial solve of size m per m^2, used as bidiag_svd_dc (88 to 102 on the Zen 5 over m 64 to 512). Real types only.

§triangular_inverse: Rate

Triangular inverse (invert_*_triangular), the whole serial inverse of size m per m^3; the join of size n has the two halves as work, 2 (n/2)^3. The constant is the median over m 64 to 512 and falls with the size (on the Zen 5, f64 0.047 per m^3 at 64 to 0.0145 at 512), so a join near the floor is a little overestimated.

§sparse_matmul: Rate

Sparse by sparse numeric product, per multiply-add of the symbolic flop count (SparseMatMulInfo, free to read); the median over the measured densities and sizes.

§householder_rank_one: Rate

Rank-one Householder apply (N == 1), per element of the target M*K.

§lu_swap: Rate

One row swap of one column in the LU swap stage (random pivot rows, columns of 64 to 1024 elements, cache resident, one thread; memory bound, so the c64 value is the larger element width, not four times the f64 one).

Implementations§

Source§

impl Rates

Source

pub const X86_64_AVX512: Rates

x86_64-avx512: Zen 5 at 2.0 GHz, boost off (see the type docs).

Source

pub const AARCH64_APPLE: Rates

aarch64-apple: Apple M5 Max (the constants of the first calibration).

Source

pub const GENERIC: Rates

generic (every unmeasured class): per entry the smaller of the measured rows.

Source

pub fn for_class(class: HostClass) -> &'static Rates

The row of a host class.

Trait Implementations§

Source§

impl Clone for Rates

Source§

fn clone(&self) -> Self

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Copy for Rates

Source§

impl Debug for Rates

Source§

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

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

impl PartialEq for Rates

Source§

fn eq(&self, other: &Self) -> bool

Equality operator ==. Read more
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Inequality operator !=. Read more
Source§

impl StructuralPartialEq for Rates

Auto Trait Implementations§

§

impl Freeze for Rates

§

impl RefUnwindSafe for Rates

§

impl Send for Rates

§

impl Sync for Rates

§

impl Unpin for Rates

§

impl UnsafeUnpin for Rates

§

impl UnwindSafe for Rates

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> Boilerplate for T
where T: Copy + Send + Sync + Debug + PartialEq + 'static,

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> ByRef<T> for T

Source§

fn by_ref(&self) -> &T

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

impl<T> DistributionExt for T
where T: ?Sized,

Source§

fn rand<T>(&self, rng: &mut (impl ?Sized + Rng)) -> T
where Self: Distribution<T>,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Imply<T> for U
where T: ?Sized, U: ?Sized,

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> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
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 = !

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, !>

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

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V