1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/*
2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Copyright (c) 2011, Intel Corporation. All rights reserved.
3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Redistribution and use in source and binary forms, with or without modification,
5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath are permitted provided that the following conditions are met:
6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions of source code must retain the above copyright notice, this
8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   list of conditions and the following disclaimer.
9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Redistributions in binary form must reproduce the above copyright notice,
10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   this list of conditions and the following disclaimer in the documentation
11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   and/or other materials provided with the distribution.
12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * Neither the name of Intel Corporation nor the names of its contributors may
13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   be used to endorse or promote products derived from this software without
14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath   specific prior written permission.
15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *   Content : Eigen bindings to Intel(R) MKL
29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath *   Include file with common MKL declarations
30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ********************************************************************************
31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath*/
32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_MKL_SUPPORT_H
34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MKL_SUPPORT_H
35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_USE_MKL_ALL
37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifndef EIGEN_USE_BLAS
38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #define EIGEN_USE_BLAS
39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifndef EIGEN_USE_LAPACKE
41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #define EIGEN_USE_LAPACKE
42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #ifndef EIGEN_USE_MKL_VML
44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath    #define EIGEN_USE_MKL_VML
45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #endif
46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifdef EIGEN_USE_LAPACKE_STRICT
49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #define EIGEN_USE_LAPACKE
50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined(EIGEN_USE_BLAS) || defined(EIGEN_USE_LAPACKE) || defined(EIGEN_USE_MKL_VML)
53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  #define EIGEN_USE_MKL
54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#if defined EIGEN_USE_MKL
577faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   include <mkl.h>
587faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez/*Check IMKL version for compatibility: < 10.3 is not usable with Eigen*/
597faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   ifndef INTEL_MKL_VERSION
607faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef EIGEN_USE_MKL /* INTEL_MKL_VERSION is not even defined on older versions */
617faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   elif INTEL_MKL_VERSION < 100305    /* the intel-mkl-103-release-notes say this was when the lapacke.h interface was added*/
627faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef EIGEN_USE_MKL
637faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   endif
647faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   ifndef EIGEN_USE_MKL
657faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez    /*If the MKL version is too old, undef everything*/
667faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_MKL_ALL
677faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_BLAS
687faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_LAPACKE
697faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_MKL_VML
707faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_LAPACKE_STRICT
717faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#       undef   EIGEN_USE_LAPACKE
727faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#   endif
737faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#endif
74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
757faaa9f3f0df9d23790277834d426c3d992ac3baCarlos Hernandez#if defined EIGEN_USE_MKL
76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#include <mkl_lapacke.h>
77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MKL_VML_THRESHOLD 128
78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen {
80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef std::complex<double> dcomplex;
82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtypedef std::complex<float>  scomplex;
83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace internal {
85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MKLType, typename EigenType>
87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline void assign_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {
88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar=eigenScalar;
89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename MKLType, typename EigenType>
92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathstatic inline void assign_conj_scalar_eig2mkl(MKLType& mklScalar, const EigenType& eigenScalar) {
93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar=eigenScalar;
94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <>
97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void assign_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {
98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.real=eigenScalar.real();
99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.imag=eigenScalar.imag();
100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <>
103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void assign_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {
104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.real=eigenScalar.real();
105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.imag=eigenScalar.imag();
106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <>
109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void assign_conj_scalar_eig2mkl<MKL_Complex16,dcomplex>(MKL_Complex16& mklScalar, const dcomplex& eigenScalar) {
110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.real=eigenScalar.real();
111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.imag=-eigenScalar.imag();
112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate <>
115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathinline void assign_conj_scalar_eig2mkl<MKL_Complex8,scomplex>(MKL_Complex8& mklScalar, const scomplex& eigenScalar) {
116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.real=eigenScalar.real();
117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath  mklScalar.imag=-eigenScalar.imag();
118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}
119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace internal
121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen
123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif
125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath
126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_MKL_SUPPORT_H
127