33 #ifndef EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
34 #define EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
49 #define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, MKLTYPE, MKLPREFIX) \
52 int LhsStorageOrder, bool ConjugateLhs, \
53 int RhsStorageOrder, bool ConjugateRhs> \
54 struct general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor> \
56 typedef gebp_traits<EIGTYPE,EIGTYPE> Traits; \
58 static void run(Index rows, Index cols, Index depth, \
59 const EIGTYPE* _lhs, Index lhsStride, \
60 const EIGTYPE* _rhs, Index rhsStride, \
61 EIGTYPE* res, Index resStride, \
63 level3_blocking<EIGTYPE, EIGTYPE>& , \
64 GemmParallelInfo<Index>* ) \
68 char transa, transb; \
69 MKL_INT m, n, k, lda, ldb, ldc; \
70 const EIGTYPE *a, *b; \
71 MKLTYPE alpha_, beta_; \
72 MatrixX##EIGPREFIX a_tmp, b_tmp; \
76 transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
77 transb = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
85 assign_scalar_eig2mkl(alpha_, alpha); \
86 assign_scalar_eig2mkl(beta_, myone); \
89 lda = (MKL_INT)lhsStride; \
90 ldb = (MKL_INT)rhsStride; \
91 ldc = (MKL_INT)resStride; \
94 if ((LhsStorageOrder==ColMajor) && (ConjugateLhs)) { \
95 Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,k,OuterStride<>(lhsStride)); \
96 a_tmp = lhs.conjugate(); \
98 lda = a_tmp.outerStride(); \
101 if ((RhsStorageOrder==ColMajor) && (ConjugateRhs)) { \
102 Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,k,n,OuterStride<>(rhsStride)); \
103 b_tmp = rhs.conjugate(); \
105 ldb = b_tmp.outerStride(); \
108 MKLPREFIX##gemm(&transa, &transb, &m, &n, &k, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
111 GEMM_SPECIALIZATION(
double, d,
double, d)
112 GEMM_SPECIALIZATION(
float, f,
float, s)
113 GEMM_SPECIALIZATION(dcomplex, cd, MKL_Complex16, z)
114 GEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8, c)
120 #endif // EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
Definition: Eigen_Colamd.h:54