34#include <visp3/core/vpConfig.h>
35#include <visp3/core/vpMatrix.h>
37#ifndef DOXYGEN_SHOULD_SKIP_THIS
39#if defined(VISP_HAVE_LAPACK)
43typedef MKL_INT integer;
45void vpMatrix::blas_dgemm(
char trans_a,
char trans_b,
unsigned int M_,
unsigned int N_,
unsigned int K_,
double alpha,
46 double *a_data,
unsigned int lda_,
double *b_data,
unsigned int ldb_,
double beta,
47 double *c_data,
unsigned int ldc_)
49 MKL_INT M =
static_cast<MKL_INT
>(M_);
50 MKL_INT N =
static_cast<MKL_INT
>(N_);
51 MKL_INT
K =
static_cast<MKL_INT
>(K_);
52 MKL_INT lda =
static_cast<MKL_INT
>(lda_);
53 MKL_INT ldb =
static_cast<MKL_INT
>(ldb_);
54 MKL_INT ldc =
static_cast<MKL_INT
>(ldc_);
56 dgemm(&trans_a, &trans_b, &M, &N, &K, &alpha, a_data, &lda, b_data, &ldb, &beta, c_data, &ldc);
59void vpMatrix::blas_dgemv(
char trans,
unsigned int M_,
unsigned int N_,
double alpha,
double *a_data,
unsigned int lda_,
60 double *x_data,
int incx_,
double beta,
double *y_data,
int incy_)
62 MKL_INT M =
static_cast<MKL_INT
>(M_);
63 MKL_INT N =
static_cast<MKL_INT
>(N_);
64 MKL_INT lda =
static_cast<MKL_INT
>(lda_);
65 MKL_INT incx =
static_cast<MKL_INT
>(incx_);
66 MKL_INT incy =
static_cast<MKL_INT
>(incy_);
68 dgemv(&trans, &M, &N, &alpha, a_data, &lda, x_data, &incx, &beta, y_data, &incy);
71#elif defined(VISP_HAVE_GSL)
73#include <gsl/gsl_blas.h>
74#include <gsl/gsl_matrix.h>
75#include <gsl/gsl_vector.h>
88 void vpMatrix::blas_dgemm(
char trans_a,
char trans_b,
unsigned int M,
unsigned int N,
unsigned int K,
double alpha,
89 double *A_data,
unsigned int lda,
double *B_data,
unsigned int ldb,
double beta,
90 double *C_data,
unsigned int ldc)
92 CBLAS_TRANSPOSE_t TransA = (trans_a ==
'n' || trans_a ==
'N') ? CblasNoTrans : CblasTrans;
93 CBLAS_TRANSPOSE_t TransB = (trans_b ==
'n' || trans_b ==
'N') ? CblasNoTrans : CblasTrans;
95 unsigned int A_rows = (TransA == CblasNoTrans) ? M :
K;
96 unsigned int A_cols = (TransA == CblasNoTrans) ? K : M;
97 unsigned int B_rows = (TransB == CblasNoTrans) ? K : N;
98 unsigned int B_cols = (TransB == CblasNoTrans) ? N :
K;
100 gsl_matrix_view A = gsl_matrix_view_array_with_tda(A_data, A_rows, A_cols, lda);
101 gsl_matrix_view B = gsl_matrix_view_array_with_tda(B_data, B_rows, B_cols, ldb);
102 gsl_matrix_view C = gsl_matrix_view_array_with_tda(C_data, M, N, ldc);
104 gsl_blas_dgemm(TransA, TransB, alpha, &A.matrix, &B.matrix, beta, &C.matrix);
112void vpMatrix::blas_dgemv(
char trans,
unsigned int M,
unsigned int N,
double alpha,
double *A_data,
unsigned int lda,
113 double *x_data,
int incx,
double beta,
double *y_data,
int incy)
115 CBLAS_TRANSPOSE_t Trans = (trans ==
'n' || trans ==
'N') ? CblasNoTrans : CblasTrans;
117 unsigned int A_rows = (Trans == CblasNoTrans) ? M : N;
118 unsigned int A_cols = (Trans == CblasNoTrans) ? N : M;
120 gsl_matrix_view A = gsl_matrix_view_array_with_tda(A_data, A_rows, A_cols, lda);
121 gsl_vector_view
x = gsl_vector_view_array_with_stride(x_data, incx, N);
122 gsl_vector_view
y = gsl_vector_view_array_with_stride(y_data, incy, M);
124 gsl_blas_dgemv(Trans, alpha, &A.matrix, &
x.vector, beta, &
y.vector);
128#ifdef VISP_HAVE_LAPACK_BUILT_IN
129typedef long int integer;
134extern "C" void dgemm_(
char *transa,
char *transb, integer *M, integer *N, integer *K,
double *alpha,
double *a,
135 integer *lda,
double *b, integer *ldb,
double *beta,
double *c, integer *ldc);
137extern "C" void dgemv_(
char *trans, integer *M, integer *N,
double *alpha,
double *a, integer *lda,
double *x,
138 integer *incx,
double *beta,
double *y, integer *incy);
140void vpMatrix::blas_dgemm(
char trans_a,
char trans_b,
unsigned int M_,
unsigned int N_,
unsigned int K_,
double alpha,
141 double *a_data,
unsigned int lda_,
double *b_data,
unsigned int ldb_,
double beta,
142 double *c_data,
unsigned int ldc_)
144 integer M =
static_cast<integer
>(M_);
145 integer
K =
static_cast<integer
>(K_);
146 integer N =
static_cast<integer
>(N_);
147 integer lda =
static_cast<integer
>(lda_);
148 integer ldb =
static_cast<integer
>(ldb_);
149 integer ldc =
static_cast<integer
>(ldc_);
151 dgemm_(&trans_a, &trans_b, &M, &N, &K, &alpha, a_data, &lda, b_data, &ldb, &beta, c_data, &ldc);
154void vpMatrix::blas_dgemv(
char trans,
unsigned int M_,
unsigned int N_,
double alpha,
double *a_data,
unsigned int lda_,
155 double *x_data,
int incx_,
double beta,
double *y_data,
int incy_)
157 integer M =
static_cast<integer
>(M_);
158 integer N =
static_cast<integer
>(N_);
159 integer lda =
static_cast<integer
>(lda_);
160 integer incx =
static_cast<integer
>(incx_);
161 integer incy =
static_cast<integer
>(incy_);
163 dgemv_(&trans, &M, &N, &alpha, a_data, &lda, x_data, &incx, &beta, y_data, &incy);
170void dummy_vpMatrix_blas() { }