| @@ -502,8 +502,7 @@ static void __inline blas_lock(volatile BLASULONG *address){ | |||||
| extension since version 3.0. If neither are available, use a compatible | extension since version 3.0. If neither are available, use a compatible | ||||
| structure as fallback (see Clause 6.2.5.13 of the C99 standard). */ | structure as fallback (see Clause 6.2.5.13 of the C99 standard). */ | ||||
| #if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \ | #if (defined(__STDC_IEC_559_COMPLEX__) || __STDC_VERSION__ >= 199901L || \ | ||||
| (__GNUC__ >= 3 && !defined(__cplusplus)) || \ | |||||
| _MSC_VER >= 1800) // Visual Studio 2013 supports complex | |||||
| (__GNUC__ >= 3 && !defined(__cplusplus)) ) | |||||
| #define OPENBLAS_COMPLEX_C99 | #define OPENBLAS_COMPLEX_C99 | ||||
| #ifndef __cplusplus | #ifndef __cplusplus | ||||
| #include <complex.h> | #include <complex.h> | ||||
| @@ -69,8 +69,8 @@ foreach (CBLAS_FLAG ${CBLAS_FLAGS}) | |||||
| set(DISABLE_COMPLEX 0) | set(DISABLE_COMPLEX 0) | ||||
| set(MANGLE_COMPLEX 3) | set(MANGLE_COMPLEX 3) | ||||
| if (CBLAS_FLAG EQUAL 1) | if (CBLAS_FLAG EQUAL 1) | ||||
| set(DISABLE_COMPLEX 1) | |||||
| set(MANGLE_COMPLEX 1) | |||||
| # set(DISABLE_COMPLEX 1) | |||||
| # set(MANGLE_COMPLEX 1) | |||||
| endif () | endif () | ||||
| GenerateNamedObjects("${BLAS1_SOURCES}" "" "" ${CBLAS_FLAG} "" "" false ${DISABLE_COMPLEX}) | GenerateNamedObjects("${BLAS1_SOURCES}" "" "" ${CBLAS_FLAG} "" "" false ${DISABLE_COMPLEX}) | ||||
| GenerateNamedObjects("${BLAS1_REAL_ONLY_SOURCES}" "" "" ${CBLAS_FLAG} "" "" false 1) | GenerateNamedObjects("${BLAS1_REAL_ONLY_SOURCES}" "" "" ${CBLAS_FLAG} "" "" false 1) | ||||
| @@ -98,43 +98,54 @@ foreach (CBLAS_FLAG ${CBLAS_FLAGS}) | |||||
| GenerateNamedObjects("imax.c" "USE_ABS;USE_MIN" "i*amin" ${CBLAS_FLAG}) | GenerateNamedObjects("imax.c" "USE_ABS;USE_MIN" "i*amin" ${CBLAS_FLAG}) | ||||
| GenerateNamedObjects("imax.c" "USE_MIN" "i*min" ${CBLAS_FLAG}) | GenerateNamedObjects("imax.c" "USE_MIN" "i*min" ${CBLAS_FLAG}) | ||||
| endforeach () | |||||
| # complex-specific sources | # complex-specific sources | ||||
| foreach (float_type ${FLOAT_TYPES}) | foreach (float_type ${FLOAT_TYPES}) | ||||
| if (${float_type} STREQUAL "COMPLEX" OR ${float_type} STREQUAL "ZCOMPLEX") | if (${float_type} STREQUAL "COMPLEX" OR ${float_type} STREQUAL "ZCOMPLEX") | ||||
| GenerateNamedObjects("zger.c" "" "geru" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zger.c" "CONJ" "gerc" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zdot.c" "CONJ" "dotc" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zdot.c" "" "dotu" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zger.c" "" "geru" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zger.c" "CONJ" "gerc" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zdot.c" "CONJ" "dotc" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zdot.c" "" "dotu" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("symm.c" "HEMM" "hemm" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("syrk.c" "HEMM" "herk" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("syr2k.c" "HEMM" "her2k" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("symm.c" "HEMM" "hemm" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("syrk.c" "HEMM" "herk" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| GenerateNamedObjects("syr2k.c" "HEMM" "her2k" ${CBLAS_FLAG} "" "" false ${float_type}) | |||||
| if (USE_GEMM3M) | if (USE_GEMM3M) | ||||
| GenerateNamedObjects("gemm.c" "GEMM3M" "gemm3m" false "" "" false ${float_type}) | GenerateNamedObjects("gemm.c" "GEMM3M" "gemm3m" false "" "" false ${float_type}) | ||||
| endif() | endif() | ||||
| endif () | endif () | ||||
| if (${float_type} STREQUAL "COMPLEX") | if (${float_type} STREQUAL "COMPLEX") | ||||
| GenerateNamedObjects("zscal.c" "SSCAL" "sscal" false "" "" false "COMPLEX") | |||||
| GenerateNamedObjects("nrm2.c" "" "scnrm2" false "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("zrot.c" "" "csrot" false "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS;USE_MIN" "scamin" false "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS" "scamax" false "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("asum.c" "" "scasum" false "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("zscal.c" "SSCAL" "sscal" ${CBLAS_FLAG} "" "" false "COMPLEX") | |||||
| GenerateNamedObjects("nrm2.c" "" "scnrm2" ${CBLAS_FLAG} "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("zrot.c" "" "csrot" ${CBLAS_FLAG} "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS;USE_MIN" "scamin" ${CBLAS_FLAG} "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS" "scamax" ${CBLAS_FLAG} "" "" true "COMPLEX") | |||||
| GenerateNamedObjects("asum.c" "" "scasum" ${CBLAS_FLAG} "" "" true "COMPLEX") | |||||
| endif () | endif () | ||||
| if (${float_type} STREQUAL "ZCOMPLEX") | if (${float_type} STREQUAL "ZCOMPLEX") | ||||
| GenerateNamedObjects("zscal.c" "SSCAL" "dscal" false "" "" false "ZCOMPLEX") | |||||
| GenerateNamedObjects("nrm2.c" "" "dznrm2" false "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("zrot.c" "" "zdrot" false "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS;USE_MIN" "dzamin" false "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS" "dzamax" false "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("asum.c" "" "dzasum" false "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("zscal.c" "SSCAL" "dscal" ${CBLAS_FLAG} "" "" false "ZCOMPLEX") | |||||
| GenerateNamedObjects("nrm2.c" "" "dznrm2" ${CBLAS_FLAG} "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("zrot.c" "" "zdrot" ${CBLAS_FLAG} "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS;USE_MIN" "dzamin" ${CBLAS_FLAG} "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("max.c" "USE_ABS" "dzamax" ${CBLAS_FLAG} "" "" true "ZCOMPLEX") | |||||
| GenerateNamedObjects("asum.c" "" "dzasum" ${CBLAS_FLAG} "" "" true "ZCOMPLEX") | |||||
| endif () | endif () | ||||
| endforeach () | endforeach () | ||||
| endforeach () | |||||
| #Special functions for CBLAS | |||||
| if (NOT DEFINED NO_CBLAS) | |||||
| foreach (float_type ${FLOAT_TYPES}) | |||||
| if (${float_type} STREQUAL "COMPLEX" OR ${float_type} STREQUAL "ZCOMPLEX") | |||||
| #cblas_dotc_sub cblas_dotu_sub | |||||
| GenerateNamedObjects("zdot.c" "FORCE_USE_STACK" "dotu_sub" 1 "" "" false ${float_type}) | |||||
| GenerateNamedObjects("zdot.c" "FORCE_USE_STACK;CONJ" "dotc_sub" 1 "" "" false ${float_type}) | |||||
| endif() | |||||
| endforeach () | |||||
| endif() | |||||
| if (NOT DEFINED NO_LAPACK) | if (NOT DEFINED NO_LAPACK) | ||||
| set(LAPACK_SOURCES | set(LAPACK_SOURCES | ||||
| @@ -153,16 +153,19 @@ void CNAME(blasint n, FLOAT *x, blasint incx, FLOAT *y, blasint incy, | |||||
| OPENBLAS_COMPLEX_FLOAT CNAME(blasint n, FLOAT *x, blasint incx, FLOAT *y, blasint incy){ | OPENBLAS_COMPLEX_FLOAT CNAME(blasint n, FLOAT *x, blasint incx, FLOAT *y, blasint incy){ | ||||
| OPENBLAS_COMPLEX_FLOAT ret; | OPENBLAS_COMPLEX_FLOAT ret; | ||||
| OPENBLAS_COMPLEX_FLOAT zero=OPENBLAS_MAKE_COMPLEX_FLOAT(0.0, 0.0); | |||||
| #endif | #endif | ||||
| PRINT_DEBUG_CNAME; | PRINT_DEBUG_CNAME; | ||||
| if (n <= 0) { | if (n <= 0) { | ||||
| #ifdef FORCE_USE_STACK | #ifdef FORCE_USE_STACK | ||||
| *result = OPENBLAS_MAKE_COMPLEX_FLOAT(0.0, 0.0); | |||||
| //*result = OPENBLAS_MAKE_COMPLEX_FLOAT(0.0, 0.0); | |||||
| CREAL(*result) = 0.0; | |||||
| CIMAG(*result) = 0.0; | |||||
| return; | return; | ||||
| #else | #else | ||||
| return OPENBLAS_MAKE_COMPLEX_FLOAT(0.0, 0.0); | |||||
| return zero; | |||||
| #endif | #endif | ||||
| } | } | ||||
| @@ -148,6 +148,9 @@ void CNAME(enum CBLAS_ORDER order, | |||||
| blasint info, t; | blasint info, t; | ||||
| #ifdef SMP | #ifdef SMP | ||||
| int nthreads; | int nthreads; | ||||
| int nthreads_max; | |||||
| int nthreads_avail; | |||||
| double MNK; | |||||
| #endif | #endif | ||||
| int (*gemv[])(BLASLONG, BLASLONG, BLASLONG, FLOAT, FLOAT, FLOAT *, BLASLONG, | int (*gemv[])(BLASLONG, BLASLONG, BLASLONG, FLOAT, FLOAT, FLOAT *, BLASLONG, | ||||
| @@ -121,6 +121,9 @@ void CNAME(enum CBLAS_ORDER order, enum CBLAS_UPLO Uplo, int n, FLOAT alpha, FLO | |||||
| FLOAT *buffer; | FLOAT *buffer; | ||||
| int trans, uplo; | int trans, uplo; | ||||
| blasint info; | blasint info; | ||||
| FLOAT * ALPHA = α | |||||
| FLOAT alpha_r = ALPHA[0]; | |||||
| FLOAT alpha_i = ALPHA[1]; | |||||
| #ifdef SMP | #ifdef SMP | ||||
| int nthreads; | int nthreads; | ||||
| #endif | #endif | ||||
| @@ -347,6 +347,74 @@ foreach (float_type ${FLOAT_TYPES}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}OMATCOPY_RTC}" "CONJ;ROWM" "omatcopy_k_rtc" false "" "" false ${float_type}) | GenerateNamedObjects("${KERNELDIR}/${${float_char}OMATCOPY_RTC}" "CONJ;ROWM" "omatcopy_k_rtc" false "" "" false ${float_type}) | ||||
| endif() | endif() | ||||
| #imatcopy | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_CN) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_CN ../generic/zimatcopy_cn.c) | |||||
| else () | |||||
| set(${float_char}IMATCOPY_CN ../generic/imatcopy_cn.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_RN) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_RN ../generic/zimatcopy_rn.c) | |||||
| else () | |||||
| set(${float_char}IMATCOPY_RN ../generic/imatcopy_rn.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_CT) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_CT ../generic/zimatcopy_ct.c) | |||||
| else () | |||||
| set(${float_char}IMATCOPY_CT ../generic/imatcopy_ct.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_RT) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_RT ../generic/zimatcopy_rt.c) | |||||
| else () | |||||
| set(${float_char}IMATCOPY_RT ../generic/imatcopy_rt.c) | |||||
| endif () | |||||
| endif () | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_CN}" "" "imatcopy_k_cn" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_RN}" "ROWM" "imatcopy_k_rn" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_CT}" "" "imatcopy_k_ct" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_RT}" "ROWM" "imatcopy_k_rt" false "" "" false ${float_type}) | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_CNC) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_CNC ../generic/zimatcopy_cnc.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_RNC) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_RNC ../generic/zimatcopy_rnc.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_CTC) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_CTC ../generic/zimatcopy_ctc.c) | |||||
| endif () | |||||
| endif () | |||||
| if (NOT DEFINED ${float_char}IMATCOPY_RTC) | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| set(${float_char}IMATCOPY_RTC ../generic/zimatcopy_rtc.c) | |||||
| endif () | |||||
| endif () | |||||
| if (${float_char} STREQUAL "Z" OR ${float_char} STREQUAL "C") | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_CNC}" "CONJ" "imatcopy_k_cnc" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_RNC}" "CONJ;ROWM" "imatcopy_k_rnc" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_CTC}" "CONJ" "imatcopy_k_ctc" false "" "" false ${float_type}) | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}IMATCOPY_RTC}" "CONJ;ROWM" "imatcopy_k_rtc" false "" "" false ${float_type}) | |||||
| endif() | |||||
| #geadd | |||||
| GenerateNamedObjects("${KERNELDIR}/${${float_char}GEADD_KERNEL}" "" "geadd_k" false "" "" false ${float_type}) | GenerateNamedObjects("${KERNELDIR}/${${float_char}GEADD_KERNEL}" "" "geadd_k" false "" "" false ${float_type}) | ||||
| endforeach () | endforeach () | ||||