TriangularSolverMatrix_MKL.h revision 7faaa9f3f0df9d23790277834d426c3d992ac3ba
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/*
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Copyright (c) 2011, Intel Corporation. All rights reserved.
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Redistribution and use in source and binary forms, with or without modification,
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) are permitted provided that the following conditions are met:
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistributions of source code must retain the above copyright notice, this
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   list of conditions and the following disclaimer.
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Redistributions in binary form must reproduce the above copyright notice,
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   this list of conditions and the following disclaimer in the documentation
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   and/or other materials provided with the distribution.
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) * Neither the name of Intel Corporation nor the names of its contributors may
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   be used to endorse or promote products derived from this software without
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   specific prior written permission.
152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ********************************************************************************
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Content : Eigen bindings to Intel(R) MKL
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *   Triangular matrix * matrix product functionality based on ?TRMM.
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ********************************************************************************
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)*/
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace Eigen {
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace internal {
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implements LeftSide op(triangular)^-1 * general
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EIGEN_MKL_TRSM_L(EIGTYPE, MKLTYPE, MKLPREFIX) \
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor> \
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ \
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { \
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsLower = (Mode&Lower) == Lower, \
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }; \
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void run( \
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Index size, Index otherSize, \
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EIGTYPE* _tri, Index triStride, \
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { \
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKL_INT m = size, n = otherSize, lda, ldb; \
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   char side = 'L', uplo, diag='N', transa; \
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Set alpha_ */ \
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKLTYPE alpha; \
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   EIGTYPE myone(1); \
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assign_scalar_eig2mkl(alpha, myone); \
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ldb = otherStride;\
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const EIGTYPE *a; \
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set trans */ \
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set uplo */ \
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uplo = IsLower ? 'L' : 'U'; \
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set a, lda */ \
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MatrixTri a_tmp; \
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (conjA) { \
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a_tmp = tri.conjugate(); \
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a = a_tmp.data(); \
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     lda = a_tmp.outerStride(); \
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else { \
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a = _tri; \
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     lda = triStride; \
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } \
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (IsUnitDiag) diag='U'; \
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* call ?trsm*/ \
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_L(double, double, d)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_L(dcomplex, MKL_Complex16, z)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_L(float, float, s)
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_L(scomplex, MKL_Complex8, c)
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// implements RightSide general * op(triangular)^-1
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#define EIGEN_MKL_TRSM_R(EIGTYPE, MKLTYPE, MKLPREFIX) \
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor> \
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles){ \
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  enum { \
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsLower = (Mode&Lower) == Lower, \
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsUnitDiag  = (Mode&UnitDiag) ? 1 : 0, \
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    IsZeroDiag  = (Mode&ZeroDiag) ? 1 : 0, \
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    conjA = ((TriStorageOrder==ColMajor) && Conjugate) ? 1 : 0 \
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }; \
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static void run( \
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      Index size, Index otherSize, \
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      const EIGTYPE* _tri, Index triStride, \
1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      EIGTYPE* _other, Index otherStride, level3_blocking<EIGTYPE,EIGTYPE>& /*blocking*/) \
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  { \
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKL_INT m = otherSize, n = size, lda, ldb; \
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   char side = 'R', uplo, diag='N', transa; \
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /* Set alpha_ */ \
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKLTYPE alpha; \
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   EIGTYPE myone(1); \
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   assign_scalar_eig2mkl(alpha, myone); \
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   ldb = otherStride;\
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   const EIGTYPE *a; \
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set trans */ \
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   transa = (TriStorageOrder==RowMajor) ? ((Conjugate) ? 'C' : 'T') : 'N'; \
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set uplo */ \
1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   uplo = IsLower ? 'L' : 'U'; \
1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (TriStorageOrder==RowMajor) uplo = (uplo == 'L') ? 'U' : 'L'; \
1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* Set a, lda */ \
1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   typedef Matrix<EIGTYPE, Dynamic, Dynamic, TriStorageOrder> MatrixTri; \
1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   Map<const MatrixTri, 0, OuterStride<> > tri(_tri,size,size,OuterStride<>(triStride)); \
1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MatrixTri a_tmp; \
1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)\
1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (conjA) { \
1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a_tmp = tri.conjugate(); \
1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a = a_tmp.data(); \
1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     lda = a_tmp.outerStride(); \
1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } else { \
1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     a = _tri; \
1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)     lda = triStride; \
1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   } \
1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   if (IsUnitDiag) diag='U'; \
1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)/* call ?trsm*/ \
1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   MKLPREFIX##trsm(&side, &uplo, &transa, &diag, &m, &n, &alpha, (const MKLTYPE*)a, &lda, (MKLTYPE*)_other, &ldb); \
1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)   /*std::cout << "TRMS_L specialization!\n";*/ \
1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } \
1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_R(double, double, d)
1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_R(dcomplex, MKL_Complex16, z)
1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_R(float, float, s)
1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)EIGEN_MKL_TRSM_R(scomplex, MKL_Complex8, c)
1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace internal
1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // end namespace Eigen
1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)