SelfadjointMatrixMatrix_MKL.h revision c981c48f5bc9aefeffc0bcb0cc3934c2fae179dd
18d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/*
28d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Copyright (c) 2011, Intel Corporation. All rights reserved.
3c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
48d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt Redistribution and use in source and binary forms, with or without modification,
5c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt are permitted provided that the following conditions are met:
6c5ec7f57ead87efa365800228aa0b09a12d9e6c4Dmitry Shmidt
78d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Redistributions of source code must retain the above copyright notice, this
88d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt   list of conditions and the following disclaimer.
98d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Redistributions in binary form must reproduce the above copyright notice,
108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt   this list of conditions and the following disclaimer in the documentation
118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt   and/or other materials provided with the distribution.
128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt * Neither the name of Intel Corporation nor the names of its contributors may
138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt   be used to endorse or promote products derived from this software without
148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt   specific prior written permission.
158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ********************************************************************************
288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *   Content : Eigen bindings to Intel(R) MKL
298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt *   Self adjoint matrix * matrix product functionality based on ?SYMM/?HEMM.
308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt ********************************************************************************
318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt*/
32391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt
338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
34ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt#define EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
35ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt
36ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidtnamespace Eigen {
37ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt
38ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidtnamespace internal {
39ea69e84a6f4455c59348485895d3d5e3af77a65bDmitry Shmidt
4068d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt
4168d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */
4268d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt
4368d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt#define EIGEN_MKL_SYMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
4468d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidttemplate <typename Index, \
458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int LhsStorageOrder, bool ConjugateLhs, \
468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int RhsStorageOrder, bool ConjugateRhs> \
478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \
488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{\
498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static EIGEN_DONT_INLINE void run( \
518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Index rows, Index cols, \
528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _lhs, Index lhsStride, \
538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _rhs, Index rhsStride, \
548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE* res,        Index resStride, \
558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE alpha) \
568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  { \
57d5e4923d04122f81300fa68fb07d64ede28fd44dDmitry Shmidt    char side='L', uplo='L'; \
588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKL_INT m, n, lda, ldb, ldc; \
598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE *a, *b; \
608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLTYPE alpha_, beta_; \
618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MatrixX##EIGPREFIX b_tmp; \
628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE myone(1);\
638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set transpose options */ \
6568d0e3ed07847339aedfac8e02f50db68c702e52Dmitry Shmidt/* Set m, n, k */ \
668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    m = (MKL_INT)rows;  \
678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    n = (MKL_INT)cols;  \
68b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt\
69b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt/* Set alpha_ & beta_ */ \
70b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    assign_scalar_eig2mkl(alpha_, alpha); \
71b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    assign_scalar_eig2mkl(beta_, myone); \
72b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt\
73b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt/* Set lda, ldb, ldc */ \
74b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    lda = (MKL_INT)lhsStride; \
75b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    ldb = (MKL_INT)rhsStride; \
76b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt    ldc = (MKL_INT)resStride; \
77b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt\
78b7b4d0ec07161a6d76c40ba7ef1306e82fbb7e15Dmitry Shmidt/* Set a, b, c */ \
79391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    if (LhsStorageOrder==RowMajor) uplo='U'; \
80391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    a = _lhs; \
81391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt\
82391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    if (RhsStorageOrder==RowMajor) { \
83391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
84391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt      b_tmp = rhs.adjoint(); \
85391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt      b = b_tmp.data(); \
86391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt      ldb = b_tmp.outerStride(); \
87391c59f0632df8db1c325da1d31d479b2eedce45Dmitry Shmidt    } else b = _rhs; \
888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
901f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt\
91c2ebb4b85d69b65f552fee71ac68f44e8d87b39eDmitry Shmidt  } \
921f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt};
938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EIGEN_MKL_HEMM_L(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttemplate <typename Index, \
978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int LhsStorageOrder, bool ConjugateLhs, \
988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int RhsStorageOrder, bool ConjugateRhs> \
998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLhs,RhsStorageOrder,false,ConjugateRhs,ColMajor> \
1008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{\
1018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static EIGEN_DONT_INLINE void run( \
1028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Index rows, Index cols, \
1038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _lhs, Index lhsStride, \
1048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _rhs, Index rhsStride, \
1058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE* res,        Index resStride, \
1068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE alpha) \
1078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  { \
1088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    char side='L', uplo='L'; \
1098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKL_INT m, n, lda, ldb, ldc; \
1108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE *a, *b; \
1118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLTYPE alpha_, beta_; \
1128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MatrixX##EIGPREFIX b_tmp; \
1138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> a_tmp; \
1148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE myone(1); \
1158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set transpose options */ \
1178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set m, n, k */ \
1188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    m = (MKL_INT)rows; \
1198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    n = (MKL_INT)cols; \
1208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set alpha_ & beta_ */ \
1228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(alpha_, alpha); \
1238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(beta_, myone); \
1248d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set lda, ldb, ldc */ \
1268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    lda = (MKL_INT)lhsStride; \
1278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldb = (MKL_INT)rhsStride; \
1288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldc = (MKL_INT)resStride; \
1298d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set a, b, c */ \
1318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (((LhsStorageOrder==ColMajor) && ConjugateLhs) || ((LhsStorageOrder==RowMajor) && (!ConjugateLhs))) { \
1328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder>, 0, OuterStride<> > lhs(_lhs,m,m,OuterStride<>(lhsStride)); \
1338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a_tmp = lhs.conjugate(); \
1348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a = a_tmp.data(); \
1358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      lda = a_tmp.outerStride(); \
1361f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt    } else a = _lhs; \
13704949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    if (LhsStorageOrder==RowMajor) uplo='U'; \
13804949598a23f501be6eec21697465fd46a28840aDmitry Shmidt\
13904949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    if (RhsStorageOrder==ColMajor && (!ConjugateRhs)) { \
14004949598a23f501be6eec21697465fd46a28840aDmitry Shmidt       b = _rhs; } \
14104949598a23f501be6eec21697465fd46a28840aDmitry Shmidt    else { \
14204949598a23f501be6eec21697465fd46a28840aDmitry Shmidt      if (RhsStorageOrder==ColMajor && ConjugateRhs) { \
14304949598a23f501be6eec21697465fd46a28840aDmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,m,n,OuterStride<>(rhsStride)); \
14404949598a23f501be6eec21697465fd46a28840aDmitry Shmidt        b_tmp = rhs.conjugate(); \
14504949598a23f501be6eec21697465fd46a28840aDmitry Shmidt      } else \
14604949598a23f501be6eec21697465fd46a28840aDmitry Shmidt      if (ConjugateRhs) { \
1471f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
1488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        b_tmp = rhs.adjoint(); \
1498d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } else { \
1508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > rhs(_rhs,n,m,OuterStride<>(rhsStride)); \
1518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        b_tmp = rhs.transpose(); \
1528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } \
1538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      b = b_tmp.data(); \
1548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      ldb = b_tmp.outerStride(); \
1558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } \
1568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
1588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
159f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt  } \
160f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt};
161f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt
162f86232838cf712377867cb42417c1613ab5dc425Dmitry ShmidtEIGEN_MKL_SYMM_L(double, double, d, d)
163f86232838cf712377867cb42417c1613ab5dc425Dmitry ShmidtEIGEN_MKL_SYMM_L(float, float, f, s)
164f86232838cf712377867cb42417c1613ab5dc425Dmitry ShmidtEIGEN_MKL_HEMM_L(dcomplex, MKL_Complex16, cd, z)
165f86232838cf712377867cb42417c1613ab5dc425Dmitry ShmidtEIGEN_MKL_HEMM_L(scomplex, MKL_Complex8, cf, c)
1668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */
1698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
1708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EIGEN_MKL_SYMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
1718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttemplate <typename Index, \
1728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int LhsStorageOrder, bool ConjugateLhs, \
1738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int RhsStorageOrder, bool ConjugateRhs> \
1748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \
1758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{\
1768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static EIGEN_DONT_INLINE void run( \
1788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Index rows, Index cols, \
1798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _lhs, Index lhsStride, \
1808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _rhs, Index rhsStride, \
1818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE* res,        Index resStride, \
1828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE alpha) \
1838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  { \
1848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    char side='R', uplo='L'; \
1858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKL_INT m, n, lda, ldb, ldc; \
1868d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE *a, *b; \
1878d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLTYPE alpha_, beta_; \
1888d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MatrixX##EIGPREFIX b_tmp; \
1898d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE myone(1);\
1908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set m, n, k */ \
1928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    m = (MKL_INT)rows;  \
1938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    n = (MKL_INT)cols;  \
1948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set alpha_ & beta_ */ \
1968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(alpha_, alpha); \
1978d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(beta_, myone); \
1988d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
1998d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set lda, ldb, ldc */ \
2008d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    lda = (MKL_INT)rhsStride; \
2018d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldb = (MKL_INT)lhsStride; \
2028d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldc = (MKL_INT)resStride; \
2038d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2048d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set a, b, c */ \
2058d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (RhsStorageOrder==RowMajor) uplo='U'; \
2068d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    a = _rhs; \
2078d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2088d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (LhsStorageOrder==RowMajor) { \
2098d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(rhsStride)); \
2108d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      b_tmp = lhs.adjoint(); \
2118d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      b = b_tmp.data(); \
2128d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      ldb = b_tmp.outerStride(); \
2138d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } else b = _lhs; \
2148d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2158d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLPREFIX##symm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
2168d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2178d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  } \
2188d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2198d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2208d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2218d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#define EIGEN_MKL_HEMM_R(EIGTYPE, MKLTYPE, EIGPREFIX, MKLPREFIX) \
2228d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidttemplate <typename Index, \
2238d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt          int LhsStorageOrder, bool ConjugateLhs, \
224f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt          int RhsStorageOrder, bool ConjugateRhs> \
2258d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidtstruct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateLhs,RhsStorageOrder,true,ConjugateRhs,ColMajor> \
2268d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt{\
2278d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  static EIGEN_DONT_INLINE void run( \
2288d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Index rows, Index cols, \
229f86232838cf712377867cb42417c1613ab5dc425Dmitry Shmidt    const EIGTYPE* _lhs, Index lhsStride, \
2308d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE* _rhs, Index rhsStride, \
2318d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE* res,        Index resStride, \
2328d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE alpha) \
2338d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  { \
2348d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    char side='R', uplo='L'; \
2358d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKL_INT m, n, lda, ldb, ldc; \
2368d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    const EIGTYPE *a, *b; \
2378d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLTYPE alpha_, beta_; \
2388d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MatrixX##EIGPREFIX b_tmp; \
2398d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> a_tmp; \
2408d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    EIGTYPE myone(1); \
2418d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2428d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set m, n, k */ \
2438d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    m = (MKL_INT)rows; \
2448d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    n = (MKL_INT)cols; \
2458d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2468d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set alpha_ & beta_ */ \
2478d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(alpha_, alpha); \
2488d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    assign_scalar_eig2mkl(beta_, myone); \
2491f69aa52ea2e0a73ac502565df8c666ee49cab6aDmitry Shmidt\
2508d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set lda, ldb, ldc */ \
2518d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    lda = (MKL_INT)rhsStride; \
2528d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldb = (MKL_INT)lhsStride; \
2538d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    ldc = (MKL_INT)resStride; \
2548d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2558d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt/* Set a, b, c */ \
2568d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (((RhsStorageOrder==ColMajor) && ConjugateRhs) || ((RhsStorageOrder==RowMajor) && (!ConjugateRhs))) { \
2578d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      Map<const Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder>, 0, OuterStride<> > rhs(_rhs,n,n,OuterStride<>(rhsStride)); \
2588d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a_tmp = rhs.conjugate(); \
2598d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      a = a_tmp.data(); \
2608d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      lda = a_tmp.outerStride(); \
2618d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } else a = _rhs; \
2628d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (RhsStorageOrder==RowMajor) uplo='U'; \
2638d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2648d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    if (LhsStorageOrder==ColMajor && (!ConjugateLhs)) { \
2658d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt       b = _lhs; } \
2668d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    else { \
2678d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      if (LhsStorageOrder==ColMajor && ConjugateLhs) { \
2688d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,m,n,OuterStride<>(lhsStride)); \
2698d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        b_tmp = lhs.conjugate(); \
2708d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } else \
2718d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      if (ConjugateLhs) { \
2728d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
2738d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        b_tmp = lhs.adjoint(); \
2748d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } else { \
2758d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        Map<const MatrixX##EIGPREFIX, 0, OuterStride<> > lhs(_lhs,n,m,OuterStride<>(lhsStride)); \
2768d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt        b_tmp = lhs.transpose(); \
2778d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      } \
2788d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      b = b_tmp.data(); \
2798d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt      ldb = b_tmp.outerStride(); \
2808d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    } \
2818d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt\
2828d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt    MKLPREFIX##hemm(&side, &uplo, &m, &n, &alpha_, (const MKLTYPE*)a, &lda, (const MKLTYPE*)b, &ldb, &beta_, (MKLTYPE*)res, &ldc); \
2838d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt  } \
2848d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt};
2858d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2868d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtEIGEN_MKL_SYMM_R(double, double, d, d)
2878d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtEIGEN_MKL_SYMM_R(float, float, f, s)
2888d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtEIGEN_MKL_HEMM_R(dcomplex, MKL_Complex16, cd, z)
2898d520ff1dc2da35cdca849e982051b86468016d8Dmitry ShmidtEIGEN_MKL_HEMM_R(scomplex, MKL_Complex8, cf, c)
2908d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2918d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} // end namespace internal
2928d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2938d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt} // end namespace Eigen
2948d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt
2958d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
2968d520ff1dc2da35cdca849e982051b86468016d8Dmitry Shmidt