1
0
mirror of https://github.com/TREX-CoE/qmckl.git synced 2024-06-30 00:44:52 +02:00
qmckl/org/qmckl_blas.org
2021-09-15 16:21:42 +02:00

8.5 KiB

BLAS functions

Matrix operations

qmckl_dgemm

Matrix multiply l$C_{ij} = \beta C_{ij} + \alpha \sum_{k} A_{ik} \cdot B_{kj}$ using Fortran matmul function. TODO: Add description about the external library dependence.

qmckl_context context in Global state
bool TransA in Number of rows of the input matrix
bool TransB in Number of rows of the input matrix
int64_t m in Number of rows of the input matrix
int64_t n in Number of columns of the input matrix
int64_t k in Number of columns of the input matrix
double alpha in Number of columns of the input matrix
double A[][lda] in Array containing the $m \times n$ matrix $A$
int64_t lda in Leading dimension of array A
double B[][ldb] in Array containing the $n \times m$ matrix $B$
int64_t ldb in Leading dimension of array B
double beta in Array containing the $n \times m$ matrix $B$
double C[][ldc] out Array containing the $n \times m$ matrix $B$
int64_t ldc in Leading dimension of array B

Requirements

  • context is not QMCKL_NULL_CONTEXT
  • m > 0
  • n > 0
  • k > 0
  • lda >= m
  • ldb >= n
  • ldc >= n
  • A is allocated with at least $m \times k \times 8$ bytes
  • B is allocated with at least $k \times n \times 8$ bytes
  • C is allocated with at least $m \times n \times 8$ bytes

C header

qmckl_exit_code qmckl_dgemm (
const qmckl_context context,
const bool TransA,
const bool TransB,
const int64_t m,
const int64_t n,
const int64_t k,
const double alpha,
const double* A,
const int64_t lda,
const double* B,
const int64_t ldb,
const double beta,
double* const C,
const int64_t ldc );

Source

integer function qmckl_dgemm_f(context, TransA, TransB, m, n, k, alpha, A, LDA, B, LDB, beta, C, LDC) &
 result(info)
use qmckl
implicit none
integer(qmckl_context)  , intent(in)  :: context
logical*8  , intent(in)  :: TransA, TransB
integer*8  , intent(in)  :: m, n, k
real*8     , intent(in)  :: alpha, beta
integer*8  , intent(in)  :: lda
real*8     , intent(in)  :: A(m,k)
integer*8  , intent(in)  :: ldb
real*8     , intent(in)  :: B(k,n)
integer*8  , intent(in)  :: ldc
real*8     , intent(out) :: C(m,n)

integer*8 :: i,j,l

info = QMCKL_SUCCESS

if (context == QMCKL_NULL_CONTEXT) then
 info = QMCKL_INVALID_CONTEXT
 return
endif

if (m <= 0_8) then
 info = QMCKL_INVALID_ARG_4
 return
endif

if (n <= 0_8) then
 info = QMCKL_INVALID_ARG_5
 return
endif

if (k <= 0_8) then
 info = QMCKL_INVALID_ARG_6
 return
endif

if (LDA .ne. m) then
 info = QMCKL_INVALID_ARG_9
 return
endif

if (LDB .ne. k) then
 info = QMCKL_INVALID_ARG_10
 return
endif

if (LDC .ne. m) then
 info = QMCKL_INVALID_ARG_13
 return
endif

C = matmul(A,B)
end function qmckl_dgemm_f