Have c_check probe availability of C11 atomics support and stdatomic.htags/v0.3.11^2
| @@ -249,6 +249,28 @@ if (($architecture eq "x86") || ($architecture eq "x86_64")) { | |||||
| } | } | ||||
| } | } | ||||
| $c11_atomics = 0; | |||||
| if ($data =~ /HAVE_C11/) { | |||||
| eval "use File::Temp qw(tempfile)"; | |||||
| if ($@){ | |||||
| warn "could not load PERL module File::Temp, so could not check compiler compatibility with C11"; | |||||
| $c11_atomics = 0; | |||||
| } else { | |||||
| ($fh,$tmpf) = tempfile( SUFFIX => '.c' , UNLINK => 1 ); | |||||
| print $tmpf "#include <stdatomic.h>\nint main(void){}\n"; | |||||
| $args = " -c -o $tmpf.o $tmpf"; | |||||
| my @cmd = ("$compiler_name $flags $args >/dev/null 2>/dev/null"); | |||||
| system(@cmd) == 0; | |||||
| if ($? != 0) { | |||||
| $c11_atomics = 0; | |||||
| } else { | |||||
| $c11_atomics = 1; | |||||
| } | |||||
| unlink("$tmpf.o"); | |||||
| } | |||||
| } | |||||
| $data = `$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`; | $data = `$compiler_name $flags -S ctest1.c && grep globl ctest1.s | head -n 1 && rm -f ctest1.s`; | ||||
| $data =~ /globl\s([_\.]*)(.*)/; | $data =~ /globl\s([_\.]*)(.*)/; | ||||
| @@ -352,6 +374,8 @@ print CONFFILE "#define __32BIT__\t1\n" if $binformat eq bin32; | |||||
| print CONFFILE "#define __64BIT__\t1\n" if $binformat eq bin64; | print CONFFILE "#define __64BIT__\t1\n" if $binformat eq bin64; | ||||
| print CONFFILE "#define FUNDERSCORE\t$need_fu\n" if $need_fu ne ""; | print CONFFILE "#define FUNDERSCORE\t$need_fu\n" if $need_fu ne ""; | ||||
| print CONFFILE "#define HAVE_MSA\t1\n" if $have_msa eq 1; | print CONFFILE "#define HAVE_MSA\t1\n" if $have_msa eq 1; | ||||
| print CONFFILE "#define HAVE_C11\t1\n" if $c11_atomics eq 1; | |||||
| if ($os eq "LINUX") { | if ($os eq "LINUX") { | ||||
| @@ -681,7 +681,7 @@ __declspec(dllimport) int __cdecl omp_in_parallel(void); | |||||
| __declspec(dllimport) int __cdecl omp_get_num_procs(void); | __declspec(dllimport) int __cdecl omp_get_num_procs(void); | ||||
| #endif | #endif | ||||
| #if (__STDC_VERSION__ >= 201112L) | |||||
| #ifdef HAVE_C11 | |||||
| #if defined(C_GCC) && ( __GNUC__ < 7) | #if defined(C_GCC) && ( __GNUC__ < 7) | ||||
| // workaround for GCC bug 65467 | // workaround for GCC bug 65467 | ||||
| #ifndef _Atomic | #ifndef _Atomic | ||||
| @@ -153,3 +153,6 @@ ARCH_ARM | |||||
| ARCH_ARM64 | ARCH_ARM64 | ||||
| #endif | #endif | ||||
| #if (defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L) | |||||
| HAVE_C11 | |||||
| #endif | |||||
| @@ -91,7 +91,7 @@ | |||||
| #endif | #endif | ||||
| typedef struct { | typedef struct { | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| _Atomic | _Atomic | ||||
| #else | #else | ||||
| volatile | volatile | ||||
| @@ -67,7 +67,7 @@ | |||||
| #endif | #endif | ||||
| typedef struct { | typedef struct { | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| _Atomic | _Atomic | ||||
| #else | #else | ||||
| volatile | volatile | ||||
| @@ -141,7 +141,7 @@ typedef struct { | |||||
| } thread_status_t; | } thread_status_t; | ||||
| #if (__STDC_VERSION__ >= 201112L) | |||||
| #ifdef HAVE_C11 | |||||
| #define atomic_load_queue(p) __atomic_load_n(p, __ATOMIC_RELAXED) | #define atomic_load_queue(p) __atomic_load_n(p, __ATOMIC_RELAXED) | ||||
| #define atomic_store_queue(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED) | #define atomic_store_queue(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED) | ||||
| #else | #else | ||||
| @@ -55,7 +55,7 @@ | |||||
| int blas_server_avail = 0; | int blas_server_avail = 0; | ||||
| static void * blas_thread_buffer[MAX_PARALLEL_NUMBER][MAX_CPU_NUMBER]; | static void * blas_thread_buffer[MAX_PARALLEL_NUMBER][MAX_CPU_NUMBER]; | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| static atomic_bool blas_buffer_inuse[MAX_PARALLEL_NUMBER]; | static atomic_bool blas_buffer_inuse[MAX_PARALLEL_NUMBER]; | ||||
| #else | #else | ||||
| static _Bool blas_buffer_inuse[MAX_PARALLEL_NUMBER]; | static _Bool blas_buffer_inuse[MAX_PARALLEL_NUMBER]; | ||||
| @@ -320,7 +320,7 @@ int exec_blas(BLASLONG num, blas_queue_t *queue){ | |||||
| while(true) { | while(true) { | ||||
| for(i=0; i < MAX_PARALLEL_NUMBER; i++) { | for(i=0; i < MAX_PARALLEL_NUMBER; i++) { | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| _Bool inuse = false; | _Bool inuse = false; | ||||
| if(atomic_compare_exchange_weak(&blas_buffer_inuse[i], &inuse, true)) { | if(atomic_compare_exchange_weak(&blas_buffer_inuse[i], &inuse, true)) { | ||||
| #else | #else | ||||
| @@ -345,7 +345,7 @@ int exec_blas(BLASLONG num, blas_queue_t *queue){ | |||||
| exec_threads(&queue[i], buf_index); | exec_threads(&queue[i], buf_index); | ||||
| } | } | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| atomic_store(&blas_buffer_inuse[buf_index], false); | atomic_store(&blas_buffer_inuse[buf_index], false); | ||||
| #else | #else | ||||
| blas_buffer_inuse[buf_index] = false; | blas_buffer_inuse[buf_index] = false; | ||||
| @@ -1095,7 +1095,7 @@ static BLASULONG base_address = 0UL; | |||||
| static BLASULONG base_address = BASE_ADDRESS; | static BLASULONG base_address = BASE_ADDRESS; | ||||
| #endif | #endif | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| static _Atomic int memory_initialized = 0; | static _Atomic int memory_initialized = 0; | ||||
| #else | #else | ||||
| static volatile int memory_initialized = 0; | static volatile int memory_initialized = 0; | ||||
| @@ -68,7 +68,7 @@ double sqrt(double); | |||||
| #define GETRF_FACTOR 1.00 | #define GETRF_FACTOR 1.00 | ||||
| #if (__STDC_VERSION__ >= 201112L) | |||||
| #ifdef HAVE_C11 | |||||
| #define atomic_load_long(p) __atomic_load_n(p, __ATOMIC_RELAXED) | #define atomic_load_long(p) __atomic_load_n(p, __ATOMIC_RELAXED) | ||||
| #define atomic_store_long(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED) | #define atomic_store_long(p, v) __atomic_store_n(p, v, __ATOMIC_RELAXED) | ||||
| #else | #else | ||||
| @@ -101,7 +101,7 @@ static FLOAT dm1 = -1.; | |||||
| #endif | #endif | ||||
| typedef struct { | typedef struct { | ||||
| #if __STDC_VERSION__ >= 201112L | |||||
| #ifdef HAVE_C11 | |||||
| _Atomic | _Atomic | ||||
| #else | #else | ||||
| volatile | volatile | ||||