33 #ifndef EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H 34 #define EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H 37 #include "../InternalHeaderCheck.h" 52 template <
typename Index,
typename LhsScalar,
int StorageOrder,
bool ConjugateLhs,
typename RhsScalar,
54 struct general_matrix_vector_product_gemv;
56 #define EIGEN_BLAS_GEMV_SPECIALIZE(Scalar) \ 57 template <typename Index, bool ConjugateLhs, bool ConjugateRhs> \ 58 struct general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>, ColMajor, \ 59 ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>, \ 60 ConjugateRhs, Specialized> { \ 61 static void run(Index rows, Index cols, const const_blas_data_mapper<Scalar, Index, ColMajor>& lhs, \ 62 const const_blas_data_mapper<Scalar, Index, RowMajor>& rhs, Scalar* res, Index resIncr, \ 65 general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>, ColMajor, \ 66 ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>, \ 67 ConjugateRhs, BuiltIn>::run(rows, cols, lhs, rhs, res, resIncr, alpha); \ 69 general_matrix_vector_product_gemv<Index, Scalar, ColMajor, ConjugateLhs, Scalar, ConjugateRhs>::run( \ 70 rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha); \ 74 template <typename Index, bool ConjugateLhs, bool ConjugateRhs> \ 75 struct general_matrix_vector_product<Index, Scalar, const_blas_data_mapper<Scalar, Index, RowMajor>, RowMajor, \ 76 ConjugateLhs, Scalar, const_blas_data_mapper<Scalar, Index, ColMajor>, \ 77 ConjugateRhs, Specialized> { \ 78 static void run(Index rows, Index cols, const const_blas_data_mapper<Scalar, Index, RowMajor>& lhs, \ 79 const const_blas_data_mapper<Scalar, Index, ColMajor>& rhs, Scalar* res, Index resIncr, \ 81 general_matrix_vector_product_gemv<Index, Scalar, RowMajor, ConjugateLhs, Scalar, ConjugateRhs>::run( \ 82 rows, cols, lhs.data(), lhs.stride(), rhs.data(), rhs.stride(), res, resIncr, alpha); \ 86 EIGEN_BLAS_GEMV_SPECIALIZE(
double)
87 EIGEN_BLAS_GEMV_SPECIALIZE(
float)
88 EIGEN_BLAS_GEMV_SPECIALIZE(dcomplex)
89 EIGEN_BLAS_GEMV_SPECIALIZE(scomplex)
91 #define EIGEN_BLAS_GEMV_SPECIALIZATION(EIGTYPE, BLASTYPE, BLASFUNC) \ 92 template <typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \ 93 struct general_matrix_vector_product_gemv<Index, EIGTYPE, LhsStorageOrder, ConjugateLhs, EIGTYPE, ConjugateRhs> { \ 94 typedef Matrix<EIGTYPE, Dynamic, 1, ColMajor> GEMVVector; \ 96 static void run(Index rows, Index cols, const EIGTYPE* lhs, Index lhsStride, const EIGTYPE* rhs, Index rhsIncr, \ 97 EIGTYPE* res, Index resIncr, EIGTYPE alpha) { \ 98 if (rows == 0 || cols == 0) return; \ 99 BlasIndex m = convert_index<BlasIndex>(rows), n = convert_index<BlasIndex>(cols), \ 100 lda = convert_index<BlasIndex>(lhsStride), incx = convert_index<BlasIndex>(rhsIncr), \ 101 incy = convert_index<BlasIndex>(resIncr); \ 102 const EIGTYPE beta(1); \ 103 const EIGTYPE* x_ptr; \ 104 char trans = (LhsStorageOrder == ColMajor) ? 'N' : (ConjugateLhs) ? 'C' : 'T'; \ 105 if (LhsStorageOrder == RowMajor) { \ 106 m = convert_index<BlasIndex>(cols); \ 107 n = convert_index<BlasIndex>(rows); \ 110 if (ConjugateRhs) { \ 111 Map<const GEMVVector, 0, InnerStride<> > map_x(rhs, cols, 1, InnerStride<>(incx)); \ 112 x_tmp = map_x.conjugate(); \ 113 x_ptr = x_tmp.data(); \ 118 BLASFUNC(&trans, &m, &n, (const BLASTYPE*)&numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, \ 119 (const BLASTYPE*)x_ptr, &incx, (const BLASTYPE*)&numext::real_ref(beta), (BLASTYPE*)res, &incy); \ 124 EIGEN_BLAS_GEMV_SPECIALIZATION(
double,
double, dgemv)
125 EIGEN_BLAS_GEMV_SPECIALIZATION(
float,
float, sgemv)
126 EIGEN_BLAS_GEMV_SPECIALIZATION(dcomplex, MKL_Complex16, zgemv)
127 EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, MKL_Complex8, cgemv)
129 EIGEN_BLAS_GEMV_SPECIALIZATION(
double,
double, dgemv_)
130 EIGEN_BLAS_GEMV_SPECIALIZATION(
float,
float, sgemv_)
131 EIGEN_BLAS_GEMV_SPECIALIZATION(dcomplex,
double, zgemv_)
132 EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex,
float, cgemv_)
139 #endif // EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H Namespace containing all symbols from the Eigen library.
Definition: B01_Experimental.dox:1
EIGEN_DEFAULT_DENSE_INDEX_TYPE Index
The Index type as used for the API.
Definition: Meta.h:82