pub enum EighDriver {
Auto,
Syevd,
Syevj,
}Expand description
cuSOLVER Hermitian eigensolver selection used by EighOptions on the
CUDA backend.
The driver changes speed and rounding, not the decomposition contract, so
gauges and AD rules are unaffected. CPU providers have a single eigh kernel
and ignore it. Analogous to SvdDriver and to
scipy.linalg.eigh(..., driver=...).
§Examples
use tenferro_linalg::{EighDriver, EighOptions};
let options = EighOptions::default().driver(EighDriver::Syevj);
assert_eq!(options.driver, EighDriver::Syevj);
assert_eq!(EighOptions::default().driver, EighDriver::Auto);Variants§
Auto
The backend’s default policy: the fastest divide-and-conquer routine
available. On CUDA a single matrix uses syevd/heevd and a batch
uses cusolverDnXsyevBatched, which solves the whole batch in one
launch at the same accuracy. On an A100 that is about 100x to 280x
faster than the per-matrix loop this default used before.
The batched routine is a different cuSOLVER entry point, so batched results can differ from the per-matrix loop in the last ULPs.
Syevd
cuSOLVER’s divide-and-conquer driver, which is what Self::Auto
already selects. Kept as an explicit spelling of the same choice.
Syevj
cuSOLVER’s Jacobi driver (cusolverDn<t>syevj, heevj for complex
input, and their batched forms).
Worth asking for only on batches of small matrices: measured on an A100 it is slightly ahead of the default up to about order 32 and loses from there, by about 4x at order 128 and far more on wide spectra, where it is also the less accurate of the two.
Trait Implementations§
Source§impl Clone for EighDriver
impl Clone for EighDriver
Source§fn clone(&self) -> EighDriver
fn clone(&self) -> EighDriver
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreimpl Copy for EighDriver
Source§impl Debug for EighDriver
impl Debug for EighDriver
Source§impl Default for EighDriver
impl Default for EighDriver
Source§fn default() -> EighDriver
fn default() -> EighDriver
impl Eq for EighDriver
Source§impl PartialEq for EighDriver
impl PartialEq for EighDriver
impl StructuralPartialEq for EighDriver
Auto Trait Implementations§
impl Freeze for EighDriver
impl RefUnwindSafe for EighDriver
impl Send for EighDriver
impl Sync for EighDriver
impl Unpin for EighDriver
impl UnsafeUnpin for EighDriver
impl UnwindSafe for EighDriver
Blanket Implementations§
impl<T> Boilerplate for T
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
impl<T, U> Imply<T> for U
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
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