mirror of
https://gitlab.com/libeigen/eigen.git
synced 2025-04-30 07:44:10 +08:00
Remove all references to MKL in BLAS wrappers.
This commit is contained in:
parent
ddabc992fa
commit
fec4c334ba
16
Eigen/Core
16
Eigen/Core
@ -450,14 +450,14 @@ using std::ptrdiff_t;
|
|||||||
#include "src/Core/ArrayWrapper.h"
|
#include "src/Core/ArrayWrapper.h"
|
||||||
|
|
||||||
#ifdef EIGEN_USE_BLAS
|
#ifdef EIGEN_USE_BLAS
|
||||||
#include "src/Core/products/GeneralMatrixMatrix_MKL.h"
|
#include "src/Core/products/GeneralMatrixMatrix_BLAS.h"
|
||||||
#include "src/Core/products/GeneralMatrixVector_MKL.h"
|
#include "src/Core/products/GeneralMatrixVector_BLAS.h"
|
||||||
#include "src/Core/products/GeneralMatrixMatrixTriangular_MKL.h"
|
#include "src/Core/products/GeneralMatrixMatrixTriangular_BLAS.h"
|
||||||
#include "src/Core/products/SelfadjointMatrixMatrix_MKL.h"
|
#include "src/Core/products/SelfadjointMatrixMatrix_BLAS.h"
|
||||||
#include "src/Core/products/SelfadjointMatrixVector_MKL.h"
|
#include "src/Core/products/SelfadjointMatrixVector_BLAS.h"
|
||||||
#include "src/Core/products/TriangularMatrixMatrix_MKL.h"
|
#include "src/Core/products/TriangularMatrixMatrix_BLAS.h"
|
||||||
#include "src/Core/products/TriangularMatrixVector_MKL.h"
|
#include "src/Core/products/TriangularMatrixVector_BLAS.h"
|
||||||
#include "src/Core/products/TriangularSolverMatrix_MKL.h"
|
#include "src/Core/products/TriangularSolverMatrix_BLAS.h"
|
||||||
#endif // EIGEN_USE_BLAS
|
#endif // EIGEN_USE_BLAS
|
||||||
|
|
||||||
#ifdef EIGEN_USE_MKL_VML
|
#ifdef EIGEN_USE_MKL_VML
|
||||||
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Level 3 BLAS SYRK/HERK implementation.
|
* Level 3 BLAS SYRK/HERK implementation.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
|
#ifndef EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
|
||||||
#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
|
#define EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -44,7 +44,7 @@ struct general_matrix_matrix_rankupdate :
|
|||||||
|
|
||||||
|
|
||||||
// try to go to BLAS specialization
|
// try to go to BLAS specialization
|
||||||
#define EIGEN_MKL_RANKUPDATE_SPECIALIZE(Scalar) \
|
#define EIGEN_BLAS_RANKUPDATE_SPECIALIZE(Scalar) \
|
||||||
template <typename Index, int LhsStorageOrder, bool ConjugateLhs, \
|
template <typename Index, int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs, int UpLo> \
|
int RhsStorageOrder, bool ConjugateRhs, int UpLo> \
|
||||||
struct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,ConjugateLhs, \
|
struct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,ConjugateLhs, \
|
||||||
@ -65,14 +65,14 @@ struct general_matrix_matrix_triangular_product<Index,Scalar,LhsStorageOrder,Con
|
|||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_RANKUPDATE_SPECIALIZE(double)
|
EIGEN_BLAS_RANKUPDATE_SPECIALIZE(double)
|
||||||
EIGEN_MKL_RANKUPDATE_SPECIALIZE(float)
|
EIGEN_BLAS_RANKUPDATE_SPECIALIZE(float)
|
||||||
// TODO handle complex cases
|
// TODO handle complex cases
|
||||||
// EIGEN_MKL_RANKUPDATE_SPECIALIZE(dcomplex)
|
// EIGEN_BLAS_RANKUPDATE_SPECIALIZE(dcomplex)
|
||||||
// EIGEN_MKL_RANKUPDATE_SPECIALIZE(scomplex)
|
// EIGEN_BLAS_RANKUPDATE_SPECIALIZE(scomplex)
|
||||||
|
|
||||||
// SYRK for float/double
|
// SYRK for float/double
|
||||||
#define EIGEN_MKL_RANKUPDATE_R(EIGTYPE, BLASTYPE, MKLFUNC) \
|
#define EIGEN_BLAS_RANKUPDATE_R(EIGTYPE, BLASTYPE, BLASFUNC) \
|
||||||
template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo> \
|
template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo> \
|
||||||
struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
|
struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
|
||||||
enum { \
|
enum { \
|
||||||
@ -92,12 +92,12 @@ struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,C
|
|||||||
/* Set alpha_ & beta_ */ \
|
/* Set alpha_ & beta_ */ \
|
||||||
assign_scalar_eig2mkl<BLASTYPE, EIGTYPE>(alpha_, alpha); \
|
assign_scalar_eig2mkl<BLASTYPE, EIGTYPE>(alpha_, alpha); \
|
||||||
assign_scalar_eig2mkl<BLASTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
|
assign_scalar_eig2mkl<BLASTYPE, EIGTYPE>(beta_, EIGTYPE(1)); \
|
||||||
MKLFUNC(&uplo, &trans, &n, &k, &alpha_, lhs, &lda, &beta_, res, &ldc); \
|
BLASFUNC(&uplo, &trans, &n, &k, &alpha_, lhs, &lda, &beta_, res, &ldc); \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
// HERK for complex data
|
// HERK for complex data
|
||||||
#define EIGEN_MKL_RANKUPDATE_C(EIGTYPE, BLASTYPE, RTYPE, MKLFUNC) \
|
#define EIGEN_BLAS_RANKUPDATE_C(EIGTYPE, BLASTYPE, RTYPE, BLASFUNC) \
|
||||||
template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo> \
|
template <typename Index, int AStorageOrder, bool ConjugateA, int UpLo> \
|
||||||
struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
|
struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,ColMajor,UpLo> { \
|
||||||
enum { \
|
enum { \
|
||||||
@ -128,21 +128,21 @@ struct general_matrix_matrix_rankupdate<Index,EIGTYPE,AStorageOrder,ConjugateA,C
|
|||||||
lda = a.outerStride(); \
|
lda = a.outerStride(); \
|
||||||
a_ptr = a.data(); \
|
a_ptr = a.data(); \
|
||||||
} else a_ptr=lhs; \
|
} else a_ptr=lhs; \
|
||||||
MKLFUNC(&uplo, &trans, &n, &k, &alpha_, (BLASTYPE*)a_ptr, &lda, &beta_, (BLASTYPE*)res, &ldc); \
|
BLASFUNC(&uplo, &trans, &n, &k, &alpha_, (BLASTYPE*)a_ptr, &lda, &beta_, (BLASTYPE*)res, &ldc); \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
EIGEN_MKL_RANKUPDATE_R(double, double, dsyrk_)
|
EIGEN_BLAS_RANKUPDATE_R(double, double, dsyrk_)
|
||||||
EIGEN_MKL_RANKUPDATE_R(float, float, ssyrk_)
|
EIGEN_BLAS_RANKUPDATE_R(float, float, ssyrk_)
|
||||||
|
|
||||||
// TODO hanlde complex cases
|
// TODO hanlde complex cases
|
||||||
// EIGEN_MKL_RANKUPDATE_C(dcomplex, double, double, zherk_)
|
// EIGEN_BLAS_RANKUPDATE_C(dcomplex, double, double, zherk_)
|
||||||
// EIGEN_MKL_RANKUPDATE_C(scomplex, float, float, cherk_)
|
// EIGEN_BLAS_RANKUPDATE_C(scomplex, float, float, cherk_)
|
||||||
|
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_MKL_H
|
#endif // EIGEN_GENERAL_MATRIX_MATRIX_TRIANGULAR_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* General matrix-matrix product functionality based on ?GEMM.
|
* General matrix-matrix product functionality based on ?GEMM.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
|
#ifndef EIGEN_GENERAL_MATRIX_MATRIX_BLAS_H
|
||||||
#define EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
|
#define EIGEN_GENERAL_MATRIX_MATRIX_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -46,7 +46,7 @@ namespace internal {
|
|||||||
|
|
||||||
// gemm specialization
|
// gemm specialization
|
||||||
|
|
||||||
#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, BLASTYPE, MKLPREFIX) \
|
#define GEMM_SPECIALIZATION(EIGTYPE, EIGPREFIX, BLASTYPE, BLASPREFIX) \
|
||||||
template< \
|
template< \
|
||||||
typename Index, \
|
typename Index, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
@ -100,7 +100,7 @@ static void run(Index rows, Index cols, Index depth, \
|
|||||||
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
||||||
} else b = _rhs; \
|
} else b = _rhs; \
|
||||||
\
|
\
|
||||||
MKLPREFIX##gemm_(&transa, &transb, &m, &n, &k, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
BLASPREFIX##gemm_(&transa, &transb, &m, &n, &k, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
||||||
}};
|
}};
|
||||||
|
|
||||||
GEMM_SPECIALIZATION(double, d, double, d)
|
GEMM_SPECIALIZATION(double, d, double, d)
|
||||||
@ -112,4 +112,4 @@ GEMM_SPECIALIZATION(scomplex, cf, float, c)
|
|||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_GENERAL_MATRIX_MATRIX_MKL_H
|
#endif // EIGEN_GENERAL_MATRIX_MATRIX_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* General matrix-vector product functionality based on ?GEMV.
|
* General matrix-vector product functionality based on ?GEMV.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
|
#ifndef EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H
|
||||||
#define EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
|
#define EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ namespace internal {
|
|||||||
template<typename Index, typename LhsScalar, int StorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>
|
template<typename Index, typename LhsScalar, int StorageOrder, bool ConjugateLhs, typename RhsScalar, bool ConjugateRhs>
|
||||||
struct general_matrix_vector_product_gemv;
|
struct general_matrix_vector_product_gemv;
|
||||||
|
|
||||||
#define EIGEN_MKL_GEMV_SPECIALIZE(Scalar) \
|
#define EIGEN_BLAS_GEMV_SPECIALIZE(Scalar) \
|
||||||
template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
|
template<typename Index, bool ConjugateLhs, bool ConjugateRhs> \
|
||||||
struct general_matrix_vector_product<Index,Scalar,const_blas_data_mapper<Scalar,Index,ColMajor>,ColMajor,ConjugateLhs,Scalar,const_blas_data_mapper<Scalar,Index,RowMajor>,ConjugateRhs,Specialized> { \
|
struct general_matrix_vector_product<Index,Scalar,const_blas_data_mapper<Scalar,Index,ColMajor>,ColMajor,ConjugateLhs,Scalar,const_blas_data_mapper<Scalar,Index,RowMajor>,ConjugateRhs,Specialized> { \
|
||||||
static void run( \
|
static void run( \
|
||||||
@ -80,12 +80,12 @@ static void run( \
|
|||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
|
|
||||||
EIGEN_MKL_GEMV_SPECIALIZE(double)
|
EIGEN_BLAS_GEMV_SPECIALIZE(double)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZE(float)
|
EIGEN_BLAS_GEMV_SPECIALIZE(float)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZE(dcomplex)
|
EIGEN_BLAS_GEMV_SPECIALIZE(dcomplex)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZE(scomplex)
|
EIGEN_BLAS_GEMV_SPECIALIZE(scomplex)
|
||||||
|
|
||||||
#define EIGEN_MKL_GEMV_SPECIALIZATION(EIGTYPE,BLASTYPE,MKLPREFIX) \
|
#define EIGEN_BLAS_GEMV_SPECIALIZATION(EIGTYPE,BLASTYPE,BLASPREFIX) \
|
||||||
template<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \
|
template<typename Index, int LhsStorageOrder, bool ConjugateLhs, bool ConjugateRhs> \
|
||||||
struct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \
|
struct general_matrix_vector_product_gemv<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,ConjugateRhs> \
|
||||||
{ \
|
{ \
|
||||||
@ -113,17 +113,17 @@ static void run( \
|
|||||||
x_ptr=x_tmp.data(); \
|
x_ptr=x_tmp.data(); \
|
||||||
incx=1; \
|
incx=1; \
|
||||||
} else x_ptr=rhs; \
|
} else x_ptr=rhs; \
|
||||||
MKLPREFIX##gemv_(&trans, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, &numext::real_ref(beta), (BLASTYPE*)res, &incy); \
|
BLASPREFIX##gemv_(&trans, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, &numext::real_ref(beta), (BLASTYPE*)res, &incy); \
|
||||||
}\
|
}\
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_GEMV_SPECIALIZATION(double, double, d)
|
EIGEN_BLAS_GEMV_SPECIALIZATION(double, double, d)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZATION(float, float, s)
|
EIGEN_BLAS_GEMV_SPECIALIZATION(float, float, s)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZATION(dcomplex, double, z)
|
EIGEN_BLAS_GEMV_SPECIALIZATION(dcomplex, double, z)
|
||||||
EIGEN_MKL_GEMV_SPECIALIZATION(scomplex, float, c)
|
EIGEN_BLAS_GEMV_SPECIALIZATION(scomplex, float, c)
|
||||||
|
|
||||||
} // end namespase internal
|
} // end namespase internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_GENERAL_MATRIX_VECTOR_MKL_H
|
#endif // EIGEN_GENERAL_MATRIX_VECTOR_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
//
|
//
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Self adjoint matrix * matrix product functionality based on ?SYMM/?HEMM.
|
* Self adjoint matrix * matrix product functionality based on ?SYMM/?HEMM.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
|
#ifndef EIGEN_SELFADJOINT_MATRIX_MATRIX_BLAS_H
|
||||||
#define EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
|
#define EIGEN_SELFADJOINT_MATRIX_MATRIX_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -40,7 +40,7 @@ namespace internal {
|
|||||||
|
|
||||||
/* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */
|
/* Optimized selfadjoint matrix * matrix (?SYMM/?HEMM) product */
|
||||||
|
|
||||||
#define EIGEN_MKL_SYMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_SYMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, \
|
template <typename Index, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -81,13 +81,13 @@ struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLh
|
|||||||
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
||||||
} else b = _rhs; \
|
} else b = _rhs; \
|
||||||
\
|
\
|
||||||
MKLPREFIX##symm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
BLASPREFIX##symm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
||||||
\
|
\
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define EIGEN_MKL_HEMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_HEMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, \
|
template <typename Index, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -144,20 +144,20 @@ struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,true,ConjugateLh
|
|||||||
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
MKLPREFIX##hemm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
BLASPREFIX##hemm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
||||||
\
|
\
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_SYMM_L(double, double, d, d)
|
EIGEN_BLAS_SYMM_L(double, double, d, d)
|
||||||
EIGEN_MKL_SYMM_L(float, float, f, s)
|
EIGEN_BLAS_SYMM_L(float, float, f, s)
|
||||||
EIGEN_MKL_HEMM_L(dcomplex, double, cd, z)
|
EIGEN_BLAS_HEMM_L(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_HEMM_L(scomplex, float, cf, c)
|
EIGEN_BLAS_HEMM_L(scomplex, float, cf, c)
|
||||||
|
|
||||||
|
|
||||||
/* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */
|
/* Optimized matrix * selfadjoint matrix (?SYMM/?HEMM) product */
|
||||||
|
|
||||||
#define EIGEN_MKL_SYMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_SYMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, \
|
template <typename Index, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -197,13 +197,13 @@ struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateL
|
|||||||
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
ldb = convert_index<BlasIndex>(b_tmp.outerStride()); \
|
||||||
} else b = _lhs; \
|
} else b = _lhs; \
|
||||||
\
|
\
|
||||||
MKLPREFIX##symm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
BLASPREFIX##symm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
||||||
\
|
\
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
#define EIGEN_MKL_HEMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_HEMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, \
|
template <typename Index, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -259,17 +259,17 @@ struct product_selfadjoint_matrix<EIGTYPE,Index,LhsStorageOrder,false,ConjugateL
|
|||||||
ldb = b_tmp.outerStride(); \
|
ldb = b_tmp.outerStride(); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
MKLPREFIX##hemm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
BLASPREFIX##hemm_(&side, &uplo, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)b, &ldb, &numext::real_ref(beta), (BLASTYPE*)res, &ldc); \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_SYMM_R(double, double, d, d)
|
EIGEN_BLAS_SYMM_R(double, double, d, d)
|
||||||
EIGEN_MKL_SYMM_R(float, float, f, s)
|
EIGEN_BLAS_SYMM_R(float, float, f, s)
|
||||||
EIGEN_MKL_HEMM_R(dcomplex, double, cd, z)
|
EIGEN_BLAS_HEMM_R(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_HEMM_R(scomplex, float, cf, c)
|
EIGEN_BLAS_HEMM_R(scomplex, float, cf, c)
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_MKL_H
|
#endif // EIGEN_SELFADJOINT_MATRIX_MATRIX_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Selfadjoint matrix-vector product functionality based on ?SYMV/HEMV.
|
* Selfadjoint matrix-vector product functionality based on ?SYMV/HEMV.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
|
#ifndef EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H
|
||||||
#define EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
|
#define EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ template<typename Scalar, typename Index, int StorageOrder, int UpLo, bool Conju
|
|||||||
struct selfadjoint_matrix_vector_product_symv :
|
struct selfadjoint_matrix_vector_product_symv :
|
||||||
selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {};
|
selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,BuiltIn> {};
|
||||||
|
|
||||||
#define EIGEN_MKL_SYMV_SPECIALIZE(Scalar) \
|
#define EIGEN_BLAS_SYMV_SPECIALIZE(Scalar) \
|
||||||
template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
|
template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
|
||||||
struct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \
|
struct selfadjoint_matrix_vector_product<Scalar,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs,Specialized> { \
|
||||||
static void run( \
|
static void run( \
|
||||||
@ -66,12 +66,12 @@ static void run( \
|
|||||||
} \
|
} \
|
||||||
}; \
|
}; \
|
||||||
|
|
||||||
EIGEN_MKL_SYMV_SPECIALIZE(double)
|
EIGEN_BLAS_SYMV_SPECIALIZE(double)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZE(float)
|
EIGEN_BLAS_SYMV_SPECIALIZE(float)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZE(dcomplex)
|
EIGEN_BLAS_SYMV_SPECIALIZE(dcomplex)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZE(scomplex)
|
EIGEN_BLAS_SYMV_SPECIALIZE(scomplex)
|
||||||
|
|
||||||
#define EIGEN_MKL_SYMV_SPECIALIZATION(EIGTYPE,BLASTYPE,MKLFUNC) \
|
#define EIGEN_BLAS_SYMV_SPECIALIZATION(EIGTYPE,BLASTYPE,BLASFUNC) \
|
||||||
template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
|
template<typename Index, int StorageOrder, int UpLo, bool ConjugateLhs, bool ConjugateRhs> \
|
||||||
struct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \
|
struct selfadjoint_matrix_vector_product_symv<EIGTYPE,Index,StorageOrder,UpLo,ConjugateLhs,ConjugateRhs> \
|
||||||
{ \
|
{ \
|
||||||
@ -95,17 +95,17 @@ const EIGTYPE* _rhs, EIGTYPE* res, EIGTYPE alpha) \
|
|||||||
x_tmp=map_x.conjugate(); \
|
x_tmp=map_x.conjugate(); \
|
||||||
x_ptr=x_tmp.data(); \
|
x_ptr=x_tmp.data(); \
|
||||||
} else x_ptr=_rhs; \
|
} else x_ptr=_rhs; \
|
||||||
MKLFUNC(&uplo, &n, &numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, &numext::real_ref(beta), (BLASTYPE*)res, &incy); \
|
BLASFUNC(&uplo, &n, &numext::real_ref(alpha), (const BLASTYPE*)lhs, &lda, (const BLASTYPE*)x_ptr, &incx, &numext::real_ref(beta), (BLASTYPE*)res, &incy); \
|
||||||
}\
|
}\
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_SYMV_SPECIALIZATION(double, double, dsymv_)
|
EIGEN_BLAS_SYMV_SPECIALIZATION(double, double, dsymv_)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZATION(float, float, ssymv_)
|
EIGEN_BLAS_SYMV_SPECIALIZATION(float, float, ssymv_)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZATION(dcomplex, double, zhemv_)
|
EIGEN_BLAS_SYMV_SPECIALIZATION(dcomplex, double, zhemv_)
|
||||||
EIGEN_MKL_SYMV_SPECIALIZATION(scomplex, float, chemv_)
|
EIGEN_BLAS_SYMV_SPECIALIZATION(scomplex, float, chemv_)
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_MKL_H
|
#endif // EIGEN_SELFADJOINT_MATRIX_VECTOR_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Triangular matrix * matrix product functionality based on ?TRMM.
|
* Triangular matrix * matrix product functionality based on ?TRMM.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
|
#ifndef EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H
|
||||||
#define EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
|
#define EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -50,7 +50,7 @@ struct product_triangular_matrix_matrix_trmm :
|
|||||||
|
|
||||||
|
|
||||||
// try to go to BLAS specialization
|
// try to go to BLAS specialization
|
||||||
#define EIGEN_MKL_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \
|
#define EIGEN_BLAS_TRMM_SPECIALIZE(Scalar, LhsIsTriangular) \
|
||||||
template <typename Index, int Mode, \
|
template <typename Index, int Mode, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -65,17 +65,17 @@ struct product_triangular_matrix_matrix<Scalar,Index, Mode, LhsIsTriangular, \
|
|||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(double, true)
|
EIGEN_BLAS_TRMM_SPECIALIZE(double, true)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(double, false)
|
EIGEN_BLAS_TRMM_SPECIALIZE(double, false)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(dcomplex, true)
|
EIGEN_BLAS_TRMM_SPECIALIZE(dcomplex, true)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(dcomplex, false)
|
EIGEN_BLAS_TRMM_SPECIALIZE(dcomplex, false)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(float, true)
|
EIGEN_BLAS_TRMM_SPECIALIZE(float, true)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(float, false)
|
EIGEN_BLAS_TRMM_SPECIALIZE(float, false)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(scomplex, true)
|
EIGEN_BLAS_TRMM_SPECIALIZE(scomplex, true)
|
||||||
EIGEN_MKL_TRMM_SPECIALIZE(scomplex, false)
|
EIGEN_BLAS_TRMM_SPECIALIZE(scomplex, false)
|
||||||
|
|
||||||
// implements col-major += alpha * op(triangular) * op(general)
|
// implements col-major += alpha * op(triangular) * op(general)
|
||||||
#define EIGEN_MKL_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_TRMM_L(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, int Mode, \
|
template <typename Index, int Mode, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -106,14 +106,14 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
|
|||||||
typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
|
typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
|
||||||
typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
|
typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
|
||||||
\
|
\
|
||||||
/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \
|
/* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/ \
|
||||||
if (rows != depth) { \
|
if (rows != depth) { \
|
||||||
\
|
\
|
||||||
/* FIXME handle mkl_domain_get_max_threads */ \
|
/* FIXME handle mkl_domain_get_max_threads */ \
|
||||||
/*int nthr = mkl_domain_get_max_threads(EIGEN_MKL_DOMAIN_BLAS);*/ int nthr = 1;\
|
/*int nthr = mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS);*/ int nthr = 1;\
|
||||||
\
|
\
|
||||||
if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \
|
if (((nthr==1) && (((std::max)(rows,depth)-diagSize)/(double)diagSize < 0.5))) { \
|
||||||
/* Most likely no benefit to call TRMM or GEMM from MKL*/ \
|
/* Most likely no benefit to call TRMM or GEMM from BLAS */ \
|
||||||
product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \
|
product_triangular_matrix_matrix<EIGTYPE,Index,Mode,true, \
|
||||||
LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
|
LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
|
||||||
_rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
|
_rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
|
||||||
@ -127,7 +127,7 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
|
|||||||
general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
|
general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
|
||||||
rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, resStride, alpha, gemm_blocking, 0); \
|
rows, cols, depth, aa_tmp.data(), aStride, _rhs, rhsStride, res, resStride, alpha, gemm_blocking, 0); \
|
||||||
\
|
\
|
||||||
/*std::cout << "TRMM_L: A is not square! Go to MKL GEMM implementation! " << nthr<<" \n";*/ \
|
/*std::cout << "TRMM_L: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/ \
|
||||||
} \
|
} \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
@ -170,9 +170,9 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
|
|||||||
a = _lhs; \
|
a = _lhs; \
|
||||||
lda = convert_index<BlasIndex>(lhsStride); \
|
lda = convert_index<BlasIndex>(lhsStride); \
|
||||||
} \
|
} \
|
||||||
/*std::cout << "TRMM_L: A is square! Go to MKL TRMM implementation! \n";*/ \
|
/*std::cout << "TRMM_L: A is square! Go to BLAS TRMM implementation! \n";*/ \
|
||||||
/* call ?trmm*/ \
|
/* call ?trmm*/ \
|
||||||
MKLPREFIX##trmm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
|
BLASPREFIX##trmm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
|
||||||
\
|
\
|
||||||
/* Add op(a_triangular)*b into res*/ \
|
/* Add op(a_triangular)*b into res*/ \
|
||||||
Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
|
Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
|
||||||
@ -180,13 +180,13 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,true, \
|
|||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMM_L(double, double, d, d)
|
EIGEN_BLAS_TRMM_L(double, double, d, d)
|
||||||
EIGEN_MKL_TRMM_L(dcomplex, double, cd, z)
|
EIGEN_BLAS_TRMM_L(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_TRMM_L(float, float, f, s)
|
EIGEN_BLAS_TRMM_L(float, float, f, s)
|
||||||
EIGEN_MKL_TRMM_L(scomplex, float, cf, c)
|
EIGEN_BLAS_TRMM_L(scomplex, float, cf, c)
|
||||||
|
|
||||||
// implements col-major += alpha * op(general) * op(triangular)
|
// implements col-major += alpha * op(general) * op(triangular)
|
||||||
#define EIGEN_MKL_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_TRMM_R(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template <typename Index, int Mode, \
|
template <typename Index, int Mode, \
|
||||||
int LhsStorageOrder, bool ConjugateLhs, \
|
int LhsStorageOrder, bool ConjugateLhs, \
|
||||||
int RhsStorageOrder, bool ConjugateRhs> \
|
int RhsStorageOrder, bool ConjugateRhs> \
|
||||||
@ -217,13 +217,13 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
|
|||||||
typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
|
typedef Matrix<EIGTYPE, Dynamic, Dynamic, LhsStorageOrder> MatrixLhs; \
|
||||||
typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
|
typedef Matrix<EIGTYPE, Dynamic, Dynamic, RhsStorageOrder> MatrixRhs; \
|
||||||
\
|
\
|
||||||
/* Non-square case - doesn't fit to MKL ?TRMM. Fall to default triangular product or call MKL ?GEMM*/ \
|
/* Non-square case - doesn't fit to BLAS ?TRMM. Fall to default triangular product or call BLAS ?GEMM*/ \
|
||||||
if (cols != depth) { \
|
if (cols != depth) { \
|
||||||
\
|
\
|
||||||
int nthr = 1 /*mkl_domain_get_max_threads(EIGEN_MKL_DOMAIN_BLAS)*/; \
|
int nthr = 1 /*mkl_domain_get_max_threads(EIGEN_BLAS_DOMAIN_BLAS)*/; \
|
||||||
\
|
\
|
||||||
if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \
|
if ((nthr==1) && (((std::max)(cols,depth)-diagSize)/(double)diagSize < 0.5)) { \
|
||||||
/* Most likely no benefit to call TRMM or GEMM from MKL*/ \
|
/* Most likely no benefit to call TRMM or GEMM from BLAS*/ \
|
||||||
product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \
|
product_triangular_matrix_matrix<EIGTYPE,Index,Mode,false, \
|
||||||
LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
|
LhsStorageOrder,ConjugateLhs, RhsStorageOrder, ConjugateRhs, ColMajor, BuiltIn>::run( \
|
||||||
_rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
|
_rows, _cols, _depth, _lhs, lhsStride, _rhs, rhsStride, res, resStride, alpha, blocking); \
|
||||||
@ -237,7 +237,7 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
|
|||||||
general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
|
general_matrix_matrix_product<Index,EIGTYPE,LhsStorageOrder,ConjugateLhs,EIGTYPE,RhsStorageOrder,ConjugateRhs,ColMajor>::run( \
|
||||||
rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, resStride, alpha, gemm_blocking, 0); \
|
rows, cols, depth, _lhs, lhsStride, aa_tmp.data(), aStride, res, resStride, alpha, gemm_blocking, 0); \
|
||||||
\
|
\
|
||||||
/*std::cout << "TRMM_R: A is not square! Go to MKL GEMM implementation! " << nthr<<" \n";*/ \
|
/*std::cout << "TRMM_R: A is not square! Go to BLAS GEMM implementation! " << nthr<<" \n";*/ \
|
||||||
} \
|
} \
|
||||||
return; \
|
return; \
|
||||||
} \
|
} \
|
||||||
@ -280,9 +280,9 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
|
|||||||
a = _rhs; \
|
a = _rhs; \
|
||||||
lda = convert_index<BlasIndex>(rhsStride); \
|
lda = convert_index<BlasIndex>(rhsStride); \
|
||||||
} \
|
} \
|
||||||
/*std::cout << "TRMM_R: A is square! Go to MKL TRMM implementation! \n";*/ \
|
/*std::cout << "TRMM_R: A is square! Go to BLAS TRMM implementation! \n";*/ \
|
||||||
/* call ?trmm*/ \
|
/* call ?trmm*/ \
|
||||||
MKLPREFIX##trmm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
|
BLASPREFIX##trmm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)b, &ldb); \
|
||||||
\
|
\
|
||||||
/* Add op(a_triangular)*b into res*/ \
|
/* Add op(a_triangular)*b into res*/ \
|
||||||
Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
|
Map<MatrixX##EIGPREFIX, 0, OuterStride<> > res_tmp(res,rows,cols,OuterStride<>(resStride)); \
|
||||||
@ -290,13 +290,13 @@ struct product_triangular_matrix_matrix_trmm<EIGTYPE,Index,Mode,false, \
|
|||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMM_R(double, double, d, d)
|
EIGEN_BLAS_TRMM_R(double, double, d, d)
|
||||||
EIGEN_MKL_TRMM_R(dcomplex, double, cd, z)
|
EIGEN_BLAS_TRMM_R(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_TRMM_R(float, float, f, s)
|
EIGEN_BLAS_TRMM_R(float, float, f, s)
|
||||||
EIGEN_MKL_TRMM_R(scomplex, float, cf, c)
|
EIGEN_BLAS_TRMM_R(scomplex, float, cf, c)
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_MKL_H
|
#endif // EIGEN_TRIANGULAR_MATRIX_MATRIX_BLAS_H
|
@ -25,13 +25,13 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Triangular matrix-vector product functionality based on ?TRMV.
|
* Triangular matrix-vector product functionality based on ?TRMV.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
|
#ifndef EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
|
||||||
#define EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
|
#define EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
@ -47,7 +47,7 @@ template<typename Index, int Mode, typename LhsScalar, bool ConjLhs, typename Rh
|
|||||||
struct triangular_matrix_vector_product_trmv :
|
struct triangular_matrix_vector_product_trmv :
|
||||||
triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};
|
triangular_matrix_vector_product<Index,Mode,LhsScalar,ConjLhs,RhsScalar,ConjRhs,StorageOrder,BuiltIn> {};
|
||||||
|
|
||||||
#define EIGEN_MKL_TRMV_SPECIALIZE(Scalar) \
|
#define EIGEN_BLAS_TRMV_SPECIALIZE(Scalar) \
|
||||||
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
||||||
struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
|
struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs,ColMajor,Specialized> { \
|
||||||
static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
|
static void run(Index _rows, Index _cols, const Scalar* _lhs, Index lhsStride, \
|
||||||
@ -65,13 +65,13 @@ struct triangular_matrix_vector_product<Index,Mode,Scalar,ConjLhs,Scalar,ConjRhs
|
|||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMV_SPECIALIZE(double)
|
EIGEN_BLAS_TRMV_SPECIALIZE(double)
|
||||||
EIGEN_MKL_TRMV_SPECIALIZE(float)
|
EIGEN_BLAS_TRMV_SPECIALIZE(float)
|
||||||
EIGEN_MKL_TRMV_SPECIALIZE(dcomplex)
|
EIGEN_BLAS_TRMV_SPECIALIZE(dcomplex)
|
||||||
EIGEN_MKL_TRMV_SPECIALIZE(scomplex)
|
EIGEN_BLAS_TRMV_SPECIALIZE(scomplex)
|
||||||
|
|
||||||
// implements col-major: res += alpha * op(triangular) * vector
|
// implements col-major: res += alpha * op(triangular) * vector
|
||||||
#define EIGEN_MKL_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_TRMV_CM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
||||||
struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
|
struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,ColMajor> { \
|
||||||
enum { \
|
enum { \
|
||||||
@ -121,11 +121,11 @@ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,
|
|||||||
diag = IsUnitDiag ? 'U' : 'N'; \
|
diag = IsUnitDiag ? 'U' : 'N'; \
|
||||||
\
|
\
|
||||||
/* call ?TRMV*/ \
|
/* call ?TRMV*/ \
|
||||||
MKLPREFIX##trmv_(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
|
BLASPREFIX##trmv_(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
|
||||||
\
|
\
|
||||||
/* Add op(a_tr)rhs into res*/ \
|
/* Add op(a_tr)rhs into res*/ \
|
||||||
MKLPREFIX##axpy_(&n, &numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
|
BLASPREFIX##axpy_(&n, &numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
|
||||||
/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
|
/* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/ \
|
||||||
if (size<(std::max)(rows,cols)) { \
|
if (size<(std::max)(rows,cols)) { \
|
||||||
if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
|
if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
|
||||||
x = x_tmp.data(); \
|
x = x_tmp.data(); \
|
||||||
@ -142,18 +142,18 @@ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,
|
|||||||
m = convert_index<BlasIndex>(size); \
|
m = convert_index<BlasIndex>(size); \
|
||||||
n = convert_index<BlasIndex>(cols-size); \
|
n = convert_index<BlasIndex>(cols-size); \
|
||||||
} \
|
} \
|
||||||
MKLPREFIX##gemv_(&trans, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, &numext::real_ref(beta), (BLASTYPE*)y, &incy); \
|
BLASPREFIX##gemv_(&trans, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, &numext::real_ref(beta), (BLASTYPE*)y, &incy); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMV_CM(double, double, d, d)
|
EIGEN_BLAS_TRMV_CM(double, double, d, d)
|
||||||
EIGEN_MKL_TRMV_CM(dcomplex, double, cd, z)
|
EIGEN_BLAS_TRMV_CM(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_TRMV_CM(float, float, f, s)
|
EIGEN_BLAS_TRMV_CM(float, float, f, s)
|
||||||
EIGEN_MKL_TRMV_CM(scomplex, float, cf, c)
|
EIGEN_BLAS_TRMV_CM(scomplex, float, cf, c)
|
||||||
|
|
||||||
// implements row-major: res += alpha * op(triangular) * vector
|
// implements row-major: res += alpha * op(triangular) * vector
|
||||||
#define EIGEN_MKL_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, MKLPREFIX) \
|
#define EIGEN_BLAS_TRMV_RM(EIGTYPE, BLASTYPE, EIGPREFIX, BLASPREFIX) \
|
||||||
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
template<typename Index, int Mode, bool ConjLhs, bool ConjRhs> \
|
||||||
struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
|
struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,ConjRhs,RowMajor> { \
|
||||||
enum { \
|
enum { \
|
||||||
@ -203,11 +203,11 @@ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,
|
|||||||
diag = IsUnitDiag ? 'U' : 'N'; \
|
diag = IsUnitDiag ? 'U' : 'N'; \
|
||||||
\
|
\
|
||||||
/* call ?TRMV*/ \
|
/* call ?TRMV*/ \
|
||||||
MKLPREFIX##trmv_(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
|
BLASPREFIX##trmv_(&uplo, &trans, &diag, &n, (const BLASTYPE*)_lhs, &lda, (BLASTYPE*)x, &incx); \
|
||||||
\
|
\
|
||||||
/* Add op(a_tr)rhs into res*/ \
|
/* Add op(a_tr)rhs into res*/ \
|
||||||
MKLPREFIX##axpy_(&n, &numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
|
BLASPREFIX##axpy_(&n, &numext::real_ref(alpha),(const BLASTYPE*)x, &incx, (BLASTYPE*)_res, &incy); \
|
||||||
/* Non-square case - doesn't fit to MKL ?TRMV. Fall to default triangular product*/ \
|
/* Non-square case - doesn't fit to BLAS ?TRMV. Fall to default triangular product*/ \
|
||||||
if (size<(std::max)(rows,cols)) { \
|
if (size<(std::max)(rows,cols)) { \
|
||||||
if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
|
if (ConjRhs) x_tmp = rhs.conjugate(); else x_tmp = rhs; \
|
||||||
x = x_tmp.data(); \
|
x = x_tmp.data(); \
|
||||||
@ -224,18 +224,18 @@ struct triangular_matrix_vector_product_trmv<Index,Mode,EIGTYPE,ConjLhs,EIGTYPE,
|
|||||||
m = convert_index<BlasIndex>(size); \
|
m = convert_index<BlasIndex>(size); \
|
||||||
n = convert_index<BlasIndex>(cols-size); \
|
n = convert_index<BlasIndex>(cols-size); \
|
||||||
} \
|
} \
|
||||||
MKLPREFIX##gemv_(&trans, &n, &m, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, &numext::real_ref(beta), (BLASTYPE*)y, &incy); \
|
BLASPREFIX##gemv_(&trans, &n, &m, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (const BLASTYPE*)x, &incx, &numext::real_ref(beta), (BLASTYPE*)y, &incy); \
|
||||||
} \
|
} \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRMV_RM(double, double, d, d)
|
EIGEN_BLAS_TRMV_RM(double, double, d, d)
|
||||||
EIGEN_MKL_TRMV_RM(dcomplex, double, cd, z)
|
EIGEN_BLAS_TRMV_RM(dcomplex, double, cd, z)
|
||||||
EIGEN_MKL_TRMV_RM(float, float, f, s)
|
EIGEN_BLAS_TRMV_RM(float, float, f, s)
|
||||||
EIGEN_MKL_TRMV_RM(scomplex, float, cf, c)
|
EIGEN_BLAS_TRMV_RM(scomplex, float, cf, c)
|
||||||
|
|
||||||
} // end namespase internal
|
} // end namespase internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_MKL_H
|
#endif // EIGEN_TRIANGULAR_MATRIX_VECTOR_BLAS_H
|
@ -25,20 +25,20 @@
|
|||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
* Content : Eigen bindings to Intel(R) MKL
|
* Content : Eigen bindings to BLAS F77
|
||||||
* Triangular matrix * matrix product functionality based on ?TRMM.
|
* Triangular matrix * matrix product functionality based on ?TRMM.
|
||||||
********************************************************************************
|
********************************************************************************
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
|
#ifndef EIGEN_TRIANGULAR_SOLVER_MATRIX_BLAS_H
|
||||||
#define EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
|
#define EIGEN_TRIANGULAR_SOLVER_MATRIX_BLAS_H
|
||||||
|
|
||||||
namespace Eigen {
|
namespace Eigen {
|
||||||
|
|
||||||
namespace internal {
|
namespace internal {
|
||||||
|
|
||||||
// implements LeftSide op(triangular)^-1 * general
|
// implements LeftSide op(triangular)^-1 * general
|
||||||
#define EIGEN_MKL_TRSM_L(EIGTYPE, BLASTYPE, MKLPREFIX) \
|
#define EIGEN_BLAS_TRSM_L(EIGTYPE, BLASTYPE, BLASPREFIX) \
|
||||||
template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
|
template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
|
||||||
struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor> \
|
struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorageOrder,ColMajor> \
|
||||||
{ \
|
{ \
|
||||||
@ -80,18 +80,18 @@ struct triangular_solve_matrix<EIGTYPE,Index,OnTheLeft,Mode,Conjugate,TriStorage
|
|||||||
} \
|
} \
|
||||||
if (IsUnitDiag) diag='U'; \
|
if (IsUnitDiag) diag='U'; \
|
||||||
/* call ?trsm*/ \
|
/* call ?trsm*/ \
|
||||||
MKLPREFIX##trsm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
|
BLASPREFIX##trsm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRSM_L(double, double, d)
|
EIGEN_BLAS_TRSM_L(double, double, d)
|
||||||
EIGEN_MKL_TRSM_L(dcomplex, double, z)
|
EIGEN_BLAS_TRSM_L(dcomplex, double, z)
|
||||||
EIGEN_MKL_TRSM_L(float, float, s)
|
EIGEN_BLAS_TRSM_L(float, float, s)
|
||||||
EIGEN_MKL_TRSM_L(scomplex, float, c)
|
EIGEN_BLAS_TRSM_L(scomplex, float, c)
|
||||||
|
|
||||||
|
|
||||||
// implements RightSide general * op(triangular)^-1
|
// implements RightSide general * op(triangular)^-1
|
||||||
#define EIGEN_MKL_TRSM_R(EIGTYPE, BLASTYPE, MKLPREFIX) \
|
#define EIGEN_BLAS_TRSM_R(EIGTYPE, BLASTYPE, BLASPREFIX) \
|
||||||
template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
|
template <typename Index, int Mode, bool Conjugate, int TriStorageOrder> \
|
||||||
struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor> \
|
struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorageOrder,ColMajor> \
|
||||||
{ \
|
{ \
|
||||||
@ -133,19 +133,19 @@ struct triangular_solve_matrix<EIGTYPE,Index,OnTheRight,Mode,Conjugate,TriStorag
|
|||||||
} \
|
} \
|
||||||
if (IsUnitDiag) diag='U'; \
|
if (IsUnitDiag) diag='U'; \
|
||||||
/* call ?trsm*/ \
|
/* call ?trsm*/ \
|
||||||
MKLPREFIX##trsm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
|
BLASPREFIX##trsm_(&side, &uplo, &transa, &diag, &m, &n, &numext::real_ref(alpha), (const BLASTYPE*)a, &lda, (BLASTYPE*)_other, &ldb); \
|
||||||
/*std::cout << "TRMS_L specialization!\n";*/ \
|
/*std::cout << "TRMS_L specialization!\n";*/ \
|
||||||
} \
|
} \
|
||||||
};
|
};
|
||||||
|
|
||||||
EIGEN_MKL_TRSM_R(double, double, d)
|
EIGEN_BLAS_TRSM_R(double, double, d)
|
||||||
EIGEN_MKL_TRSM_R(dcomplex, double, z)
|
EIGEN_BLAS_TRSM_R(dcomplex, double, z)
|
||||||
EIGEN_MKL_TRSM_R(float, float, s)
|
EIGEN_BLAS_TRSM_R(float, float, s)
|
||||||
EIGEN_MKL_TRSM_R(scomplex, float, c)
|
EIGEN_BLAS_TRSM_R(scomplex, float, c)
|
||||||
|
|
||||||
|
|
||||||
} // end namespace internal
|
} // end namespace internal
|
||||||
|
|
||||||
} // end namespace Eigen
|
} // end namespace Eigen
|
||||||
|
|
||||||
#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_MKL_H
|
#endif // EIGEN_TRIANGULAR_SOLVER_MATRIX_BLAS_H
|
Loading…
x
Reference in New Issue
Block a user