22#ifndef BELFEM_FN_GEMM_HPP
23#define BELFEM_FN_GEMM_HPP
122 template<
typename T >
139 "gemm not implemented for selected data type" );
160 sgemm_(
const_cast< char *
> ( transa ),
161 const_cast< char *
> ( transb ),
162 const_cast< int_t *
> ( m ),
163 const_cast< int_t *
> ( n ),
164 const_cast< int_t *
> ( k ),
165 const_cast< float *
> (
alpha ),
166 const_cast< float *
> ( a ),
167 const_cast< int_t *
> ( lda ),
168 const_cast< float *
> ( b ),
169 const_cast< int_t *
> ( ldb ),
170 const_cast< float *
> ( beta ),
172 const_cast< int_t *
> ( ldc ),
185 const double * alpha,
194 dgemm_(
const_cast< char *
> ( transa ),
195 const_cast< char *
> ( transb ),
196 const_cast< int_t *
> ( m ),
197 const_cast< int_t *
> ( n ),
198 const_cast< int_t *
> ( k ),
199 const_cast< double *
>(
alpha ),
200 const_cast< double *
>( a ),
201 const_cast< int_t *
> ( lda ),
202 const_cast< double *
>( b ),
203 const_cast< int_t *
> ( ldb ),
204 const_cast< double *
>( beta ),
206 const_cast< int_t *
> ( ldc ),
219 const std::complex< float > * alpha,
220 const std::complex< float > * a,
222 const std::complex< float > * b,
224 const std::complex< float > * beta,
225 std::complex< float > * c,
228 cgemm_(
const_cast< char *
> ( transa ),
229 const_cast< char *
> ( transb ),
230 const_cast< int_t *
> ( m ),
231 const_cast< int_t *
> ( n ),
232 const_cast< int_t *
> ( k ),
235 const_cast< int_t *
> ( lda ),
237 const_cast< int_t *
> ( ldb ),
240 const_cast< int_t *
> ( ldc ),
253 const std::complex< double > * alpha,
254 const std::complex< double > * a,
256 const std::complex< double > * b,
258 const std::complex< double > * beta,
259 std::complex< double > * c,
262 zgemm_(
const_cast< char *
> ( transa ),
263 const_cast< char *
> ( transb ),
264 const_cast< int_t *
> ( m ),
265 const_cast< int_t *
> ( n ),
266 const_cast< int_t *
> ( k ),
269 const_cast< int_t *
> ( lda ),
271 const_cast< int_t *
> ( ldb ),
274 const_cast< int_t *
> ( ldc ),
296 template<
typename T >
304 const char transa =
'N',
305 const char transb =
'N' )
308 const bool tNoTransA = ( transa ==
'N' || transa ==
'n' );
309 const bool tNoTransB = ( transb ==
'N' || transb ==
'n' );
311 BELFEM_ASSERT( transa ==
'N' || transa ==
'T' || transa ==
'C' ||
312 transa ==
'n' || transa ==
't' || transa ==
'c',
313 "unsupported transa flag '%c'", transa );
315 BELFEM_ASSERT( transb ==
'N' || transb ==
'T' || transb ==
'C' ||
316 transb ==
'n' || transb ==
't' || transb ==
'c',
317 "unsupported transb flag '%c'", transb );
321 int_t n = (
int_t ) ( tNoTransB ? B.n_cols() : B.n_rows() );
324 "Inner dimensions of op(A) and op(B) do not match ( %u vs %u )",
326 (
unsigned int ) ( tNoTransB ? B.n_rows() : B.n_cols() ) );
328 if ( beta ==
static_cast< T
>( 0.0 ) )
330 C.set_size( m, n, 0.0 );
334 "Number of rows of op(A) and C do not match ( %u vs %u )",
335 (
unsigned int ) m, (
unsigned int ) C.n_rows() );
338 "Number of cols of op(B) and C do not match ( %u vs %u )",
339 (
unsigned int ) n, (
unsigned int ) C.n_cols() );
#define BELFEM_ASSERT(aCheck,...)
Definition assert.hpp:244
Dense column-major matrix.
Definition cl_BZ_Matrix.hpp:28
size_t n_rows() const
Definition cl_AR_Matrix.hpp:205
size_t n_cols() const
Definition cl_AR_Matrix.hpp:213
T * data()
Definition cl_AR_Matrix.hpp:135
Definition fn_gees.hpp:33
void zgemm_(char *transa, char *transb, int_t *m, int_t *n, int_t *k, cplx_double_t *alpha, cplx_double_t *a, int_t *lda, cplx_double_t *b, int_t *ldb, cplx_double_t *beta, cplx_double_t *c, int_t *ldc, fortran_charlen_t lta, fortran_charlen_t ltb)
void sgemm_(char *transa, char *transb, int_t *m, int_t *n, int_t *k, float *alpha, float *a, int_t *lda, float *b, int_t *ldb, float *beta, float *c, int_t *ldc, fortran_charlen_t lta, fortran_charlen_t ltb)
constexpr bool dependent_false
Definition lapacktools.hpp:49
float cplx_float_t
Definition lapacktools.hpp:90
int_t leading_dimension(const Vector< T > &A)
logical length of a vector operand, as passed to LAPACK as LDB; vector storage is contiguous under bo...
Definition lapacktools.hpp:143
void gemm(const char *transa, const char *transb, const int_t *m, const int_t *n, const int_t *k, const T *alpha, const T *a, const int_t *lda, const T *b, const int_t *ldb, const T *beta, T *c, const int_t *ldc)
Definition fn_gemm.hpp:124
size_t fortran_charlen_t
Definition lapacktools.hpp:100
void dgemm_(char *transa, char *transb, int_t *m, int_t *n, int_t *k, double *alpha, double *a, int_t *lda, double *b, int_t *ldb, double *beta, double *c, int_t *ldc, fortran_charlen_t lta, fortran_charlen_t ltb)
double cplx_double_t
Definition lapacktools.hpp:91
void cgemm_(char *transa, char *transb, int_t *m, int_t *n, int_t *k, cplx_float_t *alpha, cplx_float_t *a, int_t *lda, cplx_float_t *b, int_t *ldb, cplx_float_t *beta, cplx_float_t *c, int_t *ldc, fortran_charlen_t lta, fortran_charlen_t ltb)
USER GUIDES:
Definition cl_Capacitor.cpp:16
void gemm(const Matrix< T > &A, const Matrix< T > &B, Matrix< T > &C, const T alpha=1.0, const T beta=0.0, const char transa='N', const char transb='N')
matrix-matrix product C := alpha * op(A) * op(B) + beta * C via BLAS ?gemm, where op is the identity ...
Definition fn_gemm.hpp:298
@ alpha
Definition cl_Material.hpp:161
int32_t int_t
Definition typedefs.hpp:51