diff --git a/BLAS/SRC/CMakeLists.txt b/BLAS/SRC/CMakeLists.txt index b8307db2b..501a3275f 100644 --- a/BLAS/SRC/CMakeLists.txt +++ b/BLAS/SRC/CMakeLists.txt @@ -129,7 +129,7 @@ if(BUILD_INDEX64_EXT_API) set_target_properties(${BLASLIB}_64_obj PROPERTIES POSITION_INDEPENDENT_CODE ON) #Add _64 suffix to all Fortran functions via macros foreach(F IN LISTS SOURCES_64_F) - if(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG") + if(CMAKE_Fortran_COMPILER_ID STREQUAL "NAG" OR CMAKE_Fortran_COMPILER_ID MATCHES "Intel") set_source_files_properties(${F} PROPERTIES COMPILE_FLAGS "-fpp") else() set_source_files_properties(${F} PROPERTIES COMPILE_FLAGS "-cpp") diff --git a/CBLAS/CMakeLists.txt b/CBLAS/CMakeLists.txt index 3713a3d2b..1bd75affe 100644 --- a/CBLAS/CMakeLists.txt +++ b/CBLAS/CMakeLists.txt @@ -13,9 +13,16 @@ endif() set(LAPACK_INSTALL_EXPORT_NAME ${CBLASLIB}-targets) -include(CheckCSourceCompiles) -check_c_source_compiles("int __attribute__((weak)) main() {};" - HAS_ATTRIBUTE_WEAK_SUPPORT) +if(WIN32) + # MSVC does not support __attribute__((weak)) and the Intel compiler supports + # it but produces linker errors when used in CBLAS, so we disable it for all + # Windows builds. + set(HAS_ATTRIBUTE_WEAK_SUPPORT FALSE) +else() + include(CheckCSourceCompiles) + check_c_source_compiles("int __attribute__((weak)) main() {};" + HAS_ATTRIBUTE_WEAK_SUPPORT) +endif() include_directories(include ${LAPACK_BINARY_DIR}/include) add_subdirectory(src) diff --git a/LAPACKE/include/lapack.h b/LAPACKE/include/lapack.h index 3a7d5bd74..2c41b984d 100644 --- a/LAPACKE/include/lapack.h +++ b/LAPACKE/include/lapack.h @@ -47,7 +47,8 @@ #else #include #endif -#if _MSC_VER + +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER) #define lapack_complex_float _Fcomplex #else #define lapack_complex_float float _Complex @@ -69,7 +70,8 @@ #else #include #endif -#if _MSC_VER + +#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER) #define lapack_complex_double _Dcomplex #else #define lapack_complex_double double _Complex diff --git a/LAPACKE/include/lapacke_config.h b/LAPACKE/include/lapacke_config.h index 753d4587a..d3b4e72b2 100644 --- a/LAPACKE/include/lapacke_config.h +++ b/LAPACKE/include/lapacke_config.h @@ -99,7 +99,7 @@ typedef struct { double real, imag; } _lapack_complex_double; #define lapack_complex_double_real(z) ((z).real()) #define lapack_complex_double_imag(z) ((z).imag()) -#elif _MSC_VER +#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER) #include #define lapack_complex_float _Fcomplex diff --git a/LAPACKE/src/lapacke_nancheck.c b/LAPACKE/src/lapacke_nancheck.c index c7d5c33f1..5bf5bca57 100644 --- a/LAPACKE/src/lapacke_nancheck.c +++ b/LAPACKE/src/lapacke_nancheck.c @@ -32,6 +32,9 @@ #include "lapacke_utils.h" +#include +#include + static int nancheck_flag = -1; void LAPACKE_set_nancheck( int flag ) @@ -39,21 +42,73 @@ void LAPACKE_set_nancheck( int flag ) nancheck_flag = ( flag ) ? 1 : 0; } +typedef struct { + int found; + char *value; +} lapacke_env_var; + +static inline lapacke_env_var LAPACKE_getenv(const char *var_name) +{ + size_t var_length = 0; + + /* Get the length of the environment variable value */ +#if defined(_WIN32) + errno_t result = getenv_s( &var_length, NULL, 0, var_name ); + if ( result != 0 || var_length == 0 ) { + return (lapacke_env_var){ 0, NULL }; + } +#else + const char *env = getenv( var_name ); + if ( env == NULL ) { + return (lapacke_env_var){ 0, NULL }; + } + var_length = strlen( env ) + 1; +#endif + + /* Allocate memory for the environment variable value */ + char *value = (char *)LAPACKE_malloc( var_length ); + if ( value == NULL ) { + return (lapacke_env_var){ 0, NULL }; + } + + /* Get the value of the environment variable */ +#if defined(_WIN32) + result = getenv_s( &var_length, value, var_length, var_name ); + if ( result != 0 ) { + LAPACKE_free( value ); + return (lapacke_env_var){ 0, NULL }; + } +#else + memcpy( value, env, var_length ); +#endif + + return (lapacke_env_var){ 1, value }; +} + +static inline void LAPACKE_freenv(lapacke_env_var *var) +{ + if ( var->found && var->value != NULL ) { + LAPACKE_free( var->value ); + } + var->found = 0; + var->value = NULL; +} + int LAPACKE_get_nancheck( ) { - char* env; if ( nancheck_flag != -1 ) { return nancheck_flag; } /* Check environment variable, once and only once */ - env = getenv( "LAPACKE_NANCHECK" ); - if ( !env ) { + lapacke_env_var lapacke_nancheck = LAPACKE_getenv( "LAPACKE_NANCHECK" ); + if ( !lapacke_nancheck.found ) { /* By default, NaN checking is enabled */ nancheck_flag = 1; } else { - nancheck_flag = atoi( env ) ? 1 : 0; + nancheck_flag = atoi( lapacke_nancheck.value ) ? 1 : 0; } + LAPACKE_freenv( &lapacke_nancheck ); return nancheck_flag; } diff --git a/LAPACKE/utils/lapacke_make_complex_double.c b/LAPACKE/utils/lapacke_make_complex_double.c index da59ce5d1..2d3eee155 100644 --- a/LAPACKE/utils/lapacke_make_complex_double.c +++ b/LAPACKE/utils/lapacke_make_complex_double.c @@ -43,7 +43,7 @@ lapack_complex_double lapack_make_complex_double( double re, double im ) { z = re + im * I; #elif defined(LAPACK_COMPLEX_CPP) z = std::complex(re,im); -#elif _MSC_VER +#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER) z = _Cbuild(re, im); #else /* C99 is default */ z = re + im*I; diff --git a/LAPACKE/utils/lapacke_make_complex_float.c b/LAPACKE/utils/lapacke_make_complex_float.c index 580b06837..7bca095e3 100644 --- a/LAPACKE/utils/lapacke_make_complex_float.c +++ b/LAPACKE/utils/lapacke_make_complex_float.c @@ -43,7 +43,7 @@ lapack_complex_float lapack_make_complex_float( float re, float im ) { z = re + im * I; #elif defined(LAPACK_COMPLEX_CPP) z = std::complex(re,im); -#elif _MSC_VER +#elif defined(_MSC_VER) && !defined(__INTEL_COMPILER) && !defined(__INTEL_LLVM_COMPILER) z = _FCbuild(re, im); #else /* C99 is default */ z = re + im*I; diff --git a/SRC/cgees.f b/SRC/cgees.f index 4d102a921..f534e3436 100644 --- a/SRC/cgees.f +++ b/SRC/cgees.f @@ -209,7 +209,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(EV) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(EV) COMPLEX EV END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/cgeesx.f b/SRC/cgeesx.f index 84933958b..d68834b21 100644 --- a/SRC/cgeesx.f +++ b/SRC/cgeesx.f @@ -253,7 +253,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(EV) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(EV) COMPLEX EV END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/cgges.f b/SRC/cgges.f index f28245988..5c7127a68 100644 --- a/SRC/cgges.f +++ b/SRC/cgges.f @@ -285,7 +285,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/cgges3.f b/SRC/cgges3.f index 3ca10204c..674849cf0 100644 --- a/SRC/cgges3.f +++ b/SRC/cgges3.f @@ -284,7 +284,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/cggesx.f b/SRC/cggesx.f index cc6a662b6..4aacf4189 100644 --- a/SRC/cggesx.f +++ b/SRC/cggesx.f @@ -347,7 +347,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/clarf1f.f b/SRC/clarf1f.f index cb9fc47ee..b5d4e47a4 100644 --- a/SRC/clarf1f.f +++ b/SRC/clarf1f.f @@ -150,7 +150,7 @@ INTEGER I, LASTV, LASTC * .. * .. External Subroutines .. - EXTERNAL CAXPY, CGEMV, CGER, CSCAL + EXTERNAL CAXPY, CGEMV, CGERC, CSCAL * .. * .. Intrinsic Functions .. INTRINSIC CONJG diff --git a/SRC/dgees.f b/SRC/dgees.f index 5e4e7c245..dfb09b3ad 100644 --- a/SRC/dgees.f +++ b/SRC/dgees.f @@ -228,7 +228,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) DOUBLE PRECISION WR, WI END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/dgeesx.f b/SRC/dgeesx.f index 1e99dda92..87c367771 100644 --- a/SRC/dgeesx.f +++ b/SRC/dgeesx.f @@ -295,7 +295,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) DOUBLE PRECISION WR, WI END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/dgges.f b/SRC/dgges.f index 77b3b4dca..73d4946d9 100644 --- a/SRC/dgges.f +++ b/SRC/dgges.f @@ -298,7 +298,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) DOUBLE PRECISION ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/dgges3.f b/SRC/dgges3.f index 0d2cf4461..e877c70a2 100644 --- a/SRC/dgges3.f +++ b/SRC/dgges3.f @@ -297,7 +297,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) DOUBLE PRECISION ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/dggesx.f b/SRC/dggesx.f index 3d649eed7..1c21bedee 100644 --- a/SRC/dggesx.f +++ b/SRC/dggesx.f @@ -382,7 +382,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) DOUBLE PRECISION ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/sgees.f b/SRC/sgees.f index b41685c9e..6c74a6ce5 100644 --- a/SRC/sgees.f +++ b/SRC/sgees.f @@ -228,7 +228,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) REAL WR, WI END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/sgeesx.f b/SRC/sgeesx.f index 21721e6a2..f14c735fa 100644 --- a/SRC/sgeesx.f +++ b/SRC/sgeesx.f @@ -295,7 +295,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(WR, WI) REAL WR, WI END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/sgges.f b/SRC/sgges.f index 998b2b763..b64599ca8 100644 --- a/SRC/sgges.f +++ b/SRC/sgges.f @@ -298,7 +298,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) REAL ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/sgges3.f b/SRC/sgges3.f index 0f5125819..991dbca93 100644 --- a/SRC/sgges3.f +++ b/SRC/sgges3.f @@ -297,7 +297,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) REAL ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/sggesx.f b/SRC/sggesx.f index a03db3589..e45b62d26 100644 --- a/SRC/sggesx.f +++ b/SRC/sggesx.f @@ -382,7 +382,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHAR, ALPHAI, BETA) REAL ALPHAR, ALPHAI, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/zgees.f b/SRC/zgees.f index 995419de6..c85dc1307 100644 --- a/SRC/zgees.f +++ b/SRC/zgees.f @@ -209,7 +209,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(EV) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(EV) COMPLEX*16 EV END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/zgeesx.f b/SRC/zgeesx.f index ad1731c6c..4abda28af 100644 --- a/SRC/zgeesx.f +++ b/SRC/zgeesx.f @@ -253,7 +253,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELECT_PROC_TYPE(EV) BIND(C) + LOGICAL FUNCTION SELECT_PROC_TYPE(EV) COMPLEX*16 EV END FUNCTION SELECT_PROC_TYPE END INTERFACE diff --git a/SRC/zgges.f b/SRC/zgges.f index 836a2b1fa..a0e19dcbb 100644 --- a/SRC/zgges.f +++ b/SRC/zgges.f @@ -285,7 +285,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX*16 ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/zgges3.f b/SRC/zgges3.f index de8b2ae2a..82f3c41e9 100644 --- a/SRC/zgges3.f +++ b/SRC/zgges3.f @@ -284,7 +284,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX*16 ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/zggesx.f b/SRC/zggesx.f index 0353bb43a..15f514413 100644 --- a/SRC/zggesx.f +++ b/SRC/zggesx.f @@ -347,7 +347,7 @@ * .. * .. Function Arguments .. INTERFACE - LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) BIND(C) + LOGICAL FUNCTION SELCTG_PROC_TYPE(ALPHA,BETA) COMPLEX*16 ALPHA, BETA END FUNCTION SELCTG_PROC_TYPE END INTERFACE diff --git a/SRC/zupmtr.f b/SRC/zupmtr.f index b37f4b182..97b0a6745 100644 --- a/SRC/zupmtr.f +++ b/SRC/zupmtr.f @@ -176,7 +176,7 @@ EXTERNAL LSAME * .. * .. External Subroutines .. - EXTERNAL XERBLA, ZLARF1, ZLARF1F + EXTERNAL XERBLA, ZLARF1L, ZLARF1F * .. * .. Intrinsic Functions .. INTRINSIC DCONJG, MAX