commit
31d30312dc
|
@ -617,6 +617,7 @@ DYNAMIC_CORE += POWER8
|
||||||
ifneq ($(C_COMPILER), GCC)
|
ifneq ($(C_COMPILER), GCC)
|
||||||
DYNAMIC_CORE += POWER9
|
DYNAMIC_CORE += POWER9
|
||||||
DYNAMIC_CORE += POWER10
|
DYNAMIC_CORE += POWER10
|
||||||
|
override LDFLAGS += -Wl,-no-power10-stubs
|
||||||
endif
|
endif
|
||||||
ifeq ($(C_COMPILER), GCC)
|
ifeq ($(C_COMPILER), GCC)
|
||||||
ifeq ($(GCCVERSIONGT5), 1)
|
ifeq ($(GCCVERSIONGT5), 1)
|
||||||
|
@ -626,9 +627,11 @@ $(info, OpenBLAS: Your gcc version is too old to build the POWER9 kernels.)
|
||||||
endif
|
endif
|
||||||
ifeq ($(GCCVERSIONGTEQ11), 1)
|
ifeq ($(GCCVERSIONGTEQ11), 1)
|
||||||
DYNAMIC_CORE += POWER10
|
DYNAMIC_CORE += POWER10
|
||||||
else ifeq ($(GCCVERSIONEQ10), 1)
|
override LDFLAGS += -Wl,-no-power10-stubs
|
||||||
|
else ifeq ($(GCCVERSIONGTEQ10), 1)
|
||||||
ifeq ($(GCCMINORVERSIONGTEQ2), 1)
|
ifeq ($(GCCMINORVERSIONGTEQ2), 1)
|
||||||
DYNAMIC_CORE += POWER10
|
DYNAMIC_CORE += POWER10
|
||||||
|
override LDFLAGS += -Wl,-no-power10-stubs
|
||||||
endif
|
endif
|
||||||
else
|
else
|
||||||
$(info, OpenBLAS: Your gcc version is too old to build the POWER10 kernels.)
|
$(info, OpenBLAS: Your gcc version is too old to build the POWER10 kernels.)
|
||||||
|
|
|
@ -58,6 +58,10 @@ Examples:
|
||||||
```sh
|
```sh
|
||||||
make BINARY=64 CC=mips64el-unknown-linux-gnu-gcc FC=mips64el-unknown-linux-gnu-gfortran HOSTCC=gcc TARGET=LOONGSON3A
|
make BINARY=64 CC=mips64el-unknown-linux-gnu-gcc FC=mips64el-unknown-linux-gnu-gfortran HOSTCC=gcc TARGET=LOONGSON3A
|
||||||
```
|
```
|
||||||
|
or same with the newer mips-crosscompiler put out by Loongson that defaults to the 32bit ABI:
|
||||||
|
```sh
|
||||||
|
make HOSTCC=gcc CC='/opt/mips-loongson-gcc7.3-linux-gnu/2019.06-29/bin/mips-linux-gnu-gcc -mabi=64' FC='/opt/mips-loongson-gcc7.3-linux-gnu/2019.06-29/bin/mips-linux-gnu-gfortran -mabi=64' TARGET=LOONGSON3A
|
||||||
|
```
|
||||||
|
|
||||||
* On an x86 box, compile this library for a loongson3a CPU with loongcc (based on Open64) compiler:
|
* On an x86 box, compile this library for a loongson3a CPU with loongcc (based on Open64) compiler:
|
||||||
```sh
|
```sh
|
||||||
|
|
24
c_check
24
c_check
|
@ -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") {
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,15 @@
|
||||||
# NEED2UNDERSCORES
|
# NEED2UNDERSCORES
|
||||||
|
|
||||||
if (NOT NO_LAPACK)
|
if (NOT NO_LAPACK)
|
||||||
enable_language(Fortran)
|
include(CheckLanguage)
|
||||||
|
check_language(Fortran)
|
||||||
|
if(CMAKE_Fortran_COMPILER)
|
||||||
|
enable_language(Fortran)
|
||||||
|
else()
|
||||||
|
message(STATUS "No Fortran compiler found, can build only BLAS but not LAPACK")
|
||||||
|
set (NOFORTRAN 1)
|
||||||
|
set (NO_LAPACK 1)
|
||||||
|
endif()
|
||||||
else()
|
else()
|
||||||
include(CMakeForceCompiler)
|
include(CMakeForceCompiler)
|
||||||
CMAKE_FORCE_Fortran_COMPILER(gfortran GNU)
|
CMAKE_FORCE_Fortran_COMPILER(gfortran GNU)
|
||||||
|
|
2
common.h
2
common.h
|
@ -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
|
||||||
|
|
3
ctest.c
3
ctest.c
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue