00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033 #ifndef EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
00034 #define EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
00035
00036 namespace Eigen {
00037
00038 namespace internal {
00039
00040
00041
00042
00043
00044
00045
00046
00047
00048
00049 #define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, MKLTYPE, MKLPREFIX) \
00050 template< \
00051 typename Index, \
00052 int LhsStorageOrder, bool ConjugateLhs, \
00053 int RhsStorageOrder, bool ConjugateRhs> \
00054 struct general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor> \
00055 { \
00056 static void run(Index rows, Index cols, Index depth, \
00057 const EIGTYPE* _lhs, Index lhsStride, \
00058 const EIGTYPE* _rhs, Index rhsStride, \
00059 EIGTYPE* res, Index resStride, \
00060 EIGTYPE alpha, \
00061 level3_blocking<EIGTYPE, EIGTYPE>& , \
00062 GemmParallelInfo<Index>* ) \
00063 { \
00064 using std::conj; \
00065 \
00066 char transa, transb; \
00067 MKL_INT m, n, k, lda, ldb, ldc; \
00068 const EIGTYPE *a, *b; \
00069 MKLTYPE alpha_, beta_; \
00070 MatrixX##EIGPREFIX a_tmp, b_tmp; \
00071 EIGTYPE myone(1);\
00072 \
00073 \
00074 transa = (LhsStorageOrder==RowMajor) ? ((ConjugateLhs) ? 'C' : 'T') : 'N'; \
00075 transb = (RhsStorageOrder==RowMajor) ? ((ConjugateRhs) ? 'C' : 'T') : 'N'; \
00076 \
00077 \
00078 m = (MKL_INT)rows; \
00079 n = (MKL_INT)cols; \
00080 k = (MKL_INT)depth; \
00081 \
00082 \
00083 assign_scalar_eig2mkl(alpha_, alpha); \
00084 assign_scalar_eig2mkl(beta_, myone); \
00085 \
00086 \
00087 lda = (MKL_INT)lhsStride; \
00088 ldb = (MKL_INT)rhsStride; \
00089 ldc = (MKL_INT)resStride; \
00090 \
00091 \
00092 if ((LhsStorageOrder==ColMajor) && (ConjugateLhs)) { \
00093 Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,k,OuterStride<>(lhsStride)); \
00094 a_tmp = lhs.conjugate(); \
00095 a = a_tmp.data(); \
00096 lda = a_tmp.outerStride(); \
00097 } else a = _lhs; \
00098 \
00099 if ((RhsStorageOrder==ColMajor) && (ConjugateRhs)) { \
00100 Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,k,n,OuterStride<>(rhsStride)); \
00101 b_tmp = rhs.conjugate(); \
00102 b = b_tmp.data(); \
00103 ldb = b_tmp.outerStride(); \
00104 } else b = _rhs; \
00105 \
00106 MKLPREFIX##gemm(&transa, &transb, &m, &n, &k, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
00107 }};
00108
00109 GEMM_SPECIALIZATION(double, d, double, d)
00110 GEMM_SPECIALIZATION(float, f, float, s)
00111 GEMM_SPECIALIZATION(dcomplex, cd, MKL_Complex16, z)
00112 GEMM_SPECIALIZATION(scomplex, cf, MKL_Complex8, c)
00113
00114 }
00115
00116 }
00117
00118 #endif // EIGEN_GENERAL_MATRIX_MATRIX_MKL_H