Level 3¶
The prototypes for the following routines can be found at include/elemental/blaslike/decl.hpp, while the implementations are in include/elemental/blaslike/level3/.
Gemm¶
General matrixmatrix multiplication: updates \(C := \alpha A^\# B^\sharp + \beta C\), where \(M^\#\) and \(M^\sharp\) are individually defined to be one of \(\{M,M^T,M^H\}\).

void
Gemm
(Orientation orientationOfA, Orientation orientationOfB, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C)¶

void
Gemm
(Orientation orientationOfA, Orientation orientationOfB, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C)¶
Hemm¶
Hermitian matrixmatrix multiplication: updates
\(C := \alpha A B + \beta C\), or
\(C := \alpha B A + \beta C\), depending upon whether side is set to
LEFT
or RIGHT
, respectively. In both of these types of updates,
\(A\) is implicitly Hermitian and only the triangle specified by uplo is
accessed.

void
Hemm
(LeftOrRight side, UpperOrLower uplo, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C)¶

void
Hemm
(LeftOrRight side, UpperOrLower uplo, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C)¶
Her2k¶
Hermitian rank2K update: updates
\(C := \alpha (A B^H + B A^H) + \beta C\), or
\(C := \alpha (A^H B + B^H A) + \beta C\), depending upon whether
orientation is set to NORMAL
or ADJOINT
, respectively. Only the
triangle of \(C\) specified by the uplo parameter is modified.

void
Her2k
(UpperOrLower uplo, Orientation orientation, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C)¶

void
Her2k
(UpperOrLower uplo, Orientation orientation, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C)¶
Please see SetLocalTrr2kBlocksize<T>()
and LocalTrr2kBlocksize<T>()
in the
Tuning parameters section for information on tuning the distributed
Her2k()
.
Herk¶
Hermitian rankK update: updates
\(C := \alpha A A^H + \beta C\), or
\(C := \alpha A^H A + \beta C\), depending upon whether orientation is
set to NORMAL
or ADJOINT
, respectively. Only the triangle of \(C\)
specified by the uplo parameter is modified.

void
Herk
(UpperOrLower uplo, Orientation orientation, T alpha, const Matrix<T> &A, T beta, Matrix<T> &C)¶

void
Herk
(UpperOrLower uplo, Orientation orientation, T alpha, const DistMatrix<T> &A, T beta, DistMatrix<T> &C)¶
Please see SetLocalTrrkBlocksize<T>()
and LocalTrrkBlocksize<T>()
in the Tuning parameters
section for information on tuning the distributed Herk()
.
Multishift QuasiTrsm¶
Solve for \(X\) in the linear system
or
where \(T\) is quasitriangular, \(D\) is diagonal, and
\(A^\#\) is defined to be one of \(\{A,A^T,A^H\}\).
The data movement requires almost no modification from that of
QuasiTrsm()
.
Note that the term quasitriangular is in the context of real Schur decompositions, which produce triangular matrices with mixes of \(1 \times 1\) and \(2 \times 2\) diagonal blocks.
Note
There is no corresponding BLAS routine, but it is a natural extension of Trsm.

void
MultiShiftQuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const Matrix<F> &T, const Matrix<F> &shifts, Matrix<F> &X)¶

void
MultiShiftQuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const DistMatrix<F> &T, const DistMatrix<F, VR, STAR> &shifts, DistMatrix<F> &X)¶ Overwrite the columns of X with the solutions to the shifted linear systems.

void
MultiShiftQuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, Complex<Real> alpha, const Matrix<Real> &T, const Matrix<Complex<Real>> &shifts, Matrix<Real> &XReal, Matrix<Real> &XImag)¶

void
MultiShiftQuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, Complex<Real> alpha, const DistMatrix<Real> &T, const DistMatrix<Complex<Real>, VR, STAR> &shifts, DistMatrix<Real> &XReal, DistMatrix<Real> &XImag)¶ Overwrite the columns of the real and imaginary parts of X with the solutions to the shifted linear systems.
Multishift Trsm¶
Solve for \(X\) in the linear system
or
where \(T\) is triangular, \(D\) is diagonal, and
\(A^\#\) is defined to be one of \(\{A,A^T,A^H\}\).
The data movement requires almost no modification from that of Trsm()
.
Note
There is no corresponding BLAS routine, but it is a natural modification of Trsm.

void
MultiShiftTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const Matrix<F> &T, const Matrix<F> &shifts, Matrix<F> &X)¶

void
MultiShiftTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const DistMatrix<F> &T, const DistMatrix<F, VR, STAR> &shifts, DistMatrix<F> &X)¶ Overwrite the columns of X with the solutions to the shifted linear systems.

void
MultiShiftTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, Complex<Real> alpha, const Matrix<Real> &T, const Matrix<Complex<Real>> &shifts, Matrix<Real> &XReal, Matrix<Real> &XImag)¶

void
MultiShiftTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, Complex<Real> alpha, const DistMatrix<Real> &T, const DistMatrix<Complex<Real>, VR, STAR> &shifts, DistMatrix<Real> &XReal, DistMatrix<Real> &XImag)¶ Overwrite the columns of the real and imaginary parts of X with the solutions to the shifted linear systems.
QuasiTrsm¶
Solve for \(X\) in the linear system
or
where \(T\) is quasitriangular and
\(A^\#\) is defined to be one of \(\{A,A^T,A^H\}\).
The algorithm is very similar to that of Trsm()
.
Note that the term quasitriangular is in the context of real Schur decompositions, which produce triangular matrices with mixes of \(1 \times 1\) and \(2 \times 2\) diagonal blocks.
Note
There is no corresponding BLAS routine, but it is a natural extension of Trsm.

void
QuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const Matrix<F> &T, const Matrix<F> &shifts, Matrix<F> &X, bool checkIfSingular = false)¶

void
QuasiTrsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, F alpha, const DistMatrix<F> &T, const DistMatrix<F, VR, STAR> &shifts, DistMatrix<F> &X, bool checkIfSingular = false)¶ Overwrite the columns of X with the solutions to the shifted linear systems.
Symm¶
Symmetric matrixmatrix multiplication: updates
\(C := \alpha A B + \beta C\), or
\(C := \alpha B A + \beta C\), depending upon whether side is set to
LEFT
or RIGHT
, respectively. In both of these types of updates,
\(A\) is implicitly symmetric and only the triangle specified by uplo
is accessed.

void
Symm
(LeftOrRight side, UpperOrLower uplo, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C, bool conjugate = false)¶

void
Symm
(LeftOrRight side, UpperOrLower uplo, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C, bool conjugate = false)¶
Syr2k¶
Symmetric rank2K update: updates
\(C := \alpha (A B^T + B A^T) + \beta C\), or
\(C := \alpha (A^T B + B^T A) + \beta C\), depending upon whether
orientation is set to NORMAL
or TRANSPOSE
, respectively. Only the
triangle of \(C\) specified by the uplo parameter is modified.

void
Syr2k
(UpperOrLower uplo, Orientation orientation, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C)¶

void
Syr2k
(UpperOrLower uplo, Orientation orientation, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C)¶
Please see SetLocalTrr2kBlocksize<T>()
and LocalTrr2kBlocksize<T>()
in the
Tuning parameters section for information on tuning the distributed
Syr2k()
.
Syrk¶
Symmetric rankK update: updates
\(C := \alpha A A^T + \beta C\), or
\(C := \alpha A^T A + \beta C\), depending upon whether orientation is
set to NORMAL
or TRANSPOSE
, respectively. Only the triangle of \(C\)
specified by the uplo parameter is modified.

void
Syrk
(UpperOrLower uplo, Orientation orientation, T alpha, const Matrix<T> &A, T beta, Matrix<T> &C)¶

void
Syrk
(UpperOrLower uplo, Orientation orientation, T alpha, const DistMatrix<T> &A, T beta, DistMatrix<T> &C)¶
Please see SetLocalTrrkBlocksize<T>()
and LocalTrrkBlocksize<T>()
in the Tuning parameters
section for information on tuning the distributed Syrk()
.
Trmm¶
Triangular matrixmatrix multiplication: performs
\(C := \alpha A^\# B\), or
\(C := \alpha B A^\#\), depending upon whether side was chosen
to be LEFT
or RIGHT
, respectively. Whether \(A\) is treated as
lower or upper triangular is determined by uplo, and \(A^\#\) is defined to
be one of \(\{A,A^T,A^H\}\) (and diag determines
whether \(A\) is treated as unitdiagonal or not).

void
Trmm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, T alpha, const Matrix<T> &A, Matrix<T> &B)¶

void
Trmm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, T alpha, const DistMatrix<T> &A, DistMatrix<T> &B)¶
Trr2k¶
Triangular rank2k update: performs \(E := \alpha ( A^\# B^\sharp + C^\Diamond D^\triangle ) + \beta E\), where only the triangle of E specified by uplo is modified, and the orientation of each input matrix, e.g., \(A^\# \in \{A,A^T,A^H\}\), is determined by orientationOfX for each \(X \in \left\{A,B,C,D\right\}\).
Note
There is no corresponding BLAS routine, but it is a natural generalization of “symmetric” and “Hermitian” updates.

void
Trr2k
(UpperOrLower uplo, Orientation orientationOfA, Orientation orientationOfB, Orientation orientationOfC, Orientation orientationOfD, T alpha, const Matrix<T> &A, const Matrix<T> &B, const Matrix<T> &C, const Matrix<T> &D, T beta, Matrix<T> &E)¶

void
Trr2k
(UpperOrLower uplo, Orientation orientationOfA, Orientation orientationOfB, Orientation orientationOfC, Orientation orientationOfD, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, const DistMatrix<T> &C, const DistMatrix<T> &D, T beta, DistMatrix<T> &E)¶
Trrk¶
Triangular rankk update: performs \(C := \alpha A^\# B^\sharp + \beta C\), where only the triangle of C specified by uplo is modified, and the orientations \(A^\#\) and \(B^\sharp\) are determined by orientationOfA and orientationOfB, respectively.
Note
There is no corresponding BLAS routine, but this type of update is frequently encountered, even in serial. For instance, the symmetric rankk update performed during an LDL factorization is symmetric but one of the two update matrices is scaled by D.

void
Trrk
(UpperOrLower uplo, Orientation orientationOfA, Orientation orientationOfB, T alpha, const Matrix<T> &A, const Matrix<T> &B, T beta, Matrix<T> &C)¶

void
Trrk
(UpperOrLower uplo, Orientation orientationOfA, Orientation orientationOfB, T alpha, const DistMatrix<T> &A, const DistMatrix<T> &B, T beta, DistMatrix<T> &C)¶
Trtrmm¶
Note
This routine loosely corresponds with the LAPACK routines ?lauum.
Symmetric/Hermitian triangular matrixmatrix multiply: performs \(L := L^T L\), \(L := L^H L\), \(U := U U^T\), or \(U := U U^H\), depending upon the choice of the orientation and uplo parameters.

void
Trtrmm
(Orientation orientation, UpperOrLower uplo, Matrix<T> &A)¶

void
Trtrmm
(Orientation orientation, UpperOrLower uplo, DistMatrix<T> &A)¶
Trdtrmm¶
Note
This is a modification of Trtrmm for LDL factorizations.
Symmetric/Hermitian triangular matrixmatrix multiply (with diagonal scaling): performs \(L := L^T D^{1} L\), \(L := L^H D^{1} L\), \(U := U D^{1} U^T\), or \(U := U D^{1} U^H\), depending upon the choice of the orientation and uplo parameters. Note that \(L\) and \(U\) are unitdiagonal and their diagonal is overwritten with \(D\).

void
Trdtrmm
(Orientation orientation, UpperOrLower uplo, Matrix<F> &A)¶

void
Trdtrmm
(Orientation orientation, UpperOrLower uplo, DistMatrix<F> &A)¶
Trsm¶
Triangular solve with multiple righthand sides: performs
\(C := \alpha A^{\#} B\), or
\(C := \alpha B A^{\#}\), depending upon whether side was
chosen to be LEFT
or RIGHT
, respectively. Whether \(A\) is treated
as lower or upper triangular is determined by uplo, and \(A^{\#}\)
can be \(A^{1}\), \(A^{T}\), or \(A^{H}\) (and diag determines
whether \(A\) is treated as unitdiagonal or not).

void
Trsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, F alpha, const Matrix<F> &A, Matrix<F> &B)¶

void
Trsm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, F alpha, const DistMatrix<F> &A, DistMatrix<F> &B)¶
Trstrm¶
Performs a triangular solve against a triangular matrix. Only the Left Lower Normal option is currently supported.

void
Trstrm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, F alpha, const Matrix<F> &A, Matrix<F> &X, bool checkIfSingular = true)¶

void
Trstrm
(LeftOrRight side, UpperOrLower uplo, Orientation orientation, UnitOrNonUnit diag, F alpha, const DistMatrix<F> &A, DistMatrix<F> &X, bool checkIfSingular = true)¶
Twosided Trmm¶
Performs a twosided triangular multiplication with multiple righthand sides which preserves the symmetry of the input matrix, either \(A := L^H A L\) or \(A := U A U^H\).

void
TwoSidedTrmm
(UpperOrLower uplo, UnitOrNonUnit diag, Matrix<T> &A, const Matrix<T> &B)¶

void
TwoSidedTrmm
(UpperOrLower uplo, UnitOrNonUnit diag, DistMatrix<T> &A, const DistMatrix<T> &B)¶
Twosided Trsm¶
Performs a twosided triangular solves with multiple righthand sides which preserves the symmetry of the input matrix, either \(A := L^{1} A L^{H}\) or \(A := U^{H} A U^{1}\).

void
TwoSidedTrsm
(UpperOrLower uplo, UnitOrNonUnit diag, Matrix<F> &A, const Matrix<F> &B)¶

void
TwoSidedTrsm
(UpperOrLower uplo, UnitOrNonUnit diag, DistMatrix<F> &A, const DistMatrix<F> &B)¶