1 | /* |
2 | Copyright (c) 2011, Intel Corporation. All rights reserved. |
3 | |
4 | Redistribution and use in source and binary forms, with or without modification, |
5 | are permitted provided that the following conditions are met: |
6 | |
7 | * Redistributions of source code must retain the above copyright notice, this |
8 | list of conditions and the following disclaimer. |
9 | * Redistributions in binary form must reproduce the above copyright notice, |
10 | this list of conditions and the following disclaimer in the documentation |
11 | and/or other materials provided with the distribution. |
12 | * Neither the name of Intel Corporation nor the names of its contributors may |
13 | be used to endorse or promote products derived from this software without |
14 | specific prior written permission. |
15 | |
16 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND |
17 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
18 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
19 | DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR |
20 | ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
21 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
22 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON |
23 | ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
24 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS |
25 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
26 | |
27 | ******************************************************************************** |
28 | * Content : Eigen bindings to Intel(R) MKL |
29 | * Include file with common MKL declarations |
30 | ******************************************************************************** |
31 | */ |
32 | |
33 | #ifndef EIGEN_MKL_SUPPORT_H |
34 | #define EIGEN_MKL_SUPPORT_H |
35 | |
36 | #ifdef EIGEN_USE_MKL_ALL |
37 | #ifndef EIGEN_USE_BLAS |
38 | #define EIGEN_USE_BLAS |
39 | #endif |
40 | #ifndef EIGEN_USE_LAPACKE |
41 | #define EIGEN_USE_LAPACKE |
42 | #endif |
43 | #ifndef EIGEN_USE_MKL_VML |
44 | #define EIGEN_USE_MKL_VML |
45 | #endif |
46 | #endif |
47 | |
48 | #ifdef EIGEN_USE_LAPACKE_STRICT |
49 | #define EIGEN_USE_LAPACKE |
50 | #endif |
51 | |
52 | #if defined(EIGEN_USE_MKL_VML) && !defined(EIGEN_USE_MKL) |
53 | #define EIGEN_USE_MKL |
54 | #endif |
55 | |
56 | |
57 | #if defined EIGEN_USE_MKL |
58 | # include <mkl.h> |
59 | /*Check IMKL version for compatibility: < 10.3 is not usable with Eigen*/ |
60 | # ifndef INTEL_MKL_VERSION |
61 | # undef EIGEN_USE_MKL /* INTEL_MKL_VERSION is not even defined on older versions */ |
62 | # elif INTEL_MKL_VERSION < 100305 /* the intel-mkl-103-release-notes say this was when the lapacke.h interface was added*/ |
63 | # undef EIGEN_USE_MKL |
64 | # endif |
65 | # ifndef EIGEN_USE_MKL |
66 | /*If the MKL version is too old, undef everything*/ |
67 | # undef EIGEN_USE_MKL_ALL |
68 | # undef EIGEN_USE_LAPACKE |
69 | # undef EIGEN_USE_MKL_VML |
70 | # undef EIGEN_USE_LAPACKE_STRICT |
71 | # undef EIGEN_USE_LAPACKE |
72 | # endif |
73 | #endif |
74 | |
75 | #if defined EIGEN_USE_MKL |
76 | |
77 | #define EIGEN_MKL_VML_THRESHOLD 128 |
78 | |
79 | /* MKL_DOMAIN_BLAS, etc are defined only in 10.3 update 7 */ |
80 | /* MKL_BLAS, etc are not defined in 11.2 */ |
81 | #ifdef MKL_DOMAIN_ALL |
82 | #define EIGEN_MKL_DOMAIN_ALL MKL_DOMAIN_ALL |
83 | #else |
84 | #define EIGEN_MKL_DOMAIN_ALL MKL_ALL |
85 | #endif |
86 | |
87 | #ifdef MKL_DOMAIN_BLAS |
88 | #define EIGEN_MKL_DOMAIN_BLAS MKL_DOMAIN_BLAS |
89 | #else |
90 | #define EIGEN_MKL_DOMAIN_BLAS MKL_BLAS |
91 | #endif |
92 | |
93 | #ifdef MKL_DOMAIN_FFT |
94 | #define EIGEN_MKL_DOMAIN_FFT MKL_DOMAIN_FFT |
95 | #else |
96 | #define EIGEN_MKL_DOMAIN_FFT MKL_FFT |
97 | #endif |
98 | |
99 | #ifdef MKL_DOMAIN_VML |
100 | #define EIGEN_MKL_DOMAIN_VML MKL_DOMAIN_VML |
101 | #else |
102 | #define EIGEN_MKL_DOMAIN_VML MKL_VML |
103 | #endif |
104 | |
105 | #ifdef MKL_DOMAIN_PARDISO |
106 | #define EIGEN_MKL_DOMAIN_PARDISO MKL_DOMAIN_PARDISO |
107 | #else |
108 | #define EIGEN_MKL_DOMAIN_PARDISO MKL_PARDISO |
109 | #endif |
110 | #endif |
111 | |
112 | #if defined(EIGEN_USE_BLAS) && !defined(EIGEN_USE_MKL) |
113 | #include "../../misc/blas.h" |
114 | #endif |
115 | |
116 | namespace Eigen { |
117 | |
118 | typedef std::complex<double> dcomplex; |
119 | typedef std::complex<float> scomplex; |
120 | |
121 | #if defined(EIGEN_USE_MKL) |
122 | typedef MKL_INT BlasIndex; |
123 | #else |
124 | typedef int BlasIndex; |
125 | #endif |
126 | |
127 | } // end namespace Eigen |
128 | |
129 | |
130 | #endif // EIGEN_MKL_SUPPORT_H |
131 | |