Skip to content

BLAS 3::trsm

Vinh Dang edited this page Feb 18, 2020 · 20 revisions

KokkosBlas::trsm()

Header File: KokkosBlas3_trsm.hpp

Usage: KokkosBlas::trsm(side, uplo, trans, diag, alpha, A, B);

Triangular linear system solve with multiple right-hand-sides:

op(A)*X = alpha*B if side == "L" or "l"

X*op(A) = alpha*B if side == "R" or "r"

MultiVector Interface only

template<class AViewType,
         class BViewType>
void
trsm (const char side[],
      const char uplo[],
      const char trans[],
      const char diag[],
      typename BViewType::const_value_type& alpha,
      const AViewType& A,
      const BViewType& B)

Parameters:

  • AViewType: 2-D Kokkos::View
  • BViewType: 2-D Kokkos::View

Arguments:

  • side [in] "L" or "l" indicates matrix A is on the left of X, "R" or "r" indicates matrix A is on the right of X.
  • uplo [in] "U" or "u" indicates matrix A upper part is stored (the other part is not referenced), "L" or "l" indicates matrix A lower part is stored (the other part is not referenced).
  • trans [in] "N" or "n" for non-transpose, "T" or "t" for transpose, "C" or "c" for conjugate transpose.
  • diag [in] "U" or "u" indicates the diagonal of A is assumed to be unit, "N" or "n" indicated the diagonal of A is assumed to be non-unit.
  • alpha [in] Input coefficient used for multiplication with B.
  • A [in] Input matrix, as a 2-D Kokkos::View. If side == "L" or "l", matrix A is a M-by-M triangular matrix; otherwise, matrix A is a N-by-N triangular matrix.
  • B [in,out] Input/Output matrix, as a 2-D Kokkos::View. On entry, M-by-N matrix of multile RHS. On exit, overwritten with the solution X.

Requirements:

  • For a given set of side, uplo, trans, and diag, the dimensions of the matrices must align as necessary for triangular linear system solve.

Example

#include<Kokkos_Core.hpp>
#include<Kokkos_Random.hpp>
#include<KokkosBlas3_trsm.hpp>

int main(int argc, char* argv[]) {
   Kokkos::initialize();

   int M = atoi(argv[1]);
   int N = atoi(argv[2]);
   int K = N;

   using ViewType = Kokkos::View<double**>;
   using Scalar   = typename ViewType::value_type;

   ViewType A("A",K,K);
   ViewType B("B",M,N);

   Kokkos::Random_XorShift64_Pool<typename ViewType::device_type::execution_space> rand_pool(13718);
   Kokkos::fill_random(A,rand_pool,Scalar(10));
   Kokkos::fill_random(B,rand_pool,Scalar(10));

   const Scalar alpha = 1.0;
   
   KokkosBlas::trsm("R","L","T","N",alpha,A,B);

   Kokkos::finalize();
}
Clone this wiki locally