pub trait ComputeBackend: Send + Sync {
Show 20 methods
// Required methods
fn name(&self) -> &'static str;
fn device_type(&self) -> DeviceType;
fn preferred_order(&self) -> MemoryOrder;
fn gemm<T: Scalar>(
&self,
desc: GemmDescriptor<'_, T>,
) -> Result<(), BackendError>;
fn transpose<T: Scalar>(
&self,
desc: TransposeDescriptor<'_, T>,
) -> Result<(), BackendError>;
// Provided methods
fn is_available(&self) -> bool { ... }
fn svd<T: Scalar>(
&self,
_desc: SvdDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn qr<T: Scalar>(
&self,
_desc: QrDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn lq<T: Scalar>(
&self,
_desc: LqDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn eigh<T: Scalar>(
&self,
_desc: EighDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn eig<T: Scalar>(
&self,
_desc: EigDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn solve<T: Scalar>(
&self,
_desc: SolveDescriptor<'_, T>,
) -> Result<(), BackendError> { ... }
fn par_for_svd(&self, _m: usize, _n: usize) -> ExecPolicy { ... }
fn par_for_qr(&self, _m: usize, _n: usize) -> ExecPolicy { ... }
fn par_for_lq(&self, _m: usize, _n: usize) -> ExecPolicy { ... }
fn par_for_eigh(&self, _n: usize) -> ExecPolicy { ... }
fn par_for_eig(&self, _n: usize) -> ExecPolicy { ... }
fn par_for_gemm(&self, _m: usize, _n: usize, _k: usize) -> ExecPolicy { ... }
fn par_for_solve(&self, _n: usize, _nrhs: usize) -> ExecPolicy { ... }
fn par_for_transpose(&self, _shape: &[usize]) -> ExecPolicy { ... }
}Expand description
Pluggable compute backend trait
Required Methods§
Sourcefn device_type(&self) -> DeviceType
fn device_type(&self) -> DeviceType
Device type
Sourcefn preferred_order(&self) -> MemoryOrder
fn preferred_order(&self) -> MemoryOrder
Preferred memory order for this backend’s data layout.
Descriptor data (input/output slices) is expected in this order. The linalg layer converts tensors to this order before constructing descriptors.
This is an implementor-facing contract, not a user entry point:
backend implementors must report the layout their kernels assume so
the linalg / algorithm layers can normalize to it. End users never
call it — the public Tensor surface hides memory layout entirely.
Sourcefn gemm<T: Scalar>(
&self,
desc: GemmDescriptor<'_, T>,
) -> Result<(), BackendError>
fn gemm<T: Scalar>( &self, desc: GemmDescriptor<'_, T>, ) -> Result<(), BackendError>
GEMM: C = alpha * A * B + beta * C
Sourcefn transpose<T: Scalar>(
&self,
desc: TransposeDescriptor<'_, T>,
) -> Result<(), BackendError>
fn transpose<T: Scalar>( &self, desc: TransposeDescriptor<'_, T>, ) -> Result<(), BackendError>
Transpose tensor
Provided Methods§
Sourcefn is_available(&self) -> bool
fn is_available(&self) -> bool
Check if backend is available
Sourcefn svd<T: Scalar>(
&self,
_desc: SvdDescriptor<'_, T>,
) -> Result<(), BackendError>
fn svd<T: Scalar>( &self, _desc: SvdDescriptor<'_, T>, ) -> Result<(), BackendError>
Thin SVD: A = U * diag(S) * Vt
Sourcefn qr<T: Scalar>(&self, _desc: QrDescriptor<'_, T>) -> Result<(), BackendError>
fn qr<T: Scalar>(&self, _desc: QrDescriptor<'_, T>) -> Result<(), BackendError>
Thin QR: A = Q * R
Sourcefn lq<T: Scalar>(&self, _desc: LqDescriptor<'_, T>) -> Result<(), BackendError>
fn lq<T: Scalar>(&self, _desc: LqDescriptor<'_, T>) -> Result<(), BackendError>
Thin LQ: A = L * Q
Sourcefn eigh<T: Scalar>(
&self,
_desc: EighDescriptor<'_, T>,
) -> Result<(), BackendError>
fn eigh<T: Scalar>( &self, _desc: EighDescriptor<'_, T>, ) -> Result<(), BackendError>
Self-adjoint eigenvalue decomposition: A = V * diag(W) * V^H
Sourcefn eig<T: Scalar>(
&self,
_desc: EigDescriptor<'_, T>,
) -> Result<(), BackendError>
fn eig<T: Scalar>( &self, _desc: EigDescriptor<'_, T>, ) -> Result<(), BackendError>
General eigenvalue decomposition
Sourcefn solve<T: Scalar>(
&self,
_desc: SolveDescriptor<'_, T>,
) -> Result<(), BackendError>
fn solve<T: Scalar>( &self, _desc: SolveDescriptor<'_, T>, ) -> Result<(), BackendError>
Linear solve: AX = B via LU decomposition
Sourcefn par_for_svd(&self, _m: usize, _n: usize) -> ExecPolicy
fn par_for_svd(&self, _m: usize, _n: usize) -> ExecPolicy
Recommended execution policy for SVD at the given problem size.
Default returns Sequential; performance-oriented backends (e.g. NativeBackend)
override this with a hardware-aware threshold table.
Sourcefn par_for_qr(&self, _m: usize, _n: usize) -> ExecPolicy
fn par_for_qr(&self, _m: usize, _n: usize) -> ExecPolicy
Recommended execution policy for QR at the given problem size.
Sourcefn par_for_lq(&self, _m: usize, _n: usize) -> ExecPolicy
fn par_for_lq(&self, _m: usize, _n: usize) -> ExecPolicy
Recommended execution policy for LQ at the given problem size.
Sourcefn par_for_eigh(&self, _n: usize) -> ExecPolicy
fn par_for_eigh(&self, _n: usize) -> ExecPolicy
Recommended execution policy for self-adjoint eigendecomposition.
Sourcefn par_for_eig(&self, _n: usize) -> ExecPolicy
fn par_for_eig(&self, _n: usize) -> ExecPolicy
Recommended execution policy for general eigendecomposition.
Sourcefn par_for_gemm(&self, _m: usize, _n: usize, _k: usize) -> ExecPolicy
fn par_for_gemm(&self, _m: usize, _n: usize, _k: usize) -> ExecPolicy
Recommended execution policy for GEMM at the given problem size.
Sourcefn par_for_solve(&self, _n: usize, _nrhs: usize) -> ExecPolicy
fn par_for_solve(&self, _n: usize, _nrhs: usize) -> ExecPolicy
Recommended execution policy for linear solve.
Sourcefn par_for_transpose(&self, _shape: &[usize]) -> ExecPolicy
fn par_for_transpose(&self, _shape: &[usize]) -> ExecPolicy
Recommended execution policy for tensor transpose.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety".