@@ -141,3 +141,28 @@ steps: | |||
- cmake $CMAKE_FLAGS .. | |||
- make -j | |||
- ctest -V | |||
--- | |||
kind: pipeline | |||
name: arm64_native_test | |||
platform: | |||
os: linux | |||
arch: arm64 | |||
steps: | |||
- name: Build and Test | |||
image: ubuntu:19.04 | |||
environment: | |||
CC: gcc | |||
COMMON_FLAGS: 'USE_OPENMP=1' | |||
commands: | |||
- echo "MAKE_FLAGS:= $COMMON_FLAGS" | |||
- apt-get update -y | |||
- apt-get install -y make $CC gfortran perl python g++ | |||
- $CC --version | |||
- make QUIET_MAKE=1 $COMMON_FLAGS | |||
- make -C test $COMMON_FLAGS | |||
- make -C ctest $COMMON_FLAGS | |||
- make -C utest $COMMON_FLAGS | |||
- make -C cpp_thread_test dgemm_tester |
@@ -112,12 +112,12 @@ endif | |||
shared : | |||
ifneq ($(NO_SHARED), 1) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku FreeBSD DragonFly)) | |||
@$(MAKE) -C exports so | |||
@ln -fs $(LIBSONAME) $(LIBPREFIX).so | |||
@ln -fs $(LIBSONAME) $(LIBPREFIX).so.$(MAJOR_VERSION) | |||
endif | |||
ifeq ($(OSNAME), $(filter $(OSNAME),FreeBSD OpenBSD NetBSD DragonFly)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),OpenBSD NetBSD)) | |||
@$(MAKE) -C exports so | |||
@ln -fs $(LIBSONAME) $(LIBPREFIX).so | |||
endif | |||
@@ -68,14 +68,14 @@ endif | |||
#for install shared library | |||
ifneq ($(NO_SHARED),1) | |||
@echo Copying the shared library to $(DESTDIR)$(OPENBLAS_LIBRARY_DIR) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku FreeBSD DragonFly)) | |||
@install -pm755 $(LIBSONAME) "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" | |||
@cd "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" ; \ | |||
ln -fs $(LIBSONAME) $(LIBPREFIX).so ; \ | |||
ln -fs $(LIBSONAME) $(LIBPREFIX).so.$(MAJOR_VERSION) | |||
endif | |||
ifeq ($(OSNAME), $(filter $(OSNAME),FreeBSD OpenBSD NetBSD DragonFly)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),OpenBSD NetBSD)) | |||
@cp $(LIBSONAME) "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" | |||
@cd "$(DESTDIR)$(OPENBLAS_LIBRARY_DIR)" ; \ | |||
ln -fs $(LIBSONAME) $(LIBPREFIX).so | |||
@@ -25,6 +25,11 @@ char* openblas_get_config(void); | |||
/*Get the CPU corename on runtime.*/ | |||
char* openblas_get_corename(void); | |||
#ifdef OPENBLAS_OS_LINUX | |||
/* Sets thread affinity for OpenBLAS threads. `thread_idx` is in [0, openblas_get_num_threads()-1]. */ | |||
int openblas_setaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set); | |||
#endif | |||
/* Get the parallelization type which is used by OpenBLAS */ | |||
int openblas_get_parallel(void); | |||
/* OpenBLAS is compiled for sequential use */ | |||
@@ -12,9 +12,13 @@ void launch_cblas_dgemm(double* A, double* B, double* C, const blasint randomMat | |||
int main(int argc, char* argv[]){ | |||
blasint randomMatSize = 1024; //dimension of the random square matrices used | |||
uint32_t numConcurrentThreads = 52; //number of concurrent calls of the functions being tested | |||
uint32_t numConcurrentThreads = 96; //number of concurrent calls of the functions being tested | |||
uint32_t numTestRounds = 16; //number of testing rounds before success exit | |||
uint32_t maxHwThreads = omp_get_max_threads(); | |||
if (maxHwThreads < 96) | |||
numConcurrentThreads = maxHwThreads; | |||
if (argc > 4){ | |||
std::cout<<"ERROR: too many arguments for thread safety tester"<<std::endl; | |||
abort(); | |||
@@ -15,6 +15,10 @@ int main(int argc, char* argv[]){ | |||
blasint randomMatSize = 1024; //dimension of the random square matrices and vectors being used | |||
uint32_t numConcurrentThreads = 52; //number of concurrent calls of the functions being tested | |||
uint32_t numTestRounds = 16; //number of testing rounds before success exit | |||
uint32_t maxHwThreads = omp_get_max_threads(); | |||
if (maxHwThreads < 52) | |||
numConcurrentThreads = maxHwThreads -4; | |||
if (argc > 4){ | |||
std::cout<<"ERROR: too many arguments for thread safety tester"<<std::endl; | |||
@@ -72,6 +72,7 @@ USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |||
#include "common.h" | |||
#if defined(OS_LINUX) || defined(OS_NETBSD) || defined(OS_DARWIN) || defined(OS_ANDROID) || defined(OS_SUNOS) || defined(OS_FREEBSD) || defined(OS_OPENBSD) || defined(OS_DRAGONFLY) || defined(OS_HAIKU) | |||
#include <dlfcn.h> | |||
#include <errno.h> | |||
#include <signal.h> | |||
#include <sys/resource.h> | |||
#include <sys/time.h> | |||
@@ -279,6 +280,23 @@ int get_node(void); | |||
static int increased_threads = 0; | |||
#ifdef OS_LINUX | |||
int openblas_setaffinity(int thread_idx, size_t cpusetsize, cpu_set_t* cpu_set) { | |||
const int active_threads = openblas_get_num_threads(); | |||
if (thread_idx < 0 || thread_idx >= active_threads) { | |||
errno = EINVAL; | |||
return -1; | |||
} | |||
pthread_t thread = (thread_idx == active_threads - 1) | |||
? pthread_self() | |||
: blas_threads[thread_idx]; | |||
return pthread_setaffinity_np(thread, cpusetsize, cpu_set); | |||
} | |||
#endif | |||
static void* blas_thread_server(void *arg){ | |||
/* Thread identifier */ | |||
@@ -2740,7 +2740,7 @@ void *blas_memory_alloc(int procpos){ | |||
#ifdef DEBUG | |||
printf(" Position -> %d\n", position); | |||
#endif | |||
WMB; | |||
memory[position].used = 1; | |||
#if (defined(SMP) || defined(USE_LOCKING)) && !defined(USE_OPENMP) | |||
UNLOCK_COMMAND(&alloc_lock); | |||
@@ -126,7 +126,7 @@ endif | |||
dllinit.$(SUFFIX) : dllinit.c | |||
$(CC) $(CFLAGS) -c -o $(@F) -s $< | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),Linux SunOS Android Haiku FreeBSD DragonFly)) | |||
so : ../$(LIBSONAME) | |||
@@ -171,7 +171,7 @@ endif | |||
endif | |||
#http://stackoverflow.com/questions/7656425/makefile-ifeq-logical-or | |||
ifeq ($(OSNAME), $(filter $(OSNAME),FreeBSD OpenBSD NetBSD DragonFly)) | |||
ifeq ($(OSNAME), $(filter $(OSNAME),OpenBSD NetBSD)) | |||
so : ../$(LIBSONAME) | |||
@@ -0,0 +1,160 @@ | |||
SGEMM_BETA = ../generic/gemm_beta.c | |||
DGEMM_BETA = ../generic/gemm_beta.c | |||
CGEMM_BETA = ../generic/zgemm_beta.c | |||
ZGEMM_BETA = ../generic/zgemm_beta.c | |||
STRMMKERNEL = ../generic/trmmkernel_2x2.c | |||
DTRMMKERNEL = ../generic/trmmkernel_2x2.c | |||
CTRMMKERNEL = ../generic/ztrmmkernel_2x2.c | |||
ZTRMMKERNEL = ../generic/ztrmmkernel_2x2.c | |||
SGEMMKERNEL = ../generic/gemmkernel_2x2.c | |||
SGEMMONCOPY = ../generic/gemm_ncopy_2.c | |||
SGEMMOTCOPY = ../generic/gemm_tcopy_2.c | |||
SGEMMONCOPYOBJ = sgemm_oncopy.o | |||
SGEMMOTCOPYOBJ = sgemm_otcopy.o | |||
DGEMMKERNEL = ../generic/gemmkernel_2x2.c | |||
DGEMMONCOPY = ../generic/gemm_ncopy_2.c | |||
DGEMMOTCOPY = ../generic/gemm_tcopy_2.c | |||
DGEMMONCOPYOBJ = dgemm_oncopy.o | |||
DGEMMOTCOPYOBJ = dgemm_otcopy.o | |||
CGEMMKERNEL = ../generic/zgemmkernel_2x2.c | |||
CGEMMONCOPY = ../generic/zgemm_ncopy_2.c | |||
CGEMMOTCOPY = ../generic/zgemm_tcopy_2.c | |||
CGEMMONCOPYOBJ = cgemm_oncopy.o | |||
CGEMMOTCOPYOBJ = cgemm_otcopy.o | |||
ZGEMMKERNEL = ../generic/zgemmkernel_2x2.c | |||
ZGEMMONCOPY = ../generic/zgemm_ncopy_2.c | |||
ZGEMMOTCOPY = ../generic/zgemm_tcopy_2.c | |||
ZGEMMONCOPYOBJ = zgemm_oncopy.o | |||
ZGEMMOTCOPYOBJ = zgemm_otcopy.o | |||
STRSMKERNEL_LN = ../generic/trsm_kernel_LN.c | |||
STRSMKERNEL_LT = ../generic/trsm_kernel_LT.c | |||
STRSMKERNEL_RN = ../generic/trsm_kernel_RN.c | |||
STRSMKERNEL_RT = ../generic/trsm_kernel_RT.c | |||
DTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c | |||
DTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c | |||
DTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c | |||
DTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c | |||
CTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c | |||
CTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c | |||
CTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c | |||
CTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c | |||
ZTRSMKERNEL_LN = ../generic/trsm_kernel_LN.c | |||
ZTRSMKERNEL_LT = ../generic/trsm_kernel_LT.c | |||
ZTRSMKERNEL_RN = ../generic/trsm_kernel_RN.c | |||
ZTRSMKERNEL_RT = ../generic/trsm_kernel_RT.c | |||
#Pure C for other kernels | |||
SAMAXKERNEL = ../mips/amax.c | |||
DAMAXKERNEL = ../mips/amax.c | |||
CAMAXKERNEL = ../mips/zamax.c | |||
ZAMAXKERNEL = ../mips/zamax.c | |||
SAMINKERNEL = ../mips/amin.c | |||
DAMINKERNEL = ../mips/amin.c | |||
CAMINKERNEL = ../mips/zamin.c | |||
ZAMINKERNEL = ../mips/zamin.c | |||
SMAXKERNEL = ../mips/max.c | |||
DMAXKERNEL = ../mips/max.c | |||
SMINKERNEL = ../mips/min.c | |||
DMINKERNEL = ../mips/min.c | |||
ISAMAXKERNEL = ../mips/iamax.c | |||
IDAMAXKERNEL = ../mips/iamax.c | |||
ICAMAXKERNEL = ../mips/izamax.c | |||
IZAMAXKERNEL = ../mips/izamax.c | |||
ISAMINKERNEL = ../mips/iamin.c | |||
IDAMINKERNEL = ../mips/iamin.c | |||
ICAMINKERNEL = ../mips/izamin.c | |||
IZAMINKERNEL = ../mips/izamin.c | |||
ISMAXKERNEL = ../mips/imax.c | |||
IDMAXKERNEL = ../mips/imax.c | |||
ISMINKERNEL = ../mips/imin.c | |||
IDMINKERNEL = ../mips/imin.c | |||
SASUMKERNEL = ../mips/asum.c | |||
DASUMKERNEL = ../mips/asum.c | |||
CASUMKERNEL = ../mips/zasum.c | |||
ZASUMKERNEL = ../mips/zasum.c | |||
SSUMKERNEL = ../mips/sum.c | |||
DSUMKERNEL = ../mips/sum.c | |||
CSUMKERNEL = ../mips/zsum.c | |||
ZSUMKERNEL = ../mips/zsum.c | |||
SAXPYKERNEL = ../mips/axpy.c | |||
DAXPYKERNEL = ../mips/axpy.c | |||
CAXPYKERNEL = ../mips/zaxpy.c | |||
ZAXPYKERNEL = ../mips/zaxpy.c | |||
SCOPYKERNEL = ../mips/copy.c | |||
DCOPYKERNEL = ../mips/copy.c | |||
CCOPYKERNEL = ../mips/zcopy.c | |||
ZCOPYKERNEL = ../mips/zcopy.c | |||
SDOTKERNEL = ../mips/dot.c | |||
DDOTKERNEL = ../mips/dot.c | |||
CDOTKERNEL = ../mips/zdot.c | |||
ZDOTKERNEL = ../mips/zdot.c | |||
SNRM2KERNEL = ../mips/nrm2.c | |||
DNRM2KERNEL = ../mips/nrm2.c | |||
CNRM2KERNEL = ../mips/znrm2.c | |||
ZNRM2KERNEL = ../mips/znrm2.c | |||
SROTKERNEL = ../mips/rot.c | |||
DROTKERNEL = ../mips/rot.c | |||
CROTKERNEL = ../mips/zrot.c | |||
ZROTKERNEL = ../mips/zrot.c | |||
SSCALKERNEL = ../mips/scal.c | |||
DSCALKERNEL = ../mips/scal.c | |||
CSCALKERNEL = ../mips/zscal.c | |||
ZSCALKERNEL = ../mips/zscal.c | |||
SSWAPKERNEL = ../mips/swap.c | |||
DSWAPKERNEL = ../mips/swap.c | |||
CSWAPKERNEL = ../mips/zswap.c | |||
ZSWAPKERNEL = ../mips/zswap.c | |||
SGEMVNKERNEL = ../mips/gemv_n.c | |||
DGEMVNKERNEL = ../mips/gemv_n.c | |||
CGEMVNKERNEL = ../mips/zgemv_n.c | |||
ZGEMVNKERNEL = ../mips/zgemv_n.c | |||
SGEMVTKERNEL = ../mips/gemv_t.c | |||
DGEMVTKERNEL = ../mips/gemv_t.c | |||
CGEMVTKERNEL = ../mips/zgemv_t.c | |||
ZGEMVTKERNEL = ../mips/zgemv_t.c | |||
SSYMV_U_KERNEL = ../generic/symv_k.c | |||
SSYMV_L_KERNEL = ../generic/symv_k.c | |||
DSYMV_U_KERNEL = ../generic/symv_k.c | |||
DSYMV_L_KERNEL = ../generic/symv_k.c | |||
QSYMV_U_KERNEL = ../generic/symv_k.c | |||
QSYMV_L_KERNEL = ../generic/symv_k.c | |||
CSYMV_U_KERNEL = ../generic/zsymv_k.c | |||
CSYMV_L_KERNEL = ../generic/zsymv_k.c | |||
ZSYMV_U_KERNEL = ../generic/zsymv_k.c | |||
ZSYMV_L_KERNEL = ../generic/zsymv_k.c | |||
XSYMV_U_KERNEL = ../generic/zsymv_k.c | |||
XSYMV_L_KERNEL = ../generic/zsymv_k.c | |||
ZHEMV_U_KERNEL = ../generic/zhemv_k.c | |||
ZHEMV_L_KERNEL = ../generic/zhemv_k.c | |||
CGEMM3MKERNEL = ../generic/zgemm3mkernel_dump.c | |||
ZGEMM3MKERNEL = ../generic/zgemm3mkernel_dump.c |
@@ -91,3 +91,8 @@ typedef int blasint; | |||
#define openblas_complex_xdouble_real(z) ((z).real) | |||
#define openblas_complex_xdouble_imag(z) ((z).imag) | |||
#endif | |||
/* Inclusion of Linux-specific header is needed for definition of cpu_set_t. */ | |||
#ifdef OPENBLAS_OS_LINUX | |||
#include <sched.h> | |||
#endif |