Skip to content

BLAS 3::gemm

Nathan Ellingwood edited this page Nov 12, 2019 · 1 revision

KokkosBlas::gemm()

Header File: KokkosBlas3_gemm.hpp

Usage: KokkosBlas::gemm(modeA, modeB, alpha, A, B, beta, C);

Dense matrix-matrix multiply: C = beta*C + alpha*op(A)*op(B)

Interface Single Vector only

template<class AViewType,
         class BViewType,
         class CViewType>
void
gemm (const char transA[],
      const char transB[],
      typename AViewType::const_value_type& alpha,
      const AViewType& A,
      const BViewType& B,
      typename CViewType::const_value_type& beta,
      const CViewType& C)

Parameters:

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

Arguments:

  • transA [in] "N" for non-transpose, "T" for transpose, "C" for conjugate transpose. All characters after the first are ignored. This works just like the BLAS routines.
  • transB [in] "N" for non-transpose, "T" for transpose, "C" for conjugate transpose. All characters after the first are ignored. This works just like the BLAS routines.
  • alpha [in] Input coefficient of A*x
  • A [in] Input matrix, as a 2-D Kokkos::View
  • B [in] Input matrix, as a 2-D Kokkos::View
  • beta [in] Input coefficient of C
  • C [in/out] Output vector, as a nonconst 2-D Kokkos::View

Requirements:

  • For a given mode, the dimensions of the matrices must align as necessary for matrix multiplication

Example

#include<Kokkos_Core.hpp>
#include<KokkosBlas3_gemm.hpp>

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

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

   Kokkos::View<double**> A("A",M,N);
   Kokkos::View<double**> B("B",N,M);
   Kokkos::View<double**> C("C",M,M);
   
   Kokkos::deep_copy(A,1.0);
   Kokkos::deep_copy(B,2.0);

   const double alpha = double(1.0);
   const double beta = double(0.0);
   
   KokkosBlas::gemm("N","N",alpha,A,B,beta,C);

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